From 803011fda6c056c33f70f71283a94a23fc6aa4fc Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Wed, 9 Jun 2021 18:01:40 +0800 Subject: [PATCH 1/8] K-means finished --- .../submission/18307130090/expect_w.png | Bin 0 -> 21816 bytes assignment-3/submission/18307130090/gap.png | Bin 0 -> 20182 bytes .../submission/18307130090/myplot-1.png | Bin 0 -> 21875 bytes .../submission/18307130090/myplot.png | Bin 0 -> 25440 bytes .../submission/18307130090/scatter.png | Bin 0 -> 22906 bytes assignment-3/submission/18307130090/source.py | 251 ++++++++++++++++++ .../submission/18307130090/tester_demo.py | 108 ++++++++ assignment-3/submission/18307130090/tmp.py | 32 +++ assignment-3/submission/18307130090/w.png | Bin 0 -> 19259 bytes 9 files changed, 391 insertions(+) create mode 100644 assignment-3/submission/18307130090/expect_w.png create mode 100644 assignment-3/submission/18307130090/gap.png create mode 100644 assignment-3/submission/18307130090/myplot-1.png create mode 100644 assignment-3/submission/18307130090/myplot.png create mode 100644 assignment-3/submission/18307130090/scatter.png create mode 100644 assignment-3/submission/18307130090/source.py create mode 100644 assignment-3/submission/18307130090/tester_demo.py create mode 100644 assignment-3/submission/18307130090/tmp.py create mode 100644 assignment-3/submission/18307130090/w.png diff --git a/assignment-3/submission/18307130090/expect_w.png b/assignment-3/submission/18307130090/expect_w.png new file mode 100644 index 0000000000000000000000000000000000000000..119c3a27efd2ca6d7ee017dac88e7804f9569678 GIT binary patch literal 21816 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 KM}B-S^1`pUj!f|Y literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/gap.png b/assignment-3/submission/18307130090/gap.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbe513de9583e08bb4a72701f7c7f1ca6fd76ad GIT binary patch literal 20182 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/myplot-1.png b/assignment-3/submission/18307130090/myplot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee762921d219f1ec668809b5477c6a4019d1234 GIT binary patch literal 21875 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 Hr_etEiXFqc literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/myplot.png b/assignment-3/submission/18307130090/myplot.png new file mode 100644 index 0000000000000000000000000000000000000000..77ef6125d21a2552d813e747d5a5ce8c1499ce46 GIT binary patch literal 25440 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 Cn{F-u literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/scatter.png b/assignment-3/submission/18307130090/scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..121b56c5b1fef2ba06ab03c42980fe271bbdf5a6 GIT binary patch literal 22906 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 np.float: + n = dots.shape[0] + ans = np.einsum('ij->', dis(dots, dots, False)) + # ans = sum(np.linalg.norm(dots[i] - dots[j], ord=dim) for i in range(n) for j in range(i + 1, n)) + return ans / (2 * n) + + +def dis(x, y, square=True): + xx = np.einsum('ij,ij->i', x, x)[:, np.newaxis] + yy = np.einsum('ij,ij->i', y, y)[np.newaxis, :] + dot = np.dot(x, y.T) + res = xx + yy - 2 * dot + return res if square else np.sqrt(res + 1e-12) + + +def my_scatter(np_data, color): + data = np.transpose(np_data).tolist() + plt.scatter(data[0], data[1], c=colors[color] if color is not None else 'yellow') + + +class KMeans: + + def __init__(self, n_clusters): + self.k = n_clusters + self.rand_num = 100 + self.ord = 2 + self.centers = None + + def single_fit(self, train_data): + self.centers = choose_centers(train_data, self.k, self.rand_num, self.ord) + clusters, dot2center = self.kmeans_iter(train_data) + while True: + self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) + clusters, new_dot2center = self.kmeans_iter(train_data) + if (dot2center == new_dot2center).all(): break + dot2center = new_dot2center + # for i in range(self.k): + # my_scatter(clusters[i], i) + # my_scatter(self.centers, None) + # plt.show() + + def fit(self, train_data: np.ndarray): + self.k = min(self.k, train_data.shape[0]) + self.single_fit(train_data) + + def kmeans_iter(self, train_data): + clusters, dot2center = [[] for _ in range(self.k)], [] + for dot in train_data: + i = np.argmin([np.linalg.norm(dot - center, ord=self.ord) for center in self.centers]) + dot2center.append(i) + clusters[i].append(dot) + for i in range(self.k): + clusters[i] = np.array(clusters[i]) + return clusters, np.array(dot2center, dtype=np.int) + + def predict(self, test_data): + pass + + +class GaussianMixture: + + def __init__(self, n_clusters): + self.k=n_clusters + self.pi=np.full(self.k,1.0/self.k) + self.rand_num=10 + self.mean=None + self.cov=None + self.n=None + self.dim=None + + def GMM_iter(self,train_data): + norm_p=np.array([[norm_pdf(x,self.mean[i],self.cov[i])for i in range(self.k)] for x in train_data]) + P=np.einsum('ij,j->ij',norm_p,self.pi) + P_sum=np.reciprocal(np.einsum('ij->i',P)) + P=np.einsum('ij,i->ij',P,P_sum) + N=np.einsum('ij->j',P) + N_recip=np.reciprocal(N) + self.pi=N/self.n + self.mean=np.einsum('ij,i->ij',np.einsum('ij,ik->jk',P,train_data),N_recip) + pass + + def fit(self, train_data): + self.n=train_data.shape[0] + self.dim=train_data.shape[1] + self.mean=choose_centers(train_data,self.k,self.rand_num,ord=2) + self.cov=np.concatenate([np.diag(np.full(self.dim,1))[np.newaxis, :] for _ in range(self.k)],axis=0) + self.GMM_iter(train_data) + + + def predict(self, test_data): + pass + + +class ClusteringAlgorithm: + + def __init__(self): + self.n = None + self.k = None + self.sample_num = 15 + self.rand_num = 100 + self.ord = 2 + self.centers = None + + def kmeans_iter(self, train_data: np.ndarray): + clusters, dot2center = [[] for _ in range(self.k)], [] + # for dot in train_data: + # i = np.argmin([np.linalg.norm(dot - center, ord=self.ord) for center in self.centers]) + # dot2center.append(i) + # clusters[i].append(dot) + dot2center = np.argmin(dis(train_data, self.centers), axis=1) + for i in range(self.n): + clusters[dot2center[i]].append(train_data[i]) + for i in range(self.k): + clusters[i] = np.array(clusters[i]) + return clusters, np.array(dot2center, dtype=np.int) + + def single_fit(self, train_data: np.ndarray, sample_rate=0.75, compute=True): + self.centers = choose_centers(train_data, self.k, self.rand_num, self.ord) + clusters, dot2center = self.kmeans_iter(train_data) + while True: + self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) + clusters, new_dot2center = self.kmeans_iter(train_data) + if (dot2center == new_dot2center).all(): break + dot2center = new_dot2center + if not compute: + # for i in range(self.k): + # my_scatter(clusters[i], i) + # my_scatter(self.centers, None) + # plt.show() + return None + rng = np.random.default_rng() + ans = 0 + for i in range(self.k): + cluster_size = int(clusters[i].shape[0] * sample_rate) + if cluster_size >= 300: + clusters[i] = rng.choice(clusters[i], size=cluster_size, axis=0, replace=False) + ans += dis_avg(clusters[i], self.ord) / (sample_rate * sample_rate) + else: + ans += dis_avg(clusters[i], self.ord) + + return ans + + def monte_carlo(self, data_min, data_max): + d = data_min.shape[0] + W_list = [] + for _ in range(self.sample_num): + print(f'Monte Carlo {_}') + sample_data = np.concatenate([np.random.uniform(data_min[i], data_max[i], (self.n, 1)) for i in range(d)], + axis=1) + W_list.append(self.single_fit(sample_data)) + W = np.log(W_list) + return W.mean(), W.std() * np.sqrt(1 + 1 / self.sample_num) + + def fit(self, train_data: np.ndarray): + self.n = train_data.shape[0] + data_min = train_data.min(axis=0, initial=np.inf) + data_max = train_data.max(axis=0, initial=-np.inf) + # max_k = min(max(10, int(np.sqrt(self.n / 2.0))), self.n) + max_k = 15 + W_list = [] + gap_list = [] + expec_W_list = [] + pre_gap = None + print(f'max_k={max_k}') + for self.k in range(1, max_k + 1): + print(f'k={self.k}') + W = np.log(self.single_fit(train_data)) + expec_W, s = self.monte_carlo(data_min, data_max) + # if pre_gap is not None and expec_W - W - s < pre_gap: + # self.k -= 1 + # break + pre_gap = expec_W - W + expec_W_list.append(expec_W) + gap_list.append(expec_W - W) + W_list.append(W) + print(f'final k={self.k}') + self.single_fit(train_data, compute=False) + x = list(range(1, max_k + 1)) + # fig,(ax1,ax2)=plt.subplots(2,1) + fig, ax1 = plt.subplots() + ax1.plot(x, W_list, label='W') + ax1.plot(x, expec_W_list, label='Expect_W') + ax1.set_xlabel('number of clusters k') + ax1.set_ylabel('within sum of distance') + ax1.legend() + # ax2.plot(x,gap_list) + # ax2.set_xlabel('number of clusters k') + # ax2.set_ylabel('Gap') + plt.show() + + def predict(self, test_data): + pass + + +if __name__ == '__main__': + mean = (1, 2) + cov = np.array([[73, 0], [0, 22]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[21.2, 0], [0, 32.1]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (10, 22) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + data, _ = shuffle(x, y, z) + + model = GaussianMixture(3) + model.fit(data) diff --git a/assignment-3/submission/18307130090/tester_demo.py b/assignment-3/submission/18307130090/tester_demo.py new file mode 100644 index 0000000..4fe6208 --- /dev/null +++ b/assignment-3/submission/18307130090/tester_demo.py @@ -0,0 +1,108 @@ +import numpy as np +import sys + +from source import KMeans, GaussianMixture + + +def shuffle(*datas): + data = np.concatenate(datas) + label = np.concatenate([ + np.ones((d.shape[0],), dtype=int)*i + for (i, d) in enumerate(datas) + ]) + N = data.shape[0] + idx = np.arange(N) + np.random.shuffle(idx) + data = data[idx] + label = label[idx] + return data, label + + +def data_1(): + mean = (1, 2) + cov = np.array([[73, 0], [0, 22]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[21.2, 0], [0, 32.1]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (10, 22) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + data, _ = shuffle(x, y, z) + return (data, data), 3 + + +def data_2(): + train_data = np.array([ + [23, 12, 173, 2134], + [99, -12, -126, -31], + [55, -145, -123, -342], + ]) + return (train_data, train_data), 2 + + +def test_with_n_clusters(data_fuction, algorithm_class): + (train_data, test_data), n_clusters = data_fuction() + model = algorithm_class(n_clusters) + model.fit(train_data) + res = model.predict(test_data) + assert len( + res.shape) == 1 and res.shape[0] == test_data.shape[0], "shape of result is wrong" + return res + + +def testcase_1_1(): + test_with_n_clusters(data_1, KMeans) + return True + + +def testcase_1_2(): + res = test_with_n_clusters(data_2, KMeans) + return res[0] != res[1] and res[1] == res[2] + + +def testcase_2_1(): + test_with_n_clusters(data_1, GaussianMixture) + return True + + +def testcase_2_2(): + res = test_with_n_clusters(data_2, GaussianMixture) + return res[0] != res[1] and res[1] == res[2] + + +def test_all(err_report=False): + testcases = [ + ["KMeans-1", testcase_1_1, 4], + ["KMeans-2", testcase_1_2, 4], + # ["KMeans-3", testcase_1_3, 4], + # ["KMeans-4", testcase_1_4, 4], + # ["KMeans-5", testcase_1_5, 4], + ["GMM-1", testcase_2_1, 4], + ["GMM-2", testcase_2_2, 4], + # ["GMM-3", testcase_2_3, 4], + # ["GMM-4", testcase_2_4, 4], + # ["GMM-5", testcase_2_5, 4], + ] + sum_score = sum([case[2] for case in testcases]) + score = 0 + for case in testcases: + try: + res = case[2] if case[1]() else 0 + except Exception as e: + if err_report: + print("Error [{}] occurs in {}".format(str(e), case[0])) + res = 0 + score += res + print("+ {:14} {}/{}".format(case[0], res, case[2])) + print("{:16} {}/{}".format("FINAL SCORE", score, sum_score)) + + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "--report": + test_all(True) + else: + test_all() diff --git a/assignment-3/submission/18307130090/tmp.py b/assignment-3/submission/18307130090/tmp.py new file mode 100644 index 0000000..78890fe --- /dev/null +++ b/assignment-3/submission/18307130090/tmp.py @@ -0,0 +1,32 @@ +from source import dis_avg +import numpy as np + +def row_norms(x): + return np.einsum('ij,ij->i',x,x) + +def dis(x,y): + xx=row_norms(x)[:,np.newaxis] + yy=row_norms(y)[np.newaxis,:] + dot=np.dot(x,y.T) + return xx+yy-2*dot + +def func1(x,y): + ans=x@np.diag(y) + ans_sum=np.array(np.array([ans_x.sum() for ans_x in ans])) + return np.array([ans[i]/ans_sum[i] for i in range(ans_sum.shape[0])]) + +def func2(x,y): + ans=np.einsum('ij,j->ij',x,y) + ans_sum=np.reciprocal(np.einsum('ij->i',ans)) + return np.einsum('ij,i->ij',ans,ans_sum) + +if __name__ == '__main__': + print(np.einsum('ij->i',np.array([[1,2],[3,4]]))) + n,k=10,3 + for _ in range(10000): + P=np.random.rand(n,k) + K=np.random.rand(k) + + ans=func2(P,K)-func1(P,K) + print(ans) + break \ No newline at end of file diff --git a/assignment-3/submission/18307130090/w.png b/assignment-3/submission/18307130090/w.png new file mode 100644 index 0000000000000000000000000000000000000000..72c196ee13b0149a14e5a15bd69e500c46336e47 GIT binary patch literal 19259 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 literal 0 HcmV?d00001 -- Gitee From 2649c865d19d991f366e2c45321e835a3a911a9e Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Wed, 9 Jun 2021 20:56:52 +0800 Subject: [PATCH 2/8] GMM finished --- assignment-3/submission/18307130090/source.py | 196 +++++++++++------- assignment-3/submission/18307130090/tmp.py | 20 +- 2 files changed, 127 insertions(+), 89 deletions(-) diff --git a/assignment-3/submission/18307130090/source.py b/assignment-3/submission/18307130090/source.py index 2e25816..39536fe 100644 --- a/assignment-3/submission/18307130090/source.py +++ b/assignment-3/submission/18307130090/source.py @@ -17,31 +17,32 @@ def shuffle(*datas): label = label[idx] return data, label -def norm_pdf(x,mean,cov): - n=cov.shape[0] - denominator=(np.sqrt(2*np.pi)**n)*np.sqrt(np.linalg.det(cov)) - tmp=x-mean - numerator=tmp@np.linalg.inv(cov)@tmp.T - return np.exp(numerator/(-2))/denominator - -def choose_centers(train_data, k, rand_num, ord): + +def norm_pdf(x, mean, cov): + n = cov.shape[0] + denominator = (np.sqrt(2 * np.pi) ** n) * np.sqrt(np.linalg.det(cov)) + tmp = x - mean + numerator = tmp @ np.linalg.inv(cov) @ tmp.T + return np.exp(numerator / (-2)) / denominator + + +def choose_centers(train_data, k, rand_num): rng = np.random.default_rng() centers = rng.choice(train_data, size=k, axis=0, replace=False) if k == 1: return centers - dist = dis_avg(centers, ord) + dist = dis_avg(centers) for i in range(rand_num - 1): new_centers = rng.choice(train_data, size=k, axis=0, replace=False) - new_dist = dis_avg(new_centers, ord) + new_dist = dis_avg(new_centers) if new_dist < dist: continue dist = new_dist centers = new_centers return centers -def dis_avg(dots: np.ndarray, dim) -> np.float: +def dis_avg(dots: np.ndarray): n = dots.shape[0] ans = np.einsum('ij->', dis(dots, dots, False)) - # ans = sum(np.linalg.norm(dots[i] - dots[j], ord=dim) for i in range(n) for j in range(i + 1, n)) return ans / (2 * n) @@ -58,104 +59,139 @@ def my_scatter(np_data, color): plt.scatter(data[0], data[1], c=colors[color] if color is not None else 'yellow') +def my_inner(x, mu): + tmp = x - mu + ans = np.einsum('i,j->ij', tmp, tmp) + return ans + + class KMeans: - + def __init__(self, n_clusters): self.k = n_clusters self.rand_num = 100 - self.ord = 2 self.centers = None - + self.n = None + def single_fit(self, train_data): - self.centers = choose_centers(train_data, self.k, self.rand_num, self.ord) + self.centers = choose_centers(train_data, self.k, self.rand_num) clusters, dot2center = self.kmeans_iter(train_data) while True: self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) clusters, new_dot2center = self.kmeans_iter(train_data) if (dot2center == new_dot2center).all(): break dot2center = new_dot2center - # for i in range(self.k): - # my_scatter(clusters[i], i) - # my_scatter(self.centers, None) - # plt.show() - + for i in range(self.k): + my_scatter(clusters[i], i) + my_scatter(self.centers, None) + plt.show() + def fit(self, train_data: np.ndarray): - self.k = min(self.k, train_data.shape[0]) + self.n = train_data.shape[0] + self.k = min(self.k, self.n) self.single_fit(train_data) - + def kmeans_iter(self, train_data): - clusters, dot2center = [[] for _ in range(self.k)], [] - for dot in train_data: - i = np.argmin([np.linalg.norm(dot - center, ord=self.ord) for center in self.centers]) - dot2center.append(i) - clusters[i].append(dot) + clusters = [[] for _ in range(self.k)] + dot2center = np.argmin(dis(train_data, self.centers), axis=1) + for i in range(self.n): + clusters[dot2center[i]].append(train_data[i]) for i in range(self.k): clusters[i] = np.array(clusters[i]) - return clusters, np.array(dot2center, dtype=np.int) - + return clusters, np.array(dot2center, dtype=int) + def predict(self, test_data): pass class GaussianMixture: - + def __init__(self, n_clusters): - self.k=n_clusters - self.pi=np.full(self.k,1.0/self.k) - self.rand_num=10 - self.mean=None - self.cov=None - self.n=None - self.dim=None - - def GMM_iter(self,train_data): - norm_p=np.array([[norm_pdf(x,self.mean[i],self.cov[i])for i in range(self.k)] for x in train_data]) - P=np.einsum('ij,j->ij',norm_p,self.pi) - P_sum=np.reciprocal(np.einsum('ij->i',P)) - P=np.einsum('ij,i->ij',P,P_sum) - N=np.einsum('ij->j',P) - N_recip=np.reciprocal(N) - self.pi=N/self.n - self.mean=np.einsum('ij,i->ij',np.einsum('ij,ik->jk',P,train_data),N_recip) - pass + self.k = n_clusters + self.pi = np.full(self.k, 1.0 / self.k) + self.rand_num = 10 + self.mean = None + self.cov = None + self.n = None + self.dim = None + + def GMM_iter(self, train_data): + norm_p = self.compute_norm_pdf(train_data) + pre_p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) + P = self.compute_P(norm_p) + N = np.einsum('ij->j', P) + N_recip = np.reciprocal(N) + self.pi = N / self.n + x_minus_mean = np.array([[my_inner(x, mu) for mu in self.mean] for x in train_data]) + # tmp=x_minus_mean[np.isnan(x_minus_mean)].reshape(-1) + self.cov = np.einsum('ijk,i->ijk', np.einsum('ij,ijkl->jkl', P, x_minus_mean), N_recip) + self.mean = np.einsum('ij,i->ij', np.einsum('ij,ik->jk', P, train_data), N_recip) + norm_p = self.compute_norm_pdf(train_data) + p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) + return p - pre_p + + def compute_P(self, norm_p): + P = np.einsum('ij,j->ij', norm_p, self.pi) + P_sum = np.reciprocal(np.einsum('ij->i', P)) + P = np.einsum('ij,i->ij', P, P_sum) + P[np.isnan(P) | np.isinf(P)] = 1.0 / self.k + return P + + def compute_norm_pdf(self, train_data): + return np.array([[norm_pdf(x, self.mean[i], self.cov[i]) for i in range(self.k)] for x in train_data]) def fit(self, train_data): - self.n=train_data.shape[0] - self.dim=train_data.shape[1] - self.mean=choose_centers(train_data,self.k,self.rand_num,ord=2) - self.cov=np.concatenate([np.diag(np.full(self.dim,1))[np.newaxis, :] for _ in range(self.k)],axis=0) - self.GMM_iter(train_data) + self.n = train_data.shape[0] + self.dim = train_data.shape[1] + self.mean = choose_centers(train_data, self.k, self.rand_num) + self.cov = np.concatenate([np.diag(np.full(self.dim, 1))[np.newaxis, :] for _ in range(self.k)], axis=0) + gap = np.inf + cnt = 0 + while gap > 1e-5: + gap = self.GMM_iter(train_data) + cnt += 1 + print(f'cnt={cnt} gap={gap}') + if cnt == 200: break + print(f'mean={self.mean}') + print(f'cov={self.cov}') + print(f'pi={self.pi}') + P = self.compute_P(self.compute_norm_pdf(train_data)) + dot2center = np.argmax(P, axis=1) + clusters = [[] for _ in range(self.k)] + for i in range(self.n): + clusters[dot2center[i]].append(train_data[i]) + for i in range(self.k): + clusters[i] = np.array(clusters[i]) + for i in range(self.k): + my_scatter(clusters[i], i) + my_scatter(self.mean, None) + plt.show() + pass - def predict(self, test_data): pass class ClusteringAlgorithm: - + def __init__(self): self.n = None self.k = None self.sample_num = 15 self.rand_num = 100 - self.ord = 2 self.centers = None - + def kmeans_iter(self, train_data: np.ndarray): - clusters, dot2center = [[] for _ in range(self.k)], [] - # for dot in train_data: - # i = np.argmin([np.linalg.norm(dot - center, ord=self.ord) for center in self.centers]) - # dot2center.append(i) - # clusters[i].append(dot) + clusters = [[] for _ in range(self.k)] dot2center = np.argmin(dis(train_data, self.centers), axis=1) for i in range(self.n): clusters[dot2center[i]].append(train_data[i]) for i in range(self.k): clusters[i] = np.array(clusters[i]) return clusters, np.array(dot2center, dtype=np.int) - + def single_fit(self, train_data: np.ndarray, sample_rate=0.75, compute=True): - self.centers = choose_centers(train_data, self.k, self.rand_num, self.ord) + self.centers = choose_centers(train_data, self.k, self.rand_num) clusters, dot2center = self.kmeans_iter(train_data) while True: self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) @@ -174,12 +210,12 @@ class ClusteringAlgorithm: cluster_size = int(clusters[i].shape[0] * sample_rate) if cluster_size >= 300: clusters[i] = rng.choice(clusters[i], size=cluster_size, axis=0, replace=False) - ans += dis_avg(clusters[i], self.ord) / (sample_rate * sample_rate) + ans += dis_avg(clusters[i]) / (sample_rate * sample_rate) else: - ans += dis_avg(clusters[i], self.ord) - + ans += dis_avg(clusters[i]) + return ans - + def monte_carlo(self, data_min, data_max): d = data_min.shape[0] W_list = [] @@ -190,7 +226,7 @@ class ClusteringAlgorithm: W_list.append(self.single_fit(sample_data)) W = np.log(W_list) return W.mean(), W.std() * np.sqrt(1 + 1 / self.sample_num) - + def fit(self, train_data: np.ndarray): self.n = train_data.shape[0] data_min = train_data.min(axis=0, initial=np.inf) @@ -227,23 +263,23 @@ class ClusteringAlgorithm: # ax2.set_xlabel('number of clusters k') # ax2.set_ylabel('Gap') plt.show() - + def predict(self, test_data): pass if __name__ == '__main__': - mean = (1, 2) - cov = np.array([[73, 0], [0, 22]]) - x = np.random.multivariate_normal(mean, cov, (800,)) + mean = (0, 0) + cov = np.array([[70, 0], [0, 70]]) + x = np.random.multivariate_normal(mean, cov, (7000,)) - mean = (16, -5) - cov = np.array([[21.2, 0], [0, 32.1]]) - y = np.random.multivariate_normal(mean, cov, (200,)) + mean = (-20, 20) + cov = np.array([[10, 0], [0, 10]]) + y = np.random.multivariate_normal(mean, cov, (1500,)) - mean = (10, 22) - cov = np.array([[10, 5], [5, 10]]) - z = np.random.multivariate_normal(mean, cov, (1000,)) + mean = (20, 20) + cov = np.array([[10, 0], [0, 10]]) + z = np.random.multivariate_normal(mean, cov, (1500,)) data, _ = shuffle(x, y, z) diff --git a/assignment-3/submission/18307130090/tmp.py b/assignment-3/submission/18307130090/tmp.py index 78890fe..4ed0112 100644 --- a/assignment-3/submission/18307130090/tmp.py +++ b/assignment-3/submission/18307130090/tmp.py @@ -21,12 +21,14 @@ def func2(x,y): return np.einsum('ij,i->ij',ans,ans_sum) if __name__ == '__main__': - print(np.einsum('ij->i',np.array([[1,2],[3,4]]))) - n,k=10,3 - for _ in range(10000): - P=np.random.rand(n,k) - K=np.random.rand(k) - - ans=func2(P,K)-func1(P,K) - print(ans) - break \ No newline at end of file + x=np.array([[1,2,3],[6,5,4]]) + print(np.argmax(x,axis=1)) + # print(np.einsum('ij->i',np.array([[1,2],[3,4]]))) + # n,k=10,3 + # for _ in range(10000): + # P=np.random.rand(n,k) + # K=np.random.rand(k) + # + # ans=func2(P,K)-func1(P,K) + # print(ans) + # break \ No newline at end of file -- Gitee From 4ee9753edf665bd29158531de2c2004cdb97a199 Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Thu, 10 Jun 2021 11:12:08 +0800 Subject: [PATCH 3/8] checkpoint 1 --- assignment-3/submission/18307130090/source.py | 206 ++++++++++-------- 1 file changed, 113 insertions(+), 93 deletions(-) diff --git a/assignment-3/submission/18307130090/source.py b/assignment-3/submission/18307130090/source.py index 39536fe..80cf0e8 100644 --- a/assignment-3/submission/18307130090/source.py +++ b/assignment-3/submission/18307130090/source.py @@ -18,11 +18,11 @@ def shuffle(*datas): return data, label -def norm_pdf(x, mean, cov): +def norm_pdf(x, mean, cov, cov_inv, cov_det): n = cov.shape[0] - denominator = (np.sqrt(2 * np.pi) ** n) * np.sqrt(np.linalg.det(cov)) + denominator = (np.sqrt(2 * np.pi) ** n) * np.sqrt(cov_det) tmp = x - mean - numerator = tmp @ np.linalg.inv(cov) @ tmp.T + numerator = tmp @ cov_inv @ tmp.T return np.exp(numerator / (-2)) / denominator @@ -40,7 +40,7 @@ def choose_centers(train_data, k, rand_num): return centers -def dis_avg(dots: np.ndarray): +def dis_avg(dots): n = dots.shape[0] ans = np.einsum('ij->', dis(dots, dots, False)) return ans / (2 * n) @@ -66,13 +66,13 @@ def my_inner(x, mu): class KMeans: - + def __init__(self, n_clusters): self.k = n_clusters self.rand_num = 100 self.centers = None self.n = None - + def single_fit(self, train_data): self.centers = choose_centers(train_data, self.k, self.rand_num) clusters, dot2center = self.kmeans_iter(train_data) @@ -85,12 +85,12 @@ class KMeans: my_scatter(clusters[i], i) my_scatter(self.centers, None) plt.show() - - def fit(self, train_data: np.ndarray): + + def fit(self, train_data): self.n = train_data.shape[0] self.k = min(self.k, self.n) self.single_fit(train_data) - + def kmeans_iter(self, train_data): clusters = [[] for _ in range(self.k)] dot2center = np.argmin(dis(train_data, self.centers), axis=1) @@ -99,98 +99,30 @@ class KMeans: for i in range(self.k): clusters[i] = np.array(clusters[i]) return clusters, np.array(dot2center, dtype=int) - - def predict(self, test_data): - pass - - -class GaussianMixture: - - def __init__(self, n_clusters): - self.k = n_clusters - self.pi = np.full(self.k, 1.0 / self.k) - self.rand_num = 10 - self.mean = None - self.cov = None - self.n = None - self.dim = None - - def GMM_iter(self, train_data): - norm_p = self.compute_norm_pdf(train_data) - pre_p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) - P = self.compute_P(norm_p) - N = np.einsum('ij->j', P) - N_recip = np.reciprocal(N) - self.pi = N / self.n - x_minus_mean = np.array([[my_inner(x, mu) for mu in self.mean] for x in train_data]) - # tmp=x_minus_mean[np.isnan(x_minus_mean)].reshape(-1) - self.cov = np.einsum('ijk,i->ijk', np.einsum('ij,ijkl->jkl', P, x_minus_mean), N_recip) - self.mean = np.einsum('ij,i->ij', np.einsum('ij,ik->jk', P, train_data), N_recip) - norm_p = self.compute_norm_pdf(train_data) - p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) - return p - pre_p - - def compute_P(self, norm_p): - P = np.einsum('ij,j->ij', norm_p, self.pi) - P_sum = np.reciprocal(np.einsum('ij->i', P)) - P = np.einsum('ij,i->ij', P, P_sum) - P[np.isnan(P) | np.isinf(P)] = 1.0 / self.k - return P - - def compute_norm_pdf(self, train_data): - return np.array([[norm_pdf(x, self.mean[i], self.cov[i]) for i in range(self.k)] for x in train_data]) - - def fit(self, train_data): - self.n = train_data.shape[0] - self.dim = train_data.shape[1] - self.mean = choose_centers(train_data, self.k, self.rand_num) - self.cov = np.concatenate([np.diag(np.full(self.dim, 1))[np.newaxis, :] for _ in range(self.k)], axis=0) - gap = np.inf - cnt = 0 - while gap > 1e-5: - gap = self.GMM_iter(train_data) - cnt += 1 - print(f'cnt={cnt} gap={gap}') - if cnt == 200: break - print(f'mean={self.mean}') - print(f'cov={self.cov}') - print(f'pi={self.pi}') - P = self.compute_P(self.compute_norm_pdf(train_data)) - dot2center = np.argmax(P, axis=1) - clusters = [[] for _ in range(self.k)] - for i in range(self.n): - clusters[dot2center[i]].append(train_data[i]) - for i in range(self.k): - clusters[i] = np.array(clusters[i]) - for i in range(self.k): - my_scatter(clusters[i], i) - my_scatter(self.mean, None) - plt.show() - pass - + def predict(self, test_data): pass -class ClusteringAlgorithm: - +class KMeansPlus: + def __init__(self): self.n = None self.k = None self.sample_num = 15 self.rand_num = 100 self.centers = None - - def kmeans_iter(self, train_data: np.ndarray): + + def kmeans_iter(self, train_data): clusters = [[] for _ in range(self.k)] dot2center = np.argmin(dis(train_data, self.centers), axis=1) for i in range(self.n): clusters[dot2center[i]].append(train_data[i]) for i in range(self.k): clusters[i] = np.array(clusters[i]) - return clusters, np.array(dot2center, dtype=np.int) - - def single_fit(self, train_data: np.ndarray, sample_rate=0.75, compute=True): + return clusters, np.array(dot2center, dtype=int) + + def single_fit(self, train_data, sample_rate=0.75, compute=True): self.centers = choose_centers(train_data, self.k, self.rand_num) clusters, dot2center = self.kmeans_iter(train_data) while True: @@ -213,9 +145,9 @@ class ClusteringAlgorithm: ans += dis_avg(clusters[i]) / (sample_rate * sample_rate) else: ans += dis_avg(clusters[i]) - + return ans - + def monte_carlo(self, data_min, data_max): d = data_min.shape[0] W_list = [] @@ -226,8 +158,8 @@ class ClusteringAlgorithm: W_list.append(self.single_fit(sample_data)) W = np.log(W_list) return W.mean(), W.std() * np.sqrt(1 + 1 / self.sample_num) - - def fit(self, train_data: np.ndarray): + + def fit(self, train_data): self.n = train_data.shape[0] data_min = train_data.min(axis=0, initial=np.inf) data_max = train_data.max(axis=0, initial=-np.inf) @@ -263,7 +195,95 @@ class ClusteringAlgorithm: # ax2.set_xlabel('number of clusters k') # ax2.set_ylabel('Gap') plt.show() + + def predict(self, test_data): + pass + + +class GaussianMixture: + + def __init__(self, n_clusters): + self.k = n_clusters + self.pi = np.full(self.k, 1.0 / self.k) + self.rand_num = 10 + self.mean = None + self.cov = None + self.cov_inv = None + self.cov_det = None + self.n = None + self.dim = None + + def GMM_iter(self, train_data): + norm_p = self.compute_norm_pdf(train_data) + pre_p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) + P = self.compute_P(norm_p) + N = np.einsum('ij->j', P) + N_recip = np.reciprocal(N) + self.pi = N / self.n + x_minus_mean = np.array([[my_inner(x, mu) for mu in self.mean] for x in train_data]) + # tmp=x_minus_mean[np.isnan(x_minus_mean)].reshape(-1) + self.cov = np.einsum('ijk,i->ijk', np.einsum('ij,ijkl->jkl', P, x_minus_mean), N_recip) + self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] + self.cov_det = [np.linalg.det(single_cov) for single_cov in self.cov] + self.mean = np.einsum('ij,i->ij', np.einsum('ij,ik->jk', P, train_data), N_recip) + norm_p = self.compute_norm_pdf(train_data) + p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) + return p - pre_p + + def compute_P(self, norm_p): + P = np.einsum('ij,j->ij', norm_p, self.pi) + P_sum = np.reciprocal(np.einsum('ij->i', P)) + P = np.einsum('ij,i->ij', P, P_sum) + P[np.isnan(P) | np.isinf(P)] = 1.0 / self.k + return P + + def compute_norm_pdf(self, train_data): + return np.array( + [[norm_pdf(x, self.mean[i], self.cov[i], self.cov_inv[i], self.cov_det[i]) for i in range(self.k)] for x in + train_data]) + + def fit(self, train_data): + self.n = train_data.shape[0] + self.dim = train_data.shape[1] + self.mean = choose_centers(train_data, self.k, self.rand_num) + self.cov = np.concatenate([np.diag(np.full(self.dim, 1))[np.newaxis, :] for _ in range(self.k)], axis=0) + self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] + self.cov_det = [np.linalg.det(single_cov) for single_cov in self.cov] + gap = np.inf + cnt = 0 + while gap > 1e-4: + gap = self.GMM_iter(train_data) + cnt += 1 + print(f'cnt={cnt} gap={gap}') + if cnt == 100: break + print(f'mean={self.mean}') + print(f'cov={self.cov}') + print(f'pi={self.pi}') + P = self.compute_P(self.compute_norm_pdf(train_data)) + dot2center = np.argmax(P, axis=1) + clusters = [[] for _ in range(self.k)] + for i in range(self.n): + clusters[dot2center[i]].append(train_data[i]) + for i in range(self.k): + clusters[i] = np.array(clusters[i]) + for i in range(self.k): + my_scatter(clusters[i], i) + my_scatter(self.mean, None) + plt.show() + pass + + def predict(self, test_data): + pass + +class ClusteringAlgorithm: + + def __init__(self): + pass + + def fit(self, train_data): + pass + def predict(self, test_data): pass @@ -272,16 +292,16 @@ if __name__ == '__main__': mean = (0, 0) cov = np.array([[70, 0], [0, 70]]) x = np.random.multivariate_normal(mean, cov, (7000,)) - + mean = (-20, 20) cov = np.array([[10, 0], [0, 10]]) y = np.random.multivariate_normal(mean, cov, (1500,)) - + mean = (20, 20) cov = np.array([[10, 0], [0, 10]]) z = np.random.multivariate_normal(mean, cov, (1500,)) - + data, _ = shuffle(x, y, z) - + model = GaussianMixture(3) model.fit(data) -- Gitee From e96ce10807f3fab62e41567b29a1785b3dffb273 Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Fri, 11 Jun 2021 01:17:41 +0800 Subject: [PATCH 4/8] assignment-3 finished --- assignment-3/submission/18307130090/README.md | 226 ++++++++ .../submission/18307130090/img/BIC.png | Bin 0 -> 17884 bytes .../submission/18307130090/img/auto_gmm.png | Bin 0 -> 25317 bytes .../18307130090/img/auto_kmeans.png | Bin 0 -> 22069 bytes .../submission/18307130090/img/basic.png | Bin 0 -> 25278 bytes .../submission/18307130090/img/basic_gmm.png | Bin 0 -> 25760 bytes .../18307130090/img/basic_kmeans.png | Bin 0 -> 27121 bytes .../18307130090/img/basic_matrix.png | Bin 0 -> 29523 bytes .../18307130090/img/basic_matrix_gmm.png | Bin 0 -> 29864 bytes .../18307130090/img/basic_matrix_kmeans.png | Bin 0 -> 29727 bytes .../18307130090/img/basic_triangle.png | Bin 0 -> 18702 bytes .../18307130090/img/basic_triangle_gmm.png | Bin 0 -> 19204 bytes .../18307130090/img/basic_triangle_kmeans.png | Bin 0 -> 20436 bytes .../18307130090/{ => img}/expect_w.png | Bin .../submission/18307130090/img/false_gap.png | Bin 0 -> 21607 bytes .../submission/18307130090/{ => img}/gap.png | Bin .../18307130090/{ => img}/myplot-1.png | Bin .../submission/18307130090/img/myplot.png | Bin 0 -> 25979 bytes .../18307130090/{ => img}/scatter.png | Bin .../submission/18307130090/{ => img}/w.png | Bin .../submission/18307130090/myplot.png | Bin 25440 -> 0 bytes assignment-3/submission/18307130090/source.py | 488 +++++++++++------- assignment-3/submission/18307130090/tmp.py | 34 -- 23 files changed, 526 insertions(+), 222 deletions(-) create mode 100644 assignment-3/submission/18307130090/README.md create mode 100644 assignment-3/submission/18307130090/img/BIC.png create mode 100644 assignment-3/submission/18307130090/img/auto_gmm.png create mode 100644 assignment-3/submission/18307130090/img/auto_kmeans.png create mode 100644 assignment-3/submission/18307130090/img/basic.png create mode 100644 assignment-3/submission/18307130090/img/basic_gmm.png create mode 100644 assignment-3/submission/18307130090/img/basic_kmeans.png create mode 100644 assignment-3/submission/18307130090/img/basic_matrix.png create mode 100644 assignment-3/submission/18307130090/img/basic_matrix_gmm.png create mode 100644 assignment-3/submission/18307130090/img/basic_matrix_kmeans.png create mode 100644 assignment-3/submission/18307130090/img/basic_triangle.png create mode 100644 assignment-3/submission/18307130090/img/basic_triangle_gmm.png create mode 100644 assignment-3/submission/18307130090/img/basic_triangle_kmeans.png rename assignment-3/submission/18307130090/{ => img}/expect_w.png (100%) create mode 100644 assignment-3/submission/18307130090/img/false_gap.png rename assignment-3/submission/18307130090/{ => img}/gap.png (100%) rename assignment-3/submission/18307130090/{ => img}/myplot-1.png (100%) create mode 100644 assignment-3/submission/18307130090/img/myplot.png rename assignment-3/submission/18307130090/{ => img}/scatter.png (100%) rename assignment-3/submission/18307130090/{ => img}/w.png (100%) delete mode 100644 assignment-3/submission/18307130090/myplot.png delete mode 100644 assignment-3/submission/18307130090/tmp.py diff --git a/assignment-3/submission/18307130090/README.md b/assignment-3/submission/18307130090/README.md new file mode 100644 index 0000000..1967ca7 --- /dev/null +++ b/assignment-3/submission/18307130090/README.md @@ -0,0 +1,226 @@ +# PRML-2021 Assignment3 + +姓名:夏海淞 + +学号:18307130090 + +## 简述 + +在本次实验中,我通过`NumPy`实现了`K-Means`和`GMM`两个用于聚类分析的模型,并在此基础上使用`BIC`和`Gap Statistic`方法实现了自动判断数据集中聚簇的数量并进行聚类的算法。为了验证模型和算法的正确性与效果,我在不同的二维数据集上进行了实验,对两者的运行时间和运行效果进行了比较。在实验中,我尝试对算法进行了一定优化,取得了较好的效果。 + +## 模型实现 + +### `K-Means` + +`K-Means`模型在构建时随机选取聚簇数目个点,作为聚簇的中心点;在随后的每次迭代中包含以下步骤: + +- 计算每个样本点至聚簇中心点的距离,将每个分配至距离最短的中心点对应的聚簇中; +- 计算聚簇中样本点的均值,将其作为新的聚簇中心点。 + +容易发现,`K-Means`模型通过样本点至聚簇中心点的距离预测其归属,聚簇中心点也是`K-Means`的参数。因此,聚簇中心点的初始选择对模型最终结果有着较大的影响。下图展示了当聚簇中心点选择不当时,模型容易收敛至局部最优解而非全局最优解的情形。 + +![](img\myplot.png) + +因此考虑选择一种策略,尽量避免在选择聚簇中心点时导致模型陷入局部最优解。在`K-Means++`算法中[^Arthur D 2006],作者提出了一种随机选取聚簇中心点的方法: + +- 随机选取一个样本点作为聚簇中心; +- 在随机选择下一个聚簇中心时,确保距离当前聚簇中心越远的点被选中的概率越大; +- 重复上述过程直至选出所有聚簇中心。 + +考虑到样本点数量较多时概率分配较为繁琐,我在构建模型时没有照搬该方法,而是根据“样本点之间离得越远越好”的思想,多次选择聚簇中心,最后采用平均距离最远的聚簇中心集作为结果返回: + +```python +def choose_centers(train_data, k, rand_num): # 生成初始聚簇中心点集 + rng = np.random.default_rng() + centers = rng.choice(train_data, size=k, axis=0, replace=False) # 从样本中无放回抽取样本点作为聚簇中心 + if k == 1: return centers + dist = dis_avg(centers) # 计算平均相互距离 + for i in range(rand_num - 1): # 选择相互距离最大的聚簇中心集 + new_centers = rng.choice(train_data, size=k, axis=0, replace=False) + new_dist = dis_avg(new_centers) + if new_dist < dist: continue + dist = new_dist + centers = new_centers + return centers +``` + +### `GMM` + +高斯混合模型`GMM`通过`Expectation-Maximum`算法进行参数估计。 + +设$\bold x$为样本点,$z$表示样本所属的高斯分布,$\pi,\mu,\sigma$分别表示每个高斯分布的分配概率、均值和协方差,在每次迭代中: + +- `Expectation`步:固定参数$\mu,\sigma$,计算后验分布$\gamma_{nk}=p(z^{(n)}=k|x^{(n)})$; + +- `Maximum`步:固定$\gamma_{nk}$,更新参数$\pi,\mu,\sigma$: + $$ + N_k=\sum_{n=1}^N\gamma_{nk}\\\\ + \pi_k=\frac{N_k}{N}\\\\ + \sigma_k=\frac1{N_k}\sum_{n=1}^N\gamma_{nk}(x^{(n)}-\mu_k)(x^{(n)}-\mu_k)^T\\\\ + \mu_k=\frac1{N_k}\sum_{n=1}^N\gamma_{nk}x^{(n)} + $$ + +在将`GMM`和`K-Means`进行对比时,我发现两者有一些相似之处。`K-Means`算法每次迭代时首先将每个样本点分配至某一个聚簇中,而`GMM`中计算的后验分布也有类似的作用,即量化样本点属于每个高斯分布的概率,以概率的形式对每个样本点进行了“分配”。随后`K-Means`根据分配结果重新计算聚簇中心点,而`GMM`中则是根据后验分布重新计算每个高斯分布的参数。两者的思想类似,而具体实现的角度不同。前者是通过距离的形式进行划分,而后者是根据概率的形式进行划分。 + +在构建`GMM`的时候,我碰到了一些问题: + +- 初始情况下,当样本距离每个高斯分布均较远时,联合概率均趋向于0,由于精度问题无法正确计算后验分布。注意到这种情况属于个别现象,因此我在处理时将其后验分布设置为均匀分布。 +- 在运行`GMM-2`的测试数据时,发现由于计算得到的协方差矩阵为奇异矩阵,无法计算高斯分布。查询相关资料后,发现这种现象是由于样本数量相较于维数过小出现的现象,也可以视作模型过拟合的一种表现。解决方法是:①增大样本量②降低样本维数。考虑到降维过于繁琐,我简单地对样本进行复制后加入噪声,弥补了样本数量不足的问题。 + +## 基础实验 + +### 高斯分布 + +#### 数据集参数 + +$$ +\mu_x=\begin{bmatrix}0&0\end{bmatrix},\mu_y=\begin{bmatrix}-20&20\end{bmatrix},\mu_z=\begin{bmatrix}30&30\end{bmatrix},\mu_x=\begin{bmatrix}-30&-30\end{bmatrix},\mu_x=\begin{bmatrix}30&-30\end{bmatrix}\\ +\Sigma_x=\begin{bmatrix}70&0\\\\0&70\end{bmatrix},\Sigma_y=\Sigma_z=\Sigma_w=\Sigma_t=\begin{bmatrix}10&0\\\\0&10\end{bmatrix}\\\\ +|x|=3500,|y|=|z|=|w|=|t|=750 +$$ + +![](img\basic.png) + +使用`K-Means`和`GMM`进行聚类,画出各自的聚簇: + +#### `K-Means` + +![](img\basic_kmeans.png) + +其中黄色点代表聚簇中心。 + +#### `GMM` + +![](img\basic_gmm.png) + +其中黄色点代表高斯分布均值。 + +--- + +容易发现,在高斯混合分布下,`K-Means`由于其采用距离作为分配聚簇的标准,在不同高斯分布的边界处产生了较大的误差;而采用高斯分布后验概率作为分配聚簇标准的`GMM`则表现较好。 + +### 其他分布 + +考虑到数据集采用多维高斯分布产生,采用高斯分布后验概率作为分配聚簇标准的`GMM`取得良好效果有“先射箭后画靶”的嫌疑。因此考虑采用其他分布生成随机数据集: + +尝试通过均匀分布产生矩形数据集和三角形数据集: + +![](img\basic_matrix.png) + +![](img\basic_triangle.png) + +使用`K-Means`和`GMM`进行聚类,画出各自的聚簇: + +#### `K-Means` + +![](img\basic_matrix_kmeans.png) + +![](img\basic_triangle_kmeans.png) + +其中黄色点代表聚簇中心。 + +#### `GMM` + +![](img\basic_matrix_gmm.png) + +![](img\basic_triangle_gmm.png) + +其中黄色点代表高斯分布均值。 + +容易发现,即使是对于非高斯分布的情形,`GMM`在不规则分布中依然取得了更好的效果。因此推测`GMM`的聚类能力更加出色。 + +## 自动选择聚簇数量的实验 + +### `Gap Statistic` + +助教在发布作业时提及了使用`Elbow Method`配合`K-Means`算法实现主动选择聚簇数量。因此我首先对其进行了研究。 + +聚类的主要目的是将类似的对象分配到同一聚簇中,即降低簇内平均距离。设当聚簇数量为$k$时簇内平均距离之和为$W_k$,考察$W_k$的曲线时发现$W_k$单调减,且在经过某个拐点后其斜率明显变得平缓,形如一个手肘,而拐点,也就是“肘部”被`Elbow Method`认为是聚簇数量的最佳位置。 + +然而,肘部的寻找并不容易。例如,当$W_k$曲线开始较平缓时,例如下图,很难量化“肘部”的判定标准。我查阅资料了解到,有一种被称为`Gap Statistic`的方法能够量化`Elbow Method`的判定标准[^Tibshirani R 2001]。 + +![](img\w.png) + +`Gap Statistic`的思想是将给定样本聚类后的簇内距离与空间内均匀采样的样本聚类后的期望簇内距离进行比较,两者之差被称为$Gap$。$Gap$衡量了样本的簇内距离与零假设下的偏差。`Gap Statistic`方法认为最佳的聚簇数量应当能够最大化$Gap$。 + +在实际运行中,`Gap Statistic`方法在样本覆盖的矩形中进行相同次数的均匀采样,计算聚类后的期望簇内距离$Gap_k$: +$$ +Gap_k=E(\log W_k^{(b)})-\log W_k\\\\ +E(\log W'_k)=\frac1B\sum_{b=1}^B\log W_{k}^{(b)} +$$ +`Gap Statistic`方法最后选择满足$Gap_k\ge Gap_{k+1}-s_{k+1}$的最小的$k$,其中$s_{k}=\sqrt{1+1/B}\cdot\text{std}(\log W_k^{(b)})$。 + +画出与上图对应的$E(\log W_k^{(b)})$,$\log W_k$和$Gap$的曲线: + +![](img\expect_w.png) + +![](img\gap.png) + +容易发现,此时$k=3$为最佳的聚簇数量。 + +将使用`Gap Statistic`方法的`K-Means`模型用于三角数据集,得到下图的预测结果: + +![](img\auto_kmeans.png) + +尽管`Gap Statistic`算法给出了错误的聚簇数量,然而从人类视角看,该聚类也有合理之处,且与正确聚簇数量相差不大。 + +### 簇内距离计算的优化 + +尽管`Gap Statistic`成功实现了量化“肘部”的效果,然而其运行时需要重复采样,聚类后还要计算簇内距离。当聚簇数量较小时,计算簇内距离的时间代价接近$O(n^2)$,其中$n$为样本容量,当样本点较多时运行缓慢。因此考虑对其进行优化。 + +首先,查阅资料得知,簇内距离的计算可以使用`numpy.einsum`函数改写来加速[^kmeans算法的性能改进,优化,距离,计算 (pythonf.cn)]。`numpy.einsum`是一个通过爱因斯坦求和约定(Einstein summation convention)对张量进行计算的函数,具备强大的灵活性和高效的性能。而我之前是通过`numpy.linalg.norm`计算簇内距离的。在将簇内距离的计算改用`numpy.einsum`表达后,该部分的运行时间降低为原先的10%。 + +然而,`numpy.einsum`的性能提升依然较为有限。考虑降低簇内距离的运算量。当簇内样本容量较大时,聚簇较为密集。此时可以随机抽取簇内样本的一部分进行计算,结果在进行修正后接近使用全部样本计算得到的值。实践中,对于样本容量大于250的聚簇,对其按照50%的采样率进行采样后计算簇内距离。这一优化在理论上将簇内距离的计算时间进一步降低至原先的25%。 + +### `Gap Statistic`与`BIC`的结合 + +在`GMM`中,模型有明确的优化目标:对数边际分布$\sum_{n=1}^N\log p(x^{(n)})$。因此查阅资料了解到,在通过`GMM`实现自动确定聚簇数量的算法时,可以采用`BIC`(Bayesian Information Criterion,贝叶斯信息准则)作为判断聚簇数量的依据。`BIC`引入了模型复杂程度的因素,用来惩罚过于复杂的模型,公式为$BIC=k\log n-2\log L$,其中$k,n,L$分别表示模型参数个数、样本数量和最大似然。 + +在引入`BIC`度量聚簇数量时,发现由于`GMM`的模型参数过少,`BIC`的惩罚力度不够,其曲线未按照设想的呈“U”性,而是呈现为“手肘”型,如下图所示。因此考虑将`BIC`与`Gap Statistic`结合,通过`Gap Statistic`方法找到`BIC`的拐点,从而确定最佳聚簇数量。 + +![](img\BIC.png) + +将使用`Gap Statistic`方法的`GMM`用于三角数据集,得到下图的预测结果: + +![](img\auto_gmm.png) + +可以发现,`Gap Statistic`方法帮助`GMM`找到了正确的聚簇数量。 + +### `GMM`的性能优化 + +尝试对`GMM`中频繁调用的计算高斯分布的函数`get_norm_pdf`进行优化: + +```python +def get_norm_pdf(x, mean, cov): + n = cov.shape[0] + denominator = (np.sqrt(2 * np.pi) ** n) * np.sqrt(np.linalg.det(cov)) + tmp = x - mean + numerator = tmp @ np.linalg.inv(cov) @ tmp.T + return np.exp(numerator / (-2)) / denominator +``` + +使用PyCharm对其进行性能分析后发现,大部分时间用于计算协方差矩阵的行列式和逆矩阵。考虑到单次迭代中协方差矩阵不会改变,因此可以在更新协方差矩阵时同时预计算其行列式和逆矩阵,避免重复计算: + +```python +def get_norm_pdf(x, mean, cov_inv, denominator): # 计算多维高斯分布,采用预计算策略,提高程序性能 + tmp = x - mean + numerator = tmp @ cov_inv @ tmp.T + return np.exp(numerator / (-2)) / denominator + +# 提前计算协方差的逆,用于加快高斯分布概率密度的计算 +self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] + +# 提前计算协方差的行列式,用于加快高斯分布概率密度的计算 +cov_det = [np.abs(np.linalg.det(single_cov)) for single_cov in self.cov] + +# 用于加快高斯分布概率密度的计算 +self.denominator = (np.sqrt(2 * np.pi) ** self.dim) * np.sqrt(cov_det) +``` + +## 参考资料 + +[^Arthur D 2006]:[Arthur D, Vassilvitskii S. K-Means++: The advantages of careful seeding[R]. Stanford, 2006.](http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf) +[^Tibshirani R 2001]:[Tibshirani R, Walther G, Hastie T. Estimating the number of clusters in a data set via the gap statistic[J]. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 2001, 63(2): 411-423.](http://web.stanford.edu/~hastie/Papers/gap.pdf) + +[^kmeans算法的性能改进,优化,距离,计算 (pythonf.cn)]:https://www.pythonf.cn/read/109964 + diff --git a/assignment-3/submission/18307130090/img/BIC.png b/assignment-3/submission/18307130090/img/BIC.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd557907ae7642d18149817f570d638bfd8c9f9 GIT binary patch literal 17884 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�l|Kcg*UzoU0Ju4t*ordFk9ObW!v(d26}o^KYq*& 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/auto_gmm.png b/assignment-3/submission/18307130090/img/auto_gmm.png new file mode 100644 index 0000000000000000000000000000000000000000..94bb8cfbfafed2e8bf484c4266ff1e303f93f0d2 GIT binary patch literal 25317 zcmeFZA&L0vQArQl8sqN!;l1EeW*1MMKUEO8Lii3AIZ@D=GY z+;qwHB@xg1-3$}xdjknl^ZNNhSwao_>2FB;T5A45BIAK6=z{3va|Nrp+%f*q`g+NKhfDPKYQJX_uAn>E@tB_rT%(|c(COtO;19lmYSirpW zuxPWg3qQfRxfjxd^4-PQ!yd4l0o^JP;a55T?W>O`$D3jOHsGiI4qq44fBUCLgxYEU zwAr_|#OWRXHh3lobn^b+rnd3D|GxEP0T+J-c!K`zdIj3EDAw)>Rh6=mfh48-1RW3z zqW{w;K7Rc7MRr4+arzxMqUB~tFqt?{1Gdpc_o??<1fdZ*=wjSU_`!qZk)K4byph}} zSzox@Iwrik^d{<`hJ`_R9!gb$!6a{A-APxj8XG2({Ygn%KSTQ|PW#T`zoPDYDJ?Ba z9p1C^<1OJ2dDE-bFih=FQ~IozUX{#(k>ag!|Fy!t`(h)4wfPDLvpJt`RS+gO;z`d` zfsCrpsWaY*3ldGXSrJ549vW1pXrak++%H{AO`4ll+KJtt^?P}fdfxgl4YBA8@ASL+ zthulEaMeTCS2i*|-M`h+R7>yuzQ#0?@makW(CMln43s!kVSjH@M*4Px0EZ;IWiBV( z)nna@zNx+7ix3+aVp%})JDg*h@+P}3ELD$nQlhM*n^}_#Bm8CW$9qkiX2<=Rp9QIQ zhzAW1H+$S%T!Aga@bK0+@^*u)*;&w=hs!Ry7L1Sq3Y0&N!g9B4v(CJuIwvSFxxt{5 zg%=>5CYO_gy5)xf=HX*F55R`{KQ&rD++7b24%#%G{K0O$>Z14fizK|fwfW_J8-oP1tdiwi{TkN z9pO!DJ=(KZ{fgtvs*RU`Zkqt5veVb)@H;HMX07Gb@!uBb)t)HQBh-wSGvY3rkWT|;} z_@IeLsECDQ5U}KLgLc07eq%wsI!PZgmNgF3V39z;vCY52JH9^cVZH!iVk~ajNO|L!2q>HcRYn zqnTpd@YZUJS-8Q)8TZtJ`pSwZU^LolSbr_x5NhhR(WsV{oTuR#{{Dv0=zR2!4THx2 zMIMN~q$RSzdK2mQ&2pCd*gx~vVhE!S<6c(A2fR8?EAf1UFr;ATY){}E!CLjm#du{pVjhmZKxYf z3GJxcP`i5t^9|Tkz)=KwW9`1#@#7rs(O+`U_>- zEZ@%#Q={>cS<7hUh)qV^!ci0@v#k)z#@8wbJg5`@(-Mb)itGlN12j1g*4VpV#AMBf3!{P%`}esiY%$x7oPhTI?R zv+zctXb3+?NrML7H5xqe+vgD&esio0D9eGo&lgh~=lky3lN~tyYU$jO2iu65o?n53 z;Fix^WZcV~^(dc@2=ke&Qr+a%R-Z*FYx<2MBa^KCb9w$RGLue1aE}R`zY`{*IZ#dKDz2RZs9m zbJ31{D#Zxxj!zi@S4_OUy62u9rkkL@%YPr7G3$s<(bXYe(|O-0Z45AXeG%$C_Zn?C zE^=I^Xq{Rx|5IYE{fRCu*{Rk?yTEy@24~-@R0mj7^hJn=W3WT*ctKOK2`P}Z z0AtgV*x>gXck)&#jGKONj9>rVB!XpR9BY%_*Yt6{G51>$S}j^UYH!loeg{05C=yw< zVU?=G)xKc|<2w`(a*gy+)|3dVh?|L;?U3F@<&i6y<{U+%QD3!aZyvp{e%^{EN%KE6 zlV{+wYm?Lugadm6%(u6k{eZCMOy2bmVrQgQ$d(^2ay9%aCKyT`J5EdYGA^~te{whm&~Ey(Ak5>3h^F6 zw@E^GbD2~cRF5feBOHLP*>xyiC%z;{(>K^=wwY`cNLzU_%93Ma_jHybyD9bTQ*v@I zsKh-ECD^Qi&rN$LMx$27Z{#XDef@(Bvgdr&u6E|;&gO z^k}i3ax%X{y_1!{b+$S__#1|dWBUB^O(a1dYQlF9%82(W#S%okcotzXHVL0pNAU5L zGKDD%+Tp%r1u@V0_`*HK1G&icdIRc(*}*(lay1+8*R?6^xIj}0PWISG?c1+Vl%EVw zAbi>!zkuI%g$!pW*lzh1lF+<2K{YJAaa&&A&P4-Wq_>ILhsL-+u&N2#t7UK#AD_;t zJTdZ{kR~SUc;{1XoPXHCg*2kDXq=rH^L#}H&6OY6mFJ(S4kQC z`I11zc@gVom$seV|E*M`Ve_qq%Bj1Nu8jO$YHa052ky(&r$`9lemkwAIi_c9RgM`~ zJVz{emS;Se61Bz2txvKD#j&E`XE~$$Ya6nDkG-1NN_C1)XSQ$@&#NHB?=3oW!s&YM zN5~dgNv}1d%fD5JR!-;rwl!4!uL5~x;C*7Euyd@6AqRC4S6sCVA&kWHmn2?r1I`&k z#V-fhHINAUXosBxs^cDi)?Fr6NKeKV_c8?xtE#&|m^}Dk&Yu^8O!-t5rxq5;x3!@1#x@;em=^eY>ojoT^ji6&Z?iNpXu^k**ftv8s=&*Y}<1b#;-F;HQ;8L%)C`nuxeHnk$sOpfnqTAvV=D!=*Z$C*|uFU>Bq z5!(GXbEjBH(i-&n;xq=sJN<@lK6B~GEPY{1Na#|uPVzJ^BMAvCi$y89eXCN{DQ>S3 zLX38k+m$oDOWzCnPF}{$m zbC*K@J5FcTInV%8APQEV=(5AF7NL~+NCPrrz(xCb2qopC`(R?u5E4ft^+LkuO6g~Ae`Y# z_w$i_qi)>RVP0Alj7&hNld?x$;qqD41k0}`HeM!*_oI9h{2u0>Rli8byVRLnhR+m` za+~oWQ^FT#2o5vt$}JJZZDP-=eKXhjamHeo`-|MK@jVmmaG!{ zl<6(ByP31<;%JVTXeHR|)noCi+k$D{v_TI?4e}VK%HzL*7)*Nir{5@DDnL($*#_gP zgG$q>!ag=#ZPoANdS;fV1Bost=4(|pil?<31(x6J-x z511Da>y$S^`><5CPNE__zP0R`WOz=^FHKK7Z>2eVU3Cx4Ia%$hTlTtT9_As%Irh9Qm4qM#D=+<8K_yT zcNL@n>jZ_B1*w=@XF%GOH@7~r6M`C_Cra1^t8^n>e{|&i=zg)*?hh{>hQsK5xX_++ z|8IzZW+f|;e@-Ncc8=PBA}4D-DYc%p4+sPd;Yv8|jmIc1BqLq{La`3Y-+V)!aRRop z7Vo%ByK%c)HigaAoxbI2RrhWcdntlY{KtD&XP??yws{*h+I7ULy2U?GI~n!)8;ey% z$zExlFAs_;CR5%$e>LjNF>fc_3nX1(tlCgvKtperd{oPIWci((oZQ@7&r5AQZ|9dU zyw3hF9M8^CkI^%#1%)G$Al>pauaf1UcPXh2m%#%w}cNidGt@W zebQ@7!Wi_4f>l)jCsN8nZsd)t_}@wO_zbSsrv`$!4r)nH~ zJD`l4)O4OAOH|tjtdFBL_N9HL8*F+XmNy!~%!cl8sKC`(H|e8JSprY!;&U%?36oY4 zJ7E%_PHvGvx{eSNcC(Wg)JccfTMS!k?V-Ropk&rddc(z>RNTbq$CCi|#FDU2>-KfA z_Jt+l^Kel@xhW&^I2LsKX)>HHWrZ`gQ;_j+cRI|@%Bt-+3C0P`CF}1^MJl8z!%>9E zT$r}IES+eoun;HJEg&!0-!Wwz2&?;La5xY_6V@U|J zR{0mQ)V2AjmT7TXQejfa6e7!Xo@AkUez#kerf;s!GqU9)z(QT9pqg-n8))#jb$YDD zY)9%xQEL9m2XSEVyQ)>}h&Z4vhnUi=&&Tt=(?1*-Iwk9oOY(gjuT+TjzZ(5Lvxh5R6ixVfJ!hm7<0z5~BWbA$XMM?dLEI}kq#7==p5 zaY@l6rtE6RlvWZu2<2NQE-Pv<FL)W7FGu(m-2;@Vvj_;Q^YE&5tE+ zHjxp;Ikq(`d=y|-GAO{;P;OMyw5T+Vsx(chN+BLL0#~8{#G4TGj_p?mJpZn+3j0D0 zkJ*)J*Hgqa_<|4p;`h+b0pea+uoIT7J~#N>fh`5!$#9hQx91-0zrbOJ^UO1yQszzF zMDVu7Pa;|TiY4{=x=$wOhTzLWQ$)?PPpv%7|6&bQ(@HPoXmff`QK6Hha6Pu9?;Up% zk=)N?zBQaULg=7QKrZ&EyEsA^TiQ1|7#My*4L@lTuj8ESFIdHc7h<<;ng;pjlx@zG z%@b>#PchuIGCP(QTQ&LG#?xg(H^S4e4pr?iYpD6z_%Yu8Pd!{)wi}`jYWJYYhX(UG z&3O`{_`K8}9~v*zKI*dM^IQy~|;CV;AD&M+V*~q5DRuP>-^@8Sn&M8L6M@fzh zNMb(G$ySEGv*&2uyA9#d^u{7|bM`iw=5o!UjEA-OEVoT+1qeia5=irU?FV!Wp~fS@ zS$Ej~a$PypDG%ErQ}UZtR5)o%KHbse_jHVz#w&}gg#^2^530q@OS_u!gYuJODANp^ z{S%wweydNhF}E+zAr-wgi8_6`bne>tR4}E=yH9UhKXH$yh{PY#kOi#g-?@3axgL>I z5^^Qf$oX5SIh#N?*T=AbUb|KfM7->Jip* zc%weTH5Bc~PQn=<*y`(Sg14n4oK1w_v?!kp`9kTNj%xa+D4B$5^05=#p16l$w-^a2 zc#HdbR5au+^mu&5Qe*nq*z;X$nj+M9H~NgIKsXXHL1T%}a6i`O$3}(sv>^9y4HwXr zVCQ|bdwqK0lqsUV_uP35#$A5VrBTeQqCOb=gfJkN)9zK%(ot33l>HS*H=63qOd+M- zZpZhZ1<;>jhJ#K`Q~hgb-+FKM#(MGUnV(bPBeQVpRI^lGUPKSRkz-w4*Ro05$(lGA z)1VW5Hhl^E++Y|{n=TxBmMVl%?&>C=cbiH4Jh7FeLv3fQ!qI6}Ah+h_tS_gz&*04l zXL0w@Y=l=fRhIHCZ|u;PNApvnclDn4aui!Ie&o~FJvBetWnnd6HsGLo>(qUU$Dk)o z)k8&Uzrln#rEY@K0_0tEm!+ootYEM4w}ui+jGklWfgZz#vx(#O%ZW@pKY`G6zR@hW zX%X{A2kU+4+BFP=9zN9&RSt>7DL9N!n+~mlJdyyyb6O~s@2jK`Z2_c{a}9rAx!Q~i z^r|i$9$@Ac0V+JCa9+qd~3$z_S*VrhMfPctIpM%LL& zzrtvQDoImm;;YQ&l;hUcZtQc;`hafhX@h**YR8P*eEQ!;J3%!Y z9>0Wdp6)D;v8sUtzwrfy_&?tJf3Ih_DZEm{9S(W{`ot4}XJiH1iP z@;IwP-O8iQh9OKJJk`o2A2|4PbbVf0T{nb1;jTB+^nYLW_>h`T(Vkd1pk_svC}bu? z@)i$p=l76eYWek!w`@)~FQg4`vi2(^_D@d>!v17RM|%aA%D%KhlC}JXf9!IAS=8V6 ztYL>DqkQ6nGC{tfD<-LhM9#zhzte7IjE1zrlvZiKJsMRGHw{%zkH@h#~jzX*pAqdBIGqWi*^!+Y2 zfs-RKALv4MXU6F|yoH)B&F$`Lw7m-VO6^)g5ja16DOIt3Ow!UsJ5;5|2g9OCp5K_! zXxV&TeiY$}fJf%gR5scY+F6h3qC@S86Gfo;fRZTJugtdN%3#AuJ#Nt0;KYJBn{Ie8 znaZT`mHX?@21ai;0LgH&aXC!W-c$1~<1@n>GF|)~U;vVcyIXU$)N8{v=ucI7-183B z960wy`>u&d62!D3Pi|UX388=6|1oo4((lR<)U4aynpRzY?RXuo9>OmvWqx@ycYHDT zm`SF?C*x)F@&jlnI(5wzqs@oeFpr$nt?KBN({F^;_}AG%_|aN=6-_8=wlyJNGd^Z% zD?NT%;=EdRxw}$m=KQJqAtQIGsVdgSD@m>nBQ-(BkO}jtI+vB(;H^|*e zMyvgDM%i_t5nDffVNHH8pe90@r-URq7eHvrVqtFvL1R6)7iR~1wc&z@4pPg1KT&w4 zjzPpFgEvkbpf_6)^3)&q$3=jcAM5;JB;mcl+*^|LZV+55JmeJ)HLH94JqW|0n_#tW zOCIjM8jUp+|BwWnd)sJ%5dVG#Begv7ud8aTgk&nz42+0Rb>tr3vILY+dVI1wPjT9O zLg8JH)lGumWse>IJy&b=+Ws)=13uV$_d^izOrjoIBsJ=?hOjRvJHJL2N@2cu+|(46 zU~9Gn>dXR_9_?$<6J^w1u(l4NS)kG~_|X0&O}Frc-3p<`;&ZEJGLPLRuQY6x6rR0{ zH(kZ%R;($XXM>aE*C~{Qc$o8mrvx2UP3F>N09(hmwDGQpKC2UUb*Z%2Rn}{B75HPjnUo#HFzU3#7Eh0jwjxR>OlY~J_g-b)iX!fqq^H(erRlm? zr!ZvBF2$PM5N@F}FA;i_=iR%)UDrBSef8lw{A=gDdFcqRI$vP5)$Et14zqMo!>H~U z`2KlMQ5EyUsitpRAl~HDh?Nb2OsW$eIEEFTk$LKa^O1!|GE$#7}-B~}> zhv8<;jRWeWMppWIp)$c%YcLf(Jd$0gzsI^FN#{-)*vc zdU~!33V-ZFX#{FQ{4S$95$|aRbU+YE3x~r>GLTAM?bqtk%`~W!uB%lW^i%V8IKf67 zv+wLAmnS8(_OAK!lWCOt}h|w4^^daciRIbon-4H+X}Tat;M3`bx;jMFowVA z{e)cx5^j@p*UeD+mS66dhXF{~>2AA4O8GMAXn0Zz)``KeRkZ`^Rf;7H#b*KZ-%$#Y zu-`dX#PEW`Szh&Ck)XZ9u((dlPp%8#4IdjTnhZ1%9io=tKpAvV=L)w98PAl{`)r&J zo5Jtsk{uLWaTKlO3TRO_y^bz^VfQBF-|Ol1|4muHyiX_Ri*36-&1;`%Z4_cFa+08nwz_?lx3iSUi4wMc!q6o>AXpICD}u- zU!4`SbGfJR(2V4W0XNC6FRA=*On=D4Fd2_bp;kPh$_qJ7VC4A!MvjHea6hc4qoX@> zJKY>4x?6!aQD~w1y51Az3~y>-LDPvc?)+P$g19c)M%dp4g6ydT>_Df_AQEJh%tX0G z2j?%#g_XDL(l!mag$C0F?;wv~Rc?v+bZNR$W66~2p?zcVz7gEqkqk*|f-~8Hm=dA( zp|l6Mozf!~`oL~U+SnXf)h)7lTph=J<_dmj-b#1xBsG^wW-*(QNBr8M+!6Wi(*WIN z-f}VZ`mWN2hmjnDM#gEEsypEK^$+N-#3Z)bgyEVsYq^(JAAF3Cz?Et7AxER`wC34iYNL~z6d zT&|mQ*vBcS`4-3ervA&G5J5O1s-qkM7U28}9dcXEu^e?TKU~yhTy;|Zy61a)7}#4S zwyw568MfYgQi7bvc}uxvpb&Tv7=1ku z3r{+@_Ls)R*6^Q8`|=Z3sqc0>C&G_LBDdmLOoBK*o>5>&Ai~cm|YmQyr(&>z3S#T}I?-f9ZE)72o7i*W-dE2JJa% z?A6EM_CHJn^)g)>eedfx-nVdVw!bZQXKR_Lzh`CArWZ(wwF2M!HcRH;OssjYhI%zx zQr@_^=xGd3EUKtzyVLPo$JdF=@1=yUhqq)~Ab9*xSVR)cB2Y*bPIu&y^c zUbpHX`%W3xq}ZSyJnG&fvafn9G25huc4W>d<+md!;z*_`%CVoRqZ{>Ml8=%DEuXZv z?hJ|6sZMn|D3kPDnllOeAco{PU(J``L@Trl?meu9b)uec?BA&FtDEJ{;7PK$bRH6u z!r#$?&?eP%;Vlj>b^3WGJ+zROKuHWDA~2sJ$xZ52bC7cMxbEcI3vbREGLB4qX3t6r z3lm}A-d!#!Z?=H~utBe>&CyQ)o!HlTEb;K6Y(Rp9EyN_u?Gm{$4f)7ghhV8;4o?Di za>xR|w3E>+2bj=fGf7yCaC~dQF=04buw;U^)$>XqJh|G#b>ryaGY_%z>^R&2=1l%x zux_4!k}zs2wH<)04tkrZA)sq1F<|5I#b^g5-u=p{{@vs_8)K`Ie9G=>xymnls(@Pu zi@hbY`bCLH6$Vs`I2-4>KE`-dd2`9M?J_%W7?Z*xxe(VFGJ(`E{L4{RH|cHXmL!BM zFjWRihc^ng_>Mb&Mn;V=Ym5&Jo5ZAnSr-EyJfH0UbS*`gUd%-kql7^yu3SgE*2Fv^ zD~Wjeh@Mr!2NdkIJ35WPcan_k-!1K4y^mYxeZP*X$_ya~}x z-?o1d5nPh~V|Ty-*|Ri-kk8FMVssp)c}8{5Vrp?|z*&rR@4(!QM>#D`%A-6OLhzeA zg;Y7W8BPK04HYO#Rz{QBlY5PFhnv~@(X3jGNT#%T_NmIus@!Fw8>6Y7t01Z4+5}S= zHWJgG|n8et79^IHHSR`NBbDpXKc1T;@c|i zAuREP!poCZKxh*efMUZctg9rmzj5vMxca0YEJ29MpB{rz-Hew=(U=Zyw`|Nv2^+H! zP5mNyc}lnD>Mhhx*t-96wE5Bjck^DD$x{7uG*|BVu2$ZWEL@6Nr}xj|g)?CLDGGGQ zIHa-iZ{u3T2|J{jkO& zBfu&_p^;`TYd_tGGJf05LNnLp$*cA#KGWjpx_)Z%ga%~70RcKem&1=`YRN9fmER7n zh?6-|c|bL&k-JujX|dt&b!jM3JlaU;WP{{QFusu}PIb`u#R>ochn?B0*5^ietKuDR;O%TQ)zQD&=sI;u!8q zwmmpy5e|QFSL0vCSzQ*lRSWC-p^{H-CkTLV8F5SC=%pula0T}@qw9hcXW(BKZ|vzH zgJsnsxAfutxirS zdl4Ln|G`BJ-(jzb_z8D_(gYIr&HI>WSPSa)-mDXhi`6fI`lJk!kn_^3Jvw?{)7CN#(AD3MGG2Yn9uuf|u0Vy3y5>7MX5Dfpls(aFUSUiv{IK zM#`O?JjridH(}RI*vo}M&R+xdfS>a(1rjWFE`&1Jd#gV_m}HL8SyZ&$iV_vkIn7jn>x z-yu946}AT7pX{?zXwqVCPc#qrW!|oAnisxpSKH*v>0a7|)h@Tgv&q2ZVg~@Adm6Gmw?E+cvNV{|LCxDTm=S{o8PR&S=`gopn21!9! z>$spwLdrOR- z{zi@4f4mYE^zK$AVxfmDDFG$LZ@%>d{$O11b)-ur-y0%PO?O6JaOivP>Ara-@ZKM6 zY3UgCT+V!W?k5hTh44lTH{u>?Zq?y9_WWGaoCuyL?P0RNB)*Q0xNu;rs{2N_G*-?arxO!B zGAorypY>IRTPKB_mOv0)ojDP)PoQzxgYh?$R#e`j^!O8_1oS3N-WsoT`5k%rW-H0Z z0}C(hxLcJlB5oOF4W@wisuDHAp8S6ryj9oaE-agV093^>9q&e9Q6XE`4_h$)2tjB8IcluV&2s226((qD zAp|@buFuDtF{EVyC2=auUC$+BUT0A#{I2%IW@yuoF zKITAr_;hazz_RSK`IxMh# z$j!y0c~8k~{HoU+(k)wvtAuLUmaEn1j~gDI-^xB!-+pXEY`jPR%$IF@eLA-Ncdln~ z;Z%<+{70#Gd>th@7>;!MLw`-cHduPp)j%-mM_8-a8%pdsAA98$?X`{bB(%F*lbEs2 zGrcDl3PXy_ypr!LSRMPOsmda)iJe&?jF}crZ2a(i*i|wD#wu6)jCUU(AbHCGA*r^- zyFQ|gkKsZzZi3=UHQ&cZg}g8H6S&W)aZ9*JO3;57Ox(R>eTMsC8GcuwB&uF-h;M}d z2sWx)O~}h{)Mkf-=t?jOO0N0HIrn-tIw{}&JzA_5S;CS92vX%vI}u#uNm@F_#wE!u zvFA*oKL70*MYv`_l)|{SBGZ{(Jy%*_vMS#Pn=m#^l@rm!{ua$s3XE{z?9C<~C3^4L zor+{Q-6-m3)_-`qjbJ{!wp@V7jXJMthHfH+?IgnxNNHm8li4^Z0%1&Z`C?PB2z^6b zl)bJT^kvM=-+jY7UvK_rULMR}9Lt5dQ5@F^*~-;Y3m{|$*R&|tcu&K%a97{uz4~)D z#g5&Jf2wG5YJsbYp50r_o9NMzB-!J0zEggrDf3kLfc^f%pg7f>0WliEl?#VOm@-976M#s$`ih&(Veb_OwW~f` zPP|$4yir|B35QgTOo)97fOuE1-#n1-Jry=#-=I@BtXd;@dW=S(&7SNMZG;C#D}_t7 z&%H>ZYPz@}98bk6*65$d#9mgH@t&pyi@WA+x_{REZF9LxJMGIS-k0SnZMBeBGcIMybuzSAweFT;D zg@{Pc(oI%*(bsV$jZFK>GImJle|}=SaYdu;9f#E9Hi4FeI zUoiCc>l5LH^!pF}pOW5uvPBzH!J)hXFLgdE(J5?xaR83u+2%L}+NZfX@d&MfB#8h# zECMC;K%At1yn-1Yo5q7$B>E=#1<14LWhxvT5vt_VW^+&ci1SvVD^X9uoM1(B?ax~K z?hN%#*B?!ELugLU6Fkm!?JlxUB^`JR@5q;@ME-F_EZZ_}CJHD%r@9QXPKV*K?p9^o z?-M;7!=HS|`+re8fHm_Bd50qcfg32j5h^zV@i}CI9}EZS$1YLWdJ9g$*Bd)a37L;> zDQ_Jgs!cd{M%biIKMi3+$X5bNmj>Q6Iu3zL8x~~&l3qGRI6RerFC!oj zZl#*6!QNB1%#Qd0m2yo8_OP)a0V+7_Afl@_)fOn$QFq4U-4?*PPN=`XCkDZ7CSDbW z1=|<%&8m7_Yn+SCl?_LP67!{~YD>g8(IR@f-?){i{+xFH`B|lLinfHP^|Iw}`j2<_ zq_M;|YpRP=A^@D#o5=X(A63YWpYLWn2Oto!0hr7`i%Rid`AR0&1dX7linCY~*LdxC3jfhv|Vcyt0`H zD|z3rt;hIFL@*!UimJ-i2|IT4*09oj(H&jUmI3PQ^<8jx%}1UQN8eb#u8Qz|xcFxQ zOqulSdI+AE+39l)l29i(O)Lc$Zg#5}4=K0l=|UjqzkTzefDvKYQiJBfkY#g=S9p6k z9_@t5b9auFhGFEo5LH5aQb8sz^VT}M?A;=f7z_ELryJ9wOK$yi(^c)`*|VMOO_g%* zhQZP>CKTiq9{piY>s*gC9whvnaO0MAo(nqUJl^&X0!!pQEvt=>*PsDESFrdHwaH@{Di|J%9H0 zFEQE9$f%b1NcrJk2Y=tRry|GW%BjH#0F$LGCXW;xdZsmJvtHN?+DekhK|x8E%D^>8 zBYEzUdtG$`7B>qxM(BMeyuOjCoE$pPr)XcXqJ`S~EW9n~RVSq^idx1=GObMrgdEgx z@}OK@Hcv~R>b-S=2Ya)%U=ZG7{5Pe<+!xJtOImsF`p^D_?5mb=Q5hf)Vf_nEi`7m^ zKcH%YS88op22_I%FYL^AlwDP2;^IH=S=*p;W6e3WVm0vOw!%O92XrV$pYC@)--xe? zkBfAv=FQ1)vW$s~j$Ve3GU>@uArH8O$N_9ak6sFMPy49del+?=8Rg|c>f}C9zoW?2 zmrV8$-DMa^Oe}Ar7pvz`%RxC1v#04e#NJ_>MJ^|DJO?mb$n(uq7>txT*pMW4k8pXc ztK>VO#J{~Sy?#iG9B0vX5!NGDiRnPh1e+Uiv)+@`i7>EutL{fkxy$FI>ZsYr)K=SQ zw`W)x=e>On`UnC~($K7^<<7&Ul1a?fIxeutseV&(h`l5V`8atGjk^pQ#kM;M^sjMk zanYr1v1-#tUQdE zMGr&cZBL1~K+qC#l85Y2@!XF63(x)W3FK?E>5Sa+&_+Rd-nLdVwjVuigK6ap3>;hb zUHdjglIBHVZPNP6YkME50eTd<0g;wRY{lRI$&#!NKb2qMf{j-YrhgC_==s`YHL+DBuzLDIEQh=Zc*)7GDh#f~@rj=1>I0+v zQ6i?c*77^W?_^5M;9tKSx62zW#B&~edgi9@8k!X7+3M_TFqKAJ*!~WGd?4Rnt`U6f zY{LuOIEady1!X)%v;qtU&WV9!w<(3lOAB+DU%&3X9=JV+7nuSqpcmhtB~dp%o-cd* zFHe0{6XbUdeI%=swL6%LHg((n!QMs^00E=F#DIAR{!gF}x=>Z|FK$A+R%-i8qfY0q zdm~#`)vDeChEenoLg&>`9*$YGh+26O!>BaMhgRX|WJut{cbnrA?S)S-PQ3XQ?WW8s$yYt24QFZF=he6@(WB~V4P zJ%I4UVW$Ksg3G7eAuUImaL+yshW&%;3ib-7$h9tT(5bJP0TQ2bW!b+HbYtbTll3Hg zMB4|oJn{%zepFP8DZ}de+p_;!8f`H>xv5gBdaGitq;IhVD=mN`PkzR_7KG>amzVMX z#3OJUfb9~xOYM#7Cu<9;I44+Qpp*=zIp!Y=ns{cO>>K7+FhC_aSf-g!m2F@mFG~#X zyK_up0rf|>;@-TMWz^l6HG9SfU=~EaWNfCR4|W((|A2Q-YTksNW0->|mVNeTai1t_ zAedB9Bf>05zK~hN3IJVz+-pa$VOY2vGAA3Igs~I$uK)L*mYDS{%0^2G)#9SgQq>9h ztV_tpDR!ylmu2WSZGoSLTFIH8;RK(x*L01m)~p}wm*04%F-1a#l{3}2`dg}N^Npae zm3nQX|9W_R&>+wnDT2H>=%4qZ5vZC$$fvAW*Va9hXt9~3FaC9hqIcBF<&Q;w1j=oj z-Pr0IfjdB{v48$th_b}=Uo)^kXT?EGa0&aq2ew=D`5dilP6@~07{ccjqoq6^^=DmR z-XP5Te@p-qan-d_+pxUV)|=s~lFH($A%DiTU|>kHnDi7c_6Xzg^W&;ddG@-*XwENB ztZDYJ$(27^CO{3J9X^ZznKHhuQYn6g*R21GkZ={qH}5$rx}@w3CNBK{#yW0q!e$}& ztNEDFb)Z5u_xg!m>Fhgjw*l>r%Rt+r1EqD# zwei<(c_4tvOgtmxZ?V~H&@OKgc^tF&%5M95HoESQ8n^GH-Hv^2K%IcDXiwJ;9lF$Z zy-Z6xU?tA&KGUU|m!lD04hz4&GU!DjmDp?H9D}^4PwJ**8n8{a7r$YdTeU>~y3)sS0VIA(%lr^5q z(qOOmCWq}k>7@ec@(lp(>f0zcH~v;a{O5BoL+vO@bf)Q-H8!^v4rW29)zRCcdx6;N zUtC6Kvr#zsrtpuiPSz+tr%KQ(!+HF#N?mmy=qn`X)eE%2!qfjcDNau@r+qhDg(V@| z8sQkPDq1nHxR)Ns{!Yrlj9_DhPfME{uj`1)UayUl86ds?{L!gIS{b#{=!0n<##=fTm;QT9XY zA6Ukl{GyT%bhuC{rvG#Dg=2R->)3^$RWiT-qbM=`?;#AZVb@OSLDB0jlfb9uPdfp}BIo_!dmm3l-_I``k~Iu#yzo6ED!eew11 zrfp0Qq|xNCg^qO`J--87TL6*;npPHTEd!fq{M@)SI_atSpAG&_p>7oQ!geYl)5QCc z1|aJ0zBtdM3VJsrl@XOf1Va8Ofo}_BfsNDrbtY@lHsxs35y>dP6(KHf;u?2#upR=; zjsV2g{x4$@wkg}dPNzVda{jGYy!_h&x3R`*-a+Rw~v^Np6pJEZ?;zG(DfGW6BY&k5vmi-hoYv zBIyKWzaDkho70z4?zLFi6Q<6Me*Mt zC)OudcS+d)L1Q~~GUqlQ)oBfz61N=q`H(uxNQ`$UqqcZpG+U?zKD6g6e!ftSO^8#F z*;-#in`{>c;DG_B_*`2_amdOuBupW|o*~V(l_c)&D~&qkZ>*MAum7*F#Y+ zw9FLfS0aD4lN6V!ycQc$aajIe4?Th4K{@(lz0u&$%LqQlL6dduzpOJYjqZ;AtIVTt zsSIfw;7V70EnaiYmrRT;a+LMqI~-A0;DgPS2)+`J*;*KpiV@h=Zk;3y_hcpLpKf_ z3_=d>f%PQ5L3TOXBnNKho_W$@fH(%E!KeN57rGi;rH#!CfNSH%W-F)Gz z2$VhPq1Pa`(Z>hVm83#yAsQ(k(3?-L9^=^El06p_Hp2C9`EPajRz|B~s|2|LdX93A z+wTxQakWPQn@4oR^5 zDFj%} zW@Am|L5u56oqJ5Uy^erQeN5ze)8?>Q2JO!fg;~`epVJp`$h%P$QX{ISe7-`MI0|{0&c>oLAjl$Ik785 z6r+Q^{+iv3^tJ3RROX-EDM6jK-ZJ!Vq*M__vAbnkw(!NQ^a;?=<7VwUZDyZM+l%y0 z+>5r3a{Ionu?XEPaQN2{?VFN_#$tekCExHKV#GetJ_XURDbUhoY|S5iZN~Pkh;OtS zJ|&bMHATj5c5t66$I z&l)*?v>LGGpPLslzw)vd@KCI@oe=`ytUw*%5h&b_5_IPfRAS1EUF)RLovdBF4m?`1 zmH4!)(=p-Og}XW?WtB{R?|x+u!L^=N-6}KMUG2C^fq>Q-cTU3`)y3)gqM{lguOeAtHqq|F)>#mcMeFzVb-OBF9$X;yTm|`{;mMzd!TSSUI7}Hjw&pkOq2s zaPofP`wX{{cR6a66LX+xLG#P(?u*?-mV+(b-PO*t4UWHQe$p7m$M8W)@3yrw{>jRh zJGaILl%2W_ChJUzkna9;)yaQIi`ufPw7w&X`dop23-K*70sDQgb87_B4gnVZK`i$7rA_bPV!*R8Xj`y$tR$_btaOVL9eo=l(X?HYuq^V#RHHrI#~Z1^h9VFyM9UL zid;hUj#cE5`|66pSLL{vJguG1S(mdp!5-XazTbj479P!to_`1u?(w0#SfKz%+oUzB zgQ{7>^doCM{@)p^GaBisV_=-&wa5uj=d*32-Ed>Q)JX91n~^Et&=DTi_*)$E6GPLa zI#;Z!S|NQ4|M$_6%V4~qaP~y@{C!)}q>smhqH+5RA8J({sA~#(Gl2UvW7`TEVPR+M zY2JVGaz26lLw-TAm7U$aNQzJ_!G8V5YJDTAf+cw50`l%V1LPX$k`f-mvx zGD|ob5_fxnN`rh)iRZSps`!~np89m7+u=kD`uNe?u8ZRmZ!+Q~;6T4o;69$ITjtRf zI)e`Pqw}o0xa$tzmWZC79Pu>85&L+oa(R$W&K9tuS)clJDXi+*D9T%6OPujH?QB~7 zUf8$`%u)kUf;r%1dC#x!wo2xR8w3QDvyzp4^g1W!!Q}$+shzIL1vtghU+TNtWqXvC zXkOU$8xVV>BU&;!+?91!+VP8(53~EI`CsZe$0|go4z7VBCb5Te)fZ);`?}do_wzer zN#ND}*tY}Gx=Xjuf;*h6o>HgAj;xv)>0P`TFa>d2k9d-}X@n$#qZgx6~@k=MMW(w@jDiy_)CV0Q2^` zxv!yQy{&TYoA%Mp7||BeylR&0_~x4m7{g=3kIt2Ly`*64+%C9#`{i;R-CsS?r`a}0!Q|MZG#v@Bur;A$G& z{;Q3kGJT~PBz6#=Xyx86f*^Z**izHatR1?B+H2`+D38ISEVak3oxW@T67te|meXJE z1bCuS=hP%l(x$0ac9TDS2!iKuE=JSPN0p;0I#pI<%^09KxFrPF5yWDJ{*2{40o0c7 ze}$%_1s3&(-EBcHY!RfwY%$&&Npj};HeyCSB~)f!T;|;-bwKCr%da_9)fl6XEU>s4 zK2VoVl=Lq5u%?k->oi%w%l60obpMd5p_dYFhhAEzPD`9*z2MmZ>Ftn~9xo8z{VOFR`z$ecqrA0L5x4*I zy?UNPPFmc4sLv)r; z0C8|S{;Z?>@8ZHwM#p6r_3GXcE+>C*n$^f8bjsfpX?bM2C1Gxlo!E5C(1b8339!S& z*y-uD8a@=#$6X(3QidZWLGNk@z7Ta&2Gu*xXO8(<6{<9TK2ja~Rchr-!goGaQ9Sl! z{Izj!{JBP)E9boxD|d zE5Ui}8pp0_uz6hQ%CD%EbJOe1c6Ihv2_0h^PTbu|>uHQ@$iVPMpYu3y&|W_#9s)s7 zqorMP>~GIm<4)8iBkfu(qk8zqDJ89w%ZCefRDs5egx7DlDQB_Wr_{`pcr!ZIlU6Oc zt%{8li}hMmNl4v^n3Ekb-kNv=5N-pjzx3gevDPKa678xMR9dZm)u^&!Qf=qW1DWiy z7i?5VHtrk$W_T5^v|QpPEFL?%2rKf*J3UDocU(x8@AV^;U8o>j5i}|5rY^E$7e6Wt z+F3Jv-pd?F%eM6pse=I-xvrwB4$DDNH)~gDX5GqP0HYDiOJKu_!%I0z|}6)w&=ia#Vq`^ zPDoMuB*3aSHs{-wz$@*qZzpw2&(mp#hP%zq;*n!>%RgVxu(wU+af3z;1rzwtYSF?d zc^9SH;{`>29Mj*6=wS9$k-=XkECROE5ZY$D)xvhJjfrbeR&a0H0&CRx@e-yX!FZ<= zC540Ioqqq3=INEs;sXWvMC{)aAKxcenB|l4*AaD57qkh(HbLJvThEsr+4l!ADhCG) zGU=zcKTA&GAQ!Nm&(GUo8eH|9$FI|cg+mH%GZ{VMVUK0-Sv9nuzAKXlYj1%JlD@b? z0gJ}ONyZ*ABrEgPETwd=7PcEa4Lj8XQ#C^0QlPV^g44k(95^nYP&M5SK z-}+|p2&DViqzVEiM-}~jQAxwryv(1bxFk<{WVuIq;%9&t?F5fFq>DYl|571bPU*h9 z1#jl0PYx%wUg8TPp?h)!uQ9ToJOl*N+}>tU{iSivvj5>MVdjaJx3zItzokT{cxN_E9NFoQh9=n+q4y+!yG z@VkAA>66=&>ZP)-=CX^gLWC^fxn-m+uom%B^13K|&CWWo1ay{+NY~V-yo>LLiRV3? z5KISM&jvs&&`6JVacfY}kFF4=g*}&|E_E?}{sIGH^q+%M?sW;NtwykilpCQYr$iqo zY%)FooOk~ojqVJEjUjUB2f{&avz^&mjIB$x^*7j z06nJx*%4}`>*;N>dA+R4=B$*KM*d!(!{7^_K*H^I9L=)Z>sFs=ndNf#M!~gdRVx|^ zk)R>6Hw!5^G04n1IRPeL=et22qf*8?k;-EdlcNTl=m!w!`bZ_ls49-gJ@L}55^BG>6kOVIwc6MToM88AZvHW|%Xv6v&fNuP$B z|Bz1W5qfY_hp?8Y8a?T|xBnc*h7JN*ABN4&!~W74pY?$xmxCTwiTw_e)puuI)b^sN zqtOMob=rM~Pce20?tWoI#~M{IQ=a{mWA;L$v$;LMDmxVYS`>B{xb5ZhNp|%iO*`A$ zVgRHE}0v-u~z0c{b!u?H=WRQrR z6Ow)t)FWkOX8Jdyy1L}-`?zXmrGy@Vr(Z;~5K$|X3x+E_m(ajgWE}8R)EgRZ5zq4&TS|;N}uY%8zq1 zGa~Ls8(ShqnDGWmasn{}!bimFy)S4R0I9r1dFg|5c9a7`5%r*>d7p6AVr5}Axwn3V0wwTUYC z;9pe8;;0nWXX6|hGYaQ{q}O(YuggMkY!nO)^55>#bG7UpQG3@mY)-M7#JbfF@IimbM(QW&M3jN zFXsMWy%d9DEXc08!IEhF2Ki4|{G6xS_7iO@49Ky{imN`2VXNFm_u61H8q+OPp+vdq zt%ZTP7 z84MinCI`ytLLfKg{|=lTut~O>StqF5m^ZD?X?GIyT+j>x$t79pIP`;H-SVA%sDOB7 zFwpS(3;4}rg3JXhKz;}V34ba%28F}ZQ^Z6{!Mz@F4$IOI=t308Zb2aZA@ndOTpSwO zrVPIQrkF9J9t)6{^>JXPhB;w?kE=2?3r1t;`W4Z~U`8*8ug1DJMc~ zn1AHh?b2w3_XgHFlI_;NyKkr4*NNFHk9{z7La48=bn9*l7Jpm1ehXO; zH!~5CEs{ov&vJzM96D=6{l5$VsFuN`L+~-L=J0>-YV;f z&;|n772_Bh04<>VIa4m89sn(gNlBedoGbGmcWDJ|CIgoUwiG5gHyTn9)b`wQ*Wn$+))CY*{HXgRqqj~jy zU9+ln-`Y_QY(L?c|4Tg_i!N3XS|y!!MjcPMya(NV2EX^3Zl}^;o_1HlGlJ;uy8L?J zY|;vvmPLStNCP(bU7g2rgkY-I`6d|nlk3Z}v+0Ru#7eYkoWl2kBtdT!+<>0ntl!}B z9J+lg{q?wYb_otv9G5_M@O5*%uu1?{ABLqnxb>ni&U)V0W+2AJq!Ke>U2 zA3|C zlI3|Qr$@=sVw-=w-iN7+v%}3-$Oyst^vd4^2B$xUPRMR85bURKr=9hi4~ipgD0nkJ z5hkEL>;X>-qQ0gk9(|MTgvvcwd26914c)QnrZ#It4A`s1!EcP?()rNyAb!%KwPxFn_X2@A5Y5#NKE^lEDN@rDJ#J1P#;?5JrumzPf(~`ZYd6**YiONN$ei z=FapSjp+t+7@ed1{m(pEO--Ih8^bXYLvJ4vCcNUo@c>sOs-mAS{V628M8(LRg0#8- zFSM-p(iQ6DGKn?k7ec~1LZC==s+M+6nsWJMLYLp_S1!y8QQ-{=VLO;OefbPSL;g#H z`9R_WI(666VA#0WOr>RX&B;<254w}b>o-bE%VgmoU4HC$d(aHu_ZWx!F^3n+66oc2 zVhN=ZqgJ|O<5pT)+9TZI$;l1dIzS4-#=3T^4DZ}JyKvQyfcrKO=sOdr4K>w}R3vhh zi2!RoK`m(Kak1YGij{?~8oU{((*-jBRE+67wAL}!HM(P7Z!{scH)Q=8kU z@tWr2ZF}z-WLar0Sc@DF^kG^HV%oZsR#vw5_Ic*{A81SO`Mp*jF~e5PgXpx20Ce!S z-c6_7`KA~%+o|$Eltmtf_aZ1X?u9llp-vA$p>dx9ny+SoYQtzF*=aDtJ1H^oN>TX- zpSE|g;sp_%qD~ery9Ar}>tLRPaYr?LM^a$R?E#9lpKwVWEJQ9j)`z?so}LJ135m*6UmMq-)PKIX zKU!2MA{hs($$zDcfL3;R-1)~JIGpL^JDb7YBQjqa;rA8~yMfub1lqMwkJ#Gv-2Ldm zS_rh_0Iy8;Wv`+t@qFYJhU>PT(!E`SCB9UlqD3sa2SI+mE3YVG^ymb2lq1pPed)Es zMzF{eKu3Fexl7t+*RU-hDEF!>>l2~te52b@n!{TE*O_WtcRd6AZgK5g?ZY$UUmV59wUoV!ZTQ= z4aEqcTXX`nPjle*lBDeF-tYD#tCt<#du_Oz*l<=4zzZ>axesvX=DfU306KG=@-idNQymA1_xU>BKmi>z<$L2Rjfd4AB9D)bT4%tvj632{@x_0*z(^RE{pc zDOvV`84AUH6Z{=ViBr4M0??`-8J_g0dX3EM4+Y(#{kEHiwk{2MYS)57_{qDa#y*7N zU$SqwedFW3(;Xy!biZCCUf-P^zO1L^QR0^x6cBNPmi^!FC7jG`zP9*mH~&BXM}qGq ZJ+tD0;ZM}Nt3MKeypUCqDV8$y`wzH>;UEA2 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/auto_kmeans.png b/assignment-3/submission/18307130090/img/auto_kmeans.png new file mode 100644 index 0000000000000000000000000000000000000000..05034a150a09475f801459cf717d3686478861d9 GIT binary patch literal 22069 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 bA#sHhMfiFn=uT6hoshns@wvh?4&na+I=KX0 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic.png b/assignment-3/submission/18307130090/img/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4f4aa1c967277d5e5c8189ab9eaf301846ee54 GIT binary patch literal 25278 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_gmm.png b/assignment-3/submission/18307130090/img/basic_gmm.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc25517e78447a477d149a02ad57ce163e4d0ad GIT binary patch literal 25760 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_kmeans.png b/assignment-3/submission/18307130090/img/basic_kmeans.png new file mode 100644 index 0000000000000000000000000000000000000000..4836daa5fbea4905b04537929902280b87d53b09 GIT binary patch literal 27121 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 Aod5s; literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_matrix.png b/assignment-3/submission/18307130090/img/basic_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..3b48e69f417ec5a8277603500ab75b3a98e581a0 GIT binary patch literal 29523 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 PS0X7UD_Sb7@AJO^uYG8^ literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_matrix_gmm.png b/assignment-3/submission/18307130090/img/basic_matrix_gmm.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f8301fcd213ca4cb4de0b062d4a9f7075e3e93 GIT binary patch literal 29864 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_matrix_kmeans.png b/assignment-3/submission/18307130090/img/basic_matrix_kmeans.png new file mode 100644 index 0000000000000000000000000000000000000000..319f94835d3a36ef150a1fab479c29317359e12f GIT binary patch literal 29727 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/img/basic_triangle.png b/assignment-3/submission/18307130090/img/basic_triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..30337a41f763feeeea8353a8446e4ff9c54e3ac5 GIT binary patch literal 18702 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 literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/expect_w.png b/assignment-3/submission/18307130090/img/expect_w.png similarity index 100% rename from assignment-3/submission/18307130090/expect_w.png rename to assignment-3/submission/18307130090/img/expect_w.png diff --git a/assignment-3/submission/18307130090/img/false_gap.png b/assignment-3/submission/18307130090/img/false_gap.png new file mode 100644 index 0000000000000000000000000000000000000000..569f1d156a7b6a8147ef9444047e06efe2e9a1a2 GIT binary patch literal 21607 zcmeFZXINFs(lt6k0Yw2tf&zkyLIN>@ z*j%!GF+cOOXW)L0;0B9_k;w=if>g$3xAQuU#A{(muY`LMG*pMc@rb^5HZ3iqz+clo zjmbkpU7eMU&HvpydYMR)OP88L)l>F$hOioLC!0LPE zw6O2Xmv`*!isciK(cEXAPqNa}&(ri=CFF&(QE2(2qvw1r_q;~FuCJvUa|q$38%c-q zA=v#te+ED8AN_R8Iz=Xmel!`ed+|c?v;8Yi0yso$>Kp5tMB@z&4I-|44h{})q<(kA zT9}z-75Y)(aAxU0d&XrmEB~3Ef#D|0ISR7vrJ?QFABmI1_~TzZ@rbDSEf047z`M1z zwMk~!d;I+;U%kS1@~`{)wVsaUab_G>UKjI=!n$~|*OOCIp08f%cf^=If8KS}U(BXf zeD)$|Ty?dkdcN!aR&8zVw{PEsowvdxBG|O5)r~eE6A%!Dl$;V=vUT#rLT;bIenQHO zo134Kl5(E*e&*8xpQj>D8?(t$VK>f*;}KHD{o$%-D;REXm*u}FmDEiMW}$kn_OtvS zTEm7Yi|XBW!4*c1(}aX6eF9gn-f@i2|Mg2(^(yS$(}43}PwwYxndARt^S=m@O#c1* z_YzT^BK?O4hPf>+F_qe1Uin^NVCHy6b?e2iqx}^Q4i1AelKlN(bDeeKqAC(dMMVYW zrAuXHWyvWi?3$JRt*z4hErz3&j>W~rbpi{0Ioq3?ZSCy={{G2%IeB?jl9GNqXE%tq z7y2wZVuU9@lGU5*FfcGsTO*%NGjec?RL-os8(x0NE*;rZ65)c@1 zQ=LD5mGzT=EwjIg_fShH+l9v$g&bB*a;nJ4$r(gK7l%q#zTna5>I=oE#Rxg(r>8R| zZ-#T}EG{h#tswfAxnICzc)xYaPCBTPr#Eow?T6 zO?eP-PyNFKy+v9q?$@4f0SImY4Zmy2WlR!&7*NR9I(g3-;)nl1)e%p08i7WakjLxH%bWy;Kld9dp=z zd>DJJ_xQsL)*BqZCCk<;D()sh54aCAN_~(o6Smp z`lwvl-CY=+K2PmV6r1*T^?mbqTUo3qUH+LI%c1Gp%vSMq=(~u5U}3<>+^@#RPF-Im zveyolO(n%I+nx2Kw?Z#bxnD!doVc<9@tNZNWcNMmR+b@bZx7w-hOBK@6N??=z$CGW zvWch3$vx4nD%Ru?^~yBm_wnTfpLxV(Dd*nf2I_XT=O3)y1su-jwponAgjv7I9$a%yQV)sNDaeMKF+8dY+MRjaQR*8mA%6@kvhJ3W{wY^#Yx0m z@SdkdNv=AD+8NOX33G*huCvAscSI$S6NcXTkqsU{6GmP>Z5f`@+81&7IZrsb^@nHF zg8%iwwnN=$T;{q_eV=)6I)nMjFMYGA68Gz8PW<_hA;cH+CE%Gn4dLD`?2EV8n@uR{ zzrL&IXx5f|-aJKvee+PsFFUkHvS>|uxOH;g8!yo-*73k;>?>;QFPO1oT6U$S>RrgS z4v1%5*uOHAai%8SFQKnKC0X-lKI`&VSR9g1R-PIs;v_KpK+${s1AdU)A$3qkuMIwd z3z7HOC|BjI_M={ZV>>zz>N?Et_NVWdgsxdzA5uornabcP|K!a&rWNn!l0NP-Q?1KB z*=dH^4EiSB8zwX7nmcZVUfA>Yh5w3&ztt;g%*;tl2nEjC1J1}JR?)Doa?#JdZ9CzNC4Ea-Hca}rwV#w2X zm%n!YwQc@ob_KHGLN_)AW@>^+i)1J}hDW&$mS~zjOW!82B*#pvq2D=0@k-VHlz4G% z`XXfyO_}%^u?edM*O9sxQMo!7mr2oQJnj+?L7RKQdOYKr9Mf|X^)v0ITsn<7SA9|~ zi16zIo|Q6Seomi?up{}T)4-ofyLOA7j7YjJIQS8{U*z6Q5NXin>0B)L!`Li>KcZ5M ztGGpVw(XgTQ({8)TtxvBtxA*qS<&LI?qzPfvtr~JmqB59^nxq7z28=(hoH?=rsG%e zPZyUo+s0L;vAr%q;>C-&%6~n$`sL_UGbP1w9*!$%DCe^jgr|$bf_fY3S1%-RUrMu;>mg_J+5(*Dw#dQbZ+pxG~ghtTgeDRBz-AK1j;f zy0#uuU8LhcZFlx78)o)<4&RzM4)PsIsOg4Hp5}19D+URjHKOcE- zCRE|YJJluS=BZ@&9(vY{U$KIo-WSPgVxBA<_KvQ~#H52)0z-SQk|#1AhjQ#ce-+Sj zk&uoZ#C#`1a6HA1#aDa{RwaLlJ zrKF^2X%im?(Tm@|pFbTM3bB7Q)eE4_88TLR_O?&AlvqPTLaMe$or#1u-lwO}C5XTM zoFN#|5e<+)fVrm9t~5)CvJ2nptO8Nc13hqeS?W8s+9`K`ETe%r#61-Z%IbUD!+MA18#%mb=7xkF%p;V+o4X(S$$4XSa2shKJ5^V+I7~MsO)02wkUyT( zX1@%ldu0@{Js@rxJvPZE$6Q)+I* z&NPKYk;9Gdt}exAyDv}R8FI2^_YMzBcUZ3ddT8~~8KQirxcRd+spBJ8lQ?S4J(Z#0 z$9$h^)E9rnRO^O}*q=Xt?%cUkV9)`0wW-4*I(@u9PbXC_R#s9nfrRF!errL8 z2+N1>qCA6zMi<2M*Mj69tc+HvIi5B$G)$}Xj#294yEsdQKaw6WlU_!H-=Sv`rx2X8 zJ6#m>uy3hKacsc;Pm?V;v)~#CtcTj}-+0HkYl0Ido1M1)#3`H_Z%@Bi+Z-7gdH>zT zJpDF`;?Ay*(a|y;WarLxCcHp~1_qh}M-&qP4cf@wHa=gpmS-oz!!jf6wcIYJ8 zxwyF4-~WVSpMsJyH7TicZGL_}r+ROGvi>b#S}ZIqInl$ykPuP=V{eJJNFI|quhSns ze29;aFQiJn`m%U;k8d~GT~w5~h3s}?NFO(D^4N~Zl_}biGy@Xy{&Urjov-I*++6`* zltJs^TToEo?d=^Of7RcI_L{1kHvrlBS2$<9{uh#E&B@4!;?ik|yW>giFpdSjh?0_W zTFI-WxtY;se|yE^`SX0siM!I@uvC)^%fCok&5eb#lx}cz=-wFE^eaz1?|2s%FKJTu zrY&k@CXb?%cyJEBXCpA#tZ1t_E!RII10;i!au%y!55kOV(MVy#&qv>Pwdoh&1ycfk zaZ1aajB^>%}Np7D_{om5iwwhTAlT21(Ce!~n>`TbL`)NyDJH#~5;>M+v&%11Y>S(%F> z$Fss{H-Ech|5xroS4}a4<$b>x=IqSa+&dya3aiNJwdXK#<~C7xC-NrzY*-K0~ zSz$+PwaM=B(Lq*g=?~}nXpiP)-~lgm#Gk#Sbr^YtYNeSBA?em(JERM66H5_@$uX*> z_M`r5k3Bxl<7OzYG41HAHxE#F+!fd8Uf;snkXmb7@iiqV4?z8p&uG{659V9dRFO~X z$Q%m0wcL^xsKVrnk+@&a?dCY^S&c@+@CPVt&Z7f)RXxjGdGh3|lT0|DYQ_oLKKfEl z!*WE+*Y+ZVFILN?YnZ3{_Q{lc3wUPn(aYh~0% z`uJ2`*vbFk&C3&4ZMz3_4KXO z@vF~-T9tQecpqm}v6ClU9-+ldPF&A5h;u6|%}jveg9M+CwUY*Kl-SzKqt8Kb3T$3V z)2rEV`ng%_3uvTSe9YC8$K+U5*O*J*MYh0NviWJQk4>#v>oS;cOfA+1Rd%UP#Pzm5 zhk2H#B$dBBx;7hT@HK*@7?&9hQQ}olkhDF2RXfMSO@aGx$qO(^KbEIrv1_UClo^G61+c79(-wcG!k_oE!`8}`(=67?L#^Gi21}Ygfs)#8kvYuaL#$8D%+Du*(3e1 z1Z4xoaKfFhPl6H5`bqUM-_Kr48cT-AK0q;i34Kt6IdTen6|MZl_cLOJvbBrjJjT>g$QU)fS=P?Ij zl;O1wE2*`19uD23WLtQzcimqWwoj+>xc`x&QbT5aM2YcPNtJrPsWa)AbP{6T)#7vF z!E926)*E^HAlJPDq14zCBF66Y3!IS5dN=V*<&5f@AR`6C!ZB_|n!_)$KgY~0gl(L{ zjQB)Gtbp^@BO}`rY9?=0TUpem8MIw;MeimEhItQ6FdTavYKe|_)pV}U2Hp+7cUaT7 zQi_Ln674-Va!V^;7}IpP&2*3ne0=<5bBAL0v{ZTiSVr~3Ytl3h^ykBlyfx29tMRJ; zAtS5Nv2R2#645@LqT8IeBXdXl?0Ne(MJ~a{-NNU^DXwn*)yyuYqeo|1JYue?OYK|O ziQw>A1&>_@|JXxP%g)Xo8X9{4{{0|&8NYXnaXd6Y$B57srsP%vBwom=p%%0=t#Lb~ zcHQ{lxc-}zWY|sRK}Y%lBOV@J-cO+M!nf3%B}Iy2stlObN(*|Z*Bn_Iv$m^LAGh=t z`byJZ&@cSG+2t2U7kORLgnU>11+W#2J<(M+Q5pMR>=Ok=c{x~CQh$FxFleOY1v;1U zwJ%%TZ@1am$rMU zcjw+QOsx&nMe}e=Wk!q5Diqjz8?Gl0)a6UgzIJi(w-;w4eE)JZL`m`HeXi(X&B~#Q z6KKpHu4vu#k*>}x{gHs~_xD?3%J|w!N=o|AoD~!lHvDF$r%&56c|?EuG?@K@55{7X z(D|0{o79T` zUqa&>1+Qwy#>Q%EZ@bhpdEgOI3t5iW!s`nP2=MaRa~3@l6BC(_6k9%nweqw_pj`In(LK=b;>Mm!vxwiw}|Z{NJ?K0ZyYu0EPejdfe8+Wtm2 zRANDN_N=tD^l*VeU_`{g+H_0EV+%b41A7x1E0*X{ZB_OwMQ`@%fxR)k!&671n%L)H zYl~#z+NB1~8SHl!dD31)oE|=vN#wLx7*yIB_Vz|$RIJR*^mLH%H7{lE0ya34q;vP%fn@I!kdqbjMBSQ z&8{;rbT>SZlF~s_qN?UiKc2KKU*=WR?B=h(BXa&_TfE^?*&|O*tKS(AI}Gbe+`o&u zMwI@@Nh)YE+rY;=tn52cDsFYIw<}r7dq^?;=kRdl;hiVV*NK~ea<14-d(7S4ad(8C?69B#Pft&OOU}W2^X7&28DZk$jC5dHNLx~V_`AohR5mYNs!X^ac!D> zE-Lp+&b~$0+$FE4a}bkP+&}+cW2KXaypYB2P|L1Q5n)`v z{vi$1&&yEju*`WOY21(4&T>I*i}l%+BlkwjIjv41CvtvSF0D3w3m59IVyIvq z7@x;cgiC=};BCHIZ8M^1MTk41ZBms}n(y|DS#EFHcNcYna3(mOhc7)f;}^PHfC-G3 zZbV3jOXWAFwk1w*2&4GU{2mdU9=m#RqoV@BcWj7ZJJ4{fq+!24r*$V-Pxl0(F+j{6 zPjO@XuVx)vJMndG#B*xS)35IUtr}mP=Q(iS`ShU#z3F?cy}p|dPk35*2&Nkux()mh zI@EXj^Hy`^5*n<=8=OobRb!^l(mNykvg`0ty_XA+rWNjQiu?j3ngW@kCM^lWj&RH_ zgsB|$OYXLx4=gn?m9aomVVyU(PU zS#1*6MBCDn1crH)U4smyGjp5slv-IB_&{W68X6$)BI2^7e_3roA!JiViS%`BtKhi- z=aoHcNn=*h8Id0Z#kg@YZf~1P9!ZlVzBXt^Cl8$`;D9TV??gohQUttDSmANl7)4glAgTiAnW_Rfde@`mgY??F~oNzUGIhU~ZI zni0;SWlg(uF;ZI@9g?skf;QG?Cdl9nkk9~}Hz-Y)Ji}~W}7q?xiKl7F9 z=3)iE2xiXhrS!I6wTWUI%h30=@$&?HxU4Y0UxV1hay}dOB5u+V(C=4+S!c5}x?6RGkW^*ORO;5^)F7d@BGKr@Ot3>tJj z1a;H{k+`-rCy2uzv%0L=-C&Q+8VTat{w|j}{5z_F3@OySuh5g$vo>{s$me%14>e|m zHR?W*DqZd* z2A_>=D&-!eCCd>u=He8+f1p=KJzHZzkokF~H&eMzSF>egY5?0K;C++s8FkvZK8KWU zZ)zdlyMlj>dc3dfW>tvd$?s@18&kxVgvI*YvA|w-Tv1WbtKtlMpy)=VC42sMGz#ox zIJnyLdS@BEY|x+E^b^=)5p*vrjUvA|jmr4qD>TRGL^r-lB+iI_)2h1lB1A~Uh`+t} zQ9+M{+uT^mR@&SneUH(pFh$+;@Mf9Anf&hD{lT_!uM9q*ECa-U-->O?6^uUE{m~DA zT5gDJ=V!@UB7J?1d3#(F8rhX_OC>$_n-W=*bl!0p&K7_)_3&a~*2cS5K&#Q|79ZcK zP{}X3o(5B;?vHsN%P8uoRNFQf^NFV_Tj51fCNFQ!FkjiK;l0sqtVY0o`5#0UuGurJ3&0N9Q?ycq0fz&rFgGH+u1oKTa-(CZ}SY^JYI3Z;c-49hpi zcI`JGJ#fm9C31PTUN#z~MR7aYm@NKRVX8MlC5K3#J9*wyq1!$B0(rcHZ^f<@5eZ z0bqA9VMiEJsAi^gsD`aemb>u_*;i=oH3vQ9eVs73vR%(ML#;&{`?9E;Bcn%CiK_jn z;A>VW&23uv28e`dh*=*!U_8~q+{T)nfK@W@I3|NeI=@3Wo8ilZ z<~zG~%0)zME{zg&;BgDfT9l|C? zpH_G&dPK|o934nBG&HehjCA|XL^u=9^m4W_Wm*p02U6~fKGDulV)VM4_H-mlp{hi= zmrur4NKSMHyYIm?lfzM!np<$MU5!n$E!J%Vv`@1PgwW4Qn!03iyy4G;6H>=|atyCf zGoR_`Gx$)bO_mE7(IJMX(Vlbp1Lv4`k@YFHPRW}3Uuw+l+XU^UckF9+#6?Ut+yfbM z7qC16&|JX;HDso#XZQC??iI&nc`bZ>r?o<9ova>CyWPbD1jB6=42JpFwCtU33mY5c z0hMy6vzS7GA{;C-p>h0mUPotYt~=F0cer}h`RP-LXI0ysVnh*N+Gu-$flCyHFi&X`%*vjT#UQD1Cf+9=V z1xRY?>FK>oNJvS2liQ;Bl&WK(bkD{0V{p)EXLVw8Gi!fIA6QlM;nFv6-n@VR{sXN< z_5O0jWTL>gFSy;*9OkzqxX5CZo5>3Md-7HPd>j{PVs0ZLKn7t`KthtDu=0^k$_tRQ z&G+|L2?+_!R6gKwCbJggigO(#=dJW+sd-mG{>RNPVz+p4L{>&7Sw&Q!+?MQ=g@wh5 z6CldK{*$+41(5Zgvg^Y2;AtLV$1)2Ze)lqm(xm~TA?%{#elDc+4B?(*4xS~T;aCw@ zAt9k}bn7!6sV_4@-$7Da80qa@59NUL$WOygMv;q)rcS<7Q&aUkT5h}395n|Y%|SBa zf!jT~_WQTKlTQ$XoS)Q5w7%ol%*?_bZZ|QPN;9J?g9X0!nerCz<%3S&Jz@9y_Mr;MLw9heR(YswHashxm#`+t>u zu*LzcJ+T-C%tz-!D6D4^1OL1bh>UtX&XLW6= z#J=?el7?Z%G`0plT*M!z;m|F>K@eLEyl&APpm>1As{Z&Ca+?+d_9M&hH*u=%UJs@V zm&Qjh>Jp#q^Xz(}R*9mhUBXb9<-eckQsb=R?W+;#;US$EQmMRQ+2#h$s=a|)M;Got zKm5H^H9=Ba)A*eu1Ph5{!UQYeI4`gp#;VJI>4nL^LHj@UQcVSkIl<@224V$XSy)IK zhWyn))xL37-(4n0ZNC!+AK{3e)K^5@9T&HxM?kuV3B}~Bz(->{*lUxaCdz?!eC6Xk zOLs_WXS)3c{`u{=&!BqIVG(BXIK!fv(|GnDvr3!qD#Di>gTlYwjZ3Iq!~DdfO*Lr| zoYmtY@^;ipqxoxGWiz3myI7|70ugKol6Dy#5WO$k7Oh+b#;hgQnM$t#va1-Aa-Uc?ADI%mQSQGZZ#2kW4@_%^86;!dO2DouCH zn-zb&Bk)^3?3@hRN#CIZ_{ij8kE5IWx6cafaFvk#WRkppeim;HqMh%`YY!RMTTBKh z5D$8=o(ihkA3uJ)CY{Aq>vjV7>;HfyGhyR$MLS-QJhn$D3}AoNV|{&H%jJ(acrYw{ zn<;N{%{cExC)Ib5x1OiA>SOd68@>RL8Q})bcGMe*xn=zu@?&7Xyee#_c4uN!z0LZ% zj8Q+HyDgcFXii!A!aAW;N0n!=OifLx$jMVHuhY~21}W7e&4g*FB~x%6-@cBs`r!?W zDQKm{V3{;dX|u3oeE z2I~&tnTd%Xc5GPj1kRs>`5#vA@w~)#c&#M>$F!4* zaBsKjq$RK+$;8FO0ibn*%3nr?35eMI{rw{%o?2OPReZc_Zk}CMwkyR^l|)tREjjz} z?Af#VQ0gPbS@j{H{AMg8;|~Hz2s1w|wzALRYp+Q4q0ZoM)OMe%C9#kSWxWK2>_fA> zg(9&;O{chjXc@o8f4+Au;)Y)H(cwNh>ytRD+GfMuLZj|)6(qGly-04#0^Ra6^XawA zMT2j#`Ad?5`1lZH9*`2OjQi2znSj}K-@WhYQ?6P zIJIxPx>l9y?r$w^(9+S1j+vVnS$3eJS;5Ca$6Ql2&0|Mm$JBJIga=T zGMPtA+u7OGT~)mX9Hen^4}(8;|JJ>0r~|-wh(BI)xMTs9ejA;=jk)9fvE$hW;Nj$+ zwPyE)GSl2?Y;5da=$|1wfm8k=B!n*e0u`0?!u9Ld8HKa`Q98>zpFXR4owu}i`9&s< z<-#ZwhBCEaH=I>CiHufrJ~cHpuoWLZ{D6I`v7V8&tFkk!WC>7DR%FuSwLbUQ)%B2$ zuI|HQ8_zm5_18Z27Z_w8Ih|VoHgID-IBd+U{2m11NEs`B2`s7zCA8T?xe(0$vE6iY z2t0kA{_{ptQbmPea#2*2nz1pewB6R)3f#EiZl&Y8shQb8k>K8`NX<#NLkMOC5{}Ot z97==^YiVWZqW{>d{=jC0h|&{iQ^ef+{C4c^D-{MMbd;yX{Q8t{L7WJ|cKG%EL(TD#U`1i_^v<6t z+WYUc!;HCL=LXf8vf?+uelwn4(}P9*Ya%rVYb^{h4zF&Fmt|)MkSRWNj1NVwb^3PY5iRy_XK)ZzOojZhn?H%&Fo4=;_3KfB5mE zr*d=qz^a2{>u(?1iDZRi?*OJkEmRA7p)7}%YXP7n*L*_(4>ok=_^X)~_1i?m?pACQ z>b1_IU#kSz-DK?`uLN` z5~hNfaUpM)q}F1I02Q1E(ZXk+$79hl@kp^?GztY50zIxSgS9w0`P|6JNLQEJs4EHJ zLviLW&`oVbwnyBQP|pXw`F?Qge-YPZV03L&GoFX%NopIft)onR3(zuXYd|vxNtK3% zhLWNpK$uo=aBtrZgph#r2UJE{PIGkh9tLfZ$_`SFj%800rl%VG-@bWs>h$SLAZ)K# zsb&d9rJM`G7x?y+kVdU4^va-S4EpoLQ97y6QzglYbMLQ;QBhG1W?y6Y@E}DxBH#Vk zO;VlSBV@%-QAug8Comv@Y}v`#neyUA5)zU^jSK=p-X|Po3O%>y1Y5UE&2(;}7Ey%i zzcnC8X4o$DwnYn;Bx_7|X(%am-|@utr{J0ImJ?-TV_5gxC$3diR{rWku)elNygWL0)8OwqG@X-~e#g{uameUgEZT^O zp?dh)<>X}=8o3;uShcexv-clA4qY>T^_s@b0R(bv%bJ;q?eW5`bT`^K8WTuqZo->eXQxB+etW6hdnA< z8XzBor>rb=HudeT55TfezKG=buvc*Id-4TgL#NJR&g@it+_!==#P& zMO2Z0aP@|=^4PcDe>|AEQdc0!;wRlC~KMzbNn$l@|8e zYaNF^z^WYK^Z(m}K#9sD&h#26PXI9y^_&TDy6FZ5WUd2z0uf(NBDXWp-pR@TMOatZ zjVG@jGGg6M#eCFub4~y!7e$A`TbiRBPOj$Aa@2jS1C&Gw99soCcXL{zEiuF&_l&>w z_s@VXW%S_C4?|^R7=m#jr+JV58F4ebCMv_je0h&WpyXZG_N{%S7@XZE+Swi2?o5*6 zkHfN|Fh?(1@wVCbIp`rtZB!KpDlyMOd%A@j_Z7lKM1<5G{m#PZ#gTiMoDXcb5@G-< zZJvKVnhxS0Nv#ZJ%{DaC(CLJJotU+U>`92*(!Mro^fTzug^RjHJ+XIc8ZV%n8ap~l zZT?IZZ3KfR`P2q0Zi5yYWu_ig^SsCAznj9-XF#mzSs@MDFfW#gW?He?A&G zxrU0myXdGpi>3jd&>Rv+NMId+5FIr(hF5ScT>eRiKMv|?)KW^Iw_$HK3&jjT?+I!( zFzn-IfHeI+czqm8$(Ncngh(8w8Kz3fvLK+#{+ncnk3KpYp#;Pyb4PF4m%YJuXb3oi z`c-?(<~Bn44rev2aT4{G%b2%p2gMypt@Eq=e|!dl#sAe@7D6Rx_fE4LQrT1XQIV0= zM|%r-I*nTkeJejCXrlQnH1FJbS$acw##Is=^f$Erd4$i^`5ca=wkj9uBwdC{*`Cb( zPbpmEh$tUl-|+B3a+oIZiPD6GNw9Zew*v=N)j{wHOf?L$pBS^{uqvN@^{E2{ZT#2o zKN`D!DLdRNKP^877?D}R|DXgReEpf&SGPHs2}GM(x!Nx;*1k(iV|1zqU+INO;>=Xa zC?QJlX_P;{GbiX)l_O2B130kU6F~d|)-Z@#Qsrofh={D34tCd}JRkDdsK|Vzyv%y0 z%fI4eE~F1HU%uS&Q$j%J;Q)$|Psa3m_b>A7{Eju*0 zwcdHMxw#n@+_`EG(rn19DyARriR}Ig;xiwXcO&_y(8BQ+=2rti$sjp4QEadf1*s1* z%ZuJ;luG~m_wQ|OY&<-+e!3Gg=ws&@kyeA7UHZlur48$Q0s9VeLK@kh8=Lo800`=JB1lRx6ck%`cC4HUv`^A z`5!(^(3sfN_(D>PlCOgQF`q=0V0ZgiKd5GHB_P#`svtl_Y%ZV%Z>@p+O>&IOq$*ia z`tE7u6WUkpZcE$+%3+x1F6#U3nD5WbT1TJ=17eh$d5T&L&SSF6?-CFZl9(3M`l4%6 ztu@f}$LK+8-HdW`n6KVaQ5d=o$Y$DcI?DbY1}+4D{H8BDM-4;2u~3kt9`rV(AnmN#D30x~C!d-> zBuHLK>-k4u!u)1O<;QF#q+^s6g&Az9(CbjJ+g zWid)=A!nl&R7RLdTnxrPg^p?F%6!~sg5=R!Zv?rFj-J*mza?)auO!JFp}xC~p5w3p zv6VMuf-fJSzPpe4Zr0X=1f+Od5>=xp2LcudbUQ1nyuw268#f}kjTCi%jWp;s23$_; zvjO^H5}4d#yQM)1YR7N={SLs?0O9{UJu`C=)uA&R|5{o`hMZ0Hk;X`qiyWl$J%Y5p#9F9OC@(*74zZe z=P%R{m%a8u8rZ($qeJL1I(H)cl~+TxT8TO7^5aL3IyocnH`xgC@Pud{&dwUf|5{oy z)7F-kw=Bs(X|5jGK)+a*{V(PYdemtZf|I%Jgz)k5Zq0Q!e*G$@e#8C9h2lGNR+sTe zxvlj~dopD+7WCE1a9FvxRF)35K&5IrOsmWP1Ri0hwyOFlbkK~=0yQ)FaSO6~<~3;R zM`DU@hJ$@s0`!B>BrT@+@7>POfdmUhN4LgA8+?MFmGvDpP)fE|Z6%{l3ri(qDU?xw z(s_)7OFx~Z;5OV|9%+_(@V5~4sF39fWaVZ1OML7IB6J6_m;D#+uEgL(e|!6Kb+L_; zXZq|qEue;dc3l*fWxwJfnA$AS2|YO*0$XMEw_lp;>gm}Y(;9*)*W?3W+5ur7oUU4& zlev9;giq3zY0>sYzDGo|I8TDpsz$$jQF~G)x$YK zt3(B7+swjUA55A8Q;;4BQ z2hJ*V9|LIiz_emo;Iqs#xzec3JsrCa(j%l2?GhcW(G{SKAy4pEhy>brM-R@0Kg2qy z=dc3n@}NcgD+@*^CJ!bb@SFd9NJruv&gyQB{0>b!~%298>!lM>j~fhK%W~0ktyfygwO;AnIsuT=5%P6hN>IQVvxV7%r@Z zmM)T7P>`ZV)+!(C-~m}DPaSv522bnOB6xC*c7qhnoS!ir&SS?+uiT1tJ~*Og%`vhv zL-86}rtlkr5R$WkPxk!DPUNJexqoAFZQ*l&IT0S%vO^*0>qbS_YMYu^6DsT-YSPC) zY5c!KkAU${V-7A~=rb(7MY2R4qN3j8RR7$zT%qU6*|r4=o&yo^btRkHqJ4mM>=g!a zlE|`zBDfuuJl1mi2XE=7x;Mb;8}EAv@K52ojzKRfYMAAX`=Tm0Pg(}X$0e5@id^wb zP`TyH6wVaGl;pgBVje1p-6i{=&_V5`Y|fVT=51u#5Ae%&T4f-SxM+2Qn)KuklS&9r z(A}W&9Trn!v5vI~Vw;lvWQN~k z!II94C+6LkgJ~#!N2#NbWNG4&+vwD}TH|X$O`vxZh;0eq7n|iA8hUsDeW1{H`5^u2 zP=BjP3JXZMq4VVH7j$O~jAfV`yG?R37dQA3-vNc|X3$qIxy-6VtfC&{9B9gX&7oOl zx2~CDB?|>G2FDlCfrA0N*huFUwz-*+mq>4tkA9Q)1|@8)R=Jx? zeLt|;A7nSyE5s0!oCbX(L;a>bQAJHVp_~J(P0$>fK`%|T8ok1vhiW+P_1}^aT^GQO zN|o$6zCKqgaGO3zk4$BSpxFt!=b`dhf1SE!)E=5L2fi(Evyz2A>fy^H!i5n6wygC| zX{E|Dp<5uT|8&0E>eN@(FDLw#q^GC}NcNMh1f6(BNYoOy}|2(IJQ| z1`m9%R#-Z3p9PI5C|8c*O%Y@SO$?rZoD5xjM#V&Q!Ukvbulo>?PK*u{Fc&pMut@BF zP7Udg4sWlBd7ZXv6;{xY`IjispP)2hDr^$!u)azgr`C%_1Gbu=|^u9;S~19RBMn z5fCmwmz@#+!oY}2eE@rduy7?X+9uUZ&>co`{SEhib9J&=Bso%wdUWajL zISrr@9sThmudK}T?Qh=y;p6_ghJ%rjF|LnMNJw2h|9L$=#RZnEuFsHS%DL}d5YL3V z5Bxy?3n{qELJjxqMR_eP4)%d+S7&W)?dQ)YV}zZ7$qePt$}V(b5fl`(V#vFl%7>co z6%XZjCj`&~{C#I<$84w=bUTXqH&{@elyhClt#{As@p|+5+eb`a#DXY*hc#T5?RJuF z2g(Bat>N*N*ZKLwH5a_RPELC_e+&vT@&;s89Ow1-`%K8{?>w3O9^!*SKhe})MV1qF z=}M{098Yt#zraq1gmDJIwIIib+fZ05z@Y zdo446wO)codu3)O4DiQ-=}>VNRD>YU4Ep=MAjHJf)XTqq-P3vQM3TG$A{Il_tjfF2 zAm%CjvbMhNEtdpmRN{06Njl~}nt$)EyyoT2-H>dRW$C;*-ve#Y+`PQhoZ7YP9inm( zZ2xmnh~_LL*iAtUkeGHQHoUtec77DJ<6`}Azez3L{Jd#m-(_eAXS*6AX=I}CzQ7{c zCU$ic+tXQjyh!n~CQHvmk)lRm<>Q}CbC)m|KRo`cpRn>IDoRIld)zjzTev<#^ ztB^+YEi8^(Z+2{~jJbEl-GReiwqGB2``7rmB|y@{vExHP8FYQw8qTn7aCMBKsi~0N zVm}~CI|BLl53WNC#U)1uS0~`BE3G~IU!#z1oO--jypU$b;0&$eMj0`~qaUtxSc-2~Z zYRp|^OdL4)lUi5+4BK-g@k@%huum9G)?^egDyOAOzT6 zlyqusX)%Gl1h1fr?EnfOxD5wYRg{)4EH0)NadCjEao5z&YvgyMKPBJncGRe8K90Pi zhK8A*-t@|fsO|itldBrg%go17y>qRCL||=iA%{b?@ImGNiu>_CR9{s-i?K{2DH9z2 zt|jIp%)?n}X`DB12*C0z6>TEe;WSXq-q?4Y>!K@0B;n4W8q;zgu(-5(Bh`Ym-XSb14fXX)LnR$>WZT;O zHBOVv=B$7ki;I(UcBq8o(8R)`BO4398HzqEY1(;zJKfOr6Hb)e+&<+7lh3$CVD-Z#k+Rmdj>>=PfC#@+bvt7!RX@ zgKa>p2X1PzO%meO*^`_^p{!5ux*y-V1qonqrn-Z>Qsaop@i#JjFAfkbNRFJn+g zP!0&@3|3C8;t_s*ws16RBfUerQQFByIU?kYk_$t+9q z^NI1Ey$sl0Ea-rk0m43fi}Z{P9hFxBOS-sH%pm#96{gF2f2xY~v zFI#H~f}~OxMu6PI7J>@UkzJ*~{xs4wDs{Yk|<6iV>=s?@7JwfE>Z7Fdbks(^w&A6fm}Y8}ZbjX#C>RuJwRRvEZ(O(=FE4 z)*+%TRgUZQBLrv9nwIf&WCaFxK&=~uGFpz)AyD?C@DMrLnS$#wI$>MY)YMo+c8PJI zQBU-Ew*wr{hbG;->GAOsV2xu?XoD^!KBKPd6A?`?1T^=6T16Nl7hKxa8F-bI9JD0D z`-=sD9RfiKz&GYXd)5v#GFN2Fr9LzWd3pKxbP=tOdlE%PM6`u-CBil)n;|z}N{V`N zHah6&&>kLaRK0umj&aq8eO+^6d@4{h=7t`AR%}Q}k?q3cX10mF zk0j1SLaRtfU0vO*!t>BG*%}r1<<>yDrB&?`v9>nxnuhFJRzkvasJcPZ9bAr8X*K1u zCU)wOV|G^*R>jN93$!N`ET}SH8d>c|!Qp0(dvff0a|jFM=-_eAuq9bo#ZEF`nJh^p zoz=6kwr*)}Pa(JL&waM>(XZnmtmdG;rzb?Rj?OCB7pqdQh0JO08ZB)EDdO-7!7cT_ z`(XE4DR*hoGrhO?SgeFUfpni`Pkw8;9V90b0oSfsM#X%>&7VvQi-}n7B51x!F+xT{ za;l{Xa#odW^?`&_+D^QZl6gs{J)e~mB?8G}S0Nb0d60{wq+DFETpUU$?OZv-QCZ8b z%;r(EGx-+etiEFk-!kPyYdHDI4nWBfD6*Gk8P%&^Y#Q<8`6(=v>2~jJ{Ptiwv5JFr z){@fu906l}1yD3+$k|O5u6oqJr1xJkd^EVX6B-ItR+(_lJEbym>_SoFK<2 z8+61Z8|(xTs~&9)S(Gqh_jh*Yx{jYdg0*u6MaZN^vyl_^vnP&WNXpODSU-)=sz_r) z10fZEXLGaP$Ns)P74?@-V;d&n&X!5{*XG^$b*s_l!_(z;8#lXaU28qCCIv4d0br5l zN`zN$7_?JO)FlTS2UA&DS=GIm5L1ER^MFjUPE&1yH?N@J|4iCEZ%)B)KgKuj-uWp% z*s^7dk1Fu+2;H~ydJFRz{{V~fa;XDsY;3^#P{jMoG$)P(;6Q+<{Rd#p<70oL{@-W$ zL`C5PQ+5ECg9QG2FOZmVZq3OB^JlWX0Iq2Pu9VKQtkJa%74rpCmefrY-|x52xv>G*$9Mv48@jpOx_x`TZS}Uln+;olL;O0CML$2KO8IxQCvLrC z+MxL!xFP_Q8;%@tsd@mM$p)S^@)dX%-i6uBQXk#j-Th~q^?nNFcmS+YFZ=uTFH-*r ztg=8WX%yeDU9;u|XXX_>nE>CLKFz=L_y0Asw450SEaLmt#_f%&NDF0}kq69V7qVM} zCpF}Q15)UKhzhU{{nN~EXHoa(N3|RyXa(Ni(2Kj&>}g;db#Sm18Zj~Y@-q=2m=V6g>U2Jz$J)c@~+MIG=snFZT9 zrmTsJi+g1EK)(LZ#DBlH%=yQCdAYy1{pA0^A_P>_EYz+GK9%rG>`T$bSzqd0ZSF-M wWl$5>i&>Dr1=wEOwwmDsGxg8R{P3S~)v>!WX@_nX16!vIp00i_>zopr04&JE_y7O^ literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/gap.png b/assignment-3/submission/18307130090/img/gap.png similarity index 100% rename from assignment-3/submission/18307130090/gap.png rename to assignment-3/submission/18307130090/img/gap.png diff --git a/assignment-3/submission/18307130090/myplot-1.png b/assignment-3/submission/18307130090/img/myplot-1.png similarity index 100% rename from assignment-3/submission/18307130090/myplot-1.png rename to assignment-3/submission/18307130090/img/myplot-1.png diff --git a/assignment-3/submission/18307130090/img/myplot.png b/assignment-3/submission/18307130090/img/myplot.png new file mode 100644 index 0000000000000000000000000000000000000000..8136b211c4abcbb4aa7b0d944af38a9608ce2517 GIT binary patch literal 25979 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

