diff --git a/assignment-1/submission/18300110042/knn_lab.dat b/assignment-1/submission/18300110042/knn_lab.dat deleted file mode 100644 index 41e9b68e149b69d5871dfa8da0eafa277394d71c..0000000000000000000000000000000000000000 --- a/assignment-1/submission/18300110042/knn_lab.dat +++ /dev/null @@ -1,117 +0,0 @@ -{ - "knn_lab": [ - { - "means": { - "method": "fix", - "data": [ [1, 50], [15, 10], [10, 20] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [1, 0], [0, 10 ] ], - [ [10, 15], [15, 40 ] ], - [ [20, 0], [0, 30] ] - ] - }, - "n_data": [ 400, 400, 400 ], - "k": [1, 3, 5, 9, 15, 20], - "dist": "euc", - "weights": 2, - "norm": "N" - }, - { - "means": { - "method": "fix", - "data": [ [1, 10], [5, 15] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [73, 0], [0, 22 ] ], - [ [21.2, 0], [0, 32.1] ] - ] - }, - "n_data": [ 1000, 1000 ], - "k": [5], - "dist": "euc", - "weights": 2, - "norm": "N" - }, - { - "means": { - "method": "random", - "data": [ [1, 10], [5, 15] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [73, 0], [0, 22 ] ], - [ [21.2, 0], [0, 32.1] ] - ] - }, - "n_data": [ 1000, 1000 ], - "k": [50], - "dist": "euc", - "weights": 0, - "norm": "N" - }, - { - "means": { - "method": "fix", - "data": [ [1, 20], [5, 20], [15, 15] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [1, 0], [0, 10 ] ], - [ [10, 15], [15, 40] ], - [ [20, 0], [0, 30] ] - ] - }, - "n_data": [ 100, 100, 100 ], - "k": [1, 3, 5, 9, 11, 13, 15, 17, 19], - "dist": "euc", - "weights": 0, - "norm": "N" - }, - { - "means": { - "method": "fix", - "data": [ [1, 30], [2, 30] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [1, 0], [0, 10 ] ], - [ [1, 0], [0, 10 ] ] - ] - }, - "n_data": [ 100, 100 ], - "k": [1, 3, 5, 9, 11, 13, 15, 17, 19], - "dist": "euc", - "weights": 0, - "norm": "N" - }, - { - "means": { - "method": "fix", - "data": [ [1, 20], [5, 20], [20, 30], [30, 25], [25, 25] ] - }, - "covs": { - "method": "fix", - "data": [ - [ [1, 0], [0, 10 ] ], - [ [10, 15], [15, 40] ], - [ [20, 0], [0, 30] ], - [ [10, 0], [0, 30] ], - [ [2, 5], [5, 50] ] - ] - }, - "n_data": [ 100, 100, 100, 100, 100 ], - "k": [1, 3, 5, 9, 11, 13, 15, 17, 19], - "dist": "euc", - "weights": 0, - "norm": "N" - } - ] -} \ No newline at end of file diff --git a/assignment-1/submission/18300110042/source.py b/assignment-1/submission/18300110042/source.py index f72b02ca335921ffda687c593bbb4c612e0e453f..09c31f9804b0f8df62659b723c18a37c99cf7842 100644 --- a/assignment-1/submission/18300110042/source.py +++ b/assignment-1/submission/18300110042/source.py @@ -43,8 +43,8 @@ class KNN: # construct hyperparams for grid search hyperparams = dict() if self.k == 0: - k_up_bound = 50 - if self.train_data.shape[0] < 50: + k_up_bound = 20 + if self.train_data.shape[0] < 20: k_up_bound = self.train_data.shape[0] hyperparams['k'] = [k for k in range(1, k_up_bound)] if self.norm == 'auto': @@ -187,49 +187,66 @@ class KNN: ------------------ below is code for experiement ------------------ """ -def load_lab_data(file_name): - import os, json - knn_lab_list = [] - if os.path.exists(file_name): - with open(file_name, 'r') as f: - json_data = json.loads(f.read()) - knn_lab_list = json_data.get('knn_lab', []) - return knn_lab_list - -def parse_lab_data(lab): - n_data = lab['n_data'] - ks = lab['k'] - weights = lab['weights'] - norm = lab['norm'] - dist = lab['dist'] - d_means = lab['means'] - means = [] - if d_means['method'] == 'fix': - means = d_means['data'] - else: - for m in d_means['data']: - mean = np.random.uniform(m[0], m[1], 2) - means.append(mean) - d_covs = lab['covs'] - covs = [] - if d_covs['method'] == 'fix': - covs = d_covs['data'] +def get_KLdiv(mean_1, cov_1, mean_2, cov_2): + assert len(mean_1) == len(mean_2) + num_dims = len(mean_1) + mu1 = np.array(mean_1) + mu2 = np.array(mean_2) + cov2_inv = np.linalg.inv(cov_2) + + logd = np.log(np.linalg.det(cov_2) / np.linalg.det(cov_1)) + trace_cov = np.trace(np.matmul(cov2_inv, cov_1)) + mean_cov = (mu2 - mu1).T.dot(cov2_inv).dot((mu2 - mu1)) + kldiv = 1/2 * (logd + trace_cov + mean_cov - num_dims) + return kldiv + +def guassian_kernel(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): + import torch + n_samples = int(source.size()[0])+int(target.size()[0]) + total = torch.cat([source, target], dim=0) + total0 = total.unsqueeze(0).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) + total1 = total.unsqueeze(1).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) + L2_distance = ((total0-total1)**2).sum(2) + if fix_sigma: + bandwidth = fix_sigma else: - for c in d_covs['data']: - cov = np.zeros((2, 2)) - cov[0, 0] = cov[0, 0] + np.random.uniform(c[0], c[1], 1) - cov[1, 1] = cov[1, 1] + np.random.uniform(c[0], c[1], 1) - x = np.sqrt(cov[0, 0] * cov[1, 1]) - # cov[0, 1] = np.random.uniform(-x, x, 1) - cov[1, 0] = cov[0, 1] - covs.append(cov) - return means, covs, n_data, ks, weights, norm, dist + bandwidth = torch.sum(L2_distance.data) / (n_samples**2-n_samples) + bandwidth /= kernel_mul ** (kernel_num // 2) + bandwidth_list = [bandwidth * (kernel_mul**i) for i in range(kernel_num)] + kernel_val = [torch.exp(-L2_distance / bandwidth_temp) for bandwidth_temp in bandwidth_list] + return sum(kernel_val) -def create_clustered_data(d_means, d_covs, n_data): +def mmd(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): + import torch + batch_size = int(source.size()[0]) + kernels = guassian_kernel(source, target, + kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma) + XX = kernels[:batch_size, :batch_size] + YY = kernels[batch_size:, batch_size:] + XY = kernels[:batch_size, batch_size:] + YX = kernels[batch_size:, :batch_size] + loss = torch.mean(XX + YY - XY -YX) + return loss + +def wasserstein_distance(x, y): + from scipy.spatial.distance import cdist + from scipy.optimize import linear_sum_assignment + d = cdist(x, y) + assignment = linear_sum_assignment(d) + return d[assignment].sum() / len(x) + +def maximum_mean_discrepancy(x, y): + import torch + from torch.autograd import Variable + X = Variable(torch.Tensor(x)) + Y = Variable(torch.Tensor(y)) + return mmd(X,Y).item() + +def cluster_data(means, covs, n_data): ds = [] ls = [] - for i in range(len(d_means)): - d = np.random.multivariate_normal(d_means[i], d_covs[i], n_data[i]) + for i in range(len(means)): + d = np.random.multivariate_normal(means[i], covs[i], n_data[i]) ds.append(d) ls.append(np.ones((n_data[i],), dtype=int) * i) return ds, ls @@ -239,35 +256,197 @@ def combine_all_data(ds, ls): lable = np.concatenate(ls) return data, lable -def generate_lab_data(data, lable, rate=0.2): +def generate_data(data, label, rate=0.2): idx = np.arange(len(data)) np.random.shuffle(idx) data = data[idx] - label = lable[idx] + label = label[idx] split = int(len(data) * (1 - rate)) train_data, test_data = data[:split,], data[split:,] train_label, test_label = label[:split,], label[split:,] return (train_data, train_label), (test_data, test_label) -def run_lab(labnum): - labs = load_lab_data('knn_lab.dat') - lab = labs[labnum] - means, covs, n_data, ks, weights, norm, dist = parse_lab_data(lab) - lab['means'] = means - lab['covs'] = covs - ds, ls = create_clustered_data(means, covs, n_data) +def run_lab(means, covs, n_data, ks, weights, norm, dist): + ds, ls = cluster_data(means, covs, n_data) data, label = combine_all_data(ds, ls) - (train_data, train_label), (test_data, test_label) = generate_lab_data(data, label) - accs = [] + (train_data, train_label), (test_data, test_label) = generate_data(data, label) models = [] for k in ks: - model = KNN(k, weights, norm, dist) - model.fit(train_data, train_label) - predict_label = model.predict(test_data) + model = dict() + knn = KNN(k, weights, norm, dist) + knn.fit(train_data, train_label) + predict_label = knn.predict(test_data) + acc = np.mean(np.equal(predict_label, test_label)) + model['model'] = knn + model['acc'] = acc models.append(model) - accs.append(np.mean(np.equal(predict_label, test_label))) - print("accs =", accs) - return models, lab, ds, data, label, accs + return np.array(models), ds, data, label + +def load_lab_config(lab_num): + l_config = [ + { # 0 + 'means': [ [1, 50], [15, 10], [10, 20] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [10, 15], [15, 40] ], + [ [20, 0], [0, 30] ] + ], + 'n_data': [ 400, 400, 400 ], + 'ks': [1, 3, 5, 7, 9, 15, 20], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 1 + 'means': [ [1, 20], [2, 20], [2, 25] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [10, 15], [15, 40] ], + [ [20, 0], [0, 30] ] + ], + 'n_data': [ 400, 400, 400 ], + 'ks': [1, 3, 5, 7, 9, 15, 20], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 2 + 'means': [ [1, 50], [15, 10], [10, 20] ], + 'covs': [ + [ [20, 0], [0, 40] ], + [ [40, 15], [15, 80] ], + [ [30, 0], [0, 50] ] + ], + 'n_data': [ 400, 400, 400 ], + 'ks': [1, 3, 5, 7, 9, 15, 20], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 3 + 'means': [ [1, 50], [15, 10], [10, 20], [25, 25], [40, 5] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [10, 15], [15, 40] ], + [ [20, 0], [0, 30] ], + [ [10, 0], [0, 10] ], + [ [10, 0], [0, 10] ] + ], + 'n_data': [ 240, 240, 240, 240, 240 ], + 'ks': [1, 3, 5, 7, 9, 15, 20], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 4 + 'means': [ ], 'covs': [ ], 'n_data': [ 400, 400, 400 ], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 5 + 'means': [ ], 'covs': [ ], 'n_data': [ 600, 400, 200 ], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 6 + 'means': [ ], 'covs': [ ], 'n_data': [ 800, 200, 200 ], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 7 + 'means': [ ], 'covs': [ ], 'n_data': [ 900, 200, 100 ], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 8 + 'means': [ ], 'covs': [ ], 'n_data': [240,240,240,240,240], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 9 + 'means': [ ], 'covs': [ ], 'n_data': [400,300,250,125,125], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 10 + 'means': [ ], 'covs': [ ], 'n_data': [500,300,200,100,100], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 11 + 'means': [ ], 'covs': [ ], 'n_data': [600,400,100,70,30], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 12 + 'means': [ ], 'covs': [ ], 'n_data': [170,170,170,170,170,175,175], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 13 + 'means': [ ], 'covs': [ ], 'n_data': [300,200,200,150,150,150,50], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 14 + 'means': [ ], 'covs': [ ], 'n_data': [400,300,200,100,100,80,20], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 15 + 'means': [ ], 'covs': [ ], 'n_data': [500,400,100,100,70,20,10], + 'ks': [1, 3, 5, 7, 9, 13, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 16 + 'means': [ [1, 40], [5, 30], [10, 20] ], + 'covs': [ + [ [20, 0], [0, 1500] ], + [ [2, 0], [0, 1000] ], + [ [5, 0], [0, 500] ] + ], + 'n_data': [ 400, 400, 400 ], + 'ks': [1, 3, 5, 7, 9, 15, 20], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 17 + 'means': [ [1, 30], [2, 30] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [1, 0], [0, 10] ] + ], + 'n_data': [ 100, 100 ], + 'ks': [1, 3, 5, 7, 9, 13, 15, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 18 + 'means': [ [1, 30], [5, 20], [15, 15] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [10, 15], [15, 40] ], + [ [20, 0], [0, 30] ] + ], + 'n_data': [ 100, 100, 100 ], + 'ks': [1, 3, 5, 7, 9, 13, 15, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 19 + 'means': [ [1, 20], [5, 20], [20, 30], [30, 25], [25, 25] ], + 'covs': [ + [ [1, 0], [0, 10] ], + [ [10, 15], [15, 40] ], + [ [20, 0], [0, 30] ], + [ [10, 0], [0, 30] ], + [ [2, 5], [5, 50] ] + ], + 'n_data': [ 100, 100, 100, 100, 100 ], + 'ks': [1, 3, 5, 7, 9, 13, 15, 17, 19], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 20 + 'means': [ ], 'covs': [ ], 'n_data': [ 1000, 1000 ], + 'ks': [1, 3, 5, 10, 20, 50], 'weights': 0, 'norm': 'N', 'dist': 'euc' + }, + { # 21 + 'means': [ ], 'covs': [ ], 'n_data': [ 1000, 1000 ], + 'ks': [1, 3, 5, 10, 20, 50], 'weights': 0, 'norm': 'N', 'dist': 'euc' + } + ] + n_data = l_config[lab_num]['n_data'] + means = l_config[lab_num]['means'] + covs = l_config[lab_num]['covs'] + cluster = len(n_data) + if len(means) == 0: # random set means + means = [] + for i in range(cluster): + mean = np.random.uniform(-50, 50, 2) + means.append(mean) + if len(covs) == 0: # random set covs + covs = [] + for i in range(cluster): + cov = np.zeros((2, 2)) + cov[0, 0] = np.random.uniform(0, 100, 1) + cov[1, 1] = np.random.uniform(0, 100, 1) + x = np.sqrt(cov[0, 0] * cov[1, 1]) + cov[1, 0] = cov[0, 1] + covs.append(cov) + ks = l_config[lab_num]['ks'] + weights = l_config[lab_num]['weights'] + norm = l_config[lab_num]['norm'] + dist = l_config[lab_num]['dist'] + return means, covs, n_data, ks, weights, norm, dist def plot_data(data, labels, title='data', save=False, colours=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:grey', 'tab:olive', 'tab:cyan']): @@ -288,12 +467,46 @@ colours=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:br plt.savefig(f'data_plotted_{title}') plt.show() -def plot_decision_boundary(labnum, save=False, +def plot_distance(lab_num, type='wasserstein'): + dists = [] + accss = [] + for i in range(100): + means, covs, n_data, ks, weights, norm, dist = load_lab_config(lab_num) + models, ds, data, labels = run_lab(means, covs, n_data, ks, weights, norm, dist) + if type == 'wasserstein': + dists.append(wasserstein_distance(ds[0], ds[1])) + else: + dists.append(maximum_mean_discrepancy(ds[0], ds[1])) + accs = max([m['acc'] for m in models]) + accss.append(accs) + dtoa = zip(dists, accss) + dtoa = dict(sorted(dtoa, key=lambda x: x[0])) + fig, ax = plt.subplots() + ax.plot(dtoa.keys(), dtoa.values()) + plt.show() + +def plot_kl_divergence(lab_num): + dists = [] + accss = [] + for i in range(100): + means, covs, n_data, ks, weights, norm, dist = load_lab_config(lab_num) + models, ds, data, labels = run_lab(means, covs, n_data, ks, weights, norm, dist) + dists.append(get_KLdiv(means[0], covs[0], means[1], covs[1])) + accs = [m['acc'] for m in models] + accss.append(accs) + accss = np.array(accss) + for i in range(accss.shape[1]): + dtoa = zip(dists, accss[:, i]) + dtoa = dict(sorted(dtoa, key=lambda x: x[0])) + fig, ax = plt.subplots() + ax.plot(dtoa.keys(), dtoa.values()) + plt.show() + +def plot_decision_boundary(lab_num, save=False, colours=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:grey', 'tab:olive', 'tab:cyan']): - models, lab, ds, data, labels, accs = run_lab(labnum) - for m in models: - print(m.weights) - ks = lab['k'] + means, covs, n_data, ks, weights, norm, dist = load_lab_config(lab_num) + models, ds, data, labels = run_lab(means, covs, n_data, ks, weights, norm, dist) + assert data.shape[0] == labels.shape[0] label_record = sorted(set(labels)) num_classes = len(label_record) @@ -309,9 +522,10 @@ colours=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:br fig, axs = plt.subplots(3, 3, sharex='col', sharey='row', figsize=(15,12)) indices = [(x, y) for x in [0,1,2] for y in [0,1,2]] titles = ['KNN (k=%d)' % k for k in ks] + knns = [m['model'] for m in models] - for idx, model, title in zip(indices, models, titles): - Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) + for idx, knn, title in zip(indices, knns, titles): + Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) axs[idx[0], idx[1]].contourf(xx, yy, Z, alpha=0.5) @@ -324,74 +538,30 @@ colours=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:br plt.show() -def get_KLdiv(mean_1, cov_1, mean_2, cov_2): - assert len(mean_1) == len(mean_2) - num_dims = len(mean_1) - mu1 = np.array(mean_1) - mu2 = np.array(mean_2) - cov2_inv = np.linalg.inv(cov_2) - - logd = np.log(np.linalg.det(cov_2) / np.linalg.det(cov_1)) - trace_cov = np.trace(np.matmul(cov2_inv, cov_1)) - mean_cov = (mu2 - mu1).T.dot(cov2_inv).dot((mu2 - mu1)) - kldiv = 1/2 * (logd + trace_cov + mean_cov - num_dims) - return kldiv - -def plot_distance(labnum): - dists = [] - accss = [] - for i in range(20): - models, lab, ds, data, label, accs = run_lab(labnum) - dists.append(wasserstein_distance(ds[0], ds[1])) - accss.append(accs[0]) - dtoa = zip(dists, accss) - dtoa = dict(sorted(dtoa, key=lambda x: x[0])) - fig, ax = plt.subplots() - ax.plot(dtoa.keys(), dtoa.values()) - plt.show() -def guassian_kernel(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): - import torch - n_samples = int(source.size()[0])+int(target.size()[0]) - total = torch.cat([source, target], dim=0) - total0 = total.unsqueeze(0).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) - total1 = total.unsqueeze(1).expand(int(total.size(0)), int(total.size(0)), int(total.size(1))) - L2_distance = ((total0-total1)**2).sum(2) - if fix_sigma: - bandwidth = fix_sigma +if __name__ == '__main__': + # parse lab num from user input + if len(sys.argv) > 1: + lab_num = int(sys.argv[1]) else: - bandwidth = torch.sum(L2_distance.data) / (n_samples**2-n_samples) - bandwidth /= kernel_mul ** (kernel_num // 2) - bandwidth_list = [bandwidth * (kernel_mul**i) for i in range(kernel_num)] - kernel_val = [torch.exp(-L2_distance / bandwidth_temp) for bandwidth_temp in bandwidth_list] - return sum(kernel_val) + print('Usage: python source lab_num (0 ~ 20)') + sys.exit(-1) -def mmd(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None): - import torch - batch_size = int(source.size()[0]) - kernels = guassian_kernel(source, target, - kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma) - XX = kernels[:batch_size, :batch_size] - YY = kernels[batch_size:, batch_size:] - XY = kernels[:batch_size, batch_size:] - YX = kernels[batch_size:, :batch_size] - loss = torch.mean(XX + YY - XY -YX) - return loss + if lab_num > 20 or lab_num < 0: + print('Usage: python source lab_num (0 ~ 20)') + sys.exit(-1) -def wasserstein_distance(x, y): - from scipy.spatial.distance import cdist - from scipy.optimize import linear_sum_assignment - d = cdist(x, y) - assignment = linear_sum_assignment(d) - return d[assignment].sum() / len(x) - -def maximum_mean_discrepancy(x, y): - import torch - from torch.autograd import Variable - X = Variable(torch.Tensor(x)) - Y = Variable(torch.Tensor(y)) - return mmd(X,Y).item() - -if __name__ == '__main__': - if len(sys.argv) > 1: - labnum = sys.argv[1] - models, lab, ds, data, label, accs = run_lab(int(labnum)) + # running lab job to get data + means, covs, n_data, ks, weights, norm, dist = load_lab_config(lab_num) + models, ds, data, label = run_lab(means, covs, n_data, ks, weights, norm, dist) + + # draw diagram if needed + if lab_num > 16 and lab_num < 20: + plot_decision_boundary(lab_num) + # kl_divergence to accuracy diagrams + elif lab_num == 20: + plot_kl_divergence(lab_num) + # need torch and scipy library + # elif lab_num == 21: + # plot_distance(lab_num) + else: + plot_data(data, label) \ No newline at end of file