blob: fcde97978ee97cf2ab4066faa7f94ba062a697e6 [file] [log] [blame]
 import numpy as np # Finds the coefficient to multiply A by to minimize # the percentage error between A and B. def minimize_percentage_error_model_a(A, B): z = np.where(B == 0)[0] A = np.delete(A, z, axis=0) B = np.delete(B, z, axis=0) z = np.where(A == 0)[0] A = np.delete(A, z, axis=0) B = np.delete(B, z, axis=0) R = np.divide(A, B) num = 0 den = 0 for r_i in R: num += r_i den += r_i**2 if den == 0: x = 0 else: x = (num / den)[0] return x def minimize_percentage_error_model_b(r_e, r_m, r_f): z = np.where(r_f == 0)[0] r_e = np.delete(r_e, z, axis=0) r_m = np.delete(r_m, z, axis=0) r_f = np.delete(r_f, z, axis=0) r_ef = np.divide(r_e, r_f) r_mf = np.divide(r_m, r_f) sum_ef = np.sum(r_ef) sum_ef_sq = np.sum(np.square(r_ef)) sum_mf = np.sum(r_mf) sum_mf_sq = np.sum(np.square(r_mf)) sum_ef_mf = np.sum(np.multiply(r_ef, r_mf)) # Divides x by y. If y is zero, returns 0. divide = lambda x, y : 0 if y == 0 else x / y # Set up and solve the matrix equation A = np.array([[1, divide(sum_ef_mf, sum_ef_sq)],[divide(sum_ef_mf, sum_mf_sq), 1]]) B = np.array([divide(sum_ef, sum_ef_sq), divide(sum_mf, sum_mf_sq)]) A_inv = np.linalg.pinv(A) x = np.matmul(A_inv, B) return x # Calculates the average percentage error between A and B. def average_error_model_a(A, B, x): error = 0 for i, a in enumerate(A): a = a[0] b = B[i][0] if b == 0: continue error += abs(x*a - b) / b error *= 100 error /= A.shape[0] return error def average_error_model_b(A, M, B, x): error = 0 for i, a in enumerate(A): a = a[0] mv = M[i] b = B[i][0] if b == 0: continue estimate = x[0]*a estimate += x[1]*mv error += abs(estimate - b) / b error *= 100 error /= A.shape[0] return error # Traverses the data and prints out one value for # each update type. def print_solutions(file_path): data = np.genfromtxt(file_path, delimiter="\t") prev_update = 0 split_list_indices = list() for i, val in enumerate(data): if prev_update != val[3]: split_list_indices.append(i) prev_update = val[3] split = np.split(data, split_list_indices) for array in split: A, mv, B, update = np.hsplit(array, 4) print("update type:", update[0][0]) xa = minimize_percentage_error_model_a(A, B) xb = minimize_percentage_error_model_b(A, mv, B) print("Model A coefficients:", xa, " | Model B coefficients:", xb) error_a = average_error_model_a(A, B, xa) error_b = average_error_model_b(A, mv, B, xb) baseline_error_a = average_error_model_a(A, B, 1) baseline_error_b = average_error_model_b(A, mv, B, [1, 1]) print("error a:", error_a, " | error b:", error_b) print("baseline error a:", baseline_error_a, "baseline error b:", baseline_error_b) print() if __name__ == "__main__": print_solutions("data2/lowres_17f_target150_data.txt")