+D-I0&|sh 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 RdJv;Po=Yl76p9(V{V$KH_S66X literal 0 HcmV?d00001 diff --git a/assignment-3/submission/18307130090/scatter.png b/assignment-3/submission/18307130090/img/scatter.png similarity index 100% rename from assignment-3/submission/18307130090/scatter.png rename to assignment-3/submission/18307130090/img/scatter.png diff --git a/assignment-3/submission/18307130090/w.png b/assignment-3/submission/18307130090/img/w.png similarity index 100% rename from assignment-3/submission/18307130090/w.png rename to assignment-3/submission/18307130090/img/w.png diff --git a/assignment-3/submission/18307130090/myplot.png b/assignment-3/submission/18307130090/myplot.png deleted file mode 100644 index 77ef6125d21a2552d813e747d5a5ce8c1499ce46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25440 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 Cn{F-u diff --git a/assignment-3/submission/18307130090/source.py b/assignment-3/submission/18307130090/source.py index 80cf0e8..455a851 100644 --- a/assignment-3/submission/18307130090/source.py +++ b/assignment-3/submission/18307130090/source.py @@ -1,7 +1,8 @@ import matplotlib.pyplot as plt import numpy as np -colors = ['black', 'red', 'blue', 'green', 'orange', 'purple', 'gray', 'pink', 'aqua', 'brown', 'lime'] +colors = ['red', 'sienna', 'tan', 'olivedrab', 'chartreuse', 'lightseagreen', 'skyblue', 'royalblue', 'lightcoral', + 'darkorange', 'darkviolet', 'fuchsia', 'black', 'grey'] # 绘制散点图所需的颜色集 def shuffle(*datas): @@ -18,20 +19,18 @@ def shuffle(*datas): return data, label -def norm_pdf(x, mean, cov, cov_inv, cov_det): - n = cov.shape[0] - denominator = (np.sqrt(2 * np.pi) ** n) * np.sqrt(cov_det) +def get_norm_pdf(x, mean, cov_inv, denominator): # 计算多维高斯分布,其中cov_inv和denominator采用预计算策略,提高程序性能 tmp = x - mean numerator = tmp @ cov_inv @ tmp.T return np.exp(numerator / (-2)) / denominator -def choose_centers(train_data, k, rand_num): +def choose_centers(train_data, k, rand_num): # 生成初始聚簇中心点集 rng = np.random.default_rng() - centers = rng.choice(train_data, size=k, axis=0, replace=False) + centers = rng.choice(train_data, size=k, axis=0, replace=False) # 从样本中无放回抽取样本点作为聚簇中心 if k == 1: return centers - dist = dis_avg(centers) - for i in range(rand_num - 1): + dist = dis_avg(centers) # 计算平均相互距离 + for i in range(rand_num - 1): # 选择相互距离最大的聚簇中心集 new_centers = rng.choice(train_data, size=k, axis=0, replace=False) new_dist = dis_avg(new_centers) if new_dist < dist: continue @@ -40,268 +39,381 @@ def choose_centers(train_data, k, rand_num): return centers -def dis_avg(dots): +def dis_avg(dots): # 计算簇内平均距离 n = dots.shape[0] - ans = np.einsum('ij->', dis(dots, dots, False)) + ans = np.einsum('ij->', dis(dots, dots, False)) # 等价于矩阵求和 + # ans = sum(np.linalg.norm(dots[i] - dots[j], ord=2) for i in range(n) for j in range(i + 1, n)) return ans / (2 * n) -def dis(x, y, square=True): - xx = np.einsum('ij,ij->i', x, x)[:, np.newaxis] - yy = np.einsum('ij,ij->i', y, y)[np.newaxis, :] - dot = np.dot(x, y.T) - res = xx + yy - 2 * dot +def dis(x, y, square=True): # 通过numpy.einsum计算点集x与点集y之间的两两距离 参考自https://www.pythonf.cn/read/109964 + xx = np.einsum('ij,ij->i', x, x)[:, np.newaxis] # 计算x的平方的行和 + yy = np.einsum('ij,ij->i', y, y)[np.newaxis, :] # 计算y的平方的行和 + dot = np.dot(x, y.T) # 计算xy对应的行和 + res = np.abs(xx + yy - 2 * dot) # (x-y)^2=x^2+y^2-2xy 取绝对值用来防止因精度问题出现负值 return res if square else np.sqrt(res + 1e-12) -def my_scatter(np_data, color): +def my_scatter(np_data, color): # 绘制聚簇散点图的函数 + if np_data.shape[0] == 0: return data = np.transpose(np_data).tolist() plt.scatter(data[0], data[1], c=colors[color] if color is not None else 'yellow') -def my_inner(x, mu): +def draw_clusters(clusters, centers): # 绘制所有聚簇的散点图 + k = len(clusters) + for i in range(k): + my_scatter(clusters[i], i) + my_scatter(centers, None) + plt.show() + + +def draw_list(l): # 绘制度量(如BIC、gap)曲线的函数 + n = len(l) + x = list(range(1, n + 1)) + plt.plot(x, l) + plt.show() + + +def my_inner(x, mu): # 计算GMM中协方差矩阵的函数 tmp = x - mu ans = np.einsum('i,j->ij', tmp, tmp) return ans -class KMeans: - - def __init__(self, n_clusters): - self.k = n_clusters - self.rand_num = 100 - self.centers = None - self.n = None - - def single_fit(self, train_data): - self.centers = choose_centers(train_data, self.k, self.rand_num) - clusters, dot2center = self.kmeans_iter(train_data) - while True: - self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) - clusters, new_dot2center = self.kmeans_iter(train_data) - if (dot2center == new_dot2center).all(): break - dot2center = new_dot2center - for i in range(self.k): - my_scatter(clusters[i], i) - my_scatter(self.centers, None) - plt.show() - - def fit(self, train_data): - self.n = train_data.shape[0] - self.k = min(self.k, self.n) - self.single_fit(train_data) - - def kmeans_iter(self, train_data): - clusters = [[] for _ in range(self.k)] - dot2center = np.argmin(dis(train_data, self.centers), axis=1) - for i in range(self.n): - clusters[dot2center[i]].append(train_data[i]) - for i in range(self.k): - clusters[i] = np.array(clusters[i]) - return clusters, np.array(dot2center, dtype=int) - - def predict(self, test_data): - pass +def get_clusters(dot2center, data, k): # 为每个样本分配聚簇后,生成每个聚簇的点集 + n = data.shape[0] + clusters = [[] for _ in range(k)] + for i in range(n): + clusters[dot2center[i]].append(data[i]) + for i in range(k): + clusters[i] = np.array(clusters[i]) + return clusters -class KMeansPlus: +class KMeansCore: # K-Means和K-Means Plus(即自动选择聚簇数量的K-Means)共同调用的部分 + def __init__(self, n_clusters, gap=False): # gap=False时不计算Gap度量(K-Means调用),gap=True时计算Gap度量(K-Means Plus调用) + self.k = n_clusters # 聚簇数量 + self.is_gap = gap + self.rand_num = 100 # 随机选取聚簇中心的循环次数 + self.n = None # 样本容量 + self.centers = None # 聚簇中心 - def __init__(self): - self.n = None - self.k = None - self.sample_num = 15 - self.rand_num = 100 - self.centers = None - - def kmeans_iter(self, train_data): - clusters = [[] for _ in range(self.k)] - dot2center = np.argmin(dis(train_data, self.centers), axis=1) - for i in range(self.n): - clusters[dot2center[i]].append(train_data[i]) - for i in range(self.k): - clusters[i] = np.array(clusters[i]) + def kmeans_iter(self, train_data): # K-Means 单次迭代 + dot2center = np.argmin(dis(train_data, self.centers), axis=1) # 将样本点分配至距离最近的聚簇中心 + clusters = get_clusters(dot2center, train_data, self.k) # 生成每个聚簇的点集 return clusters, np.array(dot2center, dtype=int) - def single_fit(self, train_data, sample_rate=0.75, compute=True): - self.centers = choose_centers(train_data, self.k, self.rand_num) + def fit(self, train_data, sample_rate=None): + self.n = train_data.shape[0] + self.centers = choose_centers(train_data, self.k, self.rand_num) # 随机选取聚簇中心 clusters, dot2center = self.kmeans_iter(train_data) while True: - self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) - clusters, new_dot2center = self.kmeans_iter(train_data) - if (dot2center == new_dot2center).all(): break + self.centers = np.array([np.sum(cluster, axis=0) / cluster.shape[0] for cluster in clusters]) # 计算新的聚簇中心 + clusters, new_dot2center = self.kmeans_iter(train_data) # 将样本点分配至不同聚簇 + if (dot2center == new_dot2center).all(): break # 当样本聚簇归属迭代间不发生变化时结束迭代 dot2center = new_dot2center - if not compute: - # for i in range(self.k): - # my_scatter(clusters[i], i) - # my_scatter(self.centers, None) - # plt.show() - return None - rng = np.random.default_rng() + if not self.is_gap: return None + if sample_rate is None: # 不设置采样率时直接返回簇内距离之和 + return sum([dis_avg(cluster) for cluster in clusters]) + rng = np.random.default_rng() # 设置采样器 ans = 0 for i in range(self.k): cluster_size = int(clusters[i].shape[0] * sample_rate) - if cluster_size >= 300: + if cluster_size >= 250: # 聚簇大小小于500时不采样 clusters[i] = rng.choice(clusters[i], size=cluster_size, axis=0, replace=False) - ans += dis_avg(clusters[i]) / (sample_rate * sample_rate) + ans += dis_avg(clusters[i]) / sample_rate # 数值修正 else: ans += dis_avg(clusters[i]) - return ans - def monte_carlo(self, data_min, data_max): + def predict(self, test_data): + assert self.centers is not None + return np.argmin(dis(test_data, self.centers), axis=1) # 将测试点分配至距离最近的聚簇中心 + + +class KMeans: # 直接调用KMeansCore + + def __init__(self, n_clusters): + self.core = KMeansCore(n_clusters) + + def fit(self, train_data): + self.core.fit(train_data) + + def predict(self, test_data): + dot2center = self.core.predict(test_data) + # clusters = get_clusters(dot2center, test_data, self.core.k) + # draw_clusters(clusters, self.core.centers) + return dot2center + + +class KMeansPlus: # 自动确定聚簇数量的K-Means模型 + + def __init__(self): + self.core = None # 调用KMeansCore对象 + self.k = None # 聚簇数量 + self.n = None # 样本容量 + self.sample_rate = None # 采样率 + self.sample_num = 15 # 采样次数 + + def monte_carlo(self, data_min, data_max): # 计算零假设下的期望簇内距离 d = data_min.shape[0] W_list = [] for _ in range(self.sample_num): print(f'Monte Carlo {_}') sample_data = np.concatenate([np.random.uniform(data_min[i], data_max[i], (self.n, 1)) for i in range(d)], - axis=1) - W_list.append(self.single_fit(sample_data)) + axis=1) # 生成零假设下的样本数据 + W_list.append(self.core.fit(sample_data, self.sample_rate)) W = np.log(W_list) - return W.mean(), W.std() * np.sqrt(1 + 1 / self.sample_num) + return W.mean(), W.std() * np.sqrt(1 + 1 / self.sample_num) # 返回簇内距离期望和修正后的簇内距离标准差 def fit(self, train_data): self.n = train_data.shape[0] - data_min = train_data.min(axis=0, initial=np.inf) + self.sample_rate = None if self.n <= 5000 else 0.5 # 样本容量大于5000时进行采样 + data_min = train_data.min(axis=0, initial=np.inf) # 使采样空间精确覆盖样本空间 data_max = train_data.max(axis=0, initial=-np.inf) - # max_k = min(max(10, int(np.sqrt(self.n / 2.0))), self.n) - max_k = 15 - W_list = [] - gap_list = [] - expec_W_list = [] - pre_gap = None + max_k = min(max(10, int(np.sqrt(self.n / 2.0))), self.n) # 确定遍历的聚簇数量的最大值 + # max_k = 8 print(f'max_k={max_k}') - for self.k in range(1, max_k + 1): + pre_gap = None + gap_list = [] + for self.k in range(2, max_k + 1): print(f'k={self.k}') - W = np.log(self.single_fit(train_data)) - expec_W, s = self.monte_carlo(data_min, data_max) - # if pre_gap is not None and expec_W - W - s < pre_gap: - # self.k -= 1 - # break + self.core = KMeansCore(self.k, gap=True) + W = np.log(self.core.fit(train_data, self.sample_rate)) # 计算簇内距离 + expec_W, s = self.monte_carlo(data_min, data_max) # 计算零假设下的期望簇内距离和修正后的簇内距离标准差 + if pre_gap is not None and expec_W - W - s < pre_gap: # Gap Statistic方法的判定条件 + self.k -= 1 + break pre_gap = expec_W - W - expec_W_list.append(expec_W) - gap_list.append(expec_W - W) - W_list.append(W) + gap_list.append(pre_gap) print(f'final k={self.k}') - self.single_fit(train_data, compute=False) - x = list(range(1, max_k + 1)) - # fig,(ax1,ax2)=plt.subplots(2,1) - fig, ax1 = plt.subplots() - ax1.plot(x, W_list, label='W') - ax1.plot(x, expec_W_list, label='Expect_W') - ax1.set_xlabel('number of clusters k') - ax1.set_ylabel('within sum of distance') - ax1.legend() - # ax2.plot(x,gap_list) - # ax2.set_xlabel('number of clusters k') - # ax2.set_ylabel('Gap') - plt.show() + self.core = KMeansCore(self.k) # 使用确定的聚簇数量构建模型 + self.core.fit(train_data) + # draw_list(gap_list) def predict(self, test_data): - pass + dot2center = self.core.predict(test_data) + clusters = get_clusters(dot2center, test_data, self.k) + draw_clusters(clusters, self.core.centers) + return dot2center -class GaussianMixture: +class GaussianMixture: # 基础的GMM,被GaussianMixturePlus调用 def __init__(self, n_clusters): - self.k = n_clusters - self.pi = np.full(self.k, 1.0 / self.k) - self.rand_num = 10 - self.mean = None - self.cov = None - self.cov_inv = None - self.cov_det = None - self.n = None - self.dim = None - - def GMM_iter(self, train_data): - norm_p = self.compute_norm_pdf(train_data) - pre_p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) - P = self.compute_P(norm_p) - N = np.einsum('ij->j', P) - N_recip = np.reciprocal(N) - self.pi = N / self.n - x_minus_mean = np.array([[my_inner(x, mu) for mu in self.mean] for x in train_data]) - # tmp=x_minus_mean[np.isnan(x_minus_mean)].reshape(-1) - self.cov = np.einsum('ijk,i->ijk', np.einsum('ij,ijkl->jkl', P, x_minus_mean), N_recip) - self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] - self.cov_det = [np.linalg.det(single_cov) for single_cov in self.cov] - self.mean = np.einsum('ij,i->ij', np.einsum('ij,ik->jk', P, train_data), N_recip) - norm_p = self.compute_norm_pdf(train_data) - p = np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) - return p - pre_p + self.k = n_clusters # 聚类数量 + self.pi = np.full(self.k, 1.0 / self.k) # 设定混合高斯分布的概率分布,初始条件下为均匀分布 + self.rand_num = 100 # 随机选取聚簇中心的循环次数 + self.mean = None # 混合高斯分布的均值 + self.cov = None # 混合高斯分布的协方差矩阵 + self.cov_inv = None # 协方差的逆矩阵,提前计算后用于加快高斯分布概率密度的计算 + self.cov_det = None # 协方差的行列式,提前计算后用于加快高斯分布概率密度的计算 + self.denominator = None # 高斯分布概率密度中的分母,提前计算后用于加快高斯分布概率密度的计算 + self.n = None # 样本容量 + self.dim = None # 样本维度 - def compute_P(self, norm_p): - P = np.einsum('ij,j->ij', norm_p, self.pi) - P_sum = np.reciprocal(np.einsum('ij->i', P)) - P = np.einsum('ij,i->ij', P, P_sum) - P[np.isnan(P) | np.isinf(P)] = 1.0 / self.k - return P + def compute_log_like(self, norm_p): # 计算对数边际分布之和 + return np.einsum('i->', np.log(np.einsum('j,ij->i', self.pi, norm_p))) - def compute_norm_pdf(self, train_data): + def compute_norm_pdf(self, train_data): # 计算样本与多个高斯分布的概率分布 return np.array( - [[norm_pdf(x, self.mean[i], self.cov[i], self.cov_inv[i], self.cov_det[i]) for i in range(self.k)] for x in - train_data]) + [[get_norm_pdf(x, self.mean[i], self.cov_inv[i], self.denominator[i]) for i in range(self.k)] + for x in train_data]) + + def compute_post_prob(self, norm_pdf): # 根据概率分布计算后验分布 + uni_prob = np.einsum('ij,j->ij', norm_pdf, self.pi) # 根据高斯分布和高斯分布的概率分布计算联合分布 + uni_prob_sum = np.reciprocal(np.einsum('ij->i', uni_prob)) # 计算联合分布之和 + post_prob = np.einsum('ij,i->ij', uni_prob, uni_prob_sum) # 通过联合分布计算后验分布 + post_prob[np.isnan(post_prob) | np.isinf(post_prob)] = 1.0 / self.k # 处理因精度问题导致的非法值 + return post_prob + + def GMM_iter(self, train_data): # GMM的单次迭代 + norm_pdf = self.compute_norm_pdf(train_data) # 计算高斯分布 + pre_log_like = self.compute_log_like(norm_pdf) # 通过高斯分布计算对数边际分布 + post_prob = self.compute_post_prob(norm_pdf) # 计算后验分布 + N = np.einsum('ij->j', post_prob) + N_recip = np.reciprocal(N) + self.pi = N / self.n # 更新混合高斯分布的概率分布 + x_minus_mean = np.array([[my_inner(x, mu) for mu in self.mean] for x in train_data]) + self.cov = np.einsum('ijk,i->ijk', np.einsum('ij,ijkl->jkl', post_prob, x_minus_mean), + N_recip) # 通过后验分布更新混合高斯分布的协方差 + self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] # 提前计算协方差的逆,用于加快高斯分布概率密度的计算 + cov_det = [np.abs(np.linalg.det(single_cov)) for single_cov in self.cov] # 提前计算协方差的行列式,用于加快高斯分布概率密度的计算 + self.denominator = (np.sqrt(2 * np.pi) ** self.dim) * np.sqrt(cov_det) # 用于加快高斯分布概率密度的计算 + self.mean = np.einsum('ij,i->ij', np.einsum('ij,ik->jk', post_prob, train_data), N_recip) # 通过后验分布更新混合高斯分布的均值 + norm_pdf = self.compute_norm_pdf(train_data) + log_like = self.compute_log_like(norm_pdf) # 计算新的对数边际分布 + return log_like - pre_log_like def fit(self, train_data): self.n = train_data.shape[0] self.dim = train_data.shape[1] - self.mean = choose_centers(train_data, self.k, self.rand_num) - self.cov = np.concatenate([np.diag(np.full(self.dim, 1))[np.newaxis, :] for _ in range(self.k)], axis=0) - self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] - self.cov_det = [np.linalg.det(single_cov) for single_cov in self.cov] + if self.n < 8 * self.dim: # 样本容量相对较小时采用过采样策略,防止产生奇异协方差矩阵 + train_data = np.concatenate([ + train_data, + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim), + train_data + np.random.rand(self.n, self.dim)], axis=0) + self.n = train_data.shape[0] + self.mean = choose_centers(train_data, self.k, self.rand_num) # 随机选取样本点,作为混合高斯分布的均值 + self.cov = np.concatenate([np.eye(self.dim)[np.newaxis, :] for _ in range(self.k)], axis=0) # 选取单位阵作为混合高斯分布的协方差 + self.cov_inv = [np.linalg.inv(single_cov) for single_cov in self.cov] # 提前计算协方差的逆,用于加快高斯分布概率密度的计算 + cov_det = [np.abs(np.linalg.det(single_cov)) for single_cov in self.cov] # 提前计算协方差的行列式,用于加快高斯分布概率密度的计算 + self.denominator = (np.sqrt(2 * np.pi) ** self.dim) * np.sqrt(cov_det) # 用于加快高斯分布概率密度的计算 gap = np.inf cnt = 0 - while gap > 1e-4: + while gap > 0.1: # 判断对数似然收敛的条件 gap = self.GMM_iter(train_data) cnt += 1 - print(f'cnt={cnt} gap={gap}') - if cnt == 100: break - print(f'mean={self.mean}') - print(f'cov={self.cov}') - print(f'pi={self.pi}') - P = self.compute_P(self.compute_norm_pdf(train_data)) - dot2center = np.argmax(P, axis=1) - clusters = [[] for _ in range(self.k)] - for i in range(self.n): - clusters[dot2center[i]].append(train_data[i]) - for i in range(self.k): - clusters[i] = np.array(clusters[i]) - for i in range(self.k): - my_scatter(clusters[i], i) - my_scatter(self.mean, None) - plt.show() - pass + # print(f'\tcnt={cnt} gap={gap}') + if cnt == 100: break # 最大迭代次数 + log_like = self.compute_log_like(self.compute_norm_pdf(train_data)) + BIC = self.k * np.log(self.n) - 2 * log_like # 计算BIC + return BIC def predict(self, test_data): - pass + post_prob = self.compute_post_prob(self.compute_norm_pdf(test_data)) # 计算后验分布,将测试点分配给后验概率最大的高斯分布 + dot2center = np.argmax(post_prob, axis=1) + # clusters = get_clusters(dot2center, test_data, self.k) + # draw_clusters(clusters, self.mean) + return dot2center -class ClusteringAlgorithm: - +class GaussianMixturePlus: # 自动确定聚簇数量的GMM模型 def __init__(self): - pass + self.k = None # 聚类数量 + self.n = None # 样本容量 + self.core = None # 调用GaussianMixture对象 + self.sample_num = 10 # 采样次数 + + def monte_carlo(self, data_min, data_max): # 计算零假设下的期望BIC + d = data_min.shape[0] + BIC_list = [] + for _ in range(self.sample_num): + print(f'Monte Carlo {_}') + sample_data = np.concatenate([np.random.uniform(data_min[i], data_max[i], (self.n, 1)) for i in range(d)], + axis=1) # 生成零假设下的样本数据 + BIC_list.append(self.core.fit(sample_data)) + BIC = np.array(BIC_list) + return BIC.mean(), BIC.std() * np.sqrt(1 + 1 / self.sample_num) # 返回BIC期望和修正后的BIC标准差 def fit(self, train_data): - pass + self.n = train_data.shape[0] + data_min = train_data.min(axis=0, initial=np.inf) # 使采样空间精确覆盖样本空间 + data_max = train_data.max(axis=0, initial=-np.inf) + max_k = min(max(10, int(np.sqrt(self.n / 2.0))), self.n) + # max_k = 8 + print(f'max_k={max_k}') + BIC_list, gap_list = [], [] + pre_gap = None + for self.k in range(2, max_k + 1): + print(f'k={self.k}') + self.core = GaussianMixture(self.k) + BIC = self.core.fit(train_data) # 计算BIC + BIC_list.append(BIC) + expec_BIC, s = self.monte_carlo(data_min, data_max) # 计算零假设下的期望BIC和修正后的BIC标准差 + if pre_gap is not None and expec_BIC - BIC - s < pre_gap: # Gap Statistic方法的判定条件 + self.k -= 1 + break + pre_gap = expec_BIC - BIC + gap_list.append(pre_gap) + # if len(BIC_list) < 3: continue + # x, y, z = BIC_list[-3:] + # if abs(y - z) < 0.2 * abs(x - y): + # self.k -= 1 + # self.core = GaussianMixture(self.k) + # self.core.fit(train_data) + # break + print(f'final k={self.k}') + self.core = GaussianMixture(self.k) # 使用确定的聚簇数量构建模型 + self.core.fit(train_data) + # draw_list(gap_list) def predict(self, test_data): - pass + dot2center = self.core.predict(test_data) + clusters = get_clusters(dot2center, test_data, self.k) + draw_clusters(clusters, self.core.mean) + return dot2center -if __name__ == '__main__': +def generate_triangle(dot1, dot2, dot3, num): # 生成三角状数据集的函数 + dot1 = np.array(dot1) + dot2 = np.array(dot2) + dot3 = np.array(dot3) + l = np.array([min(dot1[0], dot2[0], dot3[0]), min(dot1[1], dot2[1], dot3[1])]) # 确定采样空间 + r = np.array([max(dot1[0], dot2[0], dot3[0]), max(dot1[1], dot2[1], dot3[1])]) + cnt = 0 + ans = [] + while True: + dot = np.random.uniform(l, r, size=2) # 随机生成样本点 + + # 使用叉积判断生成的点是否位于三角形中间 + x, y, z = np.cross(dot - dot1, dot - dot2), np.cross(dot - dot2, dot - dot3), np.cross(dot - dot3, dot - dot1) + if (x < 0 and y < 0 and z < 0) or (x > 0 and y > 0 and z > 0): + cnt += 1 + ans.append(dot + np.random.rand(2) * 0.75) + if cnt == num: break + return np.array(ans) + + +def generate_data1(): # 数据集1 mean = (0, 0) cov = np.array([[70, 0], [0, 70]]) - x = np.random.multivariate_normal(mean, cov, (7000,)) + x = np.random.multivariate_normal(mean, cov, (3500,)) mean = (-20, 20) cov = np.array([[10, 0], [0, 10]]) - y = np.random.multivariate_normal(mean, cov, (1500,)) + y = np.random.multivariate_normal(mean, cov, (750,)) - mean = (20, 20) + mean = (30, 30) cov = np.array([[10, 0], [0, 10]]) - z = np.random.multivariate_normal(mean, cov, (1500,)) + z = np.random.multivariate_normal(mean, cov, (750,)) + mean = (-30, -30) + cov = np.array([[10, 0], [0, 10]]) + w = np.random.multivariate_normal(mean, cov, (750,)) + + mean = (30, -30) + cov = np.array([[10, 0], [0, 10]]) + t = np.random.multivariate_normal(mean, cov, (750,)) + data, _ = shuffle(x, y, z, w, t) + return data + + +def generate_data2(): # 数据集2 + mean = (-5, 2) + cov = np.array([[73, 0], [0, 22]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[21.2, 0], [0, 32.1]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (10, 22) + cov = np.array([[10, 5], [5, 10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) data, _ = shuffle(x, y, z) + return data + + +def generate_data3(): # 数据集3 + x = generate_triangle([0, -1], [9, 2], [6, 3.5], 500) + y = generate_triangle([1, 8], [4, 7], [5, 12], 500) + z = generate_triangle([5, 5], [8, 12], [12, 6], 500) + w = generate_triangle([8.5, 7], [12, 1], [14, 7], 500) + + data, _ = shuffle(x, y, z, w) + return data + + +if __name__ == '__main__': + data = generate_data3() - model = GaussianMixture(3) + model = GaussianMixturePlus() model.fit(data) + model.predict(data) diff --git a/assignment-3/submission/18307130090/tmp.py b/assignment-3/submission/18307130090/tmp.py deleted file mode 100644 index 4ed0112..0000000 --- a/assignment-3/submission/18307130090/tmp.py +++ /dev/null @@ -1,34 +0,0 @@ -from source import dis_avg -import numpy as np - -def row_norms(x): - return np.einsum('ij,ij->i',x,x) - -def dis(x,y): - xx=row_norms(x)[:,np.newaxis] - yy=row_norms(y)[np.newaxis,:] - dot=np.dot(x,y.T) - return xx+yy-2*dot - -def func1(x,y): - ans=x@np.diag(y) - ans_sum=np.array(np.array([ans_x.sum() for ans_x in ans])) - return np.array([ans[i]/ans_sum[i] for i in range(ans_sum.shape[0])]) - -def func2(x,y): - ans=np.einsum('ij,j->ij',x,y) - ans_sum=np.reciprocal(np.einsum('ij->i',ans)) - return np.einsum('ij,i->ij',ans,ans_sum) - -if __name__ == '__main__': - x=np.array([[1,2,3],[6,5,4]]) - print(np.argmax(x,axis=1)) - # print(np.einsum('ij->i',np.array([[1,2],[3,4]]))) - # n,k=10,3 - # for _ in range(10000): - # P=np.random.rand(n,k) - # K=np.random.rand(k) - # - # ans=func2(P,K)-func1(P,K) - # print(ans) - # break \ No newline at end of file -- Gitee From c09135d5874d49aa7a35e0ae3e3ed337097e4bf6 Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Fri, 11 Jun 2021 01:25:31 +0800 Subject: [PATCH 5/8] modify README --- assignment-3/submission/18307130090/README.md | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/assignment-3/submission/18307130090/README.md b/assignment-3/submission/18307130090/README.md index 1967ca7..cc239c5 100644 --- a/assignment-3/submission/18307130090/README.md +++ b/assignment-3/submission/18307130090/README.md @@ -19,7 +19,7 @@ 容易发现,`K-Means`模型通过样本点至聚簇中心点的距离预测其归属,聚簇中心点也是`K-Means`的参数。因此,聚簇中心点的初始选择对模型最终结果有着较大的影响。下图展示了当聚簇中心点选择不当时,模型容易收敛至局部最优解而非全局最优解的情形。 -![](img\myplot.png) +![](./img/myplot.png) 因此考虑选择一种策略,尽量避免在选择聚簇中心点时导致模型陷入局部最优解。在`K-Means++`算法中[^Arthur D 2006],作者提出了一种随机选取聚簇中心点的方法: @@ -74,24 +74,24 @@ def choose_centers(train_data, k, rand_num): # 生成初始聚簇中心点集 #### 数据集参数 $$ -\mu_x=\begin{bmatrix}0&0\end{bmatrix},\mu_y=\begin{bmatrix}-20&20\end{bmatrix},\mu_z=\begin{bmatrix}30&30\end{bmatrix},\mu_x=\begin{bmatrix}-30&-30\end{bmatrix},\mu_x=\begin{bmatrix}30&-30\end{bmatrix}\\ +\mu_x=\begin{bmatrix}0&0\end{bmatrix},\mu_y=\begin{bmatrix}-20&20\end{bmatrix},\mu_z=\begin{bmatrix}30&30\end{bmatrix},\mu_x=\begin{bmatrix}-30&-30\end{bmatrix},\mu_x=\begin{bmatrix}30&-30\end{bmatrix}\\\\ \Sigma_x=\begin{bmatrix}70&0\\\\0&70\end{bmatrix},\Sigma_y=\Sigma_z=\Sigma_w=\Sigma_t=\begin{bmatrix}10&0\\\\0&10\end{bmatrix}\\\\ |x|=3500,|y|=|z|=|w|=|t|=750 $$ -![](img\basic.png) +![](./img/basic.png) 使用`K-Means`和`GMM`进行聚类,画出各自的聚簇: #### `K-Means` -![](img\basic_kmeans.png) +![](./img/basic_kmeans.png) 其中黄色点代表聚簇中心。 #### `GMM` -![](img\basic_gmm.png) +![](./img/basic_gmm.png) 其中黄色点代表高斯分布均值。 @@ -105,25 +105,25 @@ $$ 尝试通过均匀分布产生矩形数据集和三角形数据集: -![](img\basic_matrix.png) +![](./img/basic_matrix.png) -![](img\basic_triangle.png) +![](./img/basic_triangle.png) 使用`K-Means`和`GMM`进行聚类,画出各自的聚簇: #### `K-Means` -![](img\basic_matrix_kmeans.png) +![](./img/basic_matrix_kmeans.png) -![](img\basic_triangle_kmeans.png) +![](./img/basic_triangle_kmeans.png) 其中黄色点代表聚簇中心。 #### `GMM` -![](img\basic_matrix_gmm.png) +![](./img/basic_matrix_gmm.png) -![](img\basic_triangle_gmm.png) +![](./img/basic_triangle_gmm.png) 其中黄色点代表高斯分布均值。 @@ -139,28 +139,30 @@ $$ 然而,肘部的寻找并不容易。例如,当$W_k$曲线开始较平缓时,例如下图,很难量化“肘部”的判定标准。我查阅资料了解到,有一种被称为`Gap Statistic`的方法能够量化`Elbow Method`的判定标准[^Tibshirani R 2001]。 -![](img\w.png) +![](./img/w.png) `Gap Statistic`的思想是将给定样本聚类后的簇内距离与空间内均匀采样的样本聚类后的期望簇内距离进行比较,两者之差被称为$Gap$。$Gap$衡量了样本的簇内距离与零假设下的偏差。`Gap Statistic`方法认为最佳的聚簇数量应当能够最大化$Gap$。 在实际运行中,`Gap Statistic`方法在样本覆盖的矩形中进行相同次数的均匀采样,计算聚类后的期望簇内距离$Gap_k$: + $$ Gap_k=E(\log W_k^{(b)})-\log W_k\\\\ E(\log W'_k)=\frac1B\sum_{b=1}^B\log W_{k}^{(b)} $$ + `Gap Statistic`方法最后选择满足$Gap_k\ge Gap_{k+1}-s_{k+1}$的最小的$k$,其中$s_{k}=\sqrt{1+1/B}\cdot\text{std}(\log W_k^{(b)})$。 画出与上图对应的$E(\log W_k^{(b)})$,$\log W_k$和$Gap$的曲线: -![](img\expect_w.png) +![](./img/expect_w.png) -![](img\gap.png) +![](./img/gap.png) 容易发现,此时$k=3$为最佳的聚簇数量。 将使用`Gap Statistic`方法的`K-Means`模型用于三角数据集,得到下图的预测结果: -![](img\auto_kmeans.png) +![](./img/auto_kmeans.png) 尽管`Gap Statistic`算法给出了错误的聚簇数量,然而从人类视角看,该聚类也有合理之处,且与正确聚簇数量相差不大。 @@ -176,13 +178,13 @@ $$ 在`GMM`中,模型有明确的优化目标:对数边际分布$\sum_{n=1}^N\log p(x^{(n)})$。因此查阅资料了解到,在通过`GMM`实现自动确定聚簇数量的算法时,可以采用`BIC`(Bayesian Information Criterion,贝叶斯信息准则)作为判断聚簇数量的依据。`BIC`引入了模型复杂程度的因素,用来惩罚过于复杂的模型,公式为$BIC=k\log n-2\log L$,其中$k,n,L$分别表示模型参数个数、样本数量和最大似然。 -在引入`BIC`度量聚簇数量时,发现由于`GMM`的模型参数过少,`BIC`的惩罚力度不够,其曲线未按照设想的呈“U”性,而是呈现为“手肘”型,如下图所示。因此考虑将`BIC`与`Gap Statistic`结合,通过`Gap Statistic`方法找到`BIC`的拐点,从而确定最佳聚簇数量。 +在引入`BIC`度量聚簇数量时,发现由于`GMM`的模型参数过少,`BIC`的惩罚力度不够,其曲线未按照设想的呈“U”型,而是呈现为“手肘”型,如下图所示。因此考虑将`BIC`与`Gap Statistic`结合,通过`Gap Statistic`方法找到`BIC`的拐点,从而确定最佳聚簇数量。 -![](img\BIC.png) +![](./img/BIC.png) 将使用`Gap Statistic`方法的`GMM`用于三角数据集,得到下图的预测结果: -![](img\auto_gmm.png) +![](./img/auto_gmm.png) 可以发现,`Gap Statistic`方法帮助`GMM`找到了正确的聚簇数量。 @@ -220,7 +222,10 @@ self.denominator = (np.sqrt(2 * np.pi) ** self.dim) * np.sqrt(cov_det) ## 参考资料 [^Arthur D 2006]:[Arthur D, Vassilvitskii S. K-Means++: The advantages of careful seeding[R]. Stanford, 2006.](http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf) + + [^Tibshirani R 2001]:[Tibshirani R, Walther G, Hastie T. Estimating the number of clusters in a data set via the gap statistic[J]. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 2001, 63(2): 411-423.](http://web.stanford.edu/~hastie/Papers/gap.pdf) + [^kmeans算法的性能改进,优化,距离,计算 (pythonf.cn)]:https://www.pythonf.cn/read/109964 -- Gitee From a29a4413e55673d896da70941d2652e809f65ef1 Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Fri, 11 Jun 2021 01:27:26 +0800 Subject: [PATCH 6/8] modify README --- assignment-3/submission/18307130090/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-3/submission/18307130090/README.md b/assignment-3/submission/18307130090/README.md index cc239c5..58badc5 100644 --- a/assignment-3/submission/18307130090/README.md +++ b/assignment-3/submission/18307130090/README.md @@ -143,7 +143,7 @@ $$ `Gap Statistic`的思想是将给定样本聚类后的簇内距离与空间内均匀采样的样本聚类后的期望簇内距离进行比较,两者之差被称为$Gap$。$Gap$衡量了样本的簇内距离与零假设下的偏差。`Gap Statistic`方法认为最佳的聚簇数量应当能够最大化$Gap$。 -在实际运行中,`Gap Statistic`方法在样本覆盖的矩形中进行相同次数的均匀采样,计算聚类后的期望簇内距离$Gap_k$: +在实际运行中,`Gap Statistic`方法在样本覆盖的矩形中进行相同次数的均匀采样,计算聚类后的期望簇内距离: $$ Gap_k=E(\log W_k^{(b)})-\log W_k\\\\ -- Gitee From 124aae9cf9c7fe40a9423751fac6531fde31b9ee Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Fri, 11 Jun 2021 01:30:49 +0800 Subject: [PATCH 7/8] modify README --- assignment-3/submission/18307130090/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-3/submission/18307130090/README.md b/assignment-3/submission/18307130090/README.md index 58badc5..081473e 100644 --- a/assignment-3/submission/18307130090/README.md +++ b/assignment-3/submission/18307130090/README.md @@ -145,11 +145,13 @@ $$ 在实际运行中,`Gap Statistic`方法在样本覆盖的矩形中进行相同次数的均匀采样,计算聚类后的期望簇内距离: + $$ Gap_k=E(\log W_k^{(b)})-\log W_k\\\\ -E(\log W'_k)=\frac1B\sum_{b=1}^B\log W_{k}^{(b)} +E(\log W_k^{(b)})=\frac{1}{B}\sum_{b=1}^B\log W_k^{(b)} $$ + `Gap Statistic`方法最后选择满足$Gap_k\ge Gap_{k+1}-s_{k+1}$的最小的$k$,其中$s_{k}=\sqrt{1+1/B}\cdot\text{std}(\log W_k^{(b)})$。 画出与上图对应的$E(\log W_k^{(b)})$,$\log W_k$和$Gap$的曲线: -- Gitee From de041b67c22fac94869cd203ba50bca74f4ff82b Mon Sep 17 00:00:00 2001 From: xhs7700 Date: Fri, 11 Jun 2021 01:39:28 +0800 Subject: [PATCH 8/8] modify source.py --- assignment-3/submission/18307130090/source.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-3/submission/18307130090/source.py b/assignment-3/submission/18307130090/source.py index 455a851..7a75f52 100644 --- a/assignment-3/submission/18307130090/source.py +++ b/assignment-3/submission/18307130090/source.py @@ -194,8 +194,8 @@ class KMeansPlus: # 自动确定聚簇数量的K-Means模型 def predict(self, test_data): dot2center = self.core.predict(test_data) - clusters = get_clusters(dot2center, test_data, self.k) - draw_clusters(clusters, self.core.centers) + # clusters = get_clusters(dot2center, test_data, self.k) + # draw_clusters(clusters, self.core.centers) return dot2center @@ -336,8 +336,8 @@ class GaussianMixturePlus: # 自动确定聚簇数量的GMM模型 def predict(self, test_data): dot2center = self.core.predict(test_data) - clusters = get_clusters(dot2center, test_data, self.k) - draw_clusters(clusters, self.core.mean) + # clusters = get_clusters(dot2center, test_data, self.k) + # draw_clusters(clusters, self.core.mean) return dot2center -- Gitee