From 1ef588b6b3ed0f000d82687558cd9219c723d835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:23:48 +0800 Subject: [PATCH 001/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2018340246016?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/18340246016/.keep diff --git a/assignment-1/submission/18340246016/.keep b/assignment-1/submission/18340246016/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 5ca46c0e2e2a6b2a27e8a210e7ff9a982d9a68c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:24:27 +0800 Subject: [PATCH 002/112] add assignment-1/submission/18340246016. --- assignment-1/submission/18340246016/source.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 assignment-1/submission/18340246016/source.py diff --git a/assignment-1/submission/18340246016/source.py b/assignment-1/submission/18340246016/source.py new file mode 100644 index 0000000..6da0614 --- /dev/null +++ b/assignment-1/submission/18340246016/source.py @@ -0,0 +1,3 @@ +import numpy as np +import matplotlib.pyplot as plt + -- Gitee From 9275105f3472ae128e23398a7d7a6aeeaa4e7a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:24:52 +0800 Subject: [PATCH 003/112] update assignment-1/submission/18340246016/source.py. --- assignment-1/submission/18340246016/source.py | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/assignment-1/submission/18340246016/source.py b/assignment-1/submission/18340246016/source.py index 6da0614..ceb7e79 100644 --- a/assignment-1/submission/18340246016/source.py +++ b/assignment-1/submission/18340246016/source.py @@ -1,3 +1,100 @@ import numpy as np import matplotlib.pyplot as plt +class KNN: + + def __init__(self): + self.train_data = None + self.train_labels = None + self.k = None + + def train_test_split(self,x,y,rate): + shuffled_indexes = np.random.permutation(len(x)) + test_size = int(len(x) * rate) + train_index = shuffled_indexes[test_size:] + test_index = shuffled_indexes[:test_size] + return x[train_index], x[test_index], y[train_index], y[test_index] + + def distance(self,v1,v2): + + weight_array = (v1-v2)**2 + weight_array_sum = np.sum(weight_array) + return weight_array_sum**(0.5) + + def fit(self, train_data, train_label): + + # 归一化 + mu = np.mean(train_data, axis=0) + sigma = np.std(train_data, axis=0) + train_data = (train_data - mu) / sigma + #train_data = train_data / np.sqrt(np.sum(train_data**2)) + + # 划分训练集/验证集 with rate =0.3 + X_train, X_test, Y_train, Y_test = self.train_test_split(train_data,train_label,0.3) + + # 对于不同的K[1-0.5*len(train)],计算验证集到训练集的欧氏距离 + best_k=0 + k_candi=0; + for k in range(1,int(0.5*len(X_train))+1): + + true_couter=0 + for test_counter in range(0,len(X_test)): + pos_vec_list=[] + + for train_counter in range(0,len(X_train)): + pos_vec = np.array([self.distance(X_test[test_counter],X_train[train_counter]),Y_train[train_counter]]) + pos_vec_list.append(pos_vec) + + #对距离list根据距离排序 + pos_vec_list = np.array(pos_vec_list) + pos_vec_list_sorted = pos_vec_list[np.lexsort(pos_vec_list[:,::-1].T)] + #k-近邻结果列表 + result_list = pos_vec_list_sorted[:k][:,1] + + + + #test预测结果 + label = int(result_list[np.argmax(result_list)]) + + + #检验本次test在给定k下是否正确 + if (label == Y_test[test_counter] ): + true_couter=true_couter+1 + + + #最优K取值 + if (true_couter >= best_k): + best_k = true_couter + k_candi = k + + self.k = k_candi + self.train_data = train_data + self.train_labels = train_label + return self.k + + def predict(self, test_data): + test_label=[] + result_list=[] + + # 归一化 + mu = np.mean(test_data, axis=0) + sigma = np.std(test_data, axis=0) + test_data = (test_data - mu) / sigma + #test_data = test_data / np.sqrt(np.sum(test_data**2)) + + for i in range (0,len(test_data)): + pos_vec_list=[] + for m in range(0,len(self.train_data)): + pos_vec = np.array([self.distance(self.train_data[m],test_data[i]),self.train_labels[m]]) + pos_vec_list.append(pos_vec) + + + + pos_vec_list = np.array(pos_vec_list) + pos_vec_list_sorted = pos_vec_list[np.lexsort(pos_vec_list[:,::-1].T)] + + result_list = pos_vec_list_sorted[:(self.k)][:,1] + test_label.append(result_list[np.argmax(result_list)]) + + return test_label + \ No newline at end of file -- Gitee From 169edea5f44dd38eef04a63b55fb618c164cd560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:25:43 +0800 Subject: [PATCH 004/112] add assignment-1/submission/18340246016. --- assignment-1/submission/18340246016/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/18340246016/README.md diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md new file mode 100644 index 0000000..e69de29 -- Gitee From 3c12a1eb9998381e7c1bccb5f8b0adf173b58104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:26:49 +0800 Subject: [PATCH 005/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index e69de29..8e40f5c 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -0,0 +1 @@ +![输入图片说明](https://images.gitee.com/uploads/images/2021/0331/222640_06e435c4_8823823.png "屏幕截图.png") \ No newline at end of file -- Gitee From dbd75c0b8593ca3cd168fbfed5e05228159dc47f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Wed, 31 Mar 2021 22:38:14 +0800 Subject: [PATCH 006/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 8e40f5c..cd15cf2 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1 +1,13 @@ -![输入图片说明](https://images.gitee.com/uploads/images/2021/0331/222640_06e435c4_8823823.png "屏幕截图.png") \ No newline at end of file +1. 解释一下实现过程 +1.1 sup +1.2 fit +1.3 predict +2. 高斯分布探究试验 +2.1 mean集中 + xy分散 = 对应的k +2.2 mean集中 + xy集中 = 对应的k +2.3 mean分散 + xy分散 = 对应的k +2.4 mean分散 + xy集中 = 对应的k +3.K值 +3.1 不同量下的best_k +3.2 不同K下的锯齿图 +3.3 不同K下的acc \ No newline at end of file -- Gitee From 45c6c5da81bd7a0f0bf59cb519a9303ec99ca570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 09:59:57 +0800 Subject: [PATCH 007/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index cd15cf2..374abde 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1,5 +1,5 @@ -1. 解释一下实现过程 -1.1 sup + **1. KNN实现过程 +** 1.1 sup 1.2 fit 1.3 predict 2. 高斯分布探究试验 -- Gitee From 5a3180ff238da453a133b97fcecd85f455163dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:01:49 +0800 Subject: [PATCH 008/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 374abde..0c41536 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1,5 +1,15 @@ - **1. KNN实现过程 -** 1.1 sup +1. KNN实现过程 +1.1 sup + +``` +# 这里我们用train_test_split实现训练集与验证集以给定的比例划分与打乱 +def train_test_split(self,x,y,rate): + shuffled_indexes = np.random.permutation(len(x)) + test_size = int(len(x) * rate) + train_index = shuffled_indexes[test_size:] + test_index = shuffled_indexes[:test_size] + return x[train_index], x[test_index], y[train_index], y[test_index]``` + 1.2 fit 1.3 predict 2. 高斯分布探究试验 -- Gitee From ab8bfc81ae4732eddffe0e627f814b9f61322965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:02:31 +0800 Subject: [PATCH 009/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 0c41536..9b1dba0 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -8,7 +8,8 @@ def train_test_split(self,x,y,rate): test_size = int(len(x) * rate) train_index = shuffled_indexes[test_size:] test_index = shuffled_indexes[:test_size] - return x[train_index], x[test_index], y[train_index], y[test_index]``` + return x[train_index], x[test_index], y[train_index], y[test_index] +``` 1.2 fit 1.3 predict -- Gitee From e6cc90b27f5dc9b7f479e7c0c4ef95d9862e5dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:04:15 +0800 Subject: [PATCH 010/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 9b1dba0..4add29c 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1,5 +1,6 @@ -1. KNN实现过程 -1.1 sup + **1. KNN实现过程 +** +1.1 辅助方法的实现 ``` # 这里我们用train_test_split实现训练集与验证集以给定的比例划分与打乱 @@ -11,6 +12,18 @@ def train_test_split(self,x,y,rate): return x[train_index], x[test_index], y[train_index], y[test_index] ``` + +``` +# 用distance方法计算两组向量之间的欧式距离 +def distance(self,v1,v2): + + weight_array = (v1-v2)**2 + weight_array_sum = np.sum(weight_array) + return weight_array_sum**(0.5) +``` + + + 1.2 fit 1.3 predict 2. 高斯分布探究试验 -- Gitee From e0b06a6434b7ffa9a3f40ec02cf04baa3d411e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:04:36 +0800 Subject: [PATCH 011/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 4add29c..967769b 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1,5 +1,5 @@ - **1. KNN实现过程 -** + **1. KNN实现过程** + 1.1 辅助方法的实现 ``` -- Gitee From 686121c8207506ad63a461b9e4e0574c5ead6678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:05:24 +0800 Subject: [PATCH 012/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 967769b..ec767fd 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -1,6 +1,6 @@ **1. KNN实现过程** -1.1 辅助方法的实现 +*1.1 辅助方法的实现* ``` # 这里我们用train_test_split实现训练集与验证集以给定的比例划分与打乱 -- Gitee From 539d4afd793a3b9a08ec92c0211294001f1d271e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:09:14 +0800 Subject: [PATCH 013/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index ec767fd..e701704 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -24,7 +24,63 @@ def distance(self,v1,v2): -1.2 fit +*1.2 fit* + + +``` +# 我们用fit方法实现 1. 对训练数据的归一化 2. 训练数据内部subdivide为训练集与测试集,取最优K值 3. 将训练数据赋值self.data +def fit(self, train_data, train_label): + + # 归一化 + mu = np.mean(train_data, axis=0) + sigma = np.std(train_data, axis=0) + train_data = (train_data - mu) / sigma + + # 划分训练集/验证集 with rate =0.3 + X_train, X_test, Y_train, Y_test = self.train_test_split(train_data,train_label,0.3) + + # 对于不同的K[1-0.5*len(train)],计算验证集到训练集的欧氏距离 + best_k=0 + k_candi=0; + for k in range(1,int(0.5*len(X_train))+1): + + true_couter=0 + for test_counter in range(0,len(X_test)): + pos_vec_list=[] + + for train_counter in range(0,len(X_train)): + pos_vec = np.array([self.distance(X_test[test_counter],X_train[train_counter]),Y_train[train_counter]]) + pos_vec_list.append(pos_vec) + + #对距离list根据距离排序 + pos_vec_list = np.array(pos_vec_list) + pos_vec_list_sorted = pos_vec_list[np.lexsort(pos_vec_list[:,::-1].T)] + #k-近邻结果列表 + result_list = pos_vec_list_sorted[:k][:,1] + + + + #test预测结果 + label = int(result_list[np.argmax(result_list)]) + + + #检验本次test在给定k下是否正确 + if (label == Y_test[test_counter] ): + true_couter=true_couter+1 + + + #最优K取值 + if (true_couter >= best_k): + best_k = true_couter + k_candi = k + + self.k = k_candi + self.train_data = train_data + self.train_labels = train_label + return self.k +``` + + 1.3 predict 2. 高斯分布探究试验 2.1 mean集中 + xy分散 = 对应的k -- Gitee From 2832e09057af7e54527b51fa37605e67a5e5bfb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:12:50 +0800 Subject: [PATCH 014/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index e701704..e153822 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -24,7 +24,7 @@ def distance(self,v1,v2): -*1.2 fit* +*1.2 fit方法的实现* ``` @@ -81,7 +81,38 @@ def fit(self, train_data, train_label): ``` -1.3 predict +*1.3 predict方法的实现* + +``` + # 根据fit方法带入的数据data以及训练结果K,预测test_label + def predict(self, test_data): + test_label=[] + result_list=[] + + # 归一化原始训练数据 + mu = np.mean(test_data, axis=0) + sigma = np.std(test_data, axis=0) + test_data = (test_data - mu) / sigma + + for i in range (0,len(test_data)): + pos_vec_list=[] + for m in range(0,len(self.train_data)): + pos_vec = np.array([self.distance(self.train_data[m],test_data[i]),self.train_labels[m]]) + pos_vec_list.append(pos_vec) + + + # KNN结果列表 + pos_vec_list = np.array(pos_vec_list) + pos_vec_list_sorted = pos_vec_list[np.lexsort(pos_vec_list[:,::-1].T)] + + result_list = pos_vec_list_sorted[:(self.k)][:,1] + test_label.append(result_list[np.argmax(result_list)]) + + return test_label +``` + + + 2. 高斯分布探究试验 2.1 mean集中 + xy分散 = 对应的k 2.2 mean集中 + xy集中 = 对应的k -- Gitee From 95423483bff247c6a7d86058859f44336f4e91bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:25:56 +0800 Subject: [PATCH 015/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index e153822..be84c79 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -113,8 +113,26 @@ def fit(self, train_data, train_label): -2. 高斯分布探究试验 -2.1 mean集中 + xy分散 = 对应的k + **2. 高斯分布探究试验** + +*2.1 均值集中 + xy分布分散 = 对应的k* + +$$cov= +\left\{ + \begin{matrix} + a & b \\ + f & g \\ + + \end{matrix} +\right\} +? + +作者:xxq2dream +链接:https://juejin.cn/post/6844903650024767501 +来源:掘金 +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 + + 2.2 mean集中 + xy集中 = 对应的k 2.3 mean分散 + xy分散 = 对应的k 2.4 mean分散 + xy集中 = 对应的k -- Gitee From 12060eec5f19b3a955b411ebae5e31c9734d1f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:27:08 +0800 Subject: [PATCH 016/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index be84c79..f9a1184 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -117,20 +117,13 @@ def fit(self, train_data, train_label): *2.1 均值集中 + xy分布分散 = 对应的k* -$$cov= -\left\{ - \begin{matrix} - a & b \\ - f & g \\ - - \end{matrix} -\right\} -? - -作者:xxq2dream -链接:https://juejin.cn/post/6844903650024767501 -来源:掘金 -著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +$$ + \begin{matrix} + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 + \end{matrix} \tag{1} +$$ 2.2 mean集中 + xy集中 = 对应的k -- Gitee From dbe92ea7cd043b86e1eb0287c9ac3e98524e242a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:45:24 +0800 Subject: [PATCH 017/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index f9a1184..c499215 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -115,18 +115,22 @@ def fit(self, train_data, train_label): **2. 高斯分布探究试验** -*2.1 均值集中 + xy分布分散 = 对应的k* +*2.1 均值集中 + xy分布集中 = 对应的k* $$ - \begin{matrix} - 1 & 2 & 3 \\ - 4 & 5 & 6 \\ - 7 & 8 & 9 - \end{matrix} \tag{1} +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +35 & 0 \\\\ +0 & 23 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +13 & 4 +\end{array}\right] +\end{array} $$ -2.2 mean集中 + xy集中 = 对应的k +2.2 mean集中 + xy分散 = 对应的k 2.3 mean分散 + xy分散 = 对应的k 2.4 mean分散 + xy集中 = 对应的k 3.K值 -- Gitee From 3801048141d20a7647300f181fc7a9a9769cb458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:47:21 +0800 Subject: [PATCH 018/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index c499215..14bb501 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -120,15 +120,43 @@ def fit(self, train_data, train_label): $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} -35 & 0 \\\\ -0 & 23 +1 & 0 \\\\ +0 & 1 \end{array}\right] \\\\ \mu=\left[\begin{array}{ll} -13 & 4 +10 & 10 \end{array}\right] \end{array} $$ +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 1 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +8 & 8 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 1 \\\\ +1 & 1 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +12 & 12 +\end{array}\right] +\end{array} +$$ + + + + + 2.2 mean集中 + xy分散 = 对应的k 2.3 mean分散 + xy分散 = 对应的k -- Gitee From 14d1d4e31825f461c74fdf2ac42a994c1dd5844a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:48:28 +0800 Subject: [PATCH 019/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 14bb501..bd7b2bc 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -134,7 +134,8 @@ $$ \Sigma=\left[\begin{array}{cc} 2 & 0 \\\\ 0 & 1 -\end{array}\right] \\\\ +\end{array}\right] + \mu=\left[\begin{array}{ll} 8 & 8 \end{array}\right] @@ -146,7 +147,7 @@ $$ \Sigma=\left[\begin{array}{cc} 2 & 1 \\\\ 1 & 1 -\end{array}\right] \\\\ +\end{array}\right] \mu=\left[\begin{array}{ll} 12 & 12 \end{array}\right] -- Gitee From b6b2531f6ae5b73d48462c76e483ce1e117b41d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:49:28 +0800 Subject: [PATCH 020/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index bd7b2bc..fb5a0e2 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -122,20 +122,20 @@ $$ \Sigma=\left[\begin{array}{cc} 1 & 0 \\\\ 0 & 1 -\end{array}\right] \\\\ +\end{array}\right] \mu=\left[\begin{array}{ll} 10 & 10 \end{array}\right] \end{array} $$ + $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} 2 & 0 \\\\ 0 & 1 -\end{array}\right] - +\end{array}\right] \mu=\left[\begin{array}{ll} 8 & 8 \end{array}\right] -- Gitee From 1011ce111e717a9cdd19f47eb8a4e0dbb73020f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:50:38 +0800 Subject: [PATCH 021/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index fb5a0e2..ba03e39 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -155,8 +155,8 @@ $$ $$ - - +![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") +![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") 2.2 mean集中 + xy分散 = 对应的k -- Gitee From fede853ada5c1c5df0325141eea076a2d3365b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:52:09 +0800 Subject: [PATCH 022/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index ba03e39..cfb6d7e 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -155,8 +155,8 @@ $$ $$ -![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") -![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") +[训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") +[测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") 2.2 mean集中 + xy分散 = 对应的k -- Gitee From 4e48ea5a162cbc234609bfa4a73e6814de0ca7e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:52:45 +0800 Subject: [PATCH 023/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index cfb6d7e..46d3cef 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -154,8 +154,9 @@ $$ \end{array} $$ - +训练集分布 [训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") +测试集分布 [测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") -- Gitee From 25af1019ff636595e0d333c4ba2be1dcae2e420b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:53:07 +0800 Subject: [PATCH 024/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 46d3cef..e1f3828 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -155,9 +155,9 @@ $$ $$ 训练集分布 -[训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") +![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") 测试集分布 -[测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") +![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") 2.2 mean集中 + xy分散 = 对应的k -- Gitee From 9194b762ef77c7ec05c307d378806a7034df6ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:53:48 +0800 Subject: [PATCH 025/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index e1f3828..d8481ae 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -154,9 +154,12 @@ $$ \end{array} $$ -训练集分布 +*训练集分布* + ![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") -测试集分布 + +*测试集分布* + ![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") -- Gitee From 8d7ab95f9350f3c7b8c0cbd7b66ea0c0704e1a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 10:55:12 +0800 Subject: [PATCH 026/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index d8481ae..f1e58dd 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -156,12 +156,11 @@ $$ *训练集分布* -![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105007_0d3f874d_8823823.png "屏幕截图.png") +![训练集分布](https://images.gitee.com/uploads/images/2021/0401/105433_e7ec4619_8823823.png "屏幕截图.png") *测试集分布* -![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105032_733d6b01_8823823.png "屏幕截图.png") - +![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105459_56af4a90_8823823.png "屏幕截图.png") 2.2 mean集中 + xy分散 = 对应的k 2.3 mean分散 + xy分散 = 对应的k -- Gitee From 03702af752031b5fcb57db3d82f1304a11d2b7cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:06:21 +0800 Subject: [PATCH 027/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index f1e58dd..fb194d0 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -115,6 +115,74 @@ def fit(self, train_data, train_label): **2. 高斯分布探究试验** +*2.0 生成以及展示函数* + + +``` +# 赋值矩阵 +mean = (10, 10) +cov = np.array([[1,0], [0, 1]]) +x = np.random.multivariate_normal(mean, cov, (200,)) + +mean = (8, 8) +cov = np.array([[2, 0], [0, 1]]) +y = np.random.multivariate_normal(mean, cov, (200,)) + +mean = (12, 12) +cov = np.array([[2,1],[1,1]]) +z = np.random.multivariate_normal(mean, cov, (400,)) + +# 合并xyz三组函数 +data = np.concatenate([x,y,z]) +# 为xyz打标签 +label = np.concatenate([ + np.zeros((200,),dtype=int), + np.ones((200,),dtype=int), + np.ones((400,),dtype=int)*2 + ]) +# 按8:2的比例分割训练集与测试集 +X_train, X_test, Y_train, Y_test = model.train_test_split(data,label,0.2) + +``` + + +``` +# 展示函数 +def display(x,y): + type1_x = []; type1_y = [] + type2_x = []; type2_y = [] + type3_x = []; type3_y = [] + + plt.figure(figsize=(8,6)) + + for i in range(0,len(x)): + if(y[i]==0): + type1_x.append(x[i][0]) + type1_y.append(x[i][1]) + if(y[i]==1): + type2_x.append(x[i][0]) + type2_y.append(x[i][1]) + if(y[i]==2): + type3_x.append(x[i][0]) + type3_y.append(x[i][1]) + + fig = plt.figure(figsize = (10, 6)) + ax = fig.add_subplot(111) + + type1 = ax.scatter(type1_x, type1_y, s = 30, c = 'brown') + type2 = ax.scatter(type2_x, type2_y, s = 30, c = 'lime') + type3 = ax.scatter(type3_x, type3_y, s = 30, c = "darkviolet") + + + + ax.legend((type1, type2, type3), ("A", "B", "C"), loc = 0) + + plt.show() + +``` + + + *2.1 均值集中 + xy分布集中 = 对应的k* $$ -- Gitee From 51b9ab10652cda0db8da897675f20572235cfaf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:13:34 +0800 Subject: [PATCH 028/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index fb194d0..94b5226 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -230,6 +230,11 @@ $$ ![测试集分布](https://images.gitee.com/uploads/images/2021/0401/105459_56af4a90_8823823.png "屏幕截图.png") +*K与准确率结果* +| k | 准确率 | +| ---------------- | ------ | +| 1 | 78.75% | + 2.2 mean集中 + xy分散 = 对应的k 2.3 mean分散 + xy分散 = 对应的k 2.4 mean分散 + xy集中 = 对应的k -- Gitee From 737f72377b45ffa45f5d22672b36aad59ab8c530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:19:18 +0800 Subject: [PATCH 029/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 94b5226..2aba0a1 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -185,6 +185,55 @@ def display(x,y): *2.1 均值集中 + xy分布集中 = 对应的k* +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +4 & 0 \\\\ +0 & 2 +\end{array}\right] +\mu=\left[\begin{array}{ll} +10 & 10 +\end{array}\right] +\end{array} +$$ + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 4 +\end{array}\right] +\mu=\left[\begin{array}{ll} +8 & 8 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +8 & 1 \\\\ +1 & 6 +\end{array}\right] +\mu=\left[\begin{array}{ll} +12 & 12 +\end{array}\right] +\end{array} +$$ + +*训练集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/111859_687c068b_8823823.png "屏幕截图.png") +*测试集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/111906_d0e2e134_8823823.png "屏幕截图.png") +*K与准确率结果* +| k | 准确率 | +| ---------------- | ------ | +| 1 | 78.75% | + +*2.2 mean集中 + xy分散 = 对应的k* $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -235,10 +284,12 @@ $$ | ---------------- | ------ | | 1 | 78.75% | -2.2 mean集中 + xy分散 = 对应的k + 2.3 mean分散 + xy分散 = 对应的k 2.4 mean分散 + xy集中 = 对应的k -3.K值 + +**3.K值** + 3.1 不同量下的best_k 3.2 不同K下的锯齿图 3.3 不同K下的acc \ No newline at end of file -- Gitee From 14eab53ac5f492e17dc93538c008893c9fcce9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:21:27 +0800 Subject: [PATCH 030/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 2aba0a1..9a18ef1 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -183,7 +183,7 @@ def display(x,y): -*2.1 均值集中 + xy分布集中 = 对应的k* +*2.1 均值集中 + xy分布分散 = 对应的k* $$ \begin{array}{l} @@ -222,18 +222,20 @@ $$ \end{array} $$ + *训练集分布* ![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/111859_687c068b_8823823.png "屏幕截图.png") + *测试集分布* ![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/111906_d0e2e134_8823823.png "屏幕截图.png") *K与准确率结果* | k | 准确率 | | ---------------- | ------ | -| 1 | 78.75% | +| 4 | 62.5% | -*2.2 mean集中 + xy分散 = 对应的k* +*2.2 mean集中 + xy集中 = 对应的k* $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} -- Gitee From 95ac2d2371d7de6a57f2c8e57008cc89b5b66e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:25:31 +0800 Subject: [PATCH 031/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 9a18ef1..9aab188 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -287,7 +287,61 @@ $$ | 1 | 78.75% | -2.3 mean分散 + xy分散 = 对应的k +***2.3 mean分散 + xy分散 = 对应的k*** + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +4 & 0 \\\\ +0 & 2 +\end{array}\right] +\mu=\left[\begin{array}{ll} +2 & 2 +\end{array}\right] +\end{array} +$$ + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 4 +\end{array}\right] +\mu=\left[\begin{array}{ll} +4 & 6 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +8 & 1 \\\\ +1 & 6 +\end{array}\right] +\mu=\left[\begin{array}{ll} +10 & 10 +\end{array}\right] +\end{array} +$$ + + +*训练集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112426_09535d36_8823823.png "屏幕截图.png") + +*测试集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112437_53a32eec_8823823.png "屏幕截图.png")*K与准确率结果* + + +| k | 准确率 | +| ---------------- | ------ | +| 2 | 86.25% | + + 2.4 mean分散 + xy集中 = 对应的k **3.K值** -- Gitee From 7c88f32407cf34e8ed2e855bf59f479bca89755b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:29:07 +0800 Subject: [PATCH 032/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 9aab188..2c150ce 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -334,7 +334,9 @@ $$ *测试集分布* -![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112437_53a32eec_8823823.png "屏幕截图.png")*K与准确率结果* +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112437_53a32eec_8823823.png "屏幕截图.png") + +*K与准确率结果* | k | 准确率 | @@ -342,7 +344,64 @@ $$ | 2 | 86.25% | -2.4 mean分散 + xy集中 = 对应的k +*2.4 mean分散 + xy集中 = 对应的k* + + + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +1 & 0 \\\\ +0 & 1 +\end{array}\right] +\mu=\left[\begin{array}{ll} +2 & 2 +\end{array}\right] +\end{array} +$$ + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 2 +\end{array}\right] +\mu=\left[\begin{array}{ll} +4 & 6 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 1 \\\\ +1 & 3 +\end{array}\right] +\mu=\left[\begin{array}{ll} +10 & 10 +\end{array}\right] +\end{array} +$$ + + +*训练集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112759_754208e4_8823823.png "屏幕截图.png") + +*测试集分布* + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/112810_ca9d4230_8823823.png "屏幕截图.png") + +*K与准确率结果* + + +| k | 准确率 | +| ---------------- | ------ | +| 1 | 95.625% | + **3.K值** -- Gitee From 09c735138f878a03a47d6d4283f058c09a17fac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:30:28 +0800 Subject: [PATCH 033/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 2c150ce..ddd781c 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -183,7 +183,7 @@ def display(x,y): -*2.1 均值集中 + xy分布分散 = 对应的k* +***2.1 均值集中 + xy分布分散 = 对应的k*** $$ \begin{array}{l} @@ -230,12 +230,14 @@ $$ *测试集分布* ![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/111906_d0e2e134_8823823.png "屏幕截图.png") + *K与准确率结果* | k | 准确率 | | ---------------- | ------ | | 4 | 62.5% | -*2.2 mean集中 + xy集中 = 对应的k* +***2.2 mean集中 + xy集中 = 对应的k*** + $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -344,7 +346,7 @@ $$ | 2 | 86.25% | -*2.4 mean分散 + xy集中 = 对应的k* +***2.4 mean分散 + xy集中 = 对应的k*** -- Gitee From 34088143a60d7ec6900d6ecf51e0075f4924853b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:39:51 +0800 Subject: [PATCH 034/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index ddd781c..61877f6 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -405,6 +405,12 @@ $$ | 1 | 95.625% | +***2.5 有关高斯分布的结论*** +1. 与直观体会到的类似,模型准确率与高斯分布均值离散程度正相关,与xy方差负相关 +2. 模型在均值分散,方差集中的情况下表现最好,在均值集中,方差分散的情况下表现最差 +3. 最佳K的取值与准确率无直接联系,准确性更多取决于分布情况 + + **3.K值** 3.1 不同量下的best_k -- Gitee From ee9ac51821f0ce42029f2aaeea5b3fe0cf95c8df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 11:47:50 +0800 Subject: [PATCH 035/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 61877f6..a1b275d 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -119,29 +119,30 @@ def fit(self, train_data, train_label): ``` -# 赋值矩阵 -mean = (10, 10) -cov = np.array([[1,0], [0, 1]]) -x = np.random.multivariate_normal(mean, cov, (200,)) +def generate (amount_1,amount_2,amount_3): -mean = (8, 8) -cov = np.array([[2, 0], [0, 1]]) -y = np.random.multivariate_normal(mean, cov, (200,)) - -mean = (12, 12) -cov = np.array([[2,1],[1,1]]) -z = np.random.multivariate_normal(mean, cov, (400,)) - -# 合并xyz三组函数 -data = np.concatenate([x,y,z]) -# 为xyz打标签 -label = np.concatenate([ - np.zeros((200,),dtype=int), - np.ones((200,),dtype=int), - np.ones((400,),dtype=int)*2 - ]) -# 按8:2的比例分割训练集与测试集 -X_train, X_test, Y_train, Y_test = model.train_test_split(data,label,0.2) + mean = (2, 2) + cov = np.array([[1,0], [0, 1]]) + x = np.random.multivariate_normal(mean, cov, (amount_1,)) + + mean = (4, 6) + cov = np.array([[2, 0], [0, 2]]) + y = np.random.multivariate_normal(mean, cov, (amount_2,)) + + mean = (10, 10) + cov = np.array([[2,1],[1,3]]) + z = np.random.multivariate_normal(mean, cov, (amount_3,)) + + + data = np.concatenate([x,y,z]) + + label = np.concatenate([ + np.zeros((amount_1,),dtype=int), + np.ones((amount_2,),dtype=int), + np.ones((amount_3,),dtype=int)*2 + ]) + + return model.train_test_split(data,label,0.2) ``` @@ -411,8 +412,13 @@ $$ 3. 最佳K的取值与准确率无直接联系,准确性更多取决于分布情况 -**3.K值** -3.1 不同量下的best_k +** +3. K值 +** + +***3.1 不同量下的best_k*** + + 3.2 不同K下的锯齿图 3.3 不同K下的acc \ No newline at end of file -- Gitee From 979ab862116ae3f5039d310ef1393d0f97660677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:03:22 +0800 Subject: [PATCH 036/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index a1b275d..2feaf97 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -419,6 +419,34 @@ $$ ***3.1 不同量下的best_k*** +(这里以2.4高斯分布为例) + +``` +# 准备数据集维度 +amount_list = [[10,10,10],[50,50,50],[100,100,100],[150,50,200],[200,200,200],[250,300,400]] +k_list=[] +aug_amount = [30,150,300,400,600,950] + +# 在不同数据集量下训练最佳k值 +for i in range (0,len(amount_list)): + model = KNN() + X_train, X_test, Y_train, Y_test = generate(amount_list[i][0],amount_list[i][1],amount_list[i][2]) + k_list.append(model.fit(X_train, Y_train)) + +# 画图 +l1=plt.plot(aug_amount,k_list,'r--',label='Best-K-Value') +plt.title('The relationship between # elements and |K|') +plt.xlabel('Total # of elements') +plt.ylabel('K-value') +plt.legend() + +``` +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/120033_088f8aa7_8823823.png "屏幕截图.png") + + +1. K取值与元素数量无关 +2. 最佳K会趋向于一个较小的值,所以在fit时考虑遍历[1,10],无需遍历更大的K(导致额外无用运算) + 3.2 不同K下的锯齿图 3.3 不同K下的acc \ No newline at end of file -- Gitee From 59ba14c2d14761e6d5ff2b323fb8ed9c73280a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:04:35 +0800 Subject: [PATCH 037/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index 2feaf97..d9e68d0 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -413,9 +413,7 @@ $$ -** -3. K值 -** +**3. K值 ** ***3.1 不同量下的best_k*** -- Gitee From 0bf9f950a569592a6b0f694632897248bef8fa1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:25:38 +0800 Subject: [PATCH 038/112] update assignment-1/submission/18340246016/README.md. --- assignment-1/submission/18340246016/README.md | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/18340246016/README.md b/assignment-1/submission/18340246016/README.md index d9e68d0..c998960 100644 --- a/assignment-1/submission/18340246016/README.md +++ b/assignment-1/submission/18340246016/README.md @@ -446,5 +446,40 @@ plt.legend() 2. 最佳K会趋向于一个较小的值,所以在fit时考虑遍历[1,10],无需遍历更大的K(导致额外无用运算) -3.2 不同K下的锯齿图 -3.3 不同K下的acc \ No newline at end of file +**3.2 不同K下的acc** + + +``` +# 因为我实现的KNN函数没有K参数(学习最优K),这里采用SKlearn数据库中的KNeighborsClassifier来做本次探究 +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split +from sklearn.neighbors import KNeighborsClassifier + +# 导入sklearn iris数据库并分类 +iris = load_iris() +X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.25, random_state = 33) + +# 在不同k值下计算accuracy +acc_list=[] + +for i in range (1,100): + + + knc = KNeighborsClassifier(n_neighbors=i) + knc.fit(X_train, y_train) + y_predict = knc.predict(X_test) + + acc_list.append(knc.score(X_test, y_test)) + +# 画图 +l1=plt.plot(range(1,100),acc_list,'green',label='Accuracy') +plt.title('The relationship between K-choice and Accuracy') +plt.xlabel('K-Value') +plt.ylabel('Accuracy') +plt.legend() + +``` +![输入图片说明](https://images.gitee.com/uploads/images/2021/0401/122104_30809a7a_8823823.png "屏幕截图.png") + +1. 同3.1结论[2],最佳K的取值会聚焦于一个较小的值 +2. iris数据集大小为150,可以看到超过0.5*len 之后准确率锁定在50%(几乎约等于瞎猜) -- Gitee From 995af67ca45c3e02d0286696b32538e31fe08f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=84=95=E7=84=B6?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:27:33 +0800 Subject: [PATCH 039/112] update assignment-1/submission/18340246016/source.py. --- assignment-1/submission/18340246016/source.py | 68 +++++++++++++++++-- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/assignment-1/submission/18340246016/source.py b/assignment-1/submission/18340246016/source.py index ceb7e79..c43b0cc 100644 --- a/assignment-1/submission/18340246016/source.py +++ b/assignment-1/submission/18340246016/source.py @@ -1,6 +1,3 @@ -import numpy as np -import matplotlib.pyplot as plt - class KNN: def __init__(self): @@ -27,15 +24,14 @@ class KNN: mu = np.mean(train_data, axis=0) sigma = np.std(train_data, axis=0) train_data = (train_data - mu) / sigma - #train_data = train_data / np.sqrt(np.sum(train_data**2)) # 划分训练集/验证集 with rate =0.3 X_train, X_test, Y_train, Y_test = self.train_test_split(train_data,train_label,0.3) - # 对于不同的K[1-0.5*len(train)],计算验证集到训练集的欧氏距离 + # 对于不同的K[1-20],计算验证集到训练集的欧氏距离 best_k=0 k_candi=0; - for k in range(1,int(0.5*len(X_train))+1): + for k in range(1,20): true_couter=0 for test_counter in range(0,len(X_test)): @@ -67,6 +63,7 @@ class KNN: best_k = true_couter k_candi = k + # print(k_candi) self.k = k_candi self.train_data = train_data self.train_labels = train_label @@ -97,4 +94,61 @@ class KNN: test_label.append(result_list[np.argmax(result_list)]) return test_label - \ No newline at end of file + +def generate (amount_1,amount_2,amount_3): + + + mean = (2, 2) + cov = np.array([[1,0], [0, 1]]) + x = np.random.multivariate_normal(mean, cov, (amount_1,)) + + mean = (4, 6) + cov = np.array([[2, 0], [0, 2]]) + y = np.random.multivariate_normal(mean, cov, (amount_2,)) + + mean = (10, 10) + cov = np.array([[2,1],[1,3]]) + z = np.random.multivariate_normal(mean, cov, (amount_3,)) + + + data = np.concatenate([x,y,z]) + + label = np.concatenate([ + np.zeros((amount_1,),dtype=int), + np.ones((amount_2,),dtype=int), + np.ones((amount_3,),dtype=int)*2 + ]) + + return model.train_test_split(data,label,0.2) + + +def display(x,y): + type1_x = []; type1_y = [] + type2_x = []; type2_y = [] + type3_x = []; type3_y = [] + + plt.figure(figsize=(8,6)) + + for i in range(0,len(x)): + if(y[i]==0): + type1_x.append(x[i][0]) + type1_y.append(x[i][1]) + if(y[i]==1): + type2_x.append(x[i][0]) + type2_y.append(x[i][1]) + if(y[i]==2): + type3_x.append(x[i][0]) + type3_y.append(x[i][1]) + + fig = plt.figure(figsize = (10, 6)) + ax = fig.add_subplot(111) + + type1 = ax.scatter(type1_x, type1_y, s = 30, c = 'brown') + type2 = ax.scatter(type2_x, type2_y, s = 30, c = 'lime') + type3 = ax.scatter(type3_x, type3_y, s = 30, c = "darkviolet") + + + + ax.legend((type1, type2, type3), ("A", "B", "C"), loc = 0) + + plt.show() -- Gitee From 7c1648b7355ecf7f44b285f07427d8cef6e12476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:30:41 +0800 Subject: [PATCH 040/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/18340246016/img/.keep diff --git a/assignment-1/submission/18340246016/img/.keep b/assignment-1/submission/18340246016/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 16c197ef049b9296b4e600b7879efa184489c336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 1 Apr 2021 12:33:18 +0800 Subject: [PATCH 041/112] readme.md's IMG --- .../18340246016/img/105433_e7ec4619_8823823.png | Bin 0 -> 28759 bytes .../18340246016/img/105459_56af4a90_8823823.png | Bin 0 -> 14691 bytes .../18340246016/img/111859_687c068b_8823823.png | Bin 0 -> 33266 bytes .../18340246016/img/111906_d0e2e134_8823823.png | Bin 0 -> 15637 bytes .../18340246016/img/112426_09535d36_8823823.png | Bin 0 -> 31102 bytes .../18340246016/img/112437_53a32eec_8823823.png | Bin 0 -> 15380 bytes .../18340246016/img/112759_754208e4_8823823.png | Bin 0 -> 28511 bytes .../18340246016/img/112810_ca9d4230_8823823.png | Bin 0 -> 14918 bytes .../18340246016/img/120033_088f8aa7_8823823.png | Bin 0 -> 14675 bytes .../18340246016/img/122104_30809a7a_8823823.png | Bin 0 -> 15150 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/18340246016/img/105433_e7ec4619_8823823.png create mode 100644 assignment-1/submission/18340246016/img/105459_56af4a90_8823823.png create mode 100644 assignment-1/submission/18340246016/img/111859_687c068b_8823823.png create mode 100644 assignment-1/submission/18340246016/img/111906_d0e2e134_8823823.png create mode 100644 assignment-1/submission/18340246016/img/112426_09535d36_8823823.png create mode 100644 assignment-1/submission/18340246016/img/112437_53a32eec_8823823.png create mode 100644 assignment-1/submission/18340246016/img/112759_754208e4_8823823.png create mode 100644 assignment-1/submission/18340246016/img/112810_ca9d4230_8823823.png create mode 100644 assignment-1/submission/18340246016/img/120033_088f8aa7_8823823.png create mode 100644 assignment-1/submission/18340246016/img/122104_30809a7a_8823823.png diff --git a/assignment-1/submission/18340246016/img/105433_e7ec4619_8823823.png b/assignment-1/submission/18340246016/img/105433_e7ec4619_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3ebe23a4c696d374084525296b704bc1e94461 GIT binary patch literal 28759 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 literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18340246016/img/105459_56af4a90_8823823.png b/assignment-1/submission/18340246016/img/105459_56af4a90_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecab29162d04ce0e20d91129786ace0133752dd GIT binary patch literal 14691 zcmb`uby(D2^e)N_0}dg~fHVq>(jl#cFcJz#cY~Cqh=d^FjM5+>B|U%$k^<5pN_R*I zh>FrBAc*wcgM5GIo^$@Y&;5^w*|GN8YrSi&cdt*Fruyykq>Q8l1O(@ml@zoI2%wq- z1Q1&|G5F7w#<6w+0#*WLg`2wGkhOHzURyo?Ur$7Ob+o9qV^xZ~?Nu8Wo27O9yRUOR zo#zls_+m0c)XS8!qY--5-jUjTWIM>En<-+q?Ta*F;LZDeUl>xtknU}QH1_fO4tFoC z5k6!6;DvxkDXYyrM;l&yFLG~9VnD_>v*M(v@{h68lRq})17Gj`stkBP;F^BVf55f4 zF$&HEVn@JO6i%$Y!qO&27ts;%N-Y=LXJ^N>WX3O$;uCHp zJ;9Ovf6Uy5@+1fXiNY>;ok_G$jYf-E{@p2kG94P~bGX^zRC)_Nnmu#=pMYpD7((;B z+~Yp6@t2eV8_(t=EDo*KM&bF!q79ILB6mii^`Xmc3mGDm-@J2b7bcxJeQ&JSAMKC7 z7kBmPG3lk&kiIL>^!LZ)4}@l=y*J@M{lr|vI>X|_bFB~lB_m4=!!#Oy6m*-XEK*xiFuA0?v10-;K3Dz4*&MA;w^0$_B)vR zmT|%Ddo#qn<@_~W+7L`Z>qq6YV})pCW=3P?_=x!B5cdJ zOsKA5h$QT;iG@Yx@5*8>Eo5#o*Tt$&{@+Mu-HG|H4~>lxDQ?pKXYl9Yi*M6u)GH3G zeKQ>&JbHhpoJ#XZbGx1iG8)bDNdBKqPExTFvZDlqHC;Z`H(Y|uz2LCD`R|uRYOVq7 z@Ql-68$mo*KMVaXi}o)nSNgv!NW1Kvqkdnwk&u-QxYH(7H^q#Z-)7tV;qQTKoa$-$ z&Tx3X3SU~_KgY6BW@UopCUf#;=%S5~xeEu*6%6^mo}3)mjhC3sj~ZB{^HM>?LISDJ zBz7jTxs3Dp+)tV}ab#XmZLncS6i@3h6GWFnXYPHsL=`r|Or?INhjR8o1N1Z->OCU% zHg7=8Ut;8t1@G}%`0l*=&JlMKf+4?y<;fS*2Oo&$6Aa9goe=PRi7RPmz-Ds?SBj~V zQ}}AYh7+KQeS(NRfwSZM2C(IK7{2)LPA5Ev{O_9FrqN7MetbI!v!4>Wii~|i$&M41 zB^FKrnjYnHRJo7@O zucEF-bPg!aiUgq~e?uWO4&Q~y&d?XT4%;Wqe__5HphR5Yi>Rgk@BeQBpxyD7Jvsbs zcXE6*pZ?1)&u75*tF_GjP;?4shPTza07vWq+YIdN^d?YvK2g@_w}z=|*UZ|vM3eBs zOFpy6-_3-S7drkBLAzgAQl0@}CLRdis~@%d?e5>}E9=QfS>34_@H#o#P3^h*zCjBK z&%gDu27ZQrME~$lzA!rZ8E>kcyf_{Mw*&Dbe zPhDiiO%DDr2D{ju?$R+1b{W%N7KR#;{ag;sk5~X0egPaBtrB?Yz2w+`xFR z3(j@h?KWBhsw{-SG=GP6#*<%yk}F{dpxs(A2+b(8HaUzHK?KgL6$rVE;y^TFhB;@f zzKz_1>8@&hlsSW1DX11%eqLt4WSWfsWGi3x|0||qy-6+@iQSgnr76ubq*WZP} z^9NhsP@WpWQ))|>!tb3Gr3grZf2bSc^q-yRA!1Vym1{Xvd`__haS^-4%w+%sNYA0a z5J>>#p?BoLn*{-ujpTyH%=ry>3;BJu=>Rw@?(jjb?peswhmk_Mg%NQzC|tSY*XxA; zjP!v9P8zoSm?88+8w0f4Un)o8e}?<1f86Eo_alNr<|6p!K&*X+RN9bnoX6X=pc*VmH8`Y_^!?>Ir)SDTmrVpjMaVL$8nDFSq`V>uF>_n zgRU_9ayg~lx}p}8(5q}G>nVLmZpY)MU;6hJP`>+POFsf&@nqrgAi^rhvyQq}3=y=( zIKxN$Y46|oHKa`JppRZ!0RgXI#~<~un<1Y)yRho*Fw>l>(KMr(OUT7Lqt|5>&=R** zu)ttqVA@CGQddNl`{U5l_p^skIb~&B|Ev(-|@w24Q6?ENur5?GohnO1NG1v>m6l8yt0An4XJxzTaYs~HP zI3jG_fZX(6UG_@r%M8l0y?%`6CIm7X#JGDJ1JENdQf$m-!9P>Qc9uONHG`Pfii7sJfGDLhXVeM4fLxJ%Z z*k!rrzNdJ}3dagqv9>!0IT?D&d_CyWX>7GNt9=}>SZq&5XwzKacN?vzHN$+0cI4`~ zG*9~!<#4yANT-*cG68cR;}qxn1axo{j5O#V0;8DZ0^ae_PhKSw{s?U-#9(Nh#2EWY7B`h?95RyUu+e?zymz=iIVSRWU$a6Q2jL)6ubr#gy~h_e!i@ zUj51FkRB}=n3pV>>Ob7L|IK49ukPWF^prk8-D2tM|EydIzTFjUA5yxzG8nh+et|$w zX1R8PWLsa_k=RjRcVb*m-d%6**6@{VVL}Lv-gQCZQ$OOvN($i?CYDKbNpLb&@0wn_ zy?=&bd~~>Z3H*${iCgrhQxz5vpxDlS%l%VT8y??X#v_uuVCJlthH{h=I5gHJhB_iI ze#HZ;AQg0uqH2lS_40?fpwysFH@;gPlU@i-BR{?eQ2cVTQ1Z>~pV#K=3n%;A|ET3? zz~&`SRDV9lFuE6ZJi@z}4%95uo9z7C&g^&0Jj;(Q>`%0dN=w!j6?W1@lHvImOnAld z3E2Zx98ZKLou!AV-olUh;BYVJ6qEiV?B4vz-y)yC?M!_U12+te{(SN0O^w?_KMv^R zr_(YR^;*>lsEaPXSQ{<@?WR%g#sZmR1hM6vZ=>H+@(bI=>OUHh6%EmM6}~+_)?4O( zz@w-;>M#Fj+4k!j8^;0#i-{zoO&bdX{v<)BsS6gDaoUlLr{Zj&af{3sHH5uv9j7&i z_!qv~My*bYA+=J%cw9Yq&riH5%%A#P=J}!LnNfgTInc492Ubf>&>#-_^k}BU;^8YkGeq zz29f}ZoQ($3_p)`{w{~rE9rBNZGFsKbY(?9v<0pOtC}aIXZ5q;4=d>e5pXW~E#+L`v)_1%o^uJIqJtOW}eY7V7?Pgc&#+!Z&7xwjU zljSc?lMdt4vhBZ{T9x7q9jE<8qO2n)iU#2MMvM)3WB^y4Eq^~&>+Sj<8nl|Ei;02y zflRNzn>|$z$N1m!t4R-$nzag4vLIq;QFGn9;PE^w)uO_|L%ZB7asN2G*zd^{Tdt5- zr>$KXxk=($LAWi&Q-h-sue>Hvho2FXPm*>Knr8WKl=zU-3D+f|Kk)YZ6xFyGBiZZf zFzj$UxTsnpp|{$F(Mgv}nUvgdHTuGwb_~fh^4OTxF5YMBO|1=cZx7=Z-}-pE*_a-;wJklxjC8p{E=cfW?3cb0FQnO3OGKG zBKz`#l60R0rA1?Xg_^XN<&m}JloMG}ZalGaR`yBod<8}_JA7$rc&pj&g2#`)eWgAl zi_xDPIltO@w8%PApq;aBGH zI35~`S^KQFxLECZ!@Md%iv42AC(gYhgi}f%&$7AjJ;&r5+>I7?*AzlBsIJmg(XJIK zGCk5N-UJHsRgJYs7p?IQ*?oxo=)^F}zQ{T13Of7D*Fy?txnu|MB zHw{e@pD_xstI!MA~ltR$gJJjET6O#e%YJ-!4mLF8F$~R#OzMDU4^dn66NkC zGn3Q;z|&)y9uz7+X^-vx;*~M3fm{c=OLpvLcb)_VinUhj593P3`zKyf(0aZ ziBNo3>dW(;M9LcdT+Q_F$I8wLi&wd%JX>&1@s;%{82S`DSKc#MxtV85+c8Z7$|au2 zuUb@^6;?}*NC{!z>~%3HzN8T0hxSNjzH9g}Sw{7iQVx{b0o;Q>4Xc|NSZVl-gVPmC zJ6x_c-X@A8<*YZ?HJJG{o>^7p?k@)U23<}?ZEZ>pT|tejoxfh@zR>STCP9WJCwVop zXA{bjbn6ytqJ&aOpa$P@WD!GO?TQZiXwHLTq>2by;2l9eV(NUxFHpd1s094g+}QoB zHuJ7VkNnzY$H{P`D8oBfNQ2(Z5vJ3r#~v)br*)N6J1 zJt#MI6f)>ylN4tcP+JU09~FfRWGsu?$+tR1?onn|oRurj=W`&`<7Bbrp^K8Sb?@0* z;xQWx!S&I`2c-Fo5+lc=fI#u)##d!%Q<&*_>$W+XvB+2gsAHs7$2~k?5+Wan#Xe^J z{e~7w1UNJ7Q#vq|3)&`lt64%Y%P%LR4c3X~pKqyOLZH#P)VzE_Xj)ji%sGw-);|xj znNPAZLRV&>)pC|{1Q11epn<1==RjU~6rVuD&`G4xN;7WrGPif4nu{roGY6rW(X7n} zW7Sl{NC=LaUiVEzOWaBL6!%zuFW6pcs>!rb4qb~zg z3#M{0XL5rDUB;o{P!6=EDy;iSZ!#gZ_`dCNneC&Irm3sa4&pZM>+g?Wx-L&47(TNp zm@K{F7mYrzoLPsj#ywaE^W<0ET_<#tY#k;%f2{M;Wsqe?L?-MuEr&;4czMpgZZyJK{u6ichWfXa9Lu?h}GwwZWMuD_f z(Zd^5hn*?t{QingD8G?7uBPO}MpAgPZHqb(LfE`yJcxAY?-{kUd2}GJYcVp!@uy9V z!h+oFy}ZFwnjj2ma7s8h_-AkpI4yg@6r^$8Y7xQ+XhpzDjp`& zOcM@LvvC7G^VH7<)8BT#XzmPD>A6TfP8$x!sBjy9CWXL7IRIdTeZ@WFu>8n&ZW)Xno!))Jxge}*9OV_` zyh&wG?aN|Lu62UQ?h}*x&q&GDS;u7iJ>^~hgq4c7Sm-6=*d#xGc$OY^y2sq$&cdKR zQd7nlWeXhOE8K7fXZ7lSlSLmCVqR^E1P~en>9@qtA?iU29TDybVRTa(Jodw; zZ9V_^*2+O^5`Tv+GwINTC7Z^I28B>rlgIR_Ov=B1%J=!74UjM3EKw|XeXTa(?uiamd2Ma*DvJs zZY%%1=?JdmjUu@(o1h%jQzPGhWx22qRExbsm16ET<0SwdJ-H(LE<#u)Zm`(a{eJm^ z^=%peONq-R0Gf$8GXLOE$P^%a(OP9LrOfJN-Rx-)^mV5sqnIuLgQPQ0M)dT8>UwoMB{bViGr}`p zhGnwS0v9s_uwM7#C#VisNuhel+?l}>`yPKcm{|4#YklU}D$0&J;^t^PTzHPuWN7qC zu9>*@YA~TV%xEAF#a*wXW_yyCY6y1u#oT>4S zKQeRiKDA%zGsSJ(RP)&K-ogMeM+K+ikYlBV3bbmFTj89lUNv0O%O}^ZH9u&*tE$1Y z^_#EEPo?bg1(51+4UZ5)G+_I7fs-%ijL*$~|8s7D;-||=S(1e2 z+~Y2Er9-7D8AKLbTR@FA59}%8K`heII-hJ)Zdijj8)NX{f!L3(6Z&AmIs;M zI|G*NB>6yQ=T$YyY*}fIdH-_m{?85oLz~cs7^&-IP4fq`IXP|tT&-0!g3^aU%O@t$aOzu)vMDyqz2_L zKhRoLR$G}OOg&j={;_*wZLg{L#EM&iNjF2*VDB0;mzmI)e&2_c4{M%3qbO{byv;4@ zy8H~?5A-H+o9-JANxq@6SfO285xtNwnAeRe7}iqPr`ix2N>;UGcT|^Sbpom>YKd^y zgPqauyxH5*Ot3lxy_JA5om4HrhX=O_Aahad?Cf&rf5iJQF<YH=g(o1nq|8(7)PRe8+sS_n@r^aNN5bQip#y_cq zgdWN%TuP{zVp5znNA4|oynpBw%k{LG|?mISz zrAs|}-Au;B7Q+XjyI6dc?FV(iWP>w>*7&|ZWv0X4qo&=Q`R@{xDd&A`c(N}ERW}|F z{ir^W3#}3G^Q&00qTWR}vtzS}blF~aqHD={ZEsp;pua_pyw6}eAqh8<|o}H^s^G%ZQ_;4b8;@6TyR$)!UGv<}L#;ns`0jIbMl2LiIP+*d0 z+=p6SlI=Bne=?+nX;L5CmR@PZ!&JNT{^2zx0iu+R9~O z$j?fJ?nGnJnNi|;Y(Gr?8olPB7hTEjD5;9CxXwMb&Jz$HcMT|bSsm$Pu3%0Zn;Fr0 zPhl2{tbI}!iCy2s9bz0tt1Ds}0_8iBK0{QQ{H0Dp%>mHCuZ6%vfxKJhH=m@B>$ z!h-6__Hwu(GjEu{P$Q#0;Wf_3byXIRvsU4^5gWH~VTeur+J&d}p;=qfEM^uflqbIm z_FQHCe_HZ>F&X+{tu*8g=eh({1_73xMj$eX0Op6}ieNj~erXr5TxB$r`(vrW!sXgR z!T0hTCT!9KyL~D9pDA$;1v@@cNZ8m=U%e&xz?GdRjlN( zbbS!L)k>UVYGuMW;N`4?wB>U=~p*k%kcwMwKRqRr4^u*LLTX+4SRk%~1dA^Es?3 zh__IM7ZRF42E{R$?t?GKQs;VurG=58VT1$aX!{BOKpVG}9yY5S#G7CC=PuPHankTc zcUyRV|KjAdy)3PBxr4gFukiuz_AJ^9T1 z<@kGK=>Ck2db~QHhQnpT1nqYpC%Rj1%^21fko-p}euaPbk^lEN?<2{n!kL&?Wn>Xm zQk;Cb-irY|?N$#g?!9KxxGc_|(C=x38xBjTyl}=QW^>@6@)g(cblmC`JnA#E)KLyg za(!uC_uF%4j}k(S-0yl??(O(f$A==G;+xPp$3-Qb6MB#zw$tx)`pqxJbwa6PB|M?89IEW>4VGcw zhi>>v4q&x2!|_clsTlc=m-`)e2q0o#Ki~c-v687k9ll8ZhMM(_4Q@G@)e}{_AJak| zG$h7I{uIp$QPR;K~+<<3Lnr}da zHP@51t)yYMF5_P2Gi&6uPyu3v8TOJ;Eb4mnXwMLU$OINA>JC@%ZzZTSOz?{T@*ibO zQ7A~c2kaCkB&aO=Eu*yBIKgT(STKAZUF#?uFG36z@;663w6=Hq3&(E5BX6M{>{nT= zE+uG`W?8uzLd$HNt*IW~z5KR8TuKz=BRxiLL@+-DeFA0+5+lqOa~W$mPu`B2wTcjm ztFVrM|M_1`A0Hbc;z5{VC;tbULl=u4!kAIgODa67pwQ%*`F>Xtz<8+bA|EZ=LWKMH zLw`O^W&J`Y(HhqxU<%gHr32(GNwD;%YbWAJkE^1|#}vf~OV$j^Gc> z3h{8Q_>XT$v~z59QKAKDJO%bHu#Mn3jWs+s>PW(u5@+*Gs_Du5q1D(+yAz$K<(xHG zg3)?plL7Gh8JK9kPpCZk@#;?6ug}n=V0&%_5+*hR;P&*W%d?V&dUT>Dlum}D$RB?H z+pnFT>Qu=kLt=Bz7jL0$nT(mid!janpaL-utkm>~^h1>74-}|HcrPg%S!YHKw^4XD zUb{OeCI=!7tw zixn+?>mIZ(?LaqmFM(V)#RXZo01i2y{NObN`VyN&bgQ1 zBOu6*#?BndLDeLeIL7&k0Qt zmD^uO7IckoeWDP#_FgAU!(J-YPhWmY!5`6y1$Q07CApQg#$r4L0ZB7&=0~T=SSjK6 zIzle~>$=L{Q&awq%%(Kk>7?I=_Q(`oDtv7Zw*lUo;9@@|HE+D}YEZfUPwfp)*++aU zg6=z0lxiv<17H;du~KZn=G{F%@>>3t&XC}>mW3>TN9_~Cqx&C&o$xV86oe&5Iqof| zBBdd9EfKQEUu>DI^{pahoTlgtznRI})pO5V%{A&tJM z6>HsNDZCx$^>gg+#oFy*kb~S(xY)R@9lSM6;rejwGVTT0M8gL!fu5K1{Czs#Rq3GC z-DsihPq{&@p3(h}QhH>Jke*%aaeJC>Mv-C?AWNEKHuHPdOa;bSIxhHnxVYT;BNx3R zZNdoi82+1>CB>WZ`rzlmZr%)B-wtF935xV?D1E57)aOUf1u~C~nA`^}$2^-n>SRok zrpgNy-qPrX-mNa;c9DQ&LYF}+mk`oNS7H4^th?=ps-~udEGep;E0PcQvy z`hC(^DW{x^!8gi%cN10P+c!Tq`S)TaBfs zL$AYeuy)b+TwI@{5+?c$q)hsZ2ba8H5*sdzw`p3w)$KdF@9G(-{drsj*kZ&Bj0R*U zGPFTU!7H?L8nuOl>2?lkj}OAy{{&7AHl&WYN?Ba2%K79X7YR%VD+z6a#XIK8QpeIM z&b|v}euLEb?@>pRNrDo4h2+%>Y`HtmDkCq!hOpTl7>g5_GExwFm=oHdte~$j%LE>S z7?ENUeF*chHRt<)}fZL`=6QydN;0LeEu*=kriM+gpPEatik|Br<%%FyT$bmX_zB z;`P)k)c4=mbV=eCXz{_poCGN0SEdYhR}wkFfwG{9l}*=C6X8T?n*UUtLF8X)mM%W) zX?z=xxeCc0UMy9d<@{tzP7%@RWVb#1m`M0#fEJB8Fh@Q(!qP&n5> z%wF&>2EjJ`%MzX^0$rb5|0NpYAS^@38P{c^mQ>4g{YnzV&i2 z2KXLZeo0a+c3DLr`oN0*qhj;iP~ryYy9kW{ZC>uuR*UEx^-7y$aB_Z}!xOTnEhhMF z9)sL+2Q$8{p9=ZTo%gzRtM>jP+m|dNQ<>OSYP_yY06JD}eTPHUNyzyvgJ~bA-_@qa zKXHcwBt(%Czn;Bqxybeo%m_fXUB=J22Y#?8L2Rg6cH&n`yZ7z_zW2{k5P1KGK^-C3 zM+CigbI@jtF&%e|ISPRodE(!3RkzFiUg*Stkr-Q zz{^bqGU#PQ0~^Qu>noopKTpn2Qe^!&y<9+q(1D#O4CQ4RWdbc%Ft!ixFqur5PK{n# zKW+a5E&z19j27Ge5tv0}a_&kSzl*bryNed&>RG~#1WNIQ%PmI9z60}L)#N@eb}8ZK z`F_^d%L>J>e-nOVdshDK8%pDnaQf+$vWVj6#d_oGf>L-8t2Gnw%OO8K&>1gdyk1N| zvPt-%geY}o%WkNWyWX!jJkP~0b*PbEh!>D5DSG#Q+#gdnj}F09iLhAEw#y?lK;+~B zd-3ofGb++CWFPbs_O!~fLHCV|b9$q`h=#uO8%#N>I|092!N*vr z)fnEY0!jlX8|g`!l`lDlYg_cB;eS+{caw+)=J7U#5CT06*hN!DH0+w9iWC;UvkBO$v#|R^-U~(_)g$ogIv`wa!08f< z&~BWRP*wQAgSBv#!pYe0QOI$}tZ%1TO+c8NA4jaD9x7dxK;p6!U9+`Apo8 z{4D`g2ng54e9?JDjdfH#Mnbbu{#zlz-`$TLeg937R_E0D1uOn*EfKM?mPBspJwF1+ zjsUmPj-dY|&VlCqOix3X2p2q83=5P8o)rahXbKX}U{=ctet~i6Y-(oI3!jm&zx}7e zWde=LENOdPhBgIHF2a~*7P3j9O_Mf?dTHPRjta1bDxwc0lGpAm4wB4|sC+!Is>trW zNj8wd$QA z8Y(MjOjZ@eU=98u6d)Pcf$@TDf(ewo(uivH)X`aqfO%cW4g?Pm0KI_gE8w4S{--Mq zz{>^vaYL!Z!EK(7LC^qEbZ46B|2Y*%4}lY_u&I3hoPtS@U*F2RYs~cF{OQm$rt@N{ zHD83_*UvvC@NlJx&mNR?Gz6i1y$s}HGITifUt`1}7SQEg#aTAwo)pqYLE%1K>~ED6Wy;c2#s^m58xV)M*2n){z%BXaB+Nb` z(nnF@t1OM$IfYqQ9+<9MIQfYEBy-f+y}jW4eh1xXq;TA*c^j1!(OGR5wP23Iy>PvA z{S5Hw&x1Wxh=yguI@@$|w+&DaKczXQNMM1kQd_kCZ3a-mkCZF@oTnVV6Q+p`RVeb< zVVxbyvsV>J_)nYIA;bnZZeC&d1$ACtd;a2&C+@_Ox}>G=7!WP*e&%J$S}Bq5NipAM zg6|pWPJc`kgd7c)=c-}oUtg51%%G=g*(RBtfn>Hx|DbOrW4wdtHRojuHs2)XPNOIO zuv$rFwMgUo_G6f};K-7Jf;C(461CDdLYa_OL4T-^ck?}==WW3PpFjw{S^qPA*6{aD?ewA&v8QqdZm|L2Uu0nZm8AxQG`6A1Dy`sWNXhoaG_lxY1oxsq;^%3Xk6(N%^ux_EW%0H)V zK~KlEsPe5wQ$~*miFD1jeDrA?9j#V zs>2WWNnD$IdY;rg(JP;mz0<+mejCT!Vnp_y8^w}&Rp8NTxI+22Gjbe$!WuirCtv8>S&oNIV@7{UY*vlNunH;c;R zpTC;tj_X`EL2a(zv;HfI+%rJ>9F3U5bQ|25zLa0n(1{<5=~0|D`GfJNf|Vd+OM4CX zNszTZ^DmP&sa_tn6zdBI(zzBb^YM0QmL9wcmF7ZCG5~#8iU-%{Q9jClFnp3?d7T|K zX;6OCGO8JG@t-Q5u%q@bkeEoqM1Au$zAv#j9aR-l5*<27&PPuUPsn~Dm6P?Yi0ky! zmN-@9;bo+RL?67vMPkedI!8bGyN;7k?9Q`scbLbecmb2r=;;7?1#geX6k6My$B*|H z-w9YhFjO$7Zfv8^?@{|-AA_JCVne^knzf^M_bmxb8ej!he@C{nqFBO0kKc=#|1NW` zTfMXAew~aMf?xgrwA(Y^Jp*ri-uD0NpZTbb6Ud<-vviZ{uoU=sl0aEeU7Z~*9NMW=p>><8(p-~yU__kh#>)9Ephb|F2)Z9})ifW)if};Vb$`g!&Wt-yi7WFJ$nrhj&*4C_C-{NWhJT77e^i z0O6Swu+aZ2*C-{LVy+kO^XI|;icIzlg+X10oOMv?Uj@!EkcmqcanaG~{;LkRB$n85 z56Q(>qx&-7?YuCrdjcNm50deq>+qwDf8S*J3YjqR(C@PKVy8IAzOAZ;3M9~vrF$=n zvO)jD=3fKlI-xB?c6lMhNVN23=OoxkaadIm|6@8RoM=>0X)P;dAC#DkR>qK4F8{As zNeUo(#tpsKMyGL)S8)|UxZm}V5x&5efj1~Gf};fgRUTSIhl z3#vm;g>Pw0ud&|~axVU_molUguhjJwf2eSn@m{>Q_wJ)yguQYy;J-hWe5}3S$$7By zzPoa2wVEh0cF8DbP?u`*4EkS%pCQL21>d0PiZt1zE_Awmz5la0GC(w~r8GGrxMb^p zuI(Yx(*Tv)|#DB{Ni~9hOD$2{2n#&)mw+2QTmIjZ`&PNEiCcKfe%f zA%QfFnlVB%0wc(uA^>_Vh4haeSB(zWma7pNG|x+{USe4mFfb^P0M)s?XNLBvJm!I8 zj48){Yl41Y0KvyAEn*Z`hJzXtcHTzr;ex76YL#`x1eu?4Ed zGX9TtVoj&@rXAEule%m8^5LW%=M#`MJ)RVm;wz&^@baU=|J9f{?EYKDmtt zPgAQJFDR`Y>O+~2n#M~1UqD}j5HR(f(od|%MmhHd5C2GGTe(uxtWz4u#Vo6u2z4g< zZ~j3X6q7W$q%6*1T_Yfs+hH5s>^L0%U;!TXeP)y~2!NJZz-FHPHyuFfXmjHeItDAA zY(~Wm7yA?q87Di%0}oe`gAGNPR4*yP9cIxp61^!&xWpwLZz%`m{u_+BehA=d_;by0 zaB_0a+RZi0ROmI%zU;i}y}&WL3j8RQSkDI4C{b@_CuVUQPD7-Y@3{0Z42M$^HeRv8 z_Z-1ba5c{yG-|Xrm_5t#ShT7pX-?tORm$ZnNK<$^#F7lz{}yQ<Y6-`f3GF}A5PLm$QMXj$r3x${ifI`Jty+1?K`JmoCDC?vsewxmW4i~dg$ zmOx=<)m!<;ywx^_|3C4W#J*xTTQ~5~qjneEe!1waMf7y``;sR~5oePk`$-q-`pkGe zK4l|CYtQUpF(?Q-LfS8R-7B}_s+VhaBvWv%ILFVcObHR3C9G*_QvZ398rds1qtCNM zd|27`GeSpjsJSTJ+rLi53*=?Q$%n)&?}ZNPCiW%ox+PVnrv7jEY!V%TbFZ+IH-R+L z1P^U#8-IilAc2?Q5lp6b-kGS%zoCLK7-*?K|(?wb1@=>UdI(1`3IcnNUa)F4t~1iA-T&k)1Hf`0XvFzRxt1P@uMVmoymD&@*Tnz%e+eFx zZ!=1?%EB~bm2a)uiGp98nu01y+<5%fBgWn0fE} zWW}P1Q`GWaH~~|myU}K$Rd!R{z9a!6ruIhO2D`O+#}!HXt~uKQb&f;K1^xS zGiuG*mUTSkc1_D#gMS23B+A8P3khTfBiuiZE)*wzk=A}Tu6&?tk!9|GVd4L~V^^!H zrZ0{rhfof2(O9DZ3=zk2?_m`nx8R!DyOrFNmFW7lmTMVf&Zo=2nf-vd)IL{lliL2b zWpBKafJVYr^0N6?;k3}$lMe&JUp^_ugVI4{LF>|*pOr98?%!H&@IGuV6Op9ql(y7j z{O^1=d2_0_a{T>1G!BSA>8t-oCjjfcOl|~?FMq_RV)u8p&Cz_KU^Ugyr`#s}ai!63 zZ7_(`|7@RMA(6f^-iYyFrnax+yux9`P8uOK+e-mbT9geU%UuN{!!I+Xx)^#GJOti% zz)jjNGKE)PDSnyc1ATV*HHgQ{N+taibEU(1bFf^aL7I{`u~WNpm*(F%G>cyjYJ>-~ z^RGZ@>lWzLgF*b~eZPt&@2xmj+yv48@DgFsk50x(%&*pmr?2^ZY99L6e3L zq;sz1;n3kAiYuOAi2AdidEY2lvAagsX(X5KHU$qDQ}q*U!QUXKpKf=xJ7*>Cj=D*{ zSk@$fR6#vB0Cg@D)ral9WY?DZB+E0tMYH}tZ}Ue!i=hn?Z??HZIz!*hvq6rx3P*_niR(_w1KjY6is`4Gm-N@K_Pc>553B?y9bnE{mz=X&Q17;Bq`c??x z&Mkacu!$52j~>TEFSkO^`}Xnn_Lfi?(S+AjZBH`V_JxCdEsh8b31G@h2z-{&Bl7NU zg}_AM6KHvLYPA6B6v!jDwH_-a3#~#tt9E2As-X~i0*3g)V(!<(P!=@Mn0q z+L_+bs=K-X8`r&yWEb8 z`XWK&bB@b`6t3zJJJ0sldZP-t>od;ARtWQwlun&FrwFJ=f@P z$n_>E8f%yih3+Ki?oR=EhfQkitglU+?hGK{n7!Kar-QIRr!%&<-mO#UDr`Nv~cFg|S34#?M3x%zXXugUf zyl!iNb_Vbiu!UKW=I&sG? z3tz|FJwJbbEt3DxQLn&}avUtQqElyp`62s1#h-{&E;dStXUW$XAPzh&3!c_VlVfqj z0!E~2v%49qD6B~-#gETDcJ&--g|VPW~WK~+kpwZ7E7IFJ4p+I@&3Y8k4#$4|@(;M@2ZWIZVgIf(Jox~kchR}&L?qX52GU5_c zcv@dHP>llIVG@1K4<6=?1~x{c4iO+qlggIQZ7N>5EtzQh%~WVU-2ynu+Cam4b#k}_ zKkp&m4-p*Tr-ws}lyDPXUTB3t3`h%QV=VV1l|fyVfPd}~6=lb06v|lLVy1Fy<%!J< z*Re65M{@4))t)Yio5d#jowrs#lCMh}dLApGXG4O3v%uIVBiUSZwAnl5g+t}jGNp8e zi-F0<3jaOFx<-{?%jG6WB1ok9#4|P zS$>6s#So&1@%|6*o{!nHgp2PPj`@XZ_@Qj|-Z)mu`1gl4V*`TeE29b;w%mwjblfF~ zXrURuoQi+*MuQCeOSSnuDSE6j$<36%z8oClDbu}_KEM;E`O{)XEc+t(MNd78ZYd?E zQ3KDhvLB@z;Ze)EnfGZ3685A|j9`5hD%vhBen)jAzh_CTr(b7v z!Pmi2vw?KCsy8{l6?%duDg$o@7zJMzx0t)kZ3+`@KSS8A5@yjUn+rgpRetT>%QenEWpUHi-nG()Ta#tZ%s9kCWi9bzinOW1@ znOS)9JrR@;VOct}G&MA@SR^qu>13 z5G>T(m*sA;ksV1U#`@Y}8r$gyk^C#Tj&eyVVNOb$lv^T-YH{VMhKjNmwcG;_wPGoy z2z)Rl#m34oyv^YJ_5G=k7^24x75tQxhQ)xzw*!^NER`An!YP1Cij$^SnjDsMzTk2^ z2X&Hy+~M~sPIl?E&*QZyC)j!P3l7R_42E&~C$u_sb&d=l5zgOzBzq?f$OXV&pca0x zWZ{)nsTAEQ5&x$3sN?to)gUF{{Z1|CcBpBIukiiG_Zl!P46F^F)arzI9{F`XJ%4$n zE&_l>ASpf*W7TRtN&NG=`9$r!+{OT7+P)Lu`uJB#31X!(35f5tD z6QKGvFZ1TBc5pzjq7-g_N49x*H#^yG85kDgmS}fby~LjGS@np()wzE(3mwt6I0`2) z0zyf!aV)RDT6)qE_wwW;axf>hA{D$nR-h#tS2Y%@rZMD+J+zE4iMg41)&niVSvl3Y z46?>dgyD?Xe?EXtKVT#3MCEEb92jf$S32WX{8et8(3Wkoew`lb3E*i8K6o#cV;b@N zhI#wnCzJT$ZW;!jb!i2~+n^5T4a{LM+0%UQ^X=wbm%}0=rc)QX0lurYlcDakO=lF; zu4)OF5%K@XgjLC@_0v~hW=*e<;5Q?R3@8B28Y`c#o9BjLtxUess^o^v!8*xXT3Qpr zqZlZ!sDDxb$>r_<+U0-#?N>6A23d>q&FrC@f`Haur(LMJ$44mu)L$SBS%y{P$B4Eo z;G7&BQ8KRp@$Ftj$L0Vt_%{2VpmC87CaKa9q#jPOjr)~ZU;x?24OMh$iaFte@^34K zVdm3kCe%cZ2(_HYmLW_irN<@5Rm)7#`bESq94_81Rw^01piloeR3f9FbfJ{O z)BT&D)7K{sj_ zelqgpVcbgIY3oFJ9^c$XGHng>0Mm85Q|}Exu|s|>7UkIEmQ^}np`YbkQ}JJ@Y}YeD2(ArrmY|MylF^!LVYkFrMpD*-~_v&Jv)#T%O*hDjh8@;pL{fugBlZJpSp3D5l)LH)k zt!w2Pw-wQC$3<$m8`(gb$;sBrVqw1f(ro_4cY*u-UZ9=3LD9CpQZ=WPwP}CG@(OqX z%__d*BvuYMXrtD8xHn|+Ih6QRACV;V`8=~DKsU>kN2z9?FnL{TN5Y&$I2mzwM`@>V zOKtr}8=zG$jzfx}Ek5({kZP$sH5G4c^LU(Jq>)Xx8?j8IcV! z0bphb9gR2cPgLTnxzlp1uZ&bC24 zpomIG2QP_c)O9dN0s6H8!x_$fuQKMzq^mLHrPrIB(hiqzd|V;~2Z|{Cbwv4XLDIQa zGIK>zFP2;Vz9~QIP%JbenmG5J5_D*p>2jfJ^h@quw-3809{s4z`s34_s8H<4W(Dx9^$0HB7h}b#$JflF zv3}K@bs%Wx&B(4z(RQB?4d`Z1?510$c@5S=IX6L&veCf4Vb_))WZ)R!uZ#}(#!wKJhi<9scF{ zc%3731{N_M<a99iELeAWG6jPw9kPT3KD_oR*>z(UT?Ud`#V* zP0=`aRCyD9dF?el7FyT4#)k6!MJGLEk8oP$UK&xfo=3sc#Mk6n#8BL>bppHv?dSh+ znR&6{^^bQMwC+Dt=pFP4IJ}K*Vv5+^3BXff7yD*#QupRdY@tI@uh^fjgqeW#uZlC} zdEsNMUmw&Dr=Uhuc9T#ekx=y1=)LVsyJ2P&HUbxQyS*=6@sIW^t8XB1ya3qEe zL4gtzhurBZ`_MK>exX}M1)$52XFlAW#}!et)0qeXB)LrH7syJ=H=+RMr#D%Bw|U2$ zHRM)QcJF%^b1==tthCIH@2_QY?NRE@U%kiwMe-nS9xaS0O9zrz(cdcOt}@a5Q#gon zwewX%p-I+z&~QHxt}&Wp&$$@0@iH;><=u^2-xpwu`GiwF)p}ont3JR~FES}+$2)t_ zxXoPn1DqoG#dURQtUy7PD?82uwG7YQhB@=qEvX}i$O$N19qPh&ftJKh4n@?`5zQ6H$aora2 zNZEgK5wc#Ik5_llNFq9|F1U`~>OL}-L`!PLRq*;WA|MJ;DZ70qJ52*_DuIUuqk)|% zJYUAJv6G_Q@wQHhQD1n`lIni!4{F6rNMV+tIqXIPhdHEPHEjW@pZSQ*RM2nr9|E+1 zKMndR=ZdSei8~t{`4+OoL-}&??nukfUQdrmY1plc(=peRY|q zAL%PqWk6#_(}Jsooz#~)Xf%%cLNXcjWjW$U4OMI{8K_d65KL24t=J$nZfd@xCk$Z; z6H|i7k}}v z7tyw=I=I$tkTg0Z`=Q^!^*d7@agkGyY@Q(@KXwIR0;pmARj;k!#pTtd%0(UZn&|W} zM$gZnAC9(BVkWU5`_!W(#-RtX{XvkGh)HGenKL%lPq1RR=;iEh$~AturjfB8`Vem* zYp>-iLCiQ(_)xFuZ@(oizZ_s1eyNJc1BcftqCDi2*;M&`hDk)EsEwX0YJOW7l;u+|( zBlTaRn~x;k`(0YL1N{<*ulrCWv5IFr(JXhMS zqz1WxVdhs8PW{|P6!;R5H6PAGM~3nKMK^k9z1JgPj6{Ty`;2y!-U`mVRpF&u)-Iurl|)t{J$9#^b=+Ik=#{P zZwQ(MaP7&*TD_2x{ym)L{S@?nZKSo=fkLz`XDXn`41(6V() z!TGZUTBE+UrB5?{eCd0`${TFqdRaWK3m<;#+iM6AmoSZ0G~4}4{7NLArh0Z^S|$E* zJMZQ!n^0d@iIFpo_RZIsJhBloi)U`0HXByb%93`WlO>f)eZEIc`H3b|jCkENFUBn# zS9_=LAaQGib~#RMY{^%*R55oDFfAp{K8Nk(94C746Te_bJN1E}q(7)mN%bT;X-?4f zy9|{ZqMp$k=&P#0R42OkA(sJvUe)<=bnAO{ON?#e97mV`dM;-2czV%_D0VS+|#hj)A2w54%z=7B_R4KU(gwIpTEs0SUMKUB6-{!UWdHf(uT8 zYVL(G4eWIujlXmbkBHp5I92YoVPT)#vh(DWovmFC?afFbq6!2aAVZwmE4J(d4&EzD zbSSuMEC^7(#sa4hF5?ntQ|0KNY_Qf2c~Vnv zqspQTxu*pQmP@Am&0=uj-#FF?D~mbpeOg)-S1UwlD2ob_#o?e@N`hp?C9IF1yg47P{5>WMIS4fB7X( zg{6?k0%kHfb+bd6j=R%;w~0928egwr9)O}tAT&SGaS+=1&4h1Og^uf4N_3B6RDAh_ zP(x|{T&g7JXm$C@@!a4ESrboBb{Kr~dqbEe7v3h$dcSf8=I&-KSKV}$>rxN=b6P6x zrJpoS8VS$Knpn5^eb|HF(ntS?KkvycXrkI|&SIS2wOhW}%v`FPQ`;9inp-}%MRc_M zdTYYdv%%Dko`0_8L6s)2=2T#E^lx+|oG#Z(GhfvqgwR$rLQpw*K+cI2qvE%^^<*WP zZ+bfdR3th{oOy007X+zYPz>+I`~W_hD5>5LoiRZ&U0$1L*ONo6Z=ZDw*E zYd}8?*B0D?=s+?Kj~(87>)P*oP5dhFEMGx(jM2^ySZ7Bsz@W1b&a)!lvy}{P-|P)P z5bPZQey(<_9n3RG?fGlaw)9u8W6tj(@-q3xxUnsSndbf>-=&+Hk<3qt0$ULaSKyHS z+fY;8OYgIDwQz}>SAG5M*T(;|3lLx)e={nCb6hq@UpNq1E&A=;FSY zkbAsT_-u2Zch3NKgiF%ygS+!zAuaOMeae|xUYZ{-lgRQ(oAz`9Ag2ykg6IZ^^e zTEwjBYH>}zY$hgl**$yE1$Nf!2-j@p^h1T;P5ZXdE^UelN!I@BsM(nxvQ&73zkX)GRx{_>Ztl zFH=&b_?ANgDj(IYgNL z{1ydcCbiJMyL2FlAHPFPt12qihJ1dge|ru0OQ56#EGL=ontRE9(N*lY9D61HVw~(N zu?v8z6{T|nwr{1!xQRk~9IC}VDikehcdcD(GrEzlJ5{Uf1kW)52UP)E=x)-KJU>e6lLsl* znKt&KROH|<%%eOX23NH&8i^CsylY39&zuhu>uPFxb{A72gs-`V&M^^ac!)-4i~!{h zc2~YJFydQMpFGxf(ySKrf4EW5;(DLVC`J?4W;22n_y^jvLVaY*mS=YcJ@&XAHyanD zRUOc3Sa_dNd4LF{|9*s*bV^iFYqOZ_)ab#oxmZrw@iY zwSyU&e1GjiBCS+qM;r){*MW<5MSeCs_Mb5W(cL1|8RV3J>)H6>Ex#aT%k9qsjhG zC687#vsgZ29De zKYOtj!hj@d#?DCC9z|B~6C=;q^F2^M+>ZisTz!sB_;KiU&@J}$yA=PL{?zT&#;Spc znvZ%B_Bh}ZzSv7*Kr+m9i_%l)LBAG?$+44}z6~oJ%jVqlBth^u3IajbFZVACVcmjQ?05klMhsQ-Vt~cv|7_Q^TN%tq5QWR<_V>X~ao@NWzv&uf=C=3x z9rVU3)0X47dL*;rk-)6cIuPpKPQ41bx_fb0d)sKAwM{Zj>!MqVWzVYX7_RqWuKLm^ ztB&yp!1?C>&8;79rgFykX-N0QG9*W(0sDAvXTmL<7F!s_@C0j=#;toTE%tFp9k$a-X5tlGLYPQZr@foya9O>3qBI zW{FL3{m~lH9Ri4He7nM!`V(P|V&kMynMQBJDNptkEiqf5NXy%edzVJ8KJO%tWg*9g z*rn2jtLY+URR(vI-lsD!XM%j zPRk?`VMfeb-&+}V01R_m3cG8vl(W};iWf@V(evZYgQwmQrT3|cSznfSP8-&GKK74p z?gI?ng*l{?*752l^;X#x?z_lyUT;99bAU}758|Ta`63pqCrh6_}-kci$Or1 zgMVMx3?OSJabFZhQWe3zwxTl?wL0j!7K%CLaNPx7PYLpA`l-yaMvSzSuT?bCCLwbf zWs5V;AdEloa!?J(CdD$*B7Dj*DR>$IG9t800JZzRLakpWW<0z*sYbfApKq$>N>h)` zriE>xv)QNz8=Kv~;98eUId;^qe%%E+VWOQ-oF6B_xkzaJ_0=wdIZma?>)PDlSCBD< z^6b3(y-O#}$X>mNRh`3oQlgW&}=uM{og;PMD^wsD=+WVM_>sww0<{*qyyGY;{KT7jv z7~Ifx=nb(8nn76+JI}lNgPL<0o@NH?C8fq0Nzb2Kfy&;xzF~?9gba-|!X6$Zm#KF( zH-oLI{XB~*ya%sAET)_G>5}hH%*yv9TwhS#=eKofYa0O%%tnIJZV=0B{~v=`#2mYd z5*!=-Xi#-jSjtXZGLsbzBzS;b=o;p7bsX4{IQT=wDsC6Q7kCzEHd8lr22cws9nxejhPY7Qu?Af~ z3Br;$xkcgXGl-?NnJh=uc+wnD7jNw*HpIx@)iw1l!0`o-wtH}yCpzd0;c2kB=r;2@ z>z--_B7F^!Niz|a;1i^Io;WV_IETR~$au-#>EH4k@axocOTyBorthmClU^tG$KLp5 zSi9_4)_is~p6j;iELlsH$;?~m+2gLGFpX;orkBf z*bUdrmaQ4S+uz$xv>PUUy7c(7+b4@kF-t*f*;mPmbk3CJRoEewY!Ec5Ws?hvUG}f{_$pjA+9_K7paD;f;^qTsJ5> z*<}tJsovT;h(#q?R|-$s3n3!+CEjU>af#o9Yc6e}sm1l{h9@b_$(?!J z;&DtH=K#pY%h6CJ>l3e}eM4#PThRp6vSHt(mVG#us$yJVO;~ukU{7j~CHu2BXI$=FZy1y-bodqP|ntvvHtQ1$8B3~USY@9n9AO%6mh_Yl#7 z^7BdCiE&dB`;Ly>z)68>#6uGyn9qjHbp%`_r>p(v1a24T6^K8dhKJ$G+X}PB(eLIO zE$O^9l!TGZ>;3fOj**K;z!&w#`-6mofbWS>AZ7kv%V2w8HncVr_2 z9RxG&IF_0hAd#dV+2#W{u}VDsUbwr1$N`;NXuOK9nPQ@NoNKdlu2JfDJ~?V>=f6uQ z-vZkuNfi>wgtY&byBHPs$TV`F44Xu+==C0 zJc#HrwD22;KR$F9mSTP?B6RW8F zuckYn0B-N4+d}k-`WR*s&B46k6s%9{@D)5Rbbamhk8uy3*GKkYq~U;Vm*)0(B47ie!HU z``)*JtvmES(DVA;R(52(wfC;x((U2L2$oguM*!Q5Xl9WoeIWz63AKNcL%mCyzS4-*O%leEKwl3LM%^#Cb zm4t30cR-jJXyZJ?eX2JK+Pt5yMSnkD7d0a{d$#yYDT3(8a0wGRSX((fKB<=oLi>R; zBB^c8@N^G5-bJuV)(5|V$8kv6+w{A66sqSKA+G-^&M&TW()_xp{AK78JxbXz0az=E ztl92n%Zf&nS_x|yZR|LuN_Lu1_jnG@Z+1SXG7!}$RYHS`E`z^M(vBL;9fxFjIq}eb z#l~SoZ5 zS2}{agc{;3&BF&+86?&FS+SPWtwZl;Rng;MnL zs>$tx#iBWv=lVv3!mrEq2p`%SGMpYr^R4zu3wDT0`;)DZXBcWdpO6j$ku?eX+5 z7R8miOIZ?Pt`kuv$&9;>cpC=e^1-pGnaQl{Ui&VG+ek_lsFnEAA$7!3C}j-ljS6z% z4REjD@qk6le7CgRiAyl#7yX-tZ;bTtKssegWRBCuHdW)P)}HzU=b)8(KkQ0UnH9=* zSLy=8&r=3<_Zwww&Mzu(KHCd#8O32I^;pEj()ety?;Ut9P|5D5WDziBS^>W43rr_% zD4$iC#2H`T>oqVK=JWlu+IVxzTy>SqN|2(~0jfdMzP!S;@Ubtme|KN#qbdK^=4Ezc z=G)u0_Tx!W5|q8ay~zq6WDPIFCG_>@UFd}EufJ?%;LqO4H#2ZA-A<|k;?Ux_V%=R3 z#h`;JwZ_dHO{b6)C3j~2Ta>BMrd7<~Fy(zCAG`>l$4DgI&(qB$WOxj;#k9|FD!`;| zqMF9r$yf-4wS3)tuqw#BNZvo=PHekO_rt9(I8qlS$aqq_<|FNqpS{7y$0!)RTkf8JT$){Dmd zv6*h7jEcmxmzCe8wW6R)DAXHMGXwf z0H{O6P>H85duuGuHinka#=$V5?grq)(mgZ zB=zr(9hE%8vli=~!fl`9KC8nY)<|u}arA8k3F??vFVA&SE12)yeN{HNt}vyhoooF8 zNC@)@5p1F$0|Og7FX}J83khJ#m%sV^{^rQzLHgIpDw5@~ar3QW2nJ|2b)!>K>~wR= zps3FflTIj407kGNxe5DEeI9j)vAQ<&a_KlwmMQ62^6wt;GmmQ?0gPwVm59mkQXmK` z{S}o0bxD#+z#qsuC!NSz9Io;Ltnx_6DyO_FEb{mw$Fsl@%_;F>o<8LiWE{|(84%Uk zw(b3Q{>1rj?1I8W7-eGN@OvY6yVaonE#I1p#>WExS8^D`N~(g5w&|y32l;-9i?ci; z)%gDsr0y`REBR4=GwCnJ`g@AHhOg-8uzKVPMI=UV;R}a#i2hY%%FSAT9LW_18(@^7 zLxKQBM^&+&^-r`Ma?J9pMFY}PvOlT_Q1pi8(T*aO z<&Es`$j?Ax!)4PJuM`jWcaoy}q70Kb*QD^zxNe#iRJGY@K5@KY0=L;^wjc0UVW*&` zj}f0i#r}ToavS!Ehg?>3=rQdwn>maaSVe0SseNI}Pf7im<3#AP;5#|y_uD~kA_7rj zI6Uo+*~zk~9bj1^bP5;pNYyOETBanOjtVm8emrIIOmz4)C{7}aes2ReuWDY3eW<`7 z2y5f1#JBe$e%cshAoJN7knA1i!GvE`~w1q*=SM;HrXe!JG*r@!>M z0`g5SEa}a#|I3qYYoXm9fe!S;;b0CCt?Rb2EkrW(|>=U zRG>9O>!pQzJ?E3^-3yd3?sv+f(6F!~aI3a0w)6jHajjnSd98tnhm)Rb(o$)d(IUe( zVT)MtpUGi=ju+T|MUl8EriqgdT?;$e(>z!wxD7bF8TZkL*i|<3hS{dA@W)7I;)Wiq z#8oc@Pg@r)B`hJz;I|Jl=Y#X}6hdg}WFkG{5^T42u7pfWJBOT@{|%8?(omq;7Uh$S zsx!jG###C90~p0Xv?_MF!xAEht?oe6;mYQ1+uOmQ;<*D!G3|v{Jj#waxB<`2di%bk zA|`LZG?Km$Z{qyy9{B!jvZt*N0q){@i^)B|QuChwo!SA^#i7wd-&rhmzRCF$B=^kx z+c6XD3S>*$FM>mVK)v3T_B|@mmKnyW`L+WalZQ6@wa+*@HPz(Q_!+a!S>X>!?}feb z4mz0<@iV%6urSe31~$3K)@O!oDyeIGgBaX>gC@jG$@{ja*fK#lkmGq9!RzT2suQL8 zp1Tuw$!Tu(1Wb)ATl`%+RH&*Lor22AM$CN>ZIK;<3bcD7KQRXP^EJ^rP7b_@6I_3z zGBbBgXg}UDMX6Fh9!(orhtvRX@3kXCG)W{s@N6YmqLVEe^@Z*>bylU5Ymmk<1`>c{Z{v~ zR*ZZ*UlBMI*xj!WmI~S!u^X6ZfjN`xC(J9$v>nmcRDQYc#y@s3wr(o1yky+s&uZ2TqYuO!& zBB04lMPoH2vxI8^hZSF+zFsTtrcI8>b5qN%W$s8-2nhpn*a98qfXUz(pOyb`~a>z6B_1t4KR-;xRpAe%~?-uo*3VX{`euoKY(H42*< zc2;8;wn@_JH+Gy#&UoCPAbW3EO*exHuVZ!5rVhB$Ew29NTpq8Jq0#{8iIcL4Yn|ql)SFJ*TL~lB zL?tQ>^IT&7^lVdDb0yLIfKN5!i{CfLZ<*r_3?YK#Il{22bfUTLnp`mkob^ds@27ND z-_;pZ_>d|M0<=Hs`5EF8xen>yOCHo5if^3m5HC(eDeUi_WZj|rvtWnIi%T{)X&r-< zTDMW{0!x-wyxm1Z$M0`M5p1=a}qaWu7T{Osa<*qKH&w5R#H<)v~M1?*hjaD<48b22IdTbnt4)iQjj1z334)vIFU@NbU}!Mx7=|W>c2L53$3a84sNi+Hwo{38TN0%40Kazu{kZ{d zjD{&sYSf71zvtp1sJ(fu>{mOxj`*bKX=vj1MR>HKrj1YQ{WA`nmVz%O7G3_HTg~VE z33aC08m0_9rY?$v%!DNy6yi>tx<0p2XM#uHK4ZpVJ*0%e4T&?8yc;XxuSy0u} zh#cgtQ~KB&e9jjqqpL9Rzy(EuaPO{|Z380QgZrB(r2$wpPV#x{4Mwif3j%UWgi>xp ztMgNo>pMZeKI6NSw$Im4$X_+pDB~xb_TF+_l#MS^yMhY>SQU59_x`@?>r3^voMv?w zrBT{6l&+)SaxAYTOJrL75Pgud5e}k8r~|AGj3~ zS4$0;Qg z`2_S)#>7ck33(iPfzWj_BOex>!4?JG3lh^{wTggfT6IHu;JE+r*tDMah~e4EkTscM z>nAteK}HSQRzKfMZ;uEM$FXbUV?fG-ycwT-T+tBLMH*^aPSaoT3DABhYFdGvMN<+n zYuepvs$@P#y% zNtS?Y)dMOqMy*JDhAhBF#~(H!cvJ`E$Vk1Qy2iwt4Ko~2C_FakIc~%pVz02SNr~@s zP_UsN`8w0OaXDfGP=ERyo~LBQn2L^c*5fB%chXCRlNyq$Z-=_NcxmuOg{F?9p4YGQ zwB<>6xZ_v^R-n>L-1@ZSv{49fWjS1z`1bu&W6EYe5cLE&Y^NyzPX9)!NbmCn9mZAd zRTHBmziM~*V`AlS6FQ%yMAsf7w1U+>>bI@uJ&;1w>W(gn z7nHSJk0(wtUT>pKOi2nTxJpu`!Y%*|p_ZQ0ogg-f`qaZKK5#KrMT_~hy49^T4%h%j z`JOTpy%_327%s`f2|gpc@-?M=if-k}+$Bw&-24p$jWy0Vf?ZmGpDQKF>f|3OZKXdE zs)a1OL2OjG(VI~}jh-Ty``SPC3;b;nKx%KEd7or5j&fppILxmvc`A z|N7$D{Q$?S9vk|CftZb(d>02A%#EQ>rTGM;K}}QfgLhK&1zMC`V}<3m=Ih6|Wr*!t zRm698MTq#YrdT1jG~!i(An57>oNCR+Ly2rJ{^bQEI;+Ai_}SixW3ZCdw9eVg)Jr+J2drT zX-fG_==R4tFW2f=i~9~TVq(F?=&-`*Ca7<2e$C^KTQg|YSusvs;__3;^?O>9>i=6Q z1i>zW_?9gexS6J_TKxa?_LgB)1#KIsz?Kk%O-R?Kkw#i#(;zJ<9nzf=o0Q&^bTT3UX+2PFj-dy@* z;+`gy8o}A{>q|4)SAVoyG|kVmuT*Tmxu!pizvgKSuuzTzLt=`8Y;AwM3}b8D zTe;bDwZSPMbF}85076`*r7B^+q$Jn6MkjFYe7!e^f^PpBRCZ!ufV2bb;XAWG%?3bf zQlgF>YBnfBw3T|j4A&fKV~ZI?OyzfV$M-o-Jue~t{?Rl0nVq7!h_;OKs@I;s4%9 zaGGxxyxOWh@YnG){$O3IN~EBElXRfGXpI6JNgCqOR;B7Hdp0^U>v}SRCJcppy%CX^ zGe`yhAX8~^@vLBU8K+s&HI3uP6i*7$04$vT9j=yrcy^Nfr-nSs^(a`s`Jc9wfo~TH zfjlO4tuOk6{?V;Vk{I^rW6`la$@P)SzGT3d?SRZos6Ud(Fs*7&6qgupp^U(a5PvN6 zyWsBp>AU214%(I&T8N{-Gv>H+4QHP7PV~`uw=CBc!M;hXYU$2mKleuci$ExXB)H|2~|R zPYl3lRF63k&hj%qRR^%#rd+qVFU?Nje_u--cHz@!Q8Z_sx1PDrl=LjZJC9m+ej4!$ zJA1A)AYu4lbf~ySH^nrtzTFzg(GNwATvlt^N_uev_yU!U^B#49+U-93&AvJNA@@Z` zHt|*K0;u_R@L^IJa`*3DR@-Hg*vtHPg0c?Xxnh3Bf)0X;LNAUFV>f?J?&}Mz?XHQ= z)*%g~tyH~yQzW^_P-?>h8qM8SlgkGmRA0YO{1SaOFtjeZEs^>W)X1Qk9R2i%I{@3! z81yQM1!o?18&Sp{XlVW>s5dr-rnWei6{1pZf#%?PMTLYoBjdOc@tVA2r1y)uL9Hov zLMx0R^IR%|!H*BeBB@2^0*I-!5dpWk1Uuar6UpA$gO*k5Zzn}IKBUXayp`l%Fv8C& zo))veU(Tvv)P+VOk1jJya9;bI(+=Nshovw_sWu5+ZffTbbIh%~!o7(m>J=!`wwiYJ z>?H{6X2^lrXJTJAi%d2zg%)}TrjK^zI81yv9C(rwOPfrPtJLe(A3Zt8s}f}}&#w}_ zh2P&W;PaS`O3Ht7GknkTsEcpMMe*%V%VJ~;x3{nc#1(LC=lYhmyU*dReELP}AmpRc z81FV}M!cxiWt+a#@9$DuKctbgZr|ahn;>g6{EB;3hc>#}o6&$IR{9XZ za#Iw#qnc*mR(cQQ$5p(%f=z2$dG)$}hvB|T4lO+q?q2}FH^wk&WL07IY031$_uZ4f zhOySr>6mO9Fi}4)a-K^ACK2m1QY;w}@uoc|QQsX4C` z(Nv6u5Wn#tkf`YF!6WPq=(Yv5E2RqpS0+C#oTe`(rQoM!U?@>hEv; zSWoSQAddT@abFWpf`#AVdvH)Gl|!@x*@ z9&?t306dgI;*)%?4KhTE;VXnKC&JsjIST3X^dvPuuY68zsJ$kN>IP&!v9xB=A?t$0 z&DJQ!$0VA*S;gQyk-7J+bBwRM9k(dr;;kYt=a3xM#84*wfCRiM^^dF-uYl0_=QSHY z2qV>^zJT>nyZ%;keGuV|{|BQ__Yzq|?~Q;EALRbVp_x7<8C#>I*dOVheq2@I`RLGf4pX!BFGSba z%8j^Xf4jK$7df!?oWuqyj{X>j{DucA;8+I3uSF~V*+onDlEoghHuUhBWZ}M%0mH!H zEMQq^BOa3bGe$oyHiKiK!Z#iJg!qOwY}Ywq{beLq|EI1?UGmE=diA8>cPeV|r2wdv z0ho2(e^Bu+4}*oMKgRdyTUERO*1H@fL$UGaf3>=4k-Q=4J5iW@eYbA7@Jyn;H{A={ zGDaI18mXbi^VBzceSsARe%ja0!`H5s zyLS1jUfd6lpO0Y`v^2sDAox28F?QT|x0=HQ?%XfY?!D?Sz8!2fX+6P#c=tNIyb>~^ zv{|StytZh1vh^w-%Mqb$Zf6rYc@1 zk>63f)!QyKEV29;7^V8!>=yoK3cZ*wNqW{)n}*XAWS#}>ldSJGypg0FY3-*xA=Fc^ z?g8^d@LP`}X2jmC5q?2EUfW-3Sw2v%e>gv`*JUkByc>La-KM9!(DC}=762gfJL}#% zpD`pmfVaB%RlmBfQOSs9eU;bTON)5-xivPEfmAjQXLq6UJ`K3b*P|RSFbpPjrxdsM9-bdyjD0?Vif8tI&3K#}Z5MDAc2gJM~&%{C%*C z@%QApV81x(#arlt&)sTbr zu+2UZ8X!b$ywa=Q8(DgLNu6nyQmxggoqf}{IdL&sZ}Tt1aTl?6tmGX2GXr|tZ(-+$ zx^W5iG=dAU^FB3ffEixJn{L2v73X;qXe^m3ZcN&L7>*_)YtO$X=rE|g=V6xk_m;R(!NBqtq8K zK-cg#J#djIvX}$+i=(yiFeNOf0d6d5^aSGXHIxF{^!oSg>zwR;XeMS?w#!96i`N`F z98E_N3U43C>#cD0`7blhT{5_zk{EzQ&V$s$K2a>0`xs8XCdJr=Y?< zJ9RswjWHwsAZiuyR}=nOA&L4mdV-O^SJgm7!0XfY1;u;!GtLmSI%NmsX9p=B7RPeg zr^{4NB|Uz6v#uGS8~!Z&HYG|DP|wbR`qJUEMq=1m7&I9$w!4Pilb@B5D1bq0{HZ)E zZvA1u_x9(h`O4fU4rAYSzYyoe;#df-o$T4k`guD4_meqN2)`YNP zzy>i~!I1@73(WX|svRjJ+8CifoSdaYj+^^6Qr~-Q`sBf*r3HucsN{P4A2=v!;z%qNy$?5POaO^GMGZjwkwcxfs!qzTyQsg&GVrD>Q39u|?xt(6$X{Zqfy7u3`(|+a3{-NJ^v-elm zMk2+i^t_BBmU*oK7})_H5Cs(F`SW&>qbfp$r0H+p8_<1C#4BSYvV*RCLZN1` zoN80d*w;}~S2AQCM%vpO*>^T|bTO!Ovm}8KmS?uedY!jBNb`9!_{L-eT>Bv^J(L8bu zBcnZp=}G-~=`lsz21F3T6{`+c#kWfw;jK5@y_V1F&ZDQFyP+^|4HEiVo zeiVDjOicI?&pA~gX8q6NP`w$)`~0@_{G>N?&Y-s_Vw8|3kT&V8mM*B^8zUY4)7AO5 zqpP$#4o|geAIZr}OYX$JfewjYg%@K*zr>D=#0~aZJ#t2VlA$CHiiHaI2|x~iJ}(Vl zBI|euH;Jv&N+K&%R1Yb1OF1j71e_iOnj5P%_NBU*Qg_J0e-_Y4;YmY5f`?Lpb3+q-+PDG0r_c8?k_Tb?6I1-eY`{ZGv4CI4te2 ztY&G_dydKK%eKD@SoK-a(iGGGzPf`Za#H89_2&J#E)_6}7rs?JrRJI=zkd7H#i8_`Ky!p3F zhs<$h!WX2~grNYRcG!{3R*XcvS4Ezp2DJx;*< zi5_P|t(>!Pn`-KF<}3btRra-U;UMXUW1PRAyu~2Hi!H)*p@#KkHlRqx^vq|*zZ77G^i(e-dqk>=+{ZM)pTcxmCfB(s1vf8rO=JYYJ;fGXW z7rp;9yoxeDZTNoUV8&+Z&$_qfzN2%QPl)uPdo)BFj6y%)Az%$^+%mkcI(f5(*;feb z$XA||9W>i2fRWB6nHk)$2;pqL_^SOo9b`QzQ;T+OnUCPzfL-KD^g7;+p6`WKIf|f4 zeEeg^%{Cm$FmU*T`!nC-ZF7sKQ|(pZW2`kV`2E_)FosBou(HHwQwUzVVt_XdeN$#2 zPs4+Vh*KhHQUPY@9wkTDwUyzbk%wFwmt!9)j1k-T=zw1R3L@+J)K+BKXXxBXsUVRs z#y8wL;_H3GxJxCx=|Z?SAgbuAZz~4zY3v!9)6a#yppha~CXJmsmCEAaC{H!VL5j3V z++#DxiM<+ugRDgn4e!`YgcT*o^~P486_c=Yl|vkYbboF)RG`R>A7r0vPiUFQI{i2l zCk`i;OV0PdhEJg{(0dP=#$iX5*F7Bmk>X{Yv%0twcGn*71_hy0QfM>$7LD0S>hX}% zCJ9~h7!t(jbLxx8u%Scn^HA&fwlzM4y};=8*)8v3j3hXYf3EtQ|D~o_8O_@BJ4hCW z)b1CK%b2@(&D-$#gO=-TX*h@x;vv0}Rmg%8F|W<5yGiUY*rXkKlvWn|O@$1v=(;jv zCMjt5hd~^xnc5Kl+7E0Jmom0RMS|IyYNv;B!=TO7=*H#9882`mqRWrUc~4CdXvud#m51A z{g9c`>bFl5rchwU9xu0fNwzdD-U~@MbyM%g_R0|Ro^XCi%7K*nW2oL}cTsD|4iI$$p7dmB!IAhX&UyGIg93w<*n29aP>XDV&VB6$M&3!UU;&b3 zVe&T%=J*}dch|DLRqggE)N&F@P#&j;R51Z&eFO?j2Qb2&>UyeksfuCs0LQ%q6uols z_sc%woobJVEhY^+g z`k+r&epi7-rS`JaXV~-(lMsRCzbUyflxY@2*;IhVP%7uY;66f$sa|S{zo^A)XR&@voVXZ9h%U7naSy9D=&LHpFOjDs&RxbD8=dlE9P4bcT9?&7rr8VXiq*OZ5-m;x+ zqESW_G~$jHOkblb%PH$c=#2rjE#fLGaabj`=)0TUbz!Cod3So?Ee*32T@dw$tHFzL z%l0GU(3Gib$pN3XuAcS>Ee^ot)?1y?1ug4uZ0sul^AIJQdXGKlqQDssDbWaEaSh%= z=CAeN;bzX4ojLFCZ4&~Jz1sPQW zy+W+$yjzfBLl!r&#O_i{GMf$JNUBh%&cq# zPI+g0c=<88XdlG&ZObt#@Z4Bs2NOIJ|9nv(K7mtRqgW~Mef#714li(hCxm-z&M-+* zG@$+WT_NIikR+idYFj{cJeO+d?suDe1f>UX`lhf_iH^`sJx>| z=aPG#sse&TVZhz0--Mrt*Q7_ z$<7#}t?!gZQ1Qb*Yk0C?d_5v1QD$&7_AzjFd)~rukIqX`U7}Gc{Wb!ak=MQa zjNyiqeRvIjzVyQRx54%6`{4Zn>N8a|(>1UbBxF*A;8Pf9OZ%GBTj8JU6Zu>h9|u?EQM+cWfk$n?0YH^Rl>XaB2kzD3pk{? zfbAFNnpe&thG}n7qLkYde$qRGeT=I^5h3SAG3#T7Bbn9c?fxXx)=jxt0NFr$z$DHl?0d-IFBNR+xU-q5a3hg+`-RngK` zONTEb^hxihpAkQrmd)SaaZ^T?o=aR%uUehgV#F~94M(92(1MI}%t&y0a7zD}7&@+G z9|B(5OQBuPV+dgoy$!xg85x`US(7$|kKlc@0E4u*6y5ts6PQf*wk zi5FHFQQ}0VL*3R3L*Eze6V2vfoeoK70LJP1D8(oH6*cDV`EYH9mtR_YQE+hNo;OQq z>EMsi$u6oV$)Zzpxc!#7#ZCeOHiFPxVnHy%y|o3^R&wdtftMxt;cB0}EgM)%MEO_7m(0CUU z2Kq*|3T1vnO^r&@-s$QA@s3VWc@LN=wm9mqP#5Vz+84$XA+`{ho{E;OmyTevaO+vu z!8A@exhr2SIa+VFPi~{xr^&4Juf~-wU!TT~A%+?A;T*cpC#hQ0zQ$st;ved~NX1VB z#FkLhP|Mrd-peB5-C{aGK*bl!doxOUz(YQ}-f6>}L zG3$QD?73f0Wiz6NvxbczmDPK-PMd>k9ObxKPp}|D<-_^w@rI2;o}8m(*or{_Tyt>nH=Q`+>NIq z{vS#=udp%3Kgk-NkaiKTB9&yo4JK4WPN(F86w+=_rVCzaE>t%a0Z@B2yEPKq1pPR% zJz5ksLMSk;`CD##$pP*Ky5yn&$G)Fn`GL5GeJ@wi(?+xO?(=PiQl+>Z?JhrqkJfR} zJ6V&#KtzfOA_d52j8~MIZS}cnHZn-hO4ACZgZ@t}Ks%t`tER_1=NV7PJ;f+iN%><# zWHH{U6;wy)*!M(qV5N?B6DCDp8x(pw4HCqiJ56s|bO55tQ%zymAxOo24Fohe({lLJ zL3sQA-q#9wxyS5kFOD_3P+nNqf4=R?;lO~AQ&dHUdKX^f=1dj&D$cC%AS>Y(Z4#T@ zFA%#Nr@W%zLEKi5-1fylm2i{|l;aHon_JU=WXnqB59ft&*Xh@Cm`PGnfhj>Q5nm73 zy^^~(HG|NX;Wogb)7#eV-rUA6^6pkis5kfr3kF?}T12Pw&BtLiztu3J*^6@Tg_T#_ z=rIUf{}oQYAB*FJ7-{@ZD4CnXv@EXoV`<$U>g$29 zFTpKAnOxeK>m`jP5UFU3r4j3vm{{-;O%ePR&_L_WN2s(6<#SCF=n)IO6+0{_L^O2*D^%B7$ zD6fj}nXmHp8A;{_`@^6)%*ap6PpKlgq5&jw!0oE_NmyT$aA_fmjDHAa;rq5$H*xZd z{9@6FIPs&cHMRo+J59&Y?d2$b_dYDMAWkdUKT~h3&X#>SFy_j+Kb^WgVSx3j}!_qP(<=X`envQwex``y;M=g0-HoTb>bV1bOnm6cmAX0I}K z6Lxat*6b}jri=^7R!eCX5c;-(0eC*f=@BV7fZBe`xec8b;UiasbdY2~R)k;Npk zxeXAI9EE9P70V|(BXr4)eirbqvY`Y`U+#sNzNju_OIm z13@qS-onL)k6YL3-L&N)@bGnOH*?;VRpRgWi>J-T`LOQ~3 zTj`ESSJXwPH3-rJ8`m(XEK%jzSx!a}r5vjgf^eudD2+xnN9JLM_$2X&50#(HWKzi6 zYC8e+(hEJ<^3#(x#VKh}wO3{<84Fs!zv)_R3z%7`JImP6!B9+1Z0!!2QX;&zfINn& z`K}NaSI8SVfYEmxNyVzQdj_gj?&DLxoNBZ;w4_xEYBOv^KUqRJq~wg{2|clKV`DiiPW>Pe=u3pie;0ZhjB)|zrxxKT z!UXWfODJ}gsMZ>`zev$@zJOt1#Me0r@A${#AD8xU&s+FiRWFjklHK-IK0oG`F-JSS z3{Z%zmbQqFNsYd5nxb2%UH>YZB}-yrq-tRufkhbGfZ?5PSp!!F4B;ENfZ@tN(i3jk zCUDMXwI+f7nWNuCE& zzU;~2CGnDH_(#ze(Eyt8id6MFHgXs;C3oGs&7uf9Ap_ld2A{5_E^gq$Pw<$%C}5sBei$VX zS!6?=PWUqV$&b4d(>8X-u68!Y&FSwq8eZE3f=+$m3WO0xYEt&GJ!00^m(?xnNBqSh zcp931>W+VXR>aIt5v!e@`i|Jx7QSOo?d2U+$)UBv_nGDG`^ zMjPYhI79;ceb?xeT6r!DXZb)0{ob)02>$8w6O4q<1Ao>ULx>SNv^2dO#($8qYSYce z)s$_>K*sU&2@21SQRQvs80l#&EUnlSWTLh#rPlisIld{_PXBp}w+5##mhOLZGb{6X zUnX4?d;0u|LQMIndoo?YJdJGj;F6Mbm#f{wa)bIpHO<~e;$EEAk9@Vt(r}Zk*5*gO z<~3lO{~qYV;T6W)1;N4URh!UopJT^G_W^6IeV$n4VC=$>U3AIAeX)BU#lQK-Q()1E zU$Kp`IvJ7~gHrVYLPLC=&`X<_uNR6`hMFJ25ql{6m z%hQF}|G>K`knor&k{f!Xjz*rqr=889B{g>0TdcF)%wsE_IpL>!ab&<*IN)|~lufMJ!(Ljvnzb)r0Ej2ZNc(RE9b)@{ZA+483!?CcncB)NS; zO7V#4={osh4}kjv`VP49exngsx`s%yQj)4E!NbVD20_h0oEG$4*+_Ar=^pCJHm~3N^-_cS_bx8OWcLzT3?2C@giXaN&qbTut&VG6PLIDm zfkH-_6rcTN20fFFd;!lgI-A7*X(IN+ndi=cviEls3l4+-nzSPmEyoT|=%+eU*40_P z3foiwz#ItJ=j}OxzUnFuMFgXo_T8P6VeusSKv`=wO#e#s$}fxo!KocBBXJbR-|I}y zaLzD?@sl>Y1^}S#3Ii_z`j?MEg9q=^P-7$~%iL`8(wFp; zK5p0{K|F#gdpjW^<5wraQvk)si@C|qpxt2fK@OnDlh@~A8xpEKI8m5Nv1XLDVGhF$ zi+b_=F^A#blcccS!v^_xB|yf}hi#^?KI+iZ^a4M*3&WW^_HGncLp)4+A?vk)M5=rl z(@01rO+^HL67oD>%~0;wqi8yzVbJMl}*M=Cl!%m^Dp(0)kK;IcC zYUq|y&=bqHtpG5q2=B8cgOeb6F(*7vAKmR75n?~c3;1$uGwWM$V`#zaT7BN&kFrm$ zOtHp&`go1M&|Ni}J+0f^BU!6oUs?0oSXw?7ac08NH;y}fXG%WG-tvxXYf=*t?eAmc9#FiV^%Kpi#8<#jRfI zugJ9ci(MU5f3Q&Ha!N>9u0|;omW+O6@*~8ZF&}>)h_#du@V5-8Z8Qm_SGwKY2>Yt= zdvy3WU@%H5h2cf8ieKLy0RW|cbv+Dhb*~7u;{jG9;zu`-s&Og^34*%M9gU-8*|3x0 zkim6Em{nUpRIZ+!1LX^Pf-czM%CsRX%+919#0tlzi3U^YDa3hcH-2I5zcNK6O4BmL z5M5nPQt%}`9;j@ht^rXD^DW5|(-I6yqHHRseXm2VJF0Da<5OgxoLsN@JhGUy#Q<(h z(lN{D&`H*SrSJp%=MXt(Q1OT`3pMTi#iAnWhBJBjD1yM$E?|-w!<o9&dm3H& z<#d&d*rQjsM_{m)fU~RBzo#(cKHbDjSkx6sGwJg3&ZaS({};!Of#zQ^4gOltGm`W- z$ApvtgUhkcU?mcFC*NIs+fbc#L(c^PUvtib!A2v`YDEgxx8L>We#g6032qmwJL38BlU!?lU`+|04WUF3ZsBK zh+#ZQ<|DK)hJ(2V17@91M@Lc%g>!JKeOq5~)ytNy!(@hO` z2>5tU7(%>{yY_6oRwH4=(oW6*i{xK*_%XX6UQ1U^lKY}v#3pcy0!S`$fZWr9)s8X$-F1|`zm^AxwYi0*FHPN z8!zF1tR3*S$LM>2*}?)~w?hws%@*L6Y(gY(B|V?e_FrXJg)27o0w&`xh_hI-$F*w!l=&el4cAX7z1#@Vxv0B5CrN-By@12SP5U(n*SU&Ry?_u~68aa2kwP+Ygm{Pr+UJ z{NMIeN;5(S_=UJOrg}2|k|2n|-;8Md(=gE5^uDpwR^H}q&?x+{j9g&XPXuMr-}cnAjBiKc?{eHzxR&A2J0MDPG=YM|rIl-A_&;iXu1dkmv5i4IjZCZc9Sxq14~C%sp#INx z!Z;N--GetW|6l4pnwn@c;Dg(u1?*8w;QR;k$Qd5oJg{+!_~aAUhDszC3$|gJ5WWBQ36GUBAF(eurutD*;$I^@giU5I_lx26tcBU% z%x2s2iXze6h2vrvAS%v}Jbrmf04y3c;5X7l=aJ7TlzaOg6+@$9<7qGn?UT0w>w*uf z&C)GqC(oEfR8NGC$J5aVMS%~gMhr1tiHw{(P2-UdEl;U_Bu=aJ?jbI+9rQ>BKAaDa z7s5!VyoBep)B}caS7(zni7J&`HcV1NmzZCH|G|cB4d(BK zPi@!b(`iF-9r)bmX(X}qiMAX(B6&<$&k`~+kT-dpR+C?&;Uxz9Ak z-Idg~d6ZEA`uO8Z2jv2)hA(%I;i3mcdQw81(#r#b8ur#RlM_kKs7t7*5~mC^FL+62 z5f#cl(}a&hG(rc4`20fxD$^J9@rWX|DQ+X%>>3$?Sp)~6MG`GCFr|Z!oT4?{ajyzx z=Yq^9(Pif@e@&l$dGug`{U4bRoFT^k>|my*{P*uCwQ0%iRy7ITC;wH&dZfh2{rrc# zSKpPS5?#s;j6M4GZ~ZfAhrbmAm#n=s&b0;gTf_e-O>^XdrqZO6?QotUah)oGv1?n5 zHRFc6F0&&@2;`myXKJ=!c66-(y<&kMbysXsX-Z1unmQ@s*T^T|+*w6gAJy7N@(j}b zX|-b{2&awscGbvm$wJj-B{?wGPHA8Z{$V29hZfY<>}kC5?f^+iDf|sEZI3;_LGH1h zr=dQ2BZ;9{&O&HuaJKJOSLOaVt^c#(f89hMmzJ4*uimRNLwyFDXxei!_WL&r|8uW2 zfT)^l%k>VZ3cn{^GCQ4|1?W70Nd|b~9yNcV5ZhccP&g_B&V(u}^Bz0{=8N=1Gdam#BmayP|)$1Ms_YQrdIQ@@*CgkS$$ zj3N@tw#Ke>6q1YxW;Q3)baw zNXgfcc;?X#RH#ge+f>!09^bnsxRsM}P$$w;WPec)zw4!^JKaXA=>K`rE1mNkIngt< zT6xRApQ0p{eT3)$$Hd#*GfhqKu>{l(_^u~V*Kc|0Ouu~Ay#ITb`twRM>fdtz7maEv zcUK8a2{HBVEa~(&n|fSsBpNV4Fr`7D$ht;5l1$HU$Zi0b)&7ZMi2^JhpK4aS=r#CM zB(U-={eS*Xj1DY03Q19Gm^==!#RVM$jXd_B4)p&$>>TTCLJDgft6lOPFdS-N{t>_j zns$U_|5gOmhd*rp<6M9{g@cH4{Sf(o+GF}J6mSyy$Dk)7z7$Bq_Wy)N0$yI^HqLb5 z_KJka05)YN%zx9EsnTF-2hCboRbI>ZEJYppWYH7Lr1SOTXn;)#U{u8%pJ4wU&RNb|pi;B7B~nk8C?k&lZ2eO!BLWHmrc>Gm#(|5H=zaSwZene{&uu|PM}kGxz= zDO&LVQ?mr9S!Ue+>VH}ST95*C?-x(;G5=3ZqsQI(9jnLxOUeue$O%0qb0WDGDKK3e zPO!08^ zaO15M;h0>bxG6*H2cap7w49lpFzzV%3Ks#R-<^_*@ID@7PwdTp9`>%F|2~yaEW{<& z!e%@={e+8e%pLV9tFwVS3X==M@Ecum(=iJiZv{e4a=B_-vy;>Vo^x}hB0z%wm7@^o zXj%BNDCfVU_`g&4f2Qo;N(@pUKT@qEa%}+aAG9d02XXNw36sH#C@xvV!+rc)^U3N% z(!J5D)>+Tn0Im&dlR*F&5e?W!QhA>U`|t^_M#BzO5GnPZW*cT%-v4DWlzmW-;_|bK zyqY_5>TcM~GT>tmbQZ`?%>UpFpg*##F7}imQq+#^DkX2rNJ+GqPhYD^)&^Qb& zfc2%sZ6W#$aOL`~YP1~tL z{F`y$m7tc=0^yBFc}GZt~bhIV)F_cJ!LuBKgv zc88A{OiKpZH5N^dBJx$@M6q`ZtEKm~z_;J?J9GcIOqyRRJV#2-XN2KhW_sMdF(a~r z{h%yg)M_Wiwa@nEdlmNFm;J9|Gx#|D?7QR6ZgpxHk*Wdu^xlE*cr`RD?vz^2^Zi(+ zYL*w@tK#Enp^0b7MQ0*A@`Q`3F=-8Z#xeR|KJ*0F=Tc)Q_%T||AqqzI zN-Cm6Igk2F8LJv3T@^kq3%=iP%D)4`Yg_q6tbVmeGSfceOnmwCg=pMIn|yJv&bifC zV`Fm9bn>gz84bJSwNIXmn~QIb%TrQ5f2BUgsj6PRRhQqC_!9zt@&qYNUP@d8bxk)e zYprki^^h^R0R`&f3~rbQyUkrXE=+mKr-t1OTF5uafbyVRH*o=JhWFP^X7!O`?v+88jJmkwnDsS>y^2YBj4E_K z@u#w5n({<+W%ADC8S`_ZQ^B!kG>DoE4&C2(R}s0vmTj-oZ6m_WKB_uWXzmkP?S{j& zk0pKV_yVGNYP;8*u7tx)a7-Pfy#!M>RrM&nJDEwsZ$8EpqDE_$&{m@$6A;loF z(>Frie9Bd@jbwoi1)@VfJpoZaLHhsWSH78x+t+rcPuH50!lBibeAA0B`s3Y!YZ+VfCxy32+|@TNP{ARq|zw{ zC8?x@@H@*Z@4esOy?@^S;Mwz>nKSX3IWzM_>S!qwU!c1{KtMpOs)ErYAb{!+5J2qU z=fD&8rjhpq1S|xq7&!x9$ZDo*DTlJ(0&|O*%g?Agsb4s5o{QG}W_R;e>s3!$cA-!h zMJYRb)QT=Ug}u8-_xWd!I+^cpU>_Mrg$O#|6}nDz9nsU{6bk2M7!P5@Rw0DGj|ts- z)A#OCMa+X33X4*eu_w;k8RFizvzv#5_VbGyikC;9>G~M@7)fsjEM*<->JLw&_z)ok zFcty`98CcIKm3zL8Y+2rMTnlB{xAX(6e5FW&LRDHe(}twT?o<-b)h={Tjbe)>E)r( zm{_(Py`L0f@_)HN5JO-FA}?AIr+n$LhJ>iK>yHus%ki!3MgJf<(3&)NNW;LiBiMO*Nr`*+(--&#@mhUaQS(W{#6p8da z{gtnfcskfnvTsJ6>op8MWl8 z4&jQe9BRc&dKF$S$M-yK`DZ_F1(oy?3f z(OxKo8P8|2S&Y<;UwP23DDK|%Dl`8d`Sa11hu=zZ&gD%bWfP zkZnbz-+|dBa~_oC3j@tCMmTpte`hGrkPsb&QvGV_jI&Jr-M0*n$*ZcLBXytE+3Ha? zU{npyc#rj6DEPMjGXmD?ZY}g>&d&)3*VTQwf3c_AV(0Qg3FQen z9;^T#VWA+d6I&;?AA}Uw`>2|f4lhh1NqA7}`C8fG#DWJk&5uRPoA+vvWzssvR#4FDUQ1iNJJKW(APaSWX*YW$a~Cy;*N3XD>Bo9LV8nz$-Za zz{DSw)#V`)JgB(H&Oy`$4rg`=<(3lt+%2;6D#q64>0>7`gpQ1v2JJsKjunB|0#Z*J zTvmB=oY-|6%;AN`4a9fl{&DL=;3j0p)xR%&0!G_KYO03)>zX-dA<5j1?)y0r^)8BN z;w320gTKF^3Go}+;yuKAo9c8UP7Pq>;kVaP?Xw(r)~20zR>o~C4kkv^%I|HLXp!Sr zXB3{86&~4G*un0EH?m7sHv1&q;)A;RU(*DU*Eze7M}>IAqexHPF6YGU-s;aM)^(ZL z?W6_)8$1wDgm|xv32(;wG`8Ky>%I<4B&SUM*Q42iM;mSz8Jk>PzSUbwD}341xxO4% zso+a(?iKHMw3+P|%PhMl@&C&1#aoDhnxLZWq-dRt;t*l zh*M2W{#P3icqk{HKW`Eww*L6&pf{FLvgb;_R8=ogav8kPHKp?u`&mSQgo=uj z@H|MrUH`%H{{MDV@9iSofJ!3C(ALOd=DryY#h#HF4& zPm*HP_>FQtsXQ>>?_hG~Hk0ocEQdb+1Wyq0r=qwChYILk#x%7{Y&G~C?5savg??4h6e{XVI^7I0hk?mgtx zZhrrxmqO!ut3MW-pQ_2{A7!MJiB20~%mY@d=bP4p+zhLu1M#Oh%OrLR?KDx~kOsqL z@m#!F2IwEh%OhGnC|$z^kq^pf(Wmc(Pj|;C0MV1*iGQ$2dTEi&uDR9B)xy zef2N@V+aILO1wXO`}nB}?7tj5DWrHmz7n6NII!KousZ$X^c<}cOsR-Z2rx88m z+EU1BoZhcIvEs71d^gyV64K8Mvlc%$Cym+&!A=qbxVkMB+kr?Os9nh^*X9k+_T85+4M610&s{Itfw!cOJVyLxDDl~ zpTLHMk$c;Aey=3LLZYgpZ~irC0;nC76*e@D+JGSU!f}C$n4PjG+9-HorSpGz6)zS6 zRa;O9!eIIk@tVlJwZO^zXC!^Z*P1;S`iyB$odYs2A>cQAQ)p-*(DWuM`IV034jD6%jtMINmI6oSphgEX#HXwA6yJQ-t=zTMi0O~|| z{@-;hFVnySQMTAqZzF)JgFH_Cn#!rV39!T9K?$up>{QL*NFgC6Z{<$?4FWIa1P^*~ zY{0=G@Wa`m{vM+j{zD9tJ{~nAUM}hv#NNLr3Sbd3gu)Ap{GZ&FV_}8zXxuh#84dJW z4HakSy5+3d!Je!4QkXT_h6mP2M)Q6C9As`djN%*w?!}t(pYCPeb^l2RXcf> zyHK0yDV7}Tb=tA>SR(l1%S=kG_U($^gio(z&eA`_hOr`O9<>@@y$UacWNH{9LPFA8 zjb%e_J5SYJ8e6Q%FoSD=2l$^IcX>_DW7*+}3O^+RsSg+m1;k>7wb>#`LgEpNayLuU z>0t(>1@1gBmM?Lw@@6iaKPfEE(|4nE7XsTk$^Q5yJZ2GMz;4W3Pfkx47(wOK>wIUx zYlEM#XYFynjI`Y6zD+%3{vOEh(XvpRsSwtj{k?}(tRNnWpze6BKj@3xNb83};Cadf zkff~smo!j>%A?l!>Dv(S(h-~wg~VEP($xnBvvXe(0m-<-+eA{}tgSSjUU8;q(HOM* zSBvSGMBPs6%5Z^T?~CFnP9X1;Ml3%_KWqsX%?cFe#C7birk`mKYq;?m{zv5c;zoM) z<7d_&laFdAPaS(>?!_7VJarPDsHl_96;^x4t?fq-{Etk|$2m!Q#aplN34Z-8|L`P1 z7OD5r(#+JRp~eCO*P5Dc4s3|R&1zp)dCi4Vr9JKTsg7*)C1lC@w%t3+_r1g3L!itB zVO>Y2S-^O>D$;g+&Brx2P}2!+evh2~8YdHA(>GAqPrWuet1+6Ic=mn^`m5c8i$0zY zyVMS{?)3d|IgB~m^ifb#HJstF>#rQ_n8SBRg0%$R* zbf2ptT9BY!`C(ARs3~pR8#zLjCl9{m-vMa{6i|X^JW3#(Qe61z`p$#t-t#0xXDZmz zetqyR9L64EOaf2NWhKCV0^BS4Ku!^i@KCw z)u_(zD33T7%NJBgHk52j(CAJ^OiYYHiWL`(<>LeNaNI6eUyGZn)D2cjwH^oZVi!Wz z32WNsA73T3R#k6y9$mM0suSGM`z~QJe6W9^P#rUC9TDQ6iVKv(91%kdiL<2isU=`T_88l8 zTp%e#H0-uKJ}Bsl9|m!!v27@8Zn~LlHVH{HW2s z^FI(e=F)9`h|Wi?iGl){oXaa8Mf?U}ffoxG@EP&!0^Nne2cBnQ*Qe?{2XY)4U@VWW zVk=NCe)yQcQY=al^Tz`%q;xfqMsok>0nlswiH|}UXw*@9c0@aUw*)B)J z3%naL19iGVDSY1PnzkPKDH=XNF7oEYMs?btHeTVRP$;7(6cnC0=R7$m;VzJ!z|r^fi@S!~`ZEI%K2nTq9nYj0>} zXJz1%Twmz6$=(JjX;rG3@wVCy5@wXoQw$fC@aziiSNvuBIw)#>k>HgO95M{0ijZgF zga)zc%rSRKeAORaV-+a%-mY?^fzBO~q3)|#(!EbEajLi~k$vr0#&hu@`TGl8D4p(E zgig1ViX00qG-v_6S8uE-?sQX-eL`t2|3^mh**G*3!+#vU9boV2y3%ekSm()H(*HHi ze*<3VFS8PcPJ|gqIl`RE$DQw{PlKDsqz20_M_?df#TYtSkjb3QtD>6sZa`wg&Lu`p z`B$;){D-=$XJ7`R^gC!4HNdQPjc#+O_6>(nnu!WA(z=~?d+u~S0iD+hM>c)7+|n zf`55JsqX>W1z>oEA1r`V`^$&*U~u_ObMEO)wv++4q~34NBnIgc`rt2!7yS383sPmRov=MHkbHCeE3 zLYp!6=4mJV0KVGPVPq@;Ila$!W6w01bSSQfG$TIc80L-| zWiGXSQ)fRQk=hf0o6i%#G+j_EW z@YQo#d^hD;0F%o$O2ty%C0gls8HFo}b{L%pAlcPEnEF~@&|}}Gyp6wpWQ(S|_-l@U zm^;$+dCkx2f~TdNxuYX~Ab8K$dupX9*k>QzGfwAz-2b%I4)s;<(gZ{7IgSM-5YN*) zuDFz2Oj*;>RggdS9@7%+OIxeDgIrc{+pcrPxG@V)E=&!V!96iiViBxzMdD;=^xWch z&xF)A^Ip+w!SJ;SgRLE8mEF^Io8Q7B4S>Vm(2Y$zhaIEiHLv;=`Oi8OnY|m*q6}Cf zHFx%RQnwUtxH;?i+a2C~X+jD{y_6yYfemd1WdvP3uo%)KpgB;~SdDh15lz(YUe#cY zqKIlY=r%tr)BLS;v$%P4S^$>lmYYb;2oZ4l-oSny>3m60;3c7AeCcZGGGSt{`h*m_ zj^*V5eIQ=7PtIdgX#~{OBb|*|Lfcjb2SE@p7dVyfB^- zy^ZL^hAh8*)@BNl9jpP|U>eTwc&EHfCBJvu_QDMBWN zUPPLC;Uj7^CWKP^Zf}eniS$=5aFf{k?f>Y>6T!qDBn>QpEQv4Fo73|F)#{uQD)MOj zUFXJnI;G|uJ{Q!C`kwL*_#2teO_%wGwU4!I(Y@+pE_=`H z71M<>T-Vp#+izGl)6c+$?gabX7%~u54w0f^n9n{^((m@fTjf+D%}x52VJ@VODc{%zIw#QQaT{amc^3*{ z;LHM-=UVbJ*0;Duq#xgoEl+=t$J!IK&YN?aBECa$mTBBXh7UD^jCYIfoQdqbSaa9V z4P1aUuw1S}w{{{)nnFOT`(j(Zbs!_;&)NiV;k7xNHc*%TmuLjlvyS)&Z2xczeAWW{}75A3ptRKCbSa z(`bsu_2Dv9aX%+=v>WzL|#6A0>#>36u@!efYL3zQo#6F`@NJT6d{t}=e_#6(j+^2_2^Jfu$1=hT`3v5? zQk=E&bsH16mvAXK6lH89D=`;-`Q{u*5M=+y%}o3fiZr@&dh>Wxa%-T54`z^&8P}x_il{DSFh~0cm4eRp@gi&fm4+#sQbk+Kd9B$1%US zISR@{F;3J)e92%xaauXh?n}*0%?uM?8Jfbh`z4sgP#-r|cL7&rac>fv=d~yp`j9Ki+3WyW;+8KEnL4wVb z+WMMXQTvjF!OC-7o(YzQK%dldw4fCik`Qm#62=8s(-Ox@b&GK zMDYg$_`eZB~RB~m~1qau?p{LM0M|GVF?B`V*$>h?%a z8j|g#ratM&p9??JpFDp1!%Ok#ySopwj9J|md*&SUZ(P&lht843>PNpMo@6U>g@gMG zE4TJ5k{S7SuIDe>f(7XRTO2(Ly}tE3Ejw>6=33BHVx=r<;vs) zWaRI4|Bz=&Fb%w5L|+m8>)_s8v@sF6pUu48fkWZq2l*Z?p>MY1l%sXkugC7z4C3QR zryCJR%mSaJS8>~29$V4rySl=6{Ar#q}*KYP0Fv@Ck3y zJy3S?eoysDBZhhBy*2@avL)^b-LC;2H16Ruk@0p>&~Zowm}EafIHPHeu9SCALm7 zb6Oi#d__V_BNSwKNM);A8L$bGE8}0AYi4$rC;Uw?cRvp9c<`(6LxtW8>5~_{rnN9LBZ{Qx3FkL_HR*S= z%3%tp%_jD1`(uakCs*B<`xZ~|<{a#5PmeX|J?4Bzf*2!}6 zRX=z1nfW!BT_2~b;*+Ky1?}D2idz*;G3 zH>T&74xN_Q4=5((b$n~T3mlA+94}_@3TO;BwH1&SJ3H2JEu?2;Onxr)nf0W=vz#sl z*nMAFYs}67DU2d=Z0_fHWmy7?oA&-X=spVgFg3Uo6lkLZ|IIoKP z$L{MrGpb*k2;QIgynC4V%uWB7oF((V1T$nV+7>!Dq{u@iBr8sS@bmVj!e~Jjr%nk> z+sI1a8&ZGN81RJiwkfiG(2cVzay43J;tQv8T&9}Wr`;KagcdpG4vi1zWqf~gpMlIh zutwPtQ6g1g%6G0bD1}cPeGJ=iPWtkL#|1El$tiBgb7M9brMRV?)ZY;GQ|P)FZ}s8s zIQ#xc>Fi5o%@60TR7C|DA;THN?6E`9WlDVeeUYiKhpjP-bhJww3e*GT-aBLdlTyPs zydgaOShcyg6t(odQRSO&5Zk+DY~B##+bug*+mW9!izb5=g8G|sM2!a*3h5PR-H~<5 zHBYFcI+HQ8mh;QoW#+@CpffG}v-KR@m+hnIWr|5s^Q13(Z>}=09VTW+al~B1_t{p} zCG{JH{Fa48&l>Krgk5|s#tVpiPqV%I^~~{$CEgqXWPG$bbV&iVVeeU#w@iAy`+1o( zocp*hrs>^(G?5Bw#^9RixEW(vuaWCUA|E(h>Xk?y+2jxqFnq+%0*rN8x5|ViN72Bi zm8nbB6UwOf2o zbZM$6n-ZvOYU^UEx7%oBz4rSG*#dUc+8XX=9<>DQ^3~_%7CZfr=y2x48V|>&Y;-qg zKdv3BDO%U3+leZ2`~C7P^Y5HmLnY8ueD>I6KTdBV6@zva=ZN6{ul}yRaFsZvg1L(U zJ0pKo!F}8SxBl>eDAZ6Cvv<^cEIF=XOWEcj^Q{u!PyfatR1+d`?dq4`eVLNq^F!@E z6aKB2J|Ew*pguc7uEPpS7&m^2ST29G8P0vXJa+VFzB5a@YSX*yM}1+^lQ}ZNW9L;Z z&vC=`ZW*#090Cn8zl`T3H$cJc2o$lo!+-7{*llniuu&cDh6?UH#ZgFZN~JV`zW7Q% z*LmNhh#~{2pgVt#Q>iod%g2>b=HK)dE;@qx77KzJ6x5g6@>ORgiUQ}}A}q`p*))Cv)+C&4d9={;TKtNRt)sFH~>jut+F zRF~;6)B^e@&Hu>E##vFXdo68poP)~Vbe)BWK5VloR#Z$>%H6Uqa^`##_dPT0+9|@V zUM9b>`BXx3szBjxJ3L9crdJ|gW%j;)H*2?;)Rr+Xp3D=54uzY>crt2MLt6x}p_j1* zVsHw=u}-yN9kXE}%V~xp>pjECONuCk$W9)ySC30#lh+qi`p}W5ky4?9Ew!WJoOJKq4hrC$jAm`=l zMseHTc(&@AcaykG8!WCluJS7f6mJ-f7cOk4s>~RLlvT$4`HplLVD6}jO;Z32grU;q z>VgEh_0dCfLD$Xu+$)O7p_i2E%v?*mOt));4QGZTe+6M4*?m^T?9)I?zv(7v8{|bj zoH;c7^U2LMkqRV0259Zyu>>%YYW+`By6NMC4_s#o*Vv$j90(ChYG!W=$uLTiIR~v@ zDXg!Jz_E(mK5t33RQdiY=r15lf7R5**-Ki1pd^$VHlHs(T9k>N8Uj%s>UU=eNzg9# zp3$4d$6KH#I=dl5U+m6s`G*m6nibsx!_<#JtDs8G+1seLj|Gilx$`rVC`9(xi`6?GZ>bYd2vIz~I?i;NM{g&>S<8exU0?e7)R9Lp z-|LdVz}t;oQhJ(ffZslQ7)xlR%vyL*A~M%iJn;tp{K+1P%PR%_BFA$D&hwk27EQhl zzWQ1v?@R_g0+|b_S(`R}PDHYkd1kJGxJHV%G_iVLXD}#PKsWw{H^~hnBYK5wqfzE= z@3s;R_FfSv&!d?@B?9@B+9l}JE3Jbz*>{ZI`sp6mUZ}B92sZNM9xWssw;jF?=)2-3 zUD*~m%ikiBempq)phYpfd0(xfM{Ketu9}j1r_p1kw9CyVq2FdWONM;1#O0E*_;p3a z;x5O>vbL{EBBd*s&yJsw{~IfH_|*>VmmG>Y>W)>f7oE^i@9Cc&BJCI}{WY z^s4yq=?*F7DqXSk(`BrY!`rXj%IGkA23KOu@Q_^5<^n5o&OK8Lf8EjOtmo-`Hc^k7 z<^3F<-k2Asbl1IYBs@K;++H~bnz-R?!0BQ|MHMkQWkQRd@y@2nZW>Mv7veW;mpr6* zYID&mD3R{D9o5~hFSZ5NHqP%`Sd7+~?34r!RR{Kg_S_-Bg*|(?QPp(C&S zdz!TpG9HQDqSf?~poW%`TJHWUU(F?(r4>NEJ00XqZpZf1{=5ch8XN0Zs0%b<#bqxy z=URENh3hc`17@}NQLkn7 zE2N_9yOCo5$(3?)oNMUwlD^`_C-V_zzN1py>(Lo<(-w(-b^PGi(&VmclL&?3og?5dOk`Aa5U+=Kz$0SA-)VT4LFCn}?l@)si&L%IQ!ve`)lLlM@ zGZ!k+;KcmFR%Oai8}qT{w3nJ=F#iWl`i0UBV$qmADx7PW6JvJG0hRVw*Q|`7tJ;Gn zqjZ7b{q10dX!+sw_M zqU*ThTaXg$w2~qPZT57KfvuG2YOYzGuPLj~ZsRZitN^#<2l7{Fu^WRr;?2l39BD8S z{!0H`kpLpfAFMP^_qoI77Lw~g%uTr9*wKVd_n&#dM@)c*zl?gH^=G(i&m-+7j!`)w zUk*rks}brO0h~w+ynb!tkcS@>5IPJs<69ozI6vcJ= zUdY`#1Dy&H33&&)qgc@Yg)NF-ucNu2@|*tYsxxwne_=mYOLH=;;4>fLh$~zO_BouY zL;mJ9pun%j>0!9e-?~Q-cT$U_D2_k(GVUp_{d{3wRb9URf%r2G&%C z_0WGJ@eTZ4T&FHl+{oz(Xf|=QJ%7SYYBTqn`*orz_LXdT?3 z8JU*{)f)dIT%ZvqOLA1B12aqNyp^C~j&`RO|07#OBdaA9wB+~d4zelhH^P_cb6%1@ zE1)IKhZ3ZSuTq@lMEaTbL8JVL^!E~qZl6aMI*F~|C!2&sp-*9nPWiG_@mz|tgh+8S zt}HKRWMPqa+2KSRL*Zc{lV>!wF7LeA`xQ^l@amrWM$dBNXtk`v04_1VVqcj1iN zVBEA*8kp%+i2w@m3JlBtfv=j?MCR2K!3-EOxreo5S@vu8<1!=W{OR{cbX_!4(S9Tp z>#=E-uN^0i!ClTKKJJx8%(XI*$c6={jT{;$8z@@Bvo6UJ;(l&UvZZ+bNao6y%h3Q; zTh7ORCK0Pq-#*-SOY3#`kjK3*|3>4NxdBf`^G@?_YFqieYVpHjqhGWcI++hVK-0S% z>~G=z+|oG8nqBb|b#X!7j+hs{aMfGY7FLJj<*R265taB61YA7udZqG*4*F4TR>D!u z72(hHqS19L)ljw3eHnf#yjKZ>YI*x&QoL&=c_pZ=w?{s=v9Kl&5-ZL{QcyzbWom+3 zJ{^ASPVx3}G&OwJ@8D;%? z8s&i>ZxI3U0N=_}gIUvy@upsN8lW_!y$ls~`YvgZrT4B>Ve=Z$O$s-*6gKp&i90Z} z(Z?s&{oCDjB|n}V218m8lEeZ|9io#iV=2p{m=Kk1Q0_nTlj5JxH?F{@aG6nz4!H%K8d*7C4O|^C_D8WR-*y`rjGhHW>9@t-S zTech=dT-rU?5)iV^|trs_ISWEYhND0FnDTkoDS-QGLa$+J;X5UO#A4EKX)rw*<`NQ z4ii>i>i^_4aKy7dQFmj%_-v4g&Ob=Y@-Yi7237mS2Zk1<97Rz1j#RR+@TlJ+luioc z-yN0YDn4P-Ac*xRiA3s;a&ZF zzC*KnEMQp*C|eDQ9A5M1oiH0aAd;&_I@K^qDyt6`3A#>L-gYi_Q_(j3owSz#;_zP} zjU7pQj?8}EVJMmxqf^4eHg_nqs%?nN<2lq@vmYb*uaOlxG6%9>KiCL{9yUWut@LxH zOSKR5884_C{#Klf6e5Bme#!#?Jt(xNoE4K5FZY#U<<=3CHkMqPzkM+pzsY2cx!_hgS0L-0j zGd@P3vsnvYY?HlNREym_8H&n@0vkjT?Y)6-(cWLOHdquFsgahDDng2BPUhdvmJSy^ z(aY(KNbOk&rBI9areK;;;Ii4~h<15;T;p7F&sXz?TgTql3fFVz%G158ZjC&oNi7pC z+w(ryAL-sZsUZsq0HM|%7D=-}cyIRIo9{`j6<@w2yzpnSClx1AY2WWc<~_5tJnuEU zx@;=Aa55YSrdSa=-#1A08ZMj%d1`p#eFGZDrvebqk^Xm$+npqypjs!Woii+LX#84G z&o<@k$uJo)a2>k)YI8#L-tNSg@(0dY-n~wkVkGT>rT&$7w;q#LIeJ(h)I6ag{tsg$ zfU#>+4~DxG11_#2_?BSK)6M+6<8)~uK^)NXS2Sr-+j2Ke04IYR3oc_?Tvw8hf9!to zxUqtmXR7MRu;~-FPp^8d`E%#P+mVI+d5dY8Y%!hdSD=jpxwKrdU_S9WNVUptB@Q7K zFy_|h^kVl5ef5ylqbr%jML+I62_y`?m#^4t>nIM}08X5i(%%i0U-&-OvBWiEVDITc z{YZ=3RsjCf>f6~1U=k2?>g6vKQsX-9F|(2=j}}~`#YvdU(){YB&azg@W|4ZeidAAu37K4=KQS5}L&nPb6A#HUNY)CFI_Ly#FL8ve4z=3pcU-iy`i@ zA_{;?t+wz`G98{rN4gk+G~WCcL_DdRzGfH^Y{+)sfQ-1v-()?|^WM%3LgOu#=477T z7Rq`yvG0L|0BVLRzCW_lUrx|<5`&JJBEMYnnG!qj`gOKdAAEmgqep1a3=jJW96*S! zHP`}koi7p{rma0u*&3pRAbHCEn z>+4odu87sg@n%IB-_(J7?W7w-`j%=ziKxHMuGG)s*_eB<#7P!*^577mkYjO;s&?I)H9oGCYAo+mw13qe^<{zowA5tbZh=C zw_CwlA^_k!Q$Pf~vOxYxsH*d^2kz2oK!-vD;-7JZ5B2)mL z@m%t;a-oDA+~)mbpvgB=QBvt`c$7F%SzNXf0g|#uJYdt}thTkY*h@|3L29lyuHlIB z1js>8AT3AV(|I7VdHrgB&Fl!NqaavM4c1#6W!XA|SkG|0W%H(pU*AdHX{F*M8q$M9 ziM_ferUuoIn$RfX*S$;i5I>Xr1x!A6k*h?}#C*+1vgfVH6HNesfEkcjFcroq^kV6Xv#>99iBGm-2U<5=Gf-gT)4ZIga0HevN@V*)ZD>lcKPY!U z<7j0lbTEHlg{NAHpCx!dJm|ED@GN_-_;BQ8X^1xT>Di$hD34^^6gw}--ifnUbNNoS z&w_Y}c7SXbpgdp@%AQ~fqQ6$q3dcj@Ma--i((fX;UG(d5obV5}d;<@q(8)%|6C?dR zWBx5hJ`jC;AMcz0(u57UMRj^_I%<1EorJGMiR;KrtKD#gj}iU|qJOIMA{fX$fJ4qfP>Mh<(}Y6t zEs~ObfW7zlQbU}yCuJrVr(Lj@r@a4bTJB+gSwBK}T? z;$a1EPB-rZuF1W4H2;2-fM(&tI=~WfQo>i~ecQHo>6k`eH5M_Q=ZfcS4kOP<+e&!e z@iBW*Tk}9I;rpVt`wrJIzpB8*5990PA%jjz{;-TMLl4na&la`sI4R|f>uzyf6J`7O zlUu^ziq4(;`d6U6vAMEuifFO7ls{#kF73UB6b{i>fcBDnCneSDg^Nf=9l;82!O|EN zgYoYW$4QL+teql#pkKvAaI)bF_dZ|->2R0g4yQyi$P zidLE#N{wiY3>$uAOk;n~e)U*(`EBCHC}?doOTOKFzx+ zxWlKLorjkNPueqT!L`ROvGSwLJ*3?=R1McohEbS{9)4l}_AL)*!HKd�M*&d;K3q z50*!DmZ3cQ8nrWJEf*R+-1l>FjX@-HU}ulMkm8AZSlkpR%1sV!$ohDpKkN-{lJZLh z!om=LV~j{;F11vQ!%}t2uq;-0K2Jf984>S>>omgH&Wt?0;g%%cq=(V!b&F!Aj8C@L?D+J1h9Z7>ehcab407!gk$*_nn5jE$bwv*bQTv*tYc$wy|Vb+;qC ze*ujol+n!V{Nd**_tVqU7|uQET%#=FeQ#bFgE@%rTmIyDeyeCTBk|LEudsy-^UhRm z*OS9)oYZB~-J^fdlulq0-ss!cx#s%}ci5!)(gIPdfsv_Di9D2(%b~8Un&z|kNdZ;x zU3;N3pQmijiaKUT@lY6Rk#l=YNC&IPg(Vz~(#ym!ExH-4smCW&*4oK@v#vW_K78K) z+|xW+{7)?lpW)3Tb|WFp2~fSv8jy|ZRNPcJlE-X)U;(ogbWaDler}-(g6~NDvdF$` zC9auscqTun@LFU>0d^|mo&sj=JL>gnf8kVi)OiGUB3E~Q>o#()dvDD$i&PhhonXQa z6!aQWFK#%aJQf1elOBK^0FwVGe=}!`oM4~3nnd$gryoSiN`HZBv4lxP3UQB-H_-Wi5{x-&tK6u4#;&>sK* literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18340246016/img/112426_09535d36_8823823.png b/assignment-1/submission/18340246016/img/112426_09535d36_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..a1db91fe434924aafbc734b235647d73fb4229dd GIT binary patch literal 31102 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 literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18340246016/img/112437_53a32eec_8823823.png b/assignment-1/submission/18340246016/img/112437_53a32eec_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..7731028adc12f28c461efc7240b6e5fa95c12702 GIT binary patch literal 15380 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 literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18340246016/img/112759_754208e4_8823823.png b/assignment-1/submission/18340246016/img/112759_754208e4_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..913e3801971de18d4f609181dad97957b03a142b GIT binary patch literal 28511 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%0AKg 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 literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18340246016/img/122104_30809a7a_8823823.png b/assignment-1/submission/18340246016/img/122104_30809a7a_8823823.png new file mode 100644 index 0000000000000000000000000000000000000000..0343da404b4c87d03aebfde3016b60e6b55cb836 GIT binary patch literal 15150 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 Date: Thu, 1 Apr 2021 12:33:33 +0800 Subject: [PATCH 042/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-1/submission/18340246016/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-1/submission/18340246016/.keep diff --git a/assignment-1/submission/18340246016/.keep b/assignment-1/submission/18340246016/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 795a640cda650617ac6fa0beffe0607878313908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 29 Apr 2021 15:57:02 +0800 Subject: [PATCH 043/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20assignment-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/.keep diff --git a/assignment-2/.keep b/assignment-2/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 3fc83e9476532947c88166d34f20120fd2beb061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 29 Apr 2021 15:58:58 +0800 Subject: [PATCH 044/112] add assignment-2/numpy_fnn.py. --- assignment-2/numpy_fnn.py | 249 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 assignment-2/numpy_fnn.py diff --git a/assignment-2/numpy_fnn.py b/assignment-2/numpy_fnn.py new file mode 100644 index 0000000..7f48bcd --- /dev/null +++ b/assignment-2/numpy_fnn.py @@ -0,0 +1,249 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + + #################### + # code 1 # + x = self.memory['x'] + W = self.memory['W'] + + grad_W = np.matmul(x.T,grad_y) + grad_x = np.matmul(grad_y,W.T) + #################### + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 2 # + x = self.memory['x'] + + grad_x = np.where(x > 0, 1, 0) + + grad_x = grad_x * grad_y + + #################### + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 3 # + x = self.memory['x'] + + grad_x = (1/(x + self.epsilon)) + + grad_x = grad_x*grad_y + + + #################### + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + + #################### + # code 4 # + + out = np.array(x, copy="true") + + + result_list=[] + + for m in range(len(out)): + result_list.append(sum(np.exp(out[m]))) + + for m in range(len(out)): + for n in range(len(out[0])): + out[m][n]= np.exp(out[m][n]) / result_list[m] + + self.memory['x'] = x + + #################### + + return out + + + + def backward(self, grad_y): + + """ + grad_y: same shape as x + """ + + + + #################### + # code 5 # + + x = self.memory['x'] + softx = self.forward(x) + [n, m] = x.shape + out = [] + for i in range(n): + out.append([]) + for j in range(m): + out[i].append(0) + for k in range(m): + if j == k: + out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] + else: + out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] + grad_x = np.array(out) + + + + + #################### + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + #x = torch.relu(torch.matmul(x, self.W1)) + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 605dfaf5e9b9de94eee7594e1a15855caebc6a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Thu, 29 Apr 2021 16:00:33 +0800 Subject: [PATCH 045/112] add assignment-2/numpy_mnist.py. --- assignment-2/numpy_mnist.py | 58 +++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 assignment-2/numpy_mnist.py diff --git a/assignment-2/numpy_mnist.py b/assignment-2/numpy_mnist.py new file mode 100644 index 0000000..833e5aa --- /dev/null +++ b/assignment-2/numpy_mnist.py @@ -0,0 +1,58 @@ +import numpy as np +from numpy_fnn import NumpyModel, NumpyLoss +from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot + +def mini_batch(dataset, batch_size=128, numpy=False): + + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + res = [] + + + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res + + +def numpy_run(): + train_dataset, test_dataset = download_mnist() + + model = NumpyModel() + numpy_loss = NumpyLoss() + model.W1, model.W2, model.W3 = get_torch_initialization() + + train_loss = [] + + epoch_number = 3 + learning_rate = 0.1 + + for epoch in range(epoch_number): + for x, y in mini_batch(train_dataset): + y = one_hot(y) + + y_pred = model.forward(x) + loss = numpy_loss.get_loss(y_pred, y) + + model.backward(numpy_loss.backward()) + model.optimize(learning_rate) + + train_loss.append(loss.item()) + + x, y = batch(test_dataset)[0] + accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) + print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) + + plot_curve(train_loss) + + +if __name__ == "__main__": + numpy_run() \ No newline at end of file -- Gitee From 139a2e496eebaf4051ab3676600d4228161ef71a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:01:53 +0800 Subject: [PATCH 046/112] add assignment-2. --- assignment-2/readme.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/readme.md diff --git a/assignment-2/readme.md b/assignment-2/readme.md new file mode 100644 index 0000000..e69de29 -- Gitee From d951453c2bba3cf53ab9c487f308ce4d5e9cb43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:15:41 +0800 Subject: [PATCH 047/112] rename assignment-2/readme.md to assignment-2/README.md. --- assignment-2/README.md | 25 +++++++++++++++++++++++++ assignment-2/readme.md | 0 2 files changed, 25 insertions(+) create mode 100644 assignment-2/README.md delete mode 100644 assignment-2/readme.md diff --git a/assignment-2/README.md b/assignment-2/README.md new file mode 100644 index 0000000..274c633 --- /dev/null +++ b/assignment-2/README.md @@ -0,0 +1,25 @@ +**1. Mini-batch 函数的实现** + +``` +def mini_batch(dataset, batch_size=128, numpy=False): + +# 仿照batch函数分离data与label + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + + res = [] + +# 以batch_size为单位,从[0,len(data)]分割mini-batch + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res +``` diff --git a/assignment-2/readme.md b/assignment-2/readme.md deleted file mode 100644 index e69de29..0000000 -- Gitee From e13104e97a34c3d66e9602020a90f47e2803d7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:23:28 +0800 Subject: [PATCH 048/112] update assignment-2/README.md. --- assignment-2/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/assignment-2/README.md b/assignment-2/README.md index 274c633..3a44836 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -23,3 +23,10 @@ def mini_batch(dataset, batch_size=128, numpy=False): return res ``` + + **2. 模型的训练和测试** + +| Epoch | Batch_size | +| ---------------- | ------ | +| 3 | 16 | +| 10 | 128 | -- Gitee From 680ebe33e6b18eff82e227d4a98ae34f9d62212d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:26:24 +0800 Subject: [PATCH 049/112] update assignment-2/README.md. --- assignment-2/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/assignment-2/README.md b/assignment-2/README.md index 3a44836..0fe8ee5 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -30,3 +30,12 @@ def mini_batch(dataset, batch_size=128, numpy=False): | ---------------- | ------ | | 3 | 16 | | 10 | 128 | + + +* Epoch = 3 Batch_size=128 * + +[0] Accuracy: 0.9373 +[1] Accuracy: 0.9583 +[2] Accuracy: 0.9683 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") \ No newline at end of file -- Gitee From 41cd8450b1cf1796252abdb3261cc93934b64f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:26:53 +0800 Subject: [PATCH 050/112] update assignment-2/README.md. --- assignment-2/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index 0fe8ee5..cd9c6cf 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -32,10 +32,12 @@ def mini_batch(dataset, batch_size=128, numpy=False): | 10 | 128 | -* Epoch = 3 Batch_size=128 * +* Epoch = 3 Batch_size=128 [0] Accuracy: 0.9373 + [1] Accuracy: 0.9583 + [2] Accuracy: 0.9683 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") \ No newline at end of file -- Gitee From 8083ec87a9e58c3fb907d62403954677fde91bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:27:17 +0800 Subject: [PATCH 051/112] update assignment-2/README.md. --- assignment-2/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index cd9c6cf..8fc9add 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -35,9 +35,7 @@ def mini_batch(dataset, batch_size=128, numpy=False): * Epoch = 3 Batch_size=128 [0] Accuracy: 0.9373 - [1] Accuracy: 0.9583 - [2] Accuracy: 0.9683 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") \ No newline at end of file -- Gitee From b38ba76f0f7c32a277dc7fb7441ee5c29b115fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:28:14 +0800 Subject: [PATCH 052/112] update assignment-2/README.md. --- assignment-2/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index 8fc9add..d440643 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -34,8 +34,8 @@ def mini_batch(dataset, batch_size=128, numpy=False): * Epoch = 3 Batch_size=128 -[0] Accuracy: 0.9373 -[1] Accuracy: 0.9583 -[2] Accuracy: 0.9683 +
[0] Accuracy: 0.9373 +
[1] Accuracy: 0.9583 +
[2] Accuracy: 0.9683 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") \ No newline at end of file -- Gitee From b39c0b86cc07885bf8566476d7fcee7a30e4a086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 10:28:32 +0800 Subject: [PATCH 053/112] update assignment-2/README.md. --- assignment-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index d440643..4c7da37 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -34,7 +34,7 @@ def mini_batch(dataset, batch_size=128, numpy=False): * Epoch = 3 Batch_size=128 -
[0] Accuracy: 0.9373 +[0] Accuracy: 0.9373
[1] Accuracy: 0.9583
[2] Accuracy: 0.9683 -- Gitee From 800438d57751af2b14348f3685b3222d313c0b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:10:58 +0800 Subject: [PATCH 054/112] update assignment-2/README.md. --- assignment-2/README.md | 43 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index 4c7da37..b95f42e 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -38,4 +38,45 @@ def mini_batch(dataset, batch_size=128, numpy=False):
[1] Accuracy: 0.9583
[2] Accuracy: 0.9683 -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") \ No newline at end of file +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") + + + +* Epoch = 3 Batch_size=16 + +[0] Accuracy: 0.9640 +
[1] Accuracy: 0.9676 +
[2] Accuracy: 0.9707 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/103502_131ca59f_8823823.png "3-16.png") + +* Epoch = 10 Batch_size=16 + +[0] Accuracy: 0.9602 +
[1] Accuracy: 0.9657 +
[2] Accuracy: 0.9741 +
[3] Accuracy: 0.9747 +
[4] Accuracy: 0.9701 +
[5] Accuracy: 0.9731 +
[6] Accuracy: 0.9760 +
[7] Accuracy: 0.9763 +
[8] Accuracy: 0.9760 +
[9] Accuracy: 0.9780 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/105531_82cafce0_8823823.png "10-16.png") + + +* Epoch = 10 Batch_size=128 + +[0] Accuracy: 0.9389 +
[1] Accuracy: 0.9585 +
[2] Accuracy: 0.9679 +
[3] Accuracy: 0.9706 +
[4] Accuracy: 0.9746 +
[5] Accuracy: 0.9760 +
[6] Accuracy: 0.9769 +
[7] Accuracy: 0.9777 +
[8] Accuracy: 0.9781 +
[9] Accuracy: 0.9781 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") \ No newline at end of file -- Gitee From 54cf0081c52d2e22bff8236f8d6b53dca668aeb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:34:14 +0800 Subject: [PATCH 055/112] update assignment-2/README.md. --- assignment-2/README.md | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/assignment-2/README.md b/assignment-2/README.md index b95f42e..6d53862 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -26,6 +26,65 @@ def mini_batch(dataset, batch_size=128, numpy=False): **2. 模型的训练和测试** +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/113123_f204953a_8823823.png "processon.png") + +``` + # 前向传播过程 + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + + #x = torch.relu(torch.matmul(x, self.W1)) + # 模仿torch的relu(Matmul.(x,w1))操作,下同 + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + # 反向传播过程 + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass +``` + + + + + | Epoch | Batch_size | | ---------------- | ------ | | 3 | 16 | -- Gitee From d370041d49edc2d1cdc3cbf002d56681800b4723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:35:12 +0800 Subject: [PATCH 056/112] update assignment-2/README.md. --- assignment-2/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index 6d53862..4fdfff2 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -138,4 +138,8 @@ def mini_batch(dataset, batch_size=128, numpy=False):
[8] Accuracy: 0.9781
[9] Accuracy: 0.9781 -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") \ No newline at end of file +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") + + + +*探究发现* -- Gitee From 8fe4b7b70e26b55dc69d2052324383855689605c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:38:53 +0800 Subject: [PATCH 057/112] update assignment-2/README.md. --- assignment-2/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-2/README.md b/assignment-2/README.md index 4fdfff2..d1d1917 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -143,3 +143,5 @@ def mini_batch(dataset, batch_size=128, numpy=False): *探究发现* +1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 +2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 \ No newline at end of file -- Gitee From 5240526a3b001b4f80dbf9fe573480a6f4e40e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:53:48 +0800 Subject: [PATCH 058/112] update assignment-2/README.md. --- assignment-2/README.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index d1d1917..d5f6d85 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -144,4 +144,36 @@ def mini_batch(dataset, batch_size=128, numpy=False): *探究发现* 1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 -2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 \ No newline at end of file +2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 + + + **3.Momentum 优化函数下的对比试验** + + +``` + # 利用momentum优化下的optimize函数 + def optimize(self, learning_rate): + + # 初始化V值 + v1=0 + v2=0 + v3=0 + mu=0.9 + + # momentum下的更新算法 + v1 = mu * v1 - learning_rate * self.W1_grad + self.W1 = self.W1 + v1 + + v2 = mu * v2 - learning_rate * self.W2_grad + self.W2 = self.W2 + v2 + + v3 = mu * v3 - learning_rate * self.W3_grad + self.W3 = self.W3 + v3 + + + #self.W1 -= learning_rate * self.W1_grad + # self.W2 -= learning_rate * self.W2_grad + #self.W3 -= learning_rate * self.W3_grad +``` + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") \ No newline at end of file -- Gitee From 8be1d39f9827cfc85a501ab780070051982f2fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Fri, 30 Apr 2021 11:59:36 +0800 Subject: [PATCH 059/112] update assignment-2/README.md. --- assignment-2/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/assignment-2/README.md b/assignment-2/README.md index d5f6d85..827aa9f 100644 --- a/assignment-2/README.md +++ b/assignment-2/README.md @@ -176,4 +176,8 @@ def mini_batch(dataset, batch_size=128, numpy=False): #self.W3 -= learning_rate * self.W3_grad ``` -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") \ No newline at end of file +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") + +1. 在我们的测试数据下,momentum与梯度下降模型准确率差异不大 +2. momentum模型主要用来解决全局最优与局部最优之间的差异,但在本测试集下不存在全局与局部的差异 +3. 理论上来说,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域 \ No newline at end of file -- Gitee From 4cb244d6c1341f69f47a7e0dc2ab86ef2640174b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:17:46 +0800 Subject: [PATCH 060/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20submission?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/.keep diff --git a/assignment-2/submission/.keep b/assignment-2/submission/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From f0366413984247ee36e0c7df3f78f3ac11b98ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:19:16 +0800 Subject: [PATCH 061/112] add assignment-2/submission/README.md. --- assignment-2/submission/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/README.md diff --git a/assignment-2/submission/README.md b/assignment-2/submission/README.md new file mode 100644 index 0000000..e69de29 -- Gitee From 2ade6e8912a269748871af147816a198e279ea27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:19:46 +0800 Subject: [PATCH 062/112] update assignment-2/submission/README.md. --- assignment-2/submission/README.md | 183 ++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/assignment-2/submission/README.md b/assignment-2/submission/README.md index e69de29..827aa9f 100644 --- a/assignment-2/submission/README.md +++ b/assignment-2/submission/README.md @@ -0,0 +1,183 @@ +**1. Mini-batch 函数的实现** + +``` +def mini_batch(dataset, batch_size=128, numpy=False): + +# 仿照batch函数分离data与label + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + + res = [] + +# 以batch_size为单位,从[0,len(data)]分割mini-batch + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res +``` + + **2. 模型的训练和测试** + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/113123_f204953a_8823823.png "processon.png") + +``` + # 前向传播过程 + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + + #x = torch.relu(torch.matmul(x, self.W1)) + # 模仿torch的relu(Matmul.(x,w1))操作,下同 + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + # 反向传播过程 + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass +``` + + + + + +| Epoch | Batch_size | +| ---------------- | ------ | +| 3 | 16 | +| 10 | 128 | + + +* Epoch = 3 Batch_size=128 + +[0] Accuracy: 0.9373 +
[1] Accuracy: 0.9583 +
[2] Accuracy: 0.9683 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") + + + +* Epoch = 3 Batch_size=16 + +[0] Accuracy: 0.9640 +
[1] Accuracy: 0.9676 +
[2] Accuracy: 0.9707 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/103502_131ca59f_8823823.png "3-16.png") + +* Epoch = 10 Batch_size=16 + +[0] Accuracy: 0.9602 +
[1] Accuracy: 0.9657 +
[2] Accuracy: 0.9741 +
[3] Accuracy: 0.9747 +
[4] Accuracy: 0.9701 +
[5] Accuracy: 0.9731 +
[6] Accuracy: 0.9760 +
[7] Accuracy: 0.9763 +
[8] Accuracy: 0.9760 +
[9] Accuracy: 0.9780 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/105531_82cafce0_8823823.png "10-16.png") + + +* Epoch = 10 Batch_size=128 + +[0] Accuracy: 0.9389 +
[1] Accuracy: 0.9585 +
[2] Accuracy: 0.9679 +
[3] Accuracy: 0.9706 +
[4] Accuracy: 0.9746 +
[5] Accuracy: 0.9760 +
[6] Accuracy: 0.9769 +
[7] Accuracy: 0.9777 +
[8] Accuracy: 0.9781 +
[9] Accuracy: 0.9781 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") + + + +*探究发现* +1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 +2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 + + + **3.Momentum 优化函数下的对比试验** + + +``` + # 利用momentum优化下的optimize函数 + def optimize(self, learning_rate): + + # 初始化V值 + v1=0 + v2=0 + v3=0 + mu=0.9 + + # momentum下的更新算法 + v1 = mu * v1 - learning_rate * self.W1_grad + self.W1 = self.W1 + v1 + + v2 = mu * v2 - learning_rate * self.W2_grad + self.W2 = self.W2 + v2 + + v3 = mu * v3 - learning_rate * self.W3_grad + self.W3 = self.W3 + v3 + + + #self.W1 -= learning_rate * self.W1_grad + # self.W2 -= learning_rate * self.W2_grad + #self.W3 -= learning_rate * self.W3_grad +``` + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") + +1. 在我们的测试数据下,momentum与梯度下降模型准确率差异不大 +2. momentum模型主要用来解决全局最优与局部最优之间的差异,但在本测试集下不存在全局与局部的差异 +3. 理论上来说,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域 \ No newline at end of file -- Gitee From d31fadb39e915756efe8f197a7b8b2d19d217d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:20:31 +0800 Subject: [PATCH 063/112] add assignment-2/submission. --- .../submission/assignment-2/numpy_fnn.py | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 assignment-2/submission/assignment-2/numpy_fnn.py diff --git a/assignment-2/submission/assignment-2/numpy_fnn.py b/assignment-2/submission/assignment-2/numpy_fnn.py new file mode 100644 index 0000000..7f48bcd --- /dev/null +++ b/assignment-2/submission/assignment-2/numpy_fnn.py @@ -0,0 +1,249 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + + #################### + # code 1 # + x = self.memory['x'] + W = self.memory['W'] + + grad_W = np.matmul(x.T,grad_y) + grad_x = np.matmul(grad_y,W.T) + #################### + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 2 # + x = self.memory['x'] + + grad_x = np.where(x > 0, 1, 0) + + grad_x = grad_x * grad_y + + #################### + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 3 # + x = self.memory['x'] + + grad_x = (1/(x + self.epsilon)) + + grad_x = grad_x*grad_y + + + #################### + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + + #################### + # code 4 # + + out = np.array(x, copy="true") + + + result_list=[] + + for m in range(len(out)): + result_list.append(sum(np.exp(out[m]))) + + for m in range(len(out)): + for n in range(len(out[0])): + out[m][n]= np.exp(out[m][n]) / result_list[m] + + self.memory['x'] = x + + #################### + + return out + + + + def backward(self, grad_y): + + """ + grad_y: same shape as x + """ + + + + #################### + # code 5 # + + x = self.memory['x'] + softx = self.forward(x) + [n, m] = x.shape + out = [] + for i in range(n): + out.append([]) + for j in range(m): + out[i].append(0) + for k in range(m): + if j == k: + out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] + else: + out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] + grad_x = np.array(out) + + + + + #################### + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + #x = torch.relu(torch.matmul(x, self.W1)) + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 6e49ac116d333d1a7927f79719dc2ae9e9aeb98e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:21:01 +0800 Subject: [PATCH 064/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/assignment-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submission/assignment-2/numpy_fnn.py | 249 ------------------ 1 file changed, 249 deletions(-) delete mode 100644 assignment-2/submission/assignment-2/numpy_fnn.py diff --git a/assignment-2/submission/assignment-2/numpy_fnn.py b/assignment-2/submission/assignment-2/numpy_fnn.py deleted file mode 100644 index 7f48bcd..0000000 --- a/assignment-2/submission/assignment-2/numpy_fnn.py +++ /dev/null @@ -1,249 +0,0 @@ -import numpy as np - - -class NumpyOp: - - def __init__(self): - self.memory = {} - self.epsilon = 1e-12 - - -class Matmul(NumpyOp): - - def forward(self, x, W): - """ - x: shape(N, d) - w: shape(d, d') - """ - self.memory['x'] = x - self.memory['W'] = W - h = np.matmul(x, W) - return h - - def backward(self, grad_y): - """ - grad_y: shape(N, d') - """ - - #################### - # code 1 # - x = self.memory['x'] - W = self.memory['W'] - - grad_W = np.matmul(x.T,grad_y) - grad_x = np.matmul(grad_y,W.T) - #################### - - return grad_x, grad_W - - -class Relu(NumpyOp): - - def forward(self, x): - self.memory['x'] = x - return np.where(x > 0, x, np.zeros_like(x)) - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 2 # - x = self.memory['x'] - - grad_x = np.where(x > 0, 1, 0) - - grad_x = grad_x * grad_y - - #################### - - return grad_x - - -class Log(NumpyOp): - - def forward(self, x): - """ - x: shape(N, c) - """ - - out = np.log(x + self.epsilon) - self.memory['x'] = x - - return out - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 3 # - x = self.memory['x'] - - grad_x = (1/(x + self.epsilon)) - - grad_x = grad_x*grad_y - - - #################### - - return grad_x - - -class Softmax(NumpyOp): - """ - softmax over last dimension - """ - - def forward(self, x): - """ - x: shape(N, c) - """ - - #################### - # code 4 # - - out = np.array(x, copy="true") - - - result_list=[] - - for m in range(len(out)): - result_list.append(sum(np.exp(out[m]))) - - for m in range(len(out)): - for n in range(len(out[0])): - out[m][n]= np.exp(out[m][n]) / result_list[m] - - self.memory['x'] = x - - #################### - - return out - - - - def backward(self, grad_y): - - """ - grad_y: same shape as x - """ - - - - #################### - # code 5 # - - x = self.memory['x'] - softx = self.forward(x) - [n, m] = x.shape - out = [] - for i in range(n): - out.append([]) - for j in range(m): - out[i].append(0) - for k in range(m): - if j == k: - out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] - else: - out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] - grad_x = np.array(out) - - - - - #################### - - return grad_x - - -class NumpyLoss: - - def __init__(self): - self.target = None - - def get_loss(self, pred, target): - self.target = target - return (-pred * target).sum(axis=1).mean() - - def backward(self): - return -self.target / self.target.shape[0] - - -class NumpyModel: - def __init__(self): - self.W1 = np.random.normal(size=(28 * 28, 256)) - self.W2 = np.random.normal(size=(256, 64)) - self.W3 = np.random.normal(size=(64, 10)) - - # 以下算子会在 forward 和 backward 中使用 - self.matmul_1 = Matmul() - self.relu_1 = Relu() - self.matmul_2 = Matmul() - self.relu_2 = Relu() - self.matmul_3 = Matmul() - self.softmax = Softmax() - self.log = Log() - - # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) - self.x1_grad, self.W1_grad = None, None - self.relu_1_grad = None - self.x2_grad, self.W2_grad = None, None - self.relu_2_grad = None - self.x3_grad, self.W3_grad = None, None - self.softmax_grad = None - self.log_grad = None - - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - #x = torch.relu(torch.matmul(x, self.W1)) - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass - - def optimize(self, learning_rate): - self.W1 -= learning_rate * self.W1_grad - self.W2 -= learning_rate * self.W2_grad - self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 121ab91d1cd072097be024e26ac8d956b4e905a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:21:07 +0800 Subject: [PATCH 065/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-2/submission/.keep diff --git a/assignment-2/submission/.keep b/assignment-2/submission/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 8ab7d290014888a75155928cc93dbb8857f6f4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:21:29 +0800 Subject: [PATCH 066/112] add assignment-2/submission/numpy_fnn.py. --- assignment-2/submission/numpy_fnn.py | 249 +++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 assignment-2/submission/numpy_fnn.py diff --git a/assignment-2/submission/numpy_fnn.py b/assignment-2/submission/numpy_fnn.py new file mode 100644 index 0000000..7f48bcd --- /dev/null +++ b/assignment-2/submission/numpy_fnn.py @@ -0,0 +1,249 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + + #################### + # code 1 # + x = self.memory['x'] + W = self.memory['W'] + + grad_W = np.matmul(x.T,grad_y) + grad_x = np.matmul(grad_y,W.T) + #################### + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 2 # + x = self.memory['x'] + + grad_x = np.where(x > 0, 1, 0) + + grad_x = grad_x * grad_y + + #################### + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 3 # + x = self.memory['x'] + + grad_x = (1/(x + self.epsilon)) + + grad_x = grad_x*grad_y + + + #################### + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + + #################### + # code 4 # + + out = np.array(x, copy="true") + + + result_list=[] + + for m in range(len(out)): + result_list.append(sum(np.exp(out[m]))) + + for m in range(len(out)): + for n in range(len(out[0])): + out[m][n]= np.exp(out[m][n]) / result_list[m] + + self.memory['x'] = x + + #################### + + return out + + + + def backward(self, grad_y): + + """ + grad_y: same shape as x + """ + + + + #################### + # code 5 # + + x = self.memory['x'] + softx = self.forward(x) + [n, m] = x.shape + out = [] + for i in range(n): + out.append([]) + for j in range(m): + out[i].append(0) + for k in range(m): + if j == k: + out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] + else: + out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] + grad_x = np.array(out) + + + + + #################### + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + #x = torch.relu(torch.matmul(x, self.W1)) + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From cda6edb4f818cee09a27b21c5398b560ed89dbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:21:56 +0800 Subject: [PATCH 067/112] add assignment-2/submission/numpy_mnist.py. --- assignment-2/submission/numpy_mnist.py | 58 ++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 assignment-2/submission/numpy_mnist.py diff --git a/assignment-2/submission/numpy_mnist.py b/assignment-2/submission/numpy_mnist.py new file mode 100644 index 0000000..833e5aa --- /dev/null +++ b/assignment-2/submission/numpy_mnist.py @@ -0,0 +1,58 @@ +import numpy as np +from numpy_fnn import NumpyModel, NumpyLoss +from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot + +def mini_batch(dataset, batch_size=128, numpy=False): + + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + res = [] + + + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res + + +def numpy_run(): + train_dataset, test_dataset = download_mnist() + + model = NumpyModel() + numpy_loss = NumpyLoss() + model.W1, model.W2, model.W3 = get_torch_initialization() + + train_loss = [] + + epoch_number = 3 + learning_rate = 0.1 + + for epoch in range(epoch_number): + for x, y in mini_batch(train_dataset): + y = one_hot(y) + + y_pred = model.forward(x) + loss = numpy_loss.get_loss(y_pred, y) + + model.backward(numpy_loss.backward()) + model.optimize(learning_rate) + + train_loss.append(loss.item()) + + x, y = batch(test_dataset)[0] + accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) + print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) + + plot_curve(train_loss) + + +if __name__ == "__main__": + numpy_run() \ No newline at end of file -- Gitee From d61dc27d2ca729a94196a033a62e287ac2f75326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:22:14 +0800 Subject: [PATCH 068/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-2/.keep diff --git a/assignment-2/.keep b/assignment-2/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From dae7f126db9b777f53fb38fab8ecfa74a039ca8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:22:45 +0800 Subject: [PATCH 069/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/README.md | 183 ----------------------------------------- 1 file changed, 183 deletions(-) delete mode 100644 assignment-2/README.md diff --git a/assignment-2/README.md b/assignment-2/README.md deleted file mode 100644 index 827aa9f..0000000 --- a/assignment-2/README.md +++ /dev/null @@ -1,183 +0,0 @@ -**1. Mini-batch 函数的实现** - -``` -def mini_batch(dataset, batch_size=128, numpy=False): - -# 仿照batch函数分离data与label - data = [] - label = [] - for each in dataset: - data.append(np.array(each[0])) - label.append(each[1]) - - data = np.array(data) - label = np.array(label) - - - res = [] - -# 以batch_size为单位,从[0,len(data)]分割mini-batch - for start_idx in range(0, data.shape[0], batch_size): - end_idx = min(start_idx + batch_size, len(data)) - res.append((data[start_idx:end_idx],label[start_idx:end_idx])) - - return res -``` - - **2. 模型的训练和测试** - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/113123_f204953a_8823823.png "processon.png") - -``` - # 前向传播过程 - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - - #x = torch.relu(torch.matmul(x, self.W1)) - # 模仿torch的relu(Matmul.(x,w1))操作,下同 - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - # 反向传播过程 - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass -``` - - - - - -| Epoch | Batch_size | -| ---------------- | ------ | -| 3 | 16 | -| 10 | 128 | - - -* Epoch = 3 Batch_size=128 - -[0] Accuracy: 0.9373 -
[1] Accuracy: 0.9583 -
[2] Accuracy: 0.9683 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") - - - -* Epoch = 3 Batch_size=16 - -[0] Accuracy: 0.9640 -
[1] Accuracy: 0.9676 -
[2] Accuracy: 0.9707 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/103502_131ca59f_8823823.png "3-16.png") - -* Epoch = 10 Batch_size=16 - -[0] Accuracy: 0.9602 -
[1] Accuracy: 0.9657 -
[2] Accuracy: 0.9741 -
[3] Accuracy: 0.9747 -
[4] Accuracy: 0.9701 -
[5] Accuracy: 0.9731 -
[6] Accuracy: 0.9760 -
[7] Accuracy: 0.9763 -
[8] Accuracy: 0.9760 -
[9] Accuracy: 0.9780 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/105531_82cafce0_8823823.png "10-16.png") - - -* Epoch = 10 Batch_size=128 - -[0] Accuracy: 0.9389 -
[1] Accuracy: 0.9585 -
[2] Accuracy: 0.9679 -
[3] Accuracy: 0.9706 -
[4] Accuracy: 0.9746 -
[5] Accuracy: 0.9760 -
[6] Accuracy: 0.9769 -
[7] Accuracy: 0.9777 -
[8] Accuracy: 0.9781 -
[9] Accuracy: 0.9781 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") - - - -*探究发现* -1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 -2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 - - - **3.Momentum 优化函数下的对比试验** - - -``` - # 利用momentum优化下的optimize函数 - def optimize(self, learning_rate): - - # 初始化V值 - v1=0 - v2=0 - v3=0 - mu=0.9 - - # momentum下的更新算法 - v1 = mu * v1 - learning_rate * self.W1_grad - self.W1 = self.W1 + v1 - - v2 = mu * v2 - learning_rate * self.W2_grad - self.W2 = self.W2 + v2 - - v3 = mu * v3 - learning_rate * self.W3_grad - self.W3 = self.W3 + v3 - - - #self.W1 -= learning_rate * self.W1_grad - # self.W2 -= learning_rate * self.W2_grad - #self.W3 -= learning_rate * self.W3_grad -``` - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") - -1. 在我们的测试数据下,momentum与梯度下降模型准确率差异不大 -2. momentum模型主要用来解决全局最优与局部最优之间的差异,但在本测试集下不存在全局与局部的差异 -3. 理论上来说,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域 \ No newline at end of file -- Gitee From 9cb49c85bc07a789ad43b8a390cec684f2383dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:22:53 +0800 Subject: [PATCH 070/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/numpy=5Ffnn.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/numpy_fnn.py | 249 -------------------------------------- 1 file changed, 249 deletions(-) delete mode 100644 assignment-2/numpy_fnn.py diff --git a/assignment-2/numpy_fnn.py b/assignment-2/numpy_fnn.py deleted file mode 100644 index 7f48bcd..0000000 --- a/assignment-2/numpy_fnn.py +++ /dev/null @@ -1,249 +0,0 @@ -import numpy as np - - -class NumpyOp: - - def __init__(self): - self.memory = {} - self.epsilon = 1e-12 - - -class Matmul(NumpyOp): - - def forward(self, x, W): - """ - x: shape(N, d) - w: shape(d, d') - """ - self.memory['x'] = x - self.memory['W'] = W - h = np.matmul(x, W) - return h - - def backward(self, grad_y): - """ - grad_y: shape(N, d') - """ - - #################### - # code 1 # - x = self.memory['x'] - W = self.memory['W'] - - grad_W = np.matmul(x.T,grad_y) - grad_x = np.matmul(grad_y,W.T) - #################### - - return grad_x, grad_W - - -class Relu(NumpyOp): - - def forward(self, x): - self.memory['x'] = x - return np.where(x > 0, x, np.zeros_like(x)) - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 2 # - x = self.memory['x'] - - grad_x = np.where(x > 0, 1, 0) - - grad_x = grad_x * grad_y - - #################### - - return grad_x - - -class Log(NumpyOp): - - def forward(self, x): - """ - x: shape(N, c) - """ - - out = np.log(x + self.epsilon) - self.memory['x'] = x - - return out - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 3 # - x = self.memory['x'] - - grad_x = (1/(x + self.epsilon)) - - grad_x = grad_x*grad_y - - - #################### - - return grad_x - - -class Softmax(NumpyOp): - """ - softmax over last dimension - """ - - def forward(self, x): - """ - x: shape(N, c) - """ - - #################### - # code 4 # - - out = np.array(x, copy="true") - - - result_list=[] - - for m in range(len(out)): - result_list.append(sum(np.exp(out[m]))) - - for m in range(len(out)): - for n in range(len(out[0])): - out[m][n]= np.exp(out[m][n]) / result_list[m] - - self.memory['x'] = x - - #################### - - return out - - - - def backward(self, grad_y): - - """ - grad_y: same shape as x - """ - - - - #################### - # code 5 # - - x = self.memory['x'] - softx = self.forward(x) - [n, m] = x.shape - out = [] - for i in range(n): - out.append([]) - for j in range(m): - out[i].append(0) - for k in range(m): - if j == k: - out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] - else: - out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] - grad_x = np.array(out) - - - - - #################### - - return grad_x - - -class NumpyLoss: - - def __init__(self): - self.target = None - - def get_loss(self, pred, target): - self.target = target - return (-pred * target).sum(axis=1).mean() - - def backward(self): - return -self.target / self.target.shape[0] - - -class NumpyModel: - def __init__(self): - self.W1 = np.random.normal(size=(28 * 28, 256)) - self.W2 = np.random.normal(size=(256, 64)) - self.W3 = np.random.normal(size=(64, 10)) - - # 以下算子会在 forward 和 backward 中使用 - self.matmul_1 = Matmul() - self.relu_1 = Relu() - self.matmul_2 = Matmul() - self.relu_2 = Relu() - self.matmul_3 = Matmul() - self.softmax = Softmax() - self.log = Log() - - # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) - self.x1_grad, self.W1_grad = None, None - self.relu_1_grad = None - self.x2_grad, self.W2_grad = None, None - self.relu_2_grad = None - self.x3_grad, self.W3_grad = None, None - self.softmax_grad = None - self.log_grad = None - - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - #x = torch.relu(torch.matmul(x, self.W1)) - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass - - def optimize(self, learning_rate): - self.W1 -= learning_rate * self.W1_grad - self.W2 -= learning_rate * self.W2_grad - self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From acbf2200229d4e565447acbf88b4fd69ccd3cea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:23:07 +0800 Subject: [PATCH 071/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/numpy=5Fmnist.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/numpy_mnist.py | 58 ------------------------------------- 1 file changed, 58 deletions(-) delete mode 100644 assignment-2/numpy_mnist.py diff --git a/assignment-2/numpy_mnist.py b/assignment-2/numpy_mnist.py deleted file mode 100644 index 833e5aa..0000000 --- a/assignment-2/numpy_mnist.py +++ /dev/null @@ -1,58 +0,0 @@ -import numpy as np -from numpy_fnn import NumpyModel, NumpyLoss -from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot - -def mini_batch(dataset, batch_size=128, numpy=False): - - data = [] - label = [] - for each in dataset: - data.append(np.array(each[0])) - label.append(each[1]) - - data = np.array(data) - label = np.array(label) - - res = [] - - - for start_idx in range(0, data.shape[0], batch_size): - end_idx = min(start_idx + batch_size, len(data)) - res.append((data[start_idx:end_idx],label[start_idx:end_idx])) - - return res - - -def numpy_run(): - train_dataset, test_dataset = download_mnist() - - model = NumpyModel() - numpy_loss = NumpyLoss() - model.W1, model.W2, model.W3 = get_torch_initialization() - - train_loss = [] - - epoch_number = 3 - learning_rate = 0.1 - - for epoch in range(epoch_number): - for x, y in mini_batch(train_dataset): - y = one_hot(y) - - y_pred = model.forward(x) - loss = numpy_loss.get_loss(y_pred, y) - - model.backward(numpy_loss.backward()) - model.optimize(learning_rate) - - train_loss.append(loss.item()) - - x, y = batch(test_dataset)[0] - accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) - print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) - - plot_curve(train_loss) - - -if __name__ == "__main__": - numpy_run() \ No newline at end of file -- Gitee From 4c08c606bcf6b4920e85efc4207735ffdb22f00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:23:18 +0800 Subject: [PATCH 072/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2018340246016?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/18340246016/.keep diff --git a/assignment-2/submission/18340246016/.keep b/assignment-2/submission/18340246016/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From eba8f7486ce326563afca56f95914c6c4385490f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:25:00 +0800 Subject: [PATCH 073/112] add assignment-2/submission/18340246016/README.md. --- assignment-2/submission/18340246016/README.md | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 assignment-2/submission/18340246016/README.md diff --git a/assignment-2/submission/18340246016/README.md b/assignment-2/submission/18340246016/README.md new file mode 100644 index 0000000..be11b1d --- /dev/null +++ b/assignment-2/submission/18340246016/README.md @@ -0,0 +1,183 @@ +**1. Mini-batch 函数的实现** + +``` +def mini_batch(dataset, batch_size=128, numpy=False): + +# 仿照batch函数分离data与label + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + + res = [] + +# 以batch_size为单位,从[0,len(data)]分割mini-batch + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res +``` + + **2. 模型的训练和测试** + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/113123_f204953a_8823823.png "processon.png") + +``` + # 前向传播过程 + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + + #x = torch.relu(torch.matmul(x, self.W1)) + # 模仿torch的relu(Matmul.(x,w1))操作,下同 + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + # 反向传播过程 + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass +``` + + + + + +| Epoch | Batch_size | +| ---------------- | ------ | +| 3 | 16 | +| 10 | 128 | + + +* Epoch = 3 Batch_size=128 + +[0] Accuracy: 0.9373 +
[1] Accuracy: 0.9583 +
[2] Accuracy: 0.9683 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") + + + +* Epoch = 3 Batch_size=16 + +[0] Accuracy: 0.9640 +
[1] Accuracy: 0.9676 +
[2] Accuracy: 0.9707 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/103502_131ca59f_8823823.png "3-16.png") + +* Epoch = 10 Batch_size=16 + +[0] Accuracy: 0.9602 +
[1] Accuracy: 0.9657 +
[2] Accuracy: 0.9741 +
[3] Accuracy: 0.9747 +
[4] Accuracy: 0.9701 +
[5] Accuracy: 0.9731 +
[6] Accuracy: 0.9760 +
[7] Accuracy: 0.9763 +
[8] Accuracy: 0.9760 +
[9] Accuracy: 0.9780 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/105531_82cafce0_8823823.png "10-16.png") + + +* Epoch = 10 Batch_size=128 + +[0] Accuracy: 0.9389 +
[1] Accuracy: 0.9585 +
[2] Accuracy: 0.9679 +
[3] Accuracy: 0.9706 +
[4] Accuracy: 0.9746 +
[5] Accuracy: 0.9760 +
[6] Accuracy: 0.9769 +
[7] Accuracy: 0.9777 +
[8] Accuracy: 0.9781 +
[9] Accuracy: 0.9781 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") + + + +*探究发现* +1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 +2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 + + + **3.Momentum 优化函数下的对比试验** + + +``` + # 利用momentum优化下的optimize函数 + def optimize(self, learning_rate): + + # 初始化V值 + v1=0 + v2=0 + v3=0 + mu=0.9 + + # momentum下的更新算法 + v1 = mu * v1 - learning_rate * self.W1_grad + self.W1 = self.W1 + v1 + + v2 = mu * v2 - learning_rate * self.W2_grad + self.W2 = self.W2 + v2 + + v3 = mu * v3 - learning_rate * self.W3_grad + self.W3 = self.W3 + v3 + + + #self.W1 -= learning_rate * self.W1_grad + # self.W2 -= learning_rate * self.W2_grad + #self.W3 -= learning_rate * self.W3_grad +``` + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") + +1. 在我们的测试数据下,momentum与梯度下降模型准确率差异不大 +2. momentum模型主要用来解决全局最优与局部最优之间的差异,但在本测试集下不存在全局与局部的差异 +3. 理论上来说,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域 \ No newline at end of file -- Gitee From b302284b2cf17d7a85c049e032b02d3da57dad0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:25:30 +0800 Subject: [PATCH 074/112] add assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py. --- .../assignment-2/submission/numpy_fnn.py | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py diff --git a/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py b/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py new file mode 100644 index 0000000..7f48bcd --- /dev/null +++ b/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py @@ -0,0 +1,249 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + + #################### + # code 1 # + x = self.memory['x'] + W = self.memory['W'] + + grad_W = np.matmul(x.T,grad_y) + grad_x = np.matmul(grad_y,W.T) + #################### + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 2 # + x = self.memory['x'] + + grad_x = np.where(x > 0, 1, 0) + + grad_x = grad_x * grad_y + + #################### + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 3 # + x = self.memory['x'] + + grad_x = (1/(x + self.epsilon)) + + grad_x = grad_x*grad_y + + + #################### + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + + #################### + # code 4 # + + out = np.array(x, copy="true") + + + result_list=[] + + for m in range(len(out)): + result_list.append(sum(np.exp(out[m]))) + + for m in range(len(out)): + for n in range(len(out[0])): + out[m][n]= np.exp(out[m][n]) / result_list[m] + + self.memory['x'] = x + + #################### + + return out + + + + def backward(self, grad_y): + + """ + grad_y: same shape as x + """ + + + + #################### + # code 5 # + + x = self.memory['x'] + softx = self.forward(x) + [n, m] = x.shape + out = [] + for i in range(n): + out.append([]) + for j in range(m): + out[i].append(0) + for k in range(m): + if j == k: + out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] + else: + out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] + grad_x = np.array(out) + + + + + #################### + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + #x = torch.relu(torch.matmul(x, self.W1)) + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 8a602e23c34830acabd2c7d4a661dbb143a7cf2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:25:55 +0800 Subject: [PATCH 075/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/18340246016/assignment-2/submission?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment-2/submission/numpy_fnn.py | 249 ------------------ 1 file changed, 249 deletions(-) delete mode 100644 assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py diff --git a/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py b/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py deleted file mode 100644 index 7f48bcd..0000000 --- a/assignment-2/submission/18340246016/assignment-2/submission/numpy_fnn.py +++ /dev/null @@ -1,249 +0,0 @@ -import numpy as np - - -class NumpyOp: - - def __init__(self): - self.memory = {} - self.epsilon = 1e-12 - - -class Matmul(NumpyOp): - - def forward(self, x, W): - """ - x: shape(N, d) - w: shape(d, d') - """ - self.memory['x'] = x - self.memory['W'] = W - h = np.matmul(x, W) - return h - - def backward(self, grad_y): - """ - grad_y: shape(N, d') - """ - - #################### - # code 1 # - x = self.memory['x'] - W = self.memory['W'] - - grad_W = np.matmul(x.T,grad_y) - grad_x = np.matmul(grad_y,W.T) - #################### - - return grad_x, grad_W - - -class Relu(NumpyOp): - - def forward(self, x): - self.memory['x'] = x - return np.where(x > 0, x, np.zeros_like(x)) - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 2 # - x = self.memory['x'] - - grad_x = np.where(x > 0, 1, 0) - - grad_x = grad_x * grad_y - - #################### - - return grad_x - - -class Log(NumpyOp): - - def forward(self, x): - """ - x: shape(N, c) - """ - - out = np.log(x + self.epsilon) - self.memory['x'] = x - - return out - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 3 # - x = self.memory['x'] - - grad_x = (1/(x + self.epsilon)) - - grad_x = grad_x*grad_y - - - #################### - - return grad_x - - -class Softmax(NumpyOp): - """ - softmax over last dimension - """ - - def forward(self, x): - """ - x: shape(N, c) - """ - - #################### - # code 4 # - - out = np.array(x, copy="true") - - - result_list=[] - - for m in range(len(out)): - result_list.append(sum(np.exp(out[m]))) - - for m in range(len(out)): - for n in range(len(out[0])): - out[m][n]= np.exp(out[m][n]) / result_list[m] - - self.memory['x'] = x - - #################### - - return out - - - - def backward(self, grad_y): - - """ - grad_y: same shape as x - """ - - - - #################### - # code 5 # - - x = self.memory['x'] - softx = self.forward(x) - [n, m] = x.shape - out = [] - for i in range(n): - out.append([]) - for j in range(m): - out[i].append(0) - for k in range(m): - if j == k: - out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] - else: - out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] - grad_x = np.array(out) - - - - - #################### - - return grad_x - - -class NumpyLoss: - - def __init__(self): - self.target = None - - def get_loss(self, pred, target): - self.target = target - return (-pred * target).sum(axis=1).mean() - - def backward(self): - return -self.target / self.target.shape[0] - - -class NumpyModel: - def __init__(self): - self.W1 = np.random.normal(size=(28 * 28, 256)) - self.W2 = np.random.normal(size=(256, 64)) - self.W3 = np.random.normal(size=(64, 10)) - - # 以下算子会在 forward 和 backward 中使用 - self.matmul_1 = Matmul() - self.relu_1 = Relu() - self.matmul_2 = Matmul() - self.relu_2 = Relu() - self.matmul_3 = Matmul() - self.softmax = Softmax() - self.log = Log() - - # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) - self.x1_grad, self.W1_grad = None, None - self.relu_1_grad = None - self.x2_grad, self.W2_grad = None, None - self.relu_2_grad = None - self.x3_grad, self.W3_grad = None, None - self.softmax_grad = None - self.log_grad = None - - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - #x = torch.relu(torch.matmul(x, self.W1)) - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass - - def optimize(self, learning_rate): - self.W1 -= learning_rate * self.W1_grad - self.W2 -= learning_rate * self.W2_grad - self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 126872f63e45f7b5762f6902d8b9cd3496daaef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:26:01 +0800 Subject: [PATCH 076/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/18340246016/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-2/submission/18340246016/.keep diff --git a/assignment-2/submission/18340246016/.keep b/assignment-2/submission/18340246016/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 264545a4b530857590fb9539428b57c50b6949a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:26:18 +0800 Subject: [PATCH 077/112] add assignment-2/submission/18340246016/numpy_mnist.py. --- .../submission/18340246016/numpy_mnist.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 assignment-2/submission/18340246016/numpy_mnist.py diff --git a/assignment-2/submission/18340246016/numpy_mnist.py b/assignment-2/submission/18340246016/numpy_mnist.py new file mode 100644 index 0000000..833e5aa --- /dev/null +++ b/assignment-2/submission/18340246016/numpy_mnist.py @@ -0,0 +1,58 @@ +import numpy as np +from numpy_fnn import NumpyModel, NumpyLoss +from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot + +def mini_batch(dataset, batch_size=128, numpy=False): + + data = [] + label = [] + for each in dataset: + data.append(np.array(each[0])) + label.append(each[1]) + + data = np.array(data) + label = np.array(label) + + res = [] + + + for start_idx in range(0, data.shape[0], batch_size): + end_idx = min(start_idx + batch_size, len(data)) + res.append((data[start_idx:end_idx],label[start_idx:end_idx])) + + return res + + +def numpy_run(): + train_dataset, test_dataset = download_mnist() + + model = NumpyModel() + numpy_loss = NumpyLoss() + model.W1, model.W2, model.W3 = get_torch_initialization() + + train_loss = [] + + epoch_number = 3 + learning_rate = 0.1 + + for epoch in range(epoch_number): + for x, y in mini_batch(train_dataset): + y = one_hot(y) + + y_pred = model.forward(x) + loss = numpy_loss.get_loss(y_pred, y) + + model.backward(numpy_loss.backward()) + model.optimize(learning_rate) + + train_loss.append(loss.item()) + + x, y = batch(test_dataset)[0] + accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) + print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) + + plot_curve(train_loss) + + +if __name__ == "__main__": + numpy_run() \ No newline at end of file -- Gitee From 0dbb52ed31d3b95a5918474aad2d9e3105bd1743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:26:44 +0800 Subject: [PATCH 078/112] add assignment-2/submission/18340246016/numpy_fnn.py. --- .../submission/18340246016/numpy_fnn.py | 249 ++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 assignment-2/submission/18340246016/numpy_fnn.py diff --git a/assignment-2/submission/18340246016/numpy_fnn.py b/assignment-2/submission/18340246016/numpy_fnn.py new file mode 100644 index 0000000..7f48bcd --- /dev/null +++ b/assignment-2/submission/18340246016/numpy_fnn.py @@ -0,0 +1,249 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + + #################### + # code 1 # + x = self.memory['x'] + W = self.memory['W'] + + grad_W = np.matmul(x.T,grad_y) + grad_x = np.matmul(grad_y,W.T) + #################### + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 2 # + x = self.memory['x'] + + grad_x = np.where(x > 0, 1, 0) + + grad_x = grad_x * grad_y + + #################### + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + #################### + # code 3 # + x = self.memory['x'] + + grad_x = (1/(x + self.epsilon)) + + grad_x = grad_x*grad_y + + + #################### + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + + #################### + # code 4 # + + out = np.array(x, copy="true") + + + result_list=[] + + for m in range(len(out)): + result_list.append(sum(np.exp(out[m]))) + + for m in range(len(out)): + for n in range(len(out[0])): + out[m][n]= np.exp(out[m][n]) / result_list[m] + + self.memory['x'] = x + + #################### + + return out + + + + def backward(self, grad_y): + + """ + grad_y: same shape as x + """ + + + + #################### + # code 5 # + + x = self.memory['x'] + softx = self.forward(x) + [n, m] = x.shape + out = [] + for i in range(n): + out.append([]) + for j in range(m): + out[i].append(0) + for k in range(m): + if j == k: + out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] + else: + out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] + grad_x = np.array(out) + + + + + #################### + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + #################### + # code 6 # + #x = torch.relu(torch.matmul(x, self.W1)) + x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) + + #x = torch.relu(torch.matmul(x, self.W2)) + x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) + + #x = torch.matmul(x, self.W3) + #x = torch.softmax(x, 1) + x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) + + #x = torch.log(x) + x = self.log.forward(x) + + #################### + + return x + + def backward(self, y): + + #################### + # code 7 # + + self.log_grad = self.log.backward(y) + + self.softmax_grad = self.softmax.backward(self.log_grad) + + self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) + + self.relu_2_grad = self.relu_2.backward(self.x3_grad) + + self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) + + self.relu_1_grad = self.relu_1.backward(self.x2_grad) + + self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) + + + + #################### + + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From ef4e29e453691647681aa3d4077982661733d508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:26:55 +0800 Subject: [PATCH 079/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/README.md | 183 ------------------------------ 1 file changed, 183 deletions(-) delete mode 100644 assignment-2/submission/README.md diff --git a/assignment-2/submission/README.md b/assignment-2/submission/README.md deleted file mode 100644 index 827aa9f..0000000 --- a/assignment-2/submission/README.md +++ /dev/null @@ -1,183 +0,0 @@ -**1. Mini-batch 函数的实现** - -``` -def mini_batch(dataset, batch_size=128, numpy=False): - -# 仿照batch函数分离data与label - data = [] - label = [] - for each in dataset: - data.append(np.array(each[0])) - label.append(each[1]) - - data = np.array(data) - label = np.array(label) - - - res = [] - -# 以batch_size为单位,从[0,len(data)]分割mini-batch - for start_idx in range(0, data.shape[0], batch_size): - end_idx = min(start_idx + batch_size, len(data)) - res.append((data[start_idx:end_idx],label[start_idx:end_idx])) - - return res -``` - - **2. 模型的训练和测试** - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/113123_f204953a_8823823.png "processon.png") - -``` - # 前向传播过程 - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - - #x = torch.relu(torch.matmul(x, self.W1)) - # 模仿torch的relu(Matmul.(x,w1))操作,下同 - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - # 反向传播过程 - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass -``` - - - - - -| Epoch | Batch_size | -| ---------------- | ------ | -| 3 | 16 | -| 10 | 128 | - - -* Epoch = 3 Batch_size=128 - -[0] Accuracy: 0.9373 -
[1] Accuracy: 0.9583 -
[2] Accuracy: 0.9683 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/102618_2f8a1661_8823823.png "3-128.png") - - - -* Epoch = 3 Batch_size=16 - -[0] Accuracy: 0.9640 -
[1] Accuracy: 0.9676 -
[2] Accuracy: 0.9707 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/103502_131ca59f_8823823.png "3-16.png") - -* Epoch = 10 Batch_size=16 - -[0] Accuracy: 0.9602 -
[1] Accuracy: 0.9657 -
[2] Accuracy: 0.9741 -
[3] Accuracy: 0.9747 -
[4] Accuracy: 0.9701 -
[5] Accuracy: 0.9731 -
[6] Accuracy: 0.9760 -
[7] Accuracy: 0.9763 -
[8] Accuracy: 0.9760 -
[9] Accuracy: 0.9780 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/105531_82cafce0_8823823.png "10-16.png") - - -* Epoch = 10 Batch_size=128 - -[0] Accuracy: 0.9389 -
[1] Accuracy: 0.9585 -
[2] Accuracy: 0.9679 -
[3] Accuracy: 0.9706 -
[4] Accuracy: 0.9746 -
[5] Accuracy: 0.9760 -
[6] Accuracy: 0.9769 -
[7] Accuracy: 0.9777 -
[8] Accuracy: 0.9781 -
[9] Accuracy: 0.9781 - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/111052_ddb4ecda_8823823.png "10-128.png") - - - -*探究发现* -1. mini-batch size太小的情况下,模型的波动率非常高,并不是对batch_size越细分模型的准确率就越高 -2. 从epoch的数量上来看,epoch的数量与模型accuracy有正相关性 - - - **3.Momentum 优化函数下的对比试验** - - -``` - # 利用momentum优化下的optimize函数 - def optimize(self, learning_rate): - - # 初始化V值 - v1=0 - v2=0 - v3=0 - mu=0.9 - - # momentum下的更新算法 - v1 = mu * v1 - learning_rate * self.W1_grad - self.W1 = self.W1 + v1 - - v2 = mu * v2 - learning_rate * self.W2_grad - self.W2 = self.W2 + v2 - - v3 = mu * v3 - learning_rate * self.W3_grad - self.W3 = self.W3 + v3 - - - #self.W1 -= learning_rate * self.W1_grad - # self.W2 -= learning_rate * self.W2_grad - #self.W3 -= learning_rate * self.W3_grad -``` - -![输入图片说明](https://images.gitee.com/uploads/images/2021/0430/115301_1fa39f2b_8823823.png "屏幕截图.png") - -1. 在我们的测试数据下,momentum与梯度下降模型准确率差异不大 -2. momentum模型主要用来解决全局最优与局部最优之间的差异,但在本测试集下不存在全局与局部的差异 -3. 理论上来说,当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域 \ No newline at end of file -- Gitee From 7c63abea7400a9d3414b647fec383c3acc354f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:27:01 +0800 Subject: [PATCH 080/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/numpy=5Ffnn.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/numpy_fnn.py | 249 --------------------------- 1 file changed, 249 deletions(-) delete mode 100644 assignment-2/submission/numpy_fnn.py diff --git a/assignment-2/submission/numpy_fnn.py b/assignment-2/submission/numpy_fnn.py deleted file mode 100644 index 7f48bcd..0000000 --- a/assignment-2/submission/numpy_fnn.py +++ /dev/null @@ -1,249 +0,0 @@ -import numpy as np - - -class NumpyOp: - - def __init__(self): - self.memory = {} - self.epsilon = 1e-12 - - -class Matmul(NumpyOp): - - def forward(self, x, W): - """ - x: shape(N, d) - w: shape(d, d') - """ - self.memory['x'] = x - self.memory['W'] = W - h = np.matmul(x, W) - return h - - def backward(self, grad_y): - """ - grad_y: shape(N, d') - """ - - #################### - # code 1 # - x = self.memory['x'] - W = self.memory['W'] - - grad_W = np.matmul(x.T,grad_y) - grad_x = np.matmul(grad_y,W.T) - #################### - - return grad_x, grad_W - - -class Relu(NumpyOp): - - def forward(self, x): - self.memory['x'] = x - return np.where(x > 0, x, np.zeros_like(x)) - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 2 # - x = self.memory['x'] - - grad_x = np.where(x > 0, 1, 0) - - grad_x = grad_x * grad_y - - #################### - - return grad_x - - -class Log(NumpyOp): - - def forward(self, x): - """ - x: shape(N, c) - """ - - out = np.log(x + self.epsilon) - self.memory['x'] = x - - return out - - def backward(self, grad_y): - """ - grad_y: same shape as x - """ - - #################### - # code 3 # - x = self.memory['x'] - - grad_x = (1/(x + self.epsilon)) - - grad_x = grad_x*grad_y - - - #################### - - return grad_x - - -class Softmax(NumpyOp): - """ - softmax over last dimension - """ - - def forward(self, x): - """ - x: shape(N, c) - """ - - #################### - # code 4 # - - out = np.array(x, copy="true") - - - result_list=[] - - for m in range(len(out)): - result_list.append(sum(np.exp(out[m]))) - - for m in range(len(out)): - for n in range(len(out[0])): - out[m][n]= np.exp(out[m][n]) / result_list[m] - - self.memory['x'] = x - - #################### - - return out - - - - def backward(self, grad_y): - - """ - grad_y: same shape as x - """ - - - - #################### - # code 5 # - - x = self.memory['x'] - softx = self.forward(x) - [n, m] = x.shape - out = [] - for i in range(n): - out.append([]) - for j in range(m): - out[i].append(0) - for k in range(m): - if j == k: - out[i][j] += (1 - softx[i][k]) * softx[i][k] * grad_y[i][k] - else: - out[i][j] += -softx[i][j] * softx[i][k] * grad_y[i][k] - grad_x = np.array(out) - - - - - #################### - - return grad_x - - -class NumpyLoss: - - def __init__(self): - self.target = None - - def get_loss(self, pred, target): - self.target = target - return (-pred * target).sum(axis=1).mean() - - def backward(self): - return -self.target / self.target.shape[0] - - -class NumpyModel: - def __init__(self): - self.W1 = np.random.normal(size=(28 * 28, 256)) - self.W2 = np.random.normal(size=(256, 64)) - self.W3 = np.random.normal(size=(64, 10)) - - # 以下算子会在 forward 和 backward 中使用 - self.matmul_1 = Matmul() - self.relu_1 = Relu() - self.matmul_2 = Matmul() - self.relu_2 = Relu() - self.matmul_3 = Matmul() - self.softmax = Softmax() - self.log = Log() - - # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) - self.x1_grad, self.W1_grad = None, None - self.relu_1_grad = None - self.x2_grad, self.W2_grad = None, None - self.relu_2_grad = None - self.x3_grad, self.W3_grad = None, None - self.softmax_grad = None - self.log_grad = None - - def forward(self, x): - x = x.reshape(-1, 28 * 28) - - #################### - # code 6 # - #x = torch.relu(torch.matmul(x, self.W1)) - x = self.relu_1.forward(self.matmul_1.forward(x,self.W1)) - - #x = torch.relu(torch.matmul(x, self.W2)) - x = self.relu_2.forward(self.matmul_2.forward(x,self.W2)) - - #x = torch.matmul(x, self.W3) - #x = torch.softmax(x, 1) - x = self.softmax.forward(self.matmul_3.forward(x,self.W3)) - - #x = torch.log(x) - x = self.log.forward(x) - - #################### - - return x - - def backward(self, y): - - #################### - # code 7 # - - self.log_grad = self.log.backward(y) - - self.softmax_grad = self.softmax.backward(self.log_grad) - - self.x3_grad, self.W3_grad = self.matmul_3.backward(self.softmax_grad) - - self.relu_2_grad = self.relu_2.backward(self.x3_grad) - - self.x2_grad, self.W2_grad = self.matmul_2.backward(self.relu_2_grad) - - self.relu_1_grad = self.relu_1.backward(self.x2_grad) - - self.x1_grad, self.W1_grad = self.matmul_1.backward(self.relu_1_grad) - - - - #################### - - pass - - def optimize(self, learning_rate): - self.W1 -= learning_rate * self.W1_grad - self.W2 -= learning_rate * self.W2_grad - self.W3 -= learning_rate * self.W3_grad \ No newline at end of file -- Gitee From 2bb30db8c563d399d70196dfa9484349a30248f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:27:07 +0800 Subject: [PATCH 081/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/numpy=5Fmnist.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/numpy_mnist.py | 58 -------------------------- 1 file changed, 58 deletions(-) delete mode 100644 assignment-2/submission/numpy_mnist.py diff --git a/assignment-2/submission/numpy_mnist.py b/assignment-2/submission/numpy_mnist.py deleted file mode 100644 index 833e5aa..0000000 --- a/assignment-2/submission/numpy_mnist.py +++ /dev/null @@ -1,58 +0,0 @@ -import numpy as np -from numpy_fnn import NumpyModel, NumpyLoss -from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot - -def mini_batch(dataset, batch_size=128, numpy=False): - - data = [] - label = [] - for each in dataset: - data.append(np.array(each[0])) - label.append(each[1]) - - data = np.array(data) - label = np.array(label) - - res = [] - - - for start_idx in range(0, data.shape[0], batch_size): - end_idx = min(start_idx + batch_size, len(data)) - res.append((data[start_idx:end_idx],label[start_idx:end_idx])) - - return res - - -def numpy_run(): - train_dataset, test_dataset = download_mnist() - - model = NumpyModel() - numpy_loss = NumpyLoss() - model.W1, model.W2, model.W3 = get_torch_initialization() - - train_loss = [] - - epoch_number = 3 - learning_rate = 0.1 - - for epoch in range(epoch_number): - for x, y in mini_batch(train_dataset): - y = one_hot(y) - - y_pred = model.forward(x) - loss = numpy_loss.get_loss(y_pred, y) - - model.backward(numpy_loss.backward()) - model.optimize(learning_rate) - - train_loss.append(loss.item()) - - x, y = batch(test_dataset)[0] - accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) - print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) - - plot_curve(train_loss) - - -if __name__ == "__main__": - numpy_run() \ No newline at end of file -- Gitee From 4cc5d1548a24d00aaae7731be6d7dbada0bdbe56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:27:37 +0800 Subject: [PATCH 082/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/18340246016/img/.keep diff --git a/assignment-2/submission/18340246016/img/.keep b/assignment-2/submission/18340246016/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From c57f0a7828175f549b47b5e2967e1504aaf2b8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Sun, 2 May 2021 09:28:17 +0800 Subject: [PATCH 083/112] upload img --- .../submission/18340246016/img/10-128.png | Bin 0 -> 12376 bytes .../submission/18340246016/img/10-16.png | Bin 0 -> 12200 bytes .../submission/18340246016/img/3-128.png | Bin 0 -> 15189 bytes .../submission/18340246016/img/3-16.png | Bin 0 -> 12056 bytes .../submission/18340246016/img/momentum.png | Bin 0 -> 20051 bytes .../submission/18340246016/img/processon.png | Bin 0 -> 15211 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/18340246016/img/10-128.png create mode 100644 assignment-2/submission/18340246016/img/10-16.png create mode 100644 assignment-2/submission/18340246016/img/3-128.png create mode 100644 assignment-2/submission/18340246016/img/3-16.png create mode 100644 assignment-2/submission/18340246016/img/momentum.png create mode 100644 assignment-2/submission/18340246016/img/processon.png diff --git a/assignment-2/submission/18340246016/img/10-128.png b/assignment-2/submission/18340246016/img/10-128.png new file mode 100644 index 0000000000000000000000000000000000000000..62352ed1838be0f2b7ded908e7cf94416690e663 GIT binary patch literal 12376 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 pf-+J#0Ohg}MR_&3Y8kW8{|zOYF`fVb literal 0 HcmV?d00001 diff --git a/assignment-2/submission/18340246016/img/3-16.png b/assignment-2/submission/18340246016/img/3-16.png new file mode 100644 index 0000000000000000000000000000000000000000..e85d4d2d4c3cc2d62bcfd80dd2199c0ff26dcc85 GIT binary patch literal 12056 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 literal 0 HcmV?d00001 diff --git a/assignment-2/submission/18340246016/img/momentum.png b/assignment-2/submission/18340246016/img/momentum.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f3afdf95cb49bd4f84f7c2bfb68fdbd13ddde3 GIT binary patch literal 20051 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 literal 0 HcmV?d00001 diff --git a/assignment-2/submission/18340246016/img/processon.png b/assignment-2/submission/18340246016/img/processon.png new file mode 100644 index 0000000000000000000000000000000000000000..0b41c289c3621142bc38c400ba1a566f6945f523 GIT binary patch literal 15211 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 Date: Sun, 2 May 2021 09:28:31 +0800 Subject: [PATCH 084/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?assignment-2/submission/18340246016/img/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-2/submission/18340246016/img/.keep diff --git a/assignment-2/submission/18340246016/img/.keep b/assignment-2/submission/18340246016/img/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 3b3b1bfa0dbe16b570b32cc6311429597c9969f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:00:11 +0800 Subject: [PATCH 085/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=20assignment-3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/.keep diff --git a/ assignment-3/.keep b/ assignment-3/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 137c87f62f2500a7df2d6bd33222c143fee4a488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:00:35 +0800 Subject: [PATCH 086/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20submission?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/.keep diff --git a/ assignment-3/submission/.keep b/ assignment-3/submission/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 3147926bd10e228b361e5130e46fa65e1dfae6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:01:07 +0800 Subject: [PATCH 087/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2018340246016?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/.keep diff --git a/ assignment-3/submission/18340246016/.keep b/ assignment-3/submission/18340246016/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From daf49128ea8835e4c4b7afdd192740fc03695197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:02:15 +0800 Subject: [PATCH 088/112] add assignment-3/submission/18340246016. --- assignment-3/submission/18340246016/source.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/source.py diff --git a/ assignment-3/submission/18340246016/source.py b/ assignment-3/submission/18340246016/source.py new file mode 100644 index 0000000..e69de29 -- Gitee From b6314f7d5344ef00f187c946d76d410161f230cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:16:21 +0800 Subject: [PATCH 089/112] first push --- .../submission/18340246016/source.py | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/ assignment-3/submission/18340246016/source.py b/ assignment-3/submission/18340246016/source.py index e69de29..2410c0f 100644 --- a/ assignment-3/submission/18340246016/source.py +++ b/ assignment-3/submission/18340246016/source.py @@ -0,0 +1,183 @@ +import numpy as np + +class KMeans: + + def initCentroids(self,dataSet,k): + centers = dataSet[:k] + return centers + + def cluster_classifier(self,centroids,dataSet): + distances = np.sqrt(((dataSet - centroids[:, np.newaxis])**2).sum(axis=2)) + return np.argmin(distances, axis=0) + + def __init__(self, n_clusters): + self.n_clusters = n_clusters + + def fit(self, train_data): + Centroids = self.initCentroids(train_data,self.n_clusters) + temp_label = self.cluster_classifier(Centroids,train_data) + while(True): + for i in range(self.n_clusters): + Centroids[i] = np.mean(train_data[temp_label==i]) + updated_label = self.cluster_classifier(Centroids,train_data) + if (updated_label.all() == temp_label.all()): + self.Centroids=Centroids + return Centroids,updated_label + break + else: + temp_label=updated_label + + def predict(self, test_data): + return self.cluster_classifier(self.Centroids,test_data) + + + +class GaussianMixture: + + def normal(self,raw_data): + norm = np.linalg.norm(raw_data) + normal_array = raw_data/norm + return normal_array + + + def ini_para(self,n_clusters,train_data): + self.epsilon = 1e-12 + dim = train_data.shape[1] + mu=[] + var=[] + ones=[1] + + for i in range(n_clusters): + mu.append(np.random.normal(0, 1, size=(dim,))) + var.append(ones*dim) + Pi = [1 / n_clusters] * n_clusters + W = np.ones((len(train_data), n_clusters)) / n_clusters + Pi = W.sum(axis=0) / W.sum() + self.dim = dim + + + return np.array(mu),np.array(var),W,Pi + + def __init__(self, n_clusters): + self.n_clusters = n_clusters + + def multivariate_normal(self,x, mu, cov): + part1 = 1 / ( ((2* np.pi)**(len(mu)/2)) * (np.linalg.det(cov)**(1/2)) ) + part2 = (-1/2) * ((x-mu).T.dot(np.linalg.inv(cov))).dot((x-mu)) + return float(part1 * np.exp(part2)) + + def update_W(self,X, Mu, Var, Pi): + + n_points, n_clusters = len(X), len(Pi) + pdfs = np.zeros(((n_points, n_clusters))) + for m in range(n_points): + for i in range(n_clusters): + pdfs[m, i] = Pi[i] * self.multivariate_normal(X[m], Mu[i], (np.diag(Var[i]))) + W = pdfs / pdfs.sum(axis=1).reshape(-1, 1) + return W + + + def update_Pi(self,W): + Pi = W.sum(axis=0) / W.sum() + return Pi + + def update_Mu(self,X, W): + n_clusters = W.shape[1] + Mu = np.zeros((n_clusters, self.dim)) + for i in range(n_clusters): + Mu[i] = np.average(X, axis=0, weights=W[:, i]) + return Mu + + def update_Var(self,X, Mu, W): + n_clusters = W.shape[1] + Var = np.zeros((n_clusters, self.dim)) + for i in range(n_clusters): + Var[i] = np.average((X - Mu[i]) ** 2, axis=0, weights=W[:, i])+self.epsilon + return Var + + + def fit(self, train_data): + train_data = self.normal(train_data) + n_clusters = self.n_clusters + Mu,Var,W,Pi = self.ini_para(n_clusters,train_data) + n_points = len(train_data) + X=train_data + + Mu_init=Mu + Var_init=Var + i=0 + + for i in range(10): + i=i+1 + W = self.update_W(X, Mu, Var, Pi) + Pi = self.update_Pi(W) + Mu = self.update_Mu(X, W) + Var = self.update_Var(X, Mu, W) + + if (Mu_init.all()==Mu.all)and(Var_init.all()==Var.all()): + break + else: + Mu_init=Mu + Var_init=Var + + self.Pi =Pi + self.W=W + self.Mu=Mu + self.Var=Var + + + def predict(self, test_data): + test_data = self.normal(test_data) + prob= self.update_W(test_data, self.Mu, self.Var, self.Pi) + return np.argmax(prob,axis=1) + +class ClusteringAlgorithm: + + def normal(self,raw_data): + norm = np.linalg.norm(raw_data) + normal_array = raw_data/norm + return normal_array + + def __init__(self): + pass + + def length_cal(self,Centroids,points): + total=0 + for point in points: + weight_array = (point-Centroids)**2 + weight_array_sum = np.sum(weight_array) + total = total + weight_array_sum**(0.5) + + return total + + def fit(self, train_data): + train_data=self.normal(train_data) + numpoint = len(train_data) + dist_list =[] + + upper_bound = min([len(train_data)+1,20]) + + for cluster in range(1,upper_bound): + KMean = KMeans(cluster) + Centroids,label = KMean.fit(train_data) + temp_length=0 + for n in range(cluster): + temp_length = temp_length+self.length_cal(Centroids[n],train_data[label==n]) + dist_list.append(temp_length) + + + percent_change=[] + for i in range(len(dist_list)-1): + percent_change.append((dist_list[i]-dist_list[i+1])/dist_list[i]*100) + for i in range(len(percent_change)): + if (percent_change[i]<5): + self.optimal = i+1 + print(i+1) + return dist_list,percent_change + break + + def predict(self, test_data): + test_data = self.normal(test_data) + KMean_ready = KMeans(self.optimal) + KMean_ready.fit(test_data) + return KMean_ready.predict(test_data) \ No newline at end of file -- Gitee From b92bf77f4eb08915e6c4412fb3c5ea21cb939d99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:27:28 +0800 Subject: [PATCH 090/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=20assignment-3/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-3/.keep diff --git a/ assignment-3/.keep b/ assignment-3/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From c4c10995c8b1c792cc1023337cc58eb3f8e26db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:27:42 +0800 Subject: [PATCH 091/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=20assignment-3/submission/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-3/submission/.keep diff --git a/ assignment-3/submission/.keep b/ assignment-3/submission/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 0deba118acf0adbe7411ebe09f1453ccdcd9cb64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:27:53 +0800 Subject: [PATCH 092/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=20assignment-3/submission/18340246016/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/18340246016/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-3/submission/18340246016/.keep diff --git a/ assignment-3/submission/18340246016/.keep b/ assignment-3/submission/18340246016/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From e2a6bc6464b61fa2e8d330de9b08c1f24c96f699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:28:13 +0800 Subject: [PATCH 093/112] add assignment-3/submission/18340246016. --- assignment-3/submission/18340246016/readme.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/readme.md diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md new file mode 100644 index 0000000..e69de29 -- Gitee From 3b452b9d8403a7c6cb0382dc03b553933639ee6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:40:19 +0800 Subject: [PATCH 094/112] 1 st --- .../submission/18340246016/readme.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index e69de29..dfc7acb 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -0,0 +1,37 @@ + **1.基础实验部分** + + _1.1 数据生成_ + + ` +def data_generator(): +# 生成三组multivariate_normal,数据长度为2000 + 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 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 + +` \ No newline at end of file -- Gitee From d00b33424bda86851497abaa462007caa531fa2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:40:53 +0800 Subject: [PATCH 095/112] 1 --- assignment-3/submission/18340246016/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index dfc7acb..5f6430c 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -4,7 +4,7 @@ ` def data_generator(): -# 生成三组multivariate_normal,数据长度为2000 + # 生成三组multivariate_normal,数据长度为2000 mean = (1, 2) cov = np.array([[73, 0], [0, 22]]) x = np.random.multivariate_normal(mean, cov, (800,)) @@ -21,7 +21,7 @@ def data_generator(): return (data, data), 3 def shuffle(*datas): -# 随机打乱算法 + # 随机打乱算法 data = np.concatenate(datas) label = np.concatenate([ np.ones((d.shape[0],), dtype=int)*i -- Gitee From e571dd34ebf74b6691f3021447e3813bb4b618e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:41:36 +0800 Subject: [PATCH 096/112] 1 --- assignment-3/submission/18340246016/readme.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 5f6430c..14cca06 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -2,7 +2,8 @@ _1.1 数据生成_ - ` + +``` def data_generator(): # 生成三组multivariate_normal,数据长度为2000 mean = (1, 2) @@ -34,4 +35,8 @@ def shuffle(*datas): label = label[idx] return data, label -` \ No newline at end of file + +``` + + + -- Gitee From 9772cd65f8e2b43c18349bde84dd239561dad035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:42:54 +0800 Subject: [PATCH 097/112] 1 --- .../submission/18340246016/readme.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 14cca06..22aabdc 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -38,5 +38,42 @@ def shuffle(*datas): ``` +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +4 & 0 \\\\ +0 & 2 +\end{array}\right] +\mu=\left[\begin{array}{ll} +10 & 10 +\end{array}\right] +\end{array} +$$ + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 4 +\end{array}\right] +\mu=\left[\begin{array}{ll} +8 & 8 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +8 & 1 \\\\ +1 & 6 +\end{array}\right] +\mu=\left[\begin{array}{ll} +12 & 12 +\end{array}\right] +\end{array} +$$ + -- Gitee From d38ef4885053c2b7c8a375d6a10e6f23ad835683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 11:55:08 +0800 Subject: [PATCH 098/112] 1 --- assignment-3/submission/18340246016/readme.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 22aabdc..16fa5e6 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -41,11 +41,11 @@ def shuffle(*datas): $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} -4 & 0 \\\\ -0 & 2 +73 & 0 \\\\ +0 & 22 \end{array}\right] \mu=\left[\begin{array}{ll} -10 & 10 +1 & 2 \end{array}\right] \end{array} $$ @@ -54,11 +54,11 @@ $$ $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} -2 & 0 \\\\ -0 & 4 +21.2 & 0 \\\\ +0 & 32.1 \end{array}\right] \mu=\left[\begin{array}{ll} -8 & 8 +16 & -5 \end{array}\right] \end{array} $$ @@ -66,11 +66,11 @@ $$ $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} -8 & 1 \\\\ -1 & 6 +10 & 5 \\\\ +5 & 10 \end{array}\right] \mu=\left[\begin{array}{ll} -12 & 12 +10 & 22 \end{array}\right] \end{array} $$ -- Gitee From 7775d0458edd3a7ef4e86bc9d51928f1df6fef76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:10:24 +0800 Subject: [PATCH 099/112] update --- assignment-3/submission/18340246016/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 16fa5e6..f05ada1 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -76,4 +76,4 @@ $$ $$ - + ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/121015_9b4bba4b_8823823.png "屏幕截图.png") -- Gitee From ab3d4d90b62e516d5bad9be7bc90febb8c92fbe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:12:31 +0800 Subject: [PATCH 100/112] a --- .../submission/18340246016/readme.md | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index f05ada1..aa3a96c 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -1,6 +1,6 @@ **1.基础实验部分** - _1.1 数据生成_ + _1.1 数据生成与可视化_ ``` @@ -35,6 +35,37 @@ def shuffle(*datas): label = label[idx] return data, label +# 展示函数 +def display(x,y): + type1_x = []; type1_y = [] + type2_x = []; type2_y = [] + type3_x = []; type3_y = [] + + plt.figure(figsize=(8,6)) + + for i in range(0,len(x)): + if(y[i]==0): + type1_x.append(x[i][0]) + type1_y.append(x[i][1]) + if(y[i]==1): + type2_x.append(x[i][0]) + type2_y.append(x[i][1]) + if(y[i]==2): + type3_x.append(x[i][0]) + type3_y.append(x[i][1]) + + fig = plt.figure(figsize = (10, 6)) + ax = fig.add_subplot(111) + + type1 = ax.scatter(type1_x, type1_y, s = 30, c = 'brown') + type2 = ax.scatter(type2_x, type2_y, s = 30, c = 'lime') + type3 = ax.scatter(type3_x, type3_y, s = 30, c = "darkviolet") + + + + ax.legend((type1, type2, type3), ("A", "B", "C"), loc = 0) + + plt.show() ``` -- Gitee From 9df59c24ee83a1af0876abb1236c6f51bf685c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:18:34 +0800 Subject: [PATCH 101/112] a --- assignment-3/submission/18340246016/readme.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index aa3a96c..35b7559 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -1,6 +1,6 @@ **1.基础实验部分** - _1.1 数据生成与可视化_ + _1.1 数据生成与可视化实现_ ``` @@ -20,7 +20,9 @@ def data_generator(): data, _ = shuffle(x, y, z) return (data, data), 3 +``` +``` def shuffle(*datas): # 随机打乱算法 data = np.concatenate(datas) @@ -34,7 +36,9 @@ def shuffle(*datas): data = data[idx] label = label[idx] return data, label +``` +``` # 展示函数 def display(x,y): type1_x = []; type1_y = [] @@ -106,5 +110,7 @@ $$ \end{array} $$ + _1.2 样本可视化_ + ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/121015_9b4bba4b_8823823.png "屏幕截图.png") -- Gitee From 4ce0a68dd0753ebf03e1b5086d967a44ff6d73c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:22:16 +0800 Subject: [PATCH 102/112] 1 --- assignment-3/submission/18340246016/readme.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 35b7559..1764e9d 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -110,7 +110,18 @@ $$ \end{array} $$ - _1.2 样本可视化_ + _1.2 样本可视化结果_ ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/121015_9b4bba4b_8823823.png "屏幕截图.png") + + _1.3 K-Means_ + +``` +(train_data, test_data), n_clusters = data_generator() +exp =KMeans(n_clusters) +exp.fit(train_data) +result = exp.predict(test_data) +display(test_data,exp.predict(test_data)) +``` +![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/122208_5966ec9c_8823823.png "屏幕截图.png") -- Gitee From 14719feb654d1b2fd23c04b54bdaab56a289b522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:26:36 +0800 Subject: [PATCH 103/112] 1 --- assignment-3/submission/18340246016/readme.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 1764e9d..1b29187 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -113,8 +113,7 @@ $$ _1.2 样本可视化结果_ - ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/121015_9b4bba4b_8823823.png "屏幕截图.png") - +![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/122623_858b78c2_8823823.png "屏幕截图.png") _1.3 K-Means_ ``` -- Gitee From a19f8f61704c65b5532ed5baa14abd332bd05041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:28:40 +0800 Subject: [PATCH 104/112] a --- assignment-3/submission/18340246016/readme.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 1b29187..88b7e4b 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -114,8 +114,11 @@ $$ ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/122623_858b78c2_8823823.png "屏幕截图.png") + + _1.3 K-Means_ + ``` (train_data, test_data), n_clusters = data_generator() exp =KMeans(n_clusters) -- Gitee From 67d2d2c6f9938a1c4f23220f3c2c42f2093b9582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 12:31:44 +0800 Subject: [PATCH 105/112] a --- assignment-3/submission/18340246016/readme.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 88b7e4b..9413aba 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -116,7 +116,7 @@ $$ ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/122623_858b78c2_8823823.png "屏幕截图.png") - _1.3 K-Means_ + _1.3 K-Means分类结果_ ``` @@ -127,3 +127,17 @@ result = exp.predict(test_data) display(test_data,exp.predict(test_data)) ``` ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/122208_5966ec9c_8823823.png "屏幕截图.png") + + + _1.4 GaussianMixture分类结果_ + + +``` +exp =GaussianMixture(n_clusters) +exp.fit(train_data) +result = exp.predict(test_data) +display(test_data,exp.predict(test_data)) +``` + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/123050_f971e80a_8823823.png "屏幕截图.png") + -- Gitee From 6ff856cdf9003073f846f5e14a47b921f3c9eead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:05:35 +0800 Subject: [PATCH 106/112] a --- .../submission/18340246016/readme.md | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 9413aba..05f635a 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -141,3 +141,85 @@ display(test_data,exp.predict(test_data)) ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/123050_f971e80a_8823823.png "屏幕截图.png") + **2.自动选择聚簇数量(Elbow Method 配合 K-Means 算法)** + + _2.1 fit算法实现_ + + +``` + def fit(self, train_data): + train_data=self.normal(train_data) + numpoint = len(train_data) + dist_list =[] + + upper_bound = min([len(train_data)+1,20]) + + # 遍历(1,upperbound)计算distance + for cluster in range(1,upper_bound): + KMean = KMeans(cluster) + Centroids,label = KMean.fit(train_data) + temp_length=0 + for n in range(cluster): + temp_length = temp_length+self.length_cal(Centroids[n],train_data[label==n]) + dist_list.append(temp_length) + + # 当变化率小于5%,选取最佳K + percent_change=[] + for i in range(len(dist_list)-1): + percent_change.append((dist_list[i]-dist_list[i+1])/dist_list[i]*100) + for i in range(len(percent_change)): + if (percent_change[i]<5): + self.optimal = i+1 + print(i+1) + return dist_list,percent_change + break +``` + + _2.2 数据可视化_ + +原始数据 + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +1 & 0 \\\\ +0 & 1 +\end{array}\right] +\mu=\left[\begin{array}{ll} +2 & 2 +\end{array}\right] +\end{array} +$$ + + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 0 \\\\ +0 & 2 +\end{array}\right] +\mu=\left[\begin{array}{ll} +4 & 6 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +2 & 1 \\\\ +1 & 3 +\end{array}\right] +\mu=\left[\begin{array}{ll} +10 & 10 +\end{array}\right] +\end{array} +$$ + + + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/130337_efd2f52a_8823823.png "屏幕截图.png") + +clustering数据 +![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/130434_98084bb3_8823823.png "屏幕截图.png") + -- Gitee From 2d399503eead729d735069ecfadaa7a33930b205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:12:47 +0800 Subject: [PATCH 107/112] a --- .../submission/18340246016/source.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/ assignment-3/submission/18340246016/source.py b/ assignment-3/submission/18340246016/source.py index 2410c0f..c1fb499 100644 --- a/ assignment-3/submission/18340246016/source.py +++ b/ assignment-3/submission/18340246016/source.py @@ -2,10 +2,12 @@ import numpy as np class KMeans: + # 初始化Centroids def initCentroids(self,dataSet,k): centers = dataSet[:k] return centers + #dataSet分类至不同centroids下 def cluster_classifier(self,centroids,dataSet): distances = np.sqrt(((dataSet - centroids[:, np.newaxis])**2).sum(axis=2)) return np.argmin(distances, axis=0) @@ -14,13 +16,18 @@ class KMeans: self.n_clusters = n_clusters def fit(self, train_data): + + #初试化Centroids以及Centroids Centroids = self.initCentroids(train_data,self.n_clusters) temp_label = self.cluster_classifier(Centroids,train_data) + + #开始自适应fit,直到Centroids不再更新 while(True): for i in range(self.n_clusters): Centroids[i] = np.mean(train_data[temp_label==i]) updated_label = self.cluster_classifier(Centroids,train_data) if (updated_label.all() == temp_label.all()): + # 储存final Centroids self.Centroids=Centroids return Centroids,updated_label break @@ -28,18 +35,20 @@ class KMeans: temp_label=updated_label def predict(self, test_data): + #根据fit更新过的centroids分类testdata return self.cluster_classifier(self.Centroids,test_data) class GaussianMixture: + #正则化 def normal(self,raw_data): norm = np.linalg.norm(raw_data) normal_array = raw_data/norm return normal_array - + #初始化参数 mu,var,Pi,W def ini_para(self,n_clusters,train_data): self.epsilon = 1e-12 dim = train_data.shape[1] @@ -60,14 +69,15 @@ class GaussianMixture: def __init__(self, n_clusters): self.n_clusters = n_clusters - + + # multivariate_normal density function def multivariate_normal(self,x, mu, cov): part1 = 1 / ( ((2* np.pi)**(len(mu)/2)) * (np.linalg.det(cov)**(1/2)) ) part2 = (-1/2) * ((x-mu).T.dot(np.linalg.inv(cov))).dot((x-mu)) return float(part1 * np.exp(part2)) + def update_W(self,X, Mu, Var, Pi): - n_points, n_clusters = len(X), len(Pi) pdfs = np.zeros(((n_points, n_clusters))) for m in range(n_points): @@ -99,6 +109,8 @@ class GaussianMixture: def fit(self, train_data): train_data = self.normal(train_data) n_clusters = self.n_clusters + + Mu,Var,W,Pi = self.ini_para(n_clusters,train_data) n_points = len(train_data) X=train_data @@ -107,6 +119,7 @@ class GaussianMixture: Var_init=Var i=0 + # 10次loop内更新参数 for i in range(10): i=i+1 W = self.update_W(X, Mu, Var, Pi) @@ -157,6 +170,7 @@ class ClusteringAlgorithm: upper_bound = min([len(train_data)+1,20]) + # 遍历(1,upperbound)计算distance for cluster in range(1,upper_bound): KMean = KMeans(cluster) Centroids,label = KMean.fit(train_data) @@ -165,7 +179,7 @@ class ClusteringAlgorithm: temp_length = temp_length+self.length_cal(Centroids[n],train_data[label==n]) dist_list.append(temp_length) - + # 当变化率小于5%,选取最佳K percent_change=[] for i in range(len(dist_list)-1): percent_change.append((dist_list[i]-dist_list[i+1])/dist_list[i]*100) -- Gitee From 6fc520f9758f6a7ebfb5ae8b0471ef0883842e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:13:50 +0800 Subject: [PATCH 108/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/img/.keep diff --git a/ assignment-3/submission/18340246016/img/.keep b/ assignment-3/submission/18340246016/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From af8fb6f398476abc519580b8eb7abc2493f70865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:14:00 +0800 Subject: [PATCH 109/112] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=20assignment-3/submission/18340246016/img/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-3/submission/18340246016/img/.keep diff --git a/ assignment-3/submission/18340246016/img/.keep b/ assignment-3/submission/18340246016/img/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 270bcab70b5ea3ff50f14af7daa36cbbc8107884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:14:20 +0800 Subject: [PATCH 110/112] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-3/submission/18340246016/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/img/.keep diff --git a/ assignment-3/submission/18340246016/img/.keep b/ assignment-3/submission/18340246016/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 814522e4a11c2dd21b07064336640aa4be5fdc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=87=AF=E4=B9=90?= <8823823+y3sm1r@user.noreply.gitee.com> Date: Mon, 14 Jun 2021 13:16:25 +0800 Subject: [PATCH 111/112] 1 --- .../submission/18340246016/img/Cluster_algo.png | Bin 0 -> 46430 bytes .../submission/18340246016/img/GMM_res.png | Bin 0 -> 43340 bytes .../submission/18340246016/img/KMeans_res.png | Bin 0 -> 45432 bytes .../submission/18340246016/img/Vis_data_2.png | Bin 0 -> 59878 bytes .../18340246016/img/visual_data_1.png | Bin 0 -> 55507 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-3/submission/18340246016/img/Cluster_algo.png create mode 100644 assignment-3/submission/18340246016/img/GMM_res.png create mode 100644 assignment-3/submission/18340246016/img/KMeans_res.png create mode 100644 assignment-3/submission/18340246016/img/Vis_data_2.png create mode 100644 assignment-3/submission/18340246016/img/visual_data_1.png diff --git a/ assignment-3/submission/18340246016/img/Cluster_algo.png b/ assignment-3/submission/18340246016/img/Cluster_algo.png new file mode 100644 index 0000000000000000000000000000000000000000..d597d85c9497f59dfaa86a3127b4372f4ec70b4e GIT binary patch literal 46430 zcmZsCby$?&*7gkDBhmsxNl7EpLw8F_g91tq-7$cG(v5UTgLHQ&-CYvW-Cf`4@%Nr{ z-uJtn|G1cE@BOT`*Sgoe?)6zkNg5mD83q6Vz?PMfPz3-GGywph2^tFgFTWn0o&x}s z09gr9bywhCGiDi`v=g1{dHjs+$InM)c$F{TzBlg1t-3LwdP`#bJ+Qe6$>O=cS+-Pk zIhY#@yDOp`Q8G&en;DCCM#%VNeFCy3JgU4NJ5PM9mesj*ODakM;~{G zjD?Pu!)pJn&t%?^kCNupQ|NJG z*=8C4^-$s)X@vgwpE78$@r@>|c+I(>Wic9{&VGVi!$=9By&B2v3A z+6ntO21Q+`rVv8lFS=!`QGpRy1Gn+_s4&d$7~3pF^7xU(qXK_Qw`^tH zxym)ZxM0UdrQR$q^(+rKnWwb2#JB*Ed@BMJArzy8rL>`~cUG#MN`iiT9=U*TO&5L$ zmJ4=rk54hC@VCL&6!lfQ9{n;D5qMXA$Yi*e$*Vf2`TI>G|8a&tn*&J)fV@W`!@{jkFo3=YQ2#D=e31K*|2UVCj&#C;!W$DlIgCD}qX zQ*K>CgD#iP)`)aR+?xl-tGy4cPlkjayDQDR{@Pfh2A9R6s>1Mk^vH)RJIz_HWk%dC zyXria<%}SQ@{l8k5fUmp)M7g7e$^l0U4fth(8SeCbEhah97Grq`Bvf&zWqs7W?Sujtr|`NZ zl=*V;mS@FW`L^A*mo_0lp3O^=_i};g<8;e~lQtLCS0@6aR~c$QkeH1D^O?|5(a&14 z0<0HsZ`g0I2oU;;za~&KG1fU_LM8_OhAP2Qk0oQ||c?^~KWNw9mbf z>&>_iuje|`BUED}jEGa`4NwzV>(#S}59%SYooGbcwLfq0A^0%aWY(JHc`?J+7(3pf z=H;kMV2jcIm%|wPd*$x!m_wN9Hxru{-rEV@+iyC2?jjxwG~dr+Z1go?l);^2)Roy^ zrwU7|&TMIaqI9eM@pwV$H05RdJIt2fAG9YiL8E$B>7s04kyjbiKeFep^yhfL@0tjz z)J(OVa+JZS|Di%2Z+d@^o)wifrk4a`d}3+KZB2O)hcDK*gt;cj`M}g@4!8SAQ&2-t z=u{kX@j=V&f$erqLf3=g-7lg}zReW8!`BzSAkPe`%TZ|x>{7Qu%Z?VW+YXI4`UGJ2 ztxTO}mzS~Bn!TvThP00yN38rZ0#O_Tqmi8W9t7|5;+L?DJAJtIWx)LiM6yM@ zouNfm;V9AD9eK2>-IcaZz0sF9C~Hz?}a7* zi2?A}2jP%oTrTbk?@s??3x_e|s6!c+kKU54k() zTnS+FeEV&&aogCwTMEyZB3VJaU(GS{ah30Eq1ex`JP4uK%;g8+i4SQ5fOW!yf{{A3 zzonfA*#j0jHHlU{vh9ls&WBCjE?&0S4nr;_bPip+1v-+K?lzwNeAD!cU}e$cFw9gs z0*pQEK2>RPzBmYvwH_KdP5%+|jdFdVi(W2u>jU5Ldfd+1SU#i@s0hXHzC^`Q=M>{! zIE*cNRdzE~+oG|(QDk^;arHU<>hlhmM50*e@p`zMQ=)iC;IIj9oN-hOFsWjwmlY>A zi}I-GL#td+TC&Cw(}fDPW>w=m%zbZC3y

UiXaQd&~Zjw10gx>|%qPu>{SwZP4Qp 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 literal 0 HcmV?d00001 diff --git a/ assignment-3/submission/18340246016/img/GMM_res.png b/ assignment-3/submission/18340246016/img/GMM_res.png new file mode 100644 index 0000000000000000000000000000000000000000..517b0570f48530330f9a9fe424fbdf30f3a2934b GIT binary patch literal 43340 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%0DkvS+9cYWld*Ivu?RT=5ND$ z4}N{1Yn8$mRyO`nb8J*TSo&V0iERU=bK9PMelq#|$$8$G@<$)Dodq`K4u*i(P*dNd z+(CawJv&AGi&{@J3b38Re(zJugd+yl*tw3kHpk>`EYi}Nz6?3S@~9W@Hs~5H55B}3 zJ7w?ulp|%hmL34!q9x8RYs?rJn`a^=w?~f6yZZJd=`9UWtsAeF7PQhlPyQ*KLf7Jpym-SOcLPv+!vqFCV|_eO2dbQfgUp*EnmYHkSFplwN|CB;OGE z;hz6??y}D~$=*DdfVR3c-N5>^>hN-W=k-Tpbd^3R16M8=a%o5nL8 z#mCXvinHUK5fK7*(AML;e>#1_X+sVG*w;e(XO>xkjCSH4Vvcdu`9hgDd;;FP3&Pb^o( ziJ)2QAquOAkkL7o zQY5Dl)RJ?ts(h`Bis1^PgJ$<(JZG!d+xlwEJNI;KphPBxZq(%pnJ+BmA?8hBb{0=< z2y0)+$;efHs4i!Z#Fog*&`aCQf~lN5@nabO3x`pU6l=Y3Fw5x{obctEc%JAY>2a

Z2KGkrll187soGCnh@; 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 H)sz1LzD+sK literal 0 HcmV?d00001 diff --git a/ assignment-3/submission/18340246016/img/visual_data_1.png b/ assignment-3/submission/18340246016/img/visual_data_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2591b361a69de753e3119feadf0e159dc5d448c9 GIT binary patch literal 55507 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

  • w}unw}64Wb(WXQo=JgnHX10D$jP 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 Date: Mon, 14 Jun 2021 13:16:49 +0800 Subject: [PATCH 112/112] 1 --- assignment-3/submission/18340246016/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ assignment-3/submission/18340246016/readme.md b/ assignment-3/submission/18340246016/readme.md index 05f635a..df9cbec 100644 --- a/ assignment-3/submission/18340246016/readme.md +++ b/ assignment-3/submission/18340246016/readme.md @@ -221,5 +221,6 @@ $$ ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/130337_efd2f52a_8823823.png "屏幕截图.png") clustering数据 + ![输入图片说明](https://images.gitee.com/uploads/images/2021/0614/130434_98084bb3_8823823.png "屏幕截图.png") -- Gitee
  • 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 W_g91IlN&DqfAZ2QQbm$R{{I7Y3wV|Q literal 0 HcmV?d00001 diff --git a/ assignment-3/submission/18340246016/img/Vis_data_2.png b/ assignment-3/submission/18340246016/img/Vis_data_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2b76342b7cc39b6bed19f3ebb14c4f30ded45a GIT binary patch literal 59878 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