From 916725373a1531146908e6878a2d6bd3d4671d0b Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 22 Mar 2021 16:52:39 +0800 Subject: [PATCH 01/40] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2019210680053?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 19210680053/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 19210680053/.keep diff --git a/19210680053/.keep b/19210680053/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 6e3c52c39d9cb73e3327f0fe5ad51753fb5166da Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 22 Mar 2021 16:53:16 +0800 Subject: [PATCH 02/40] add 19210680053. --- 19210680053/source.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 19210680053/source.py diff --git a/19210680053/source.py b/19210680053/source.py new file mode 100644 index 0000000..e69de29 -- Gitee From d50ab725d26c89cd836c2eb896f2fb1a35a43a54 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Mon, 22 Mar 2021 16:54:28 +0800 Subject: [PATCH 03/40] update 19210680053/source.py. --- 19210680053/source.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/19210680053/source.py b/19210680053/source.py index e69de29..968f4d3 100644 --- a/19210680053/source.py +++ b/19210680053/source.py @@ -0,0 +1,28 @@ +from scipy.spatial import distance + +class KNN(): + def fit(self, X_train, Y_train): + self.X_train = X_train + self.Y_train = Y_train + + def predict(self, x_test,k): + predictions = [] + for item in x_test: + label = self.closest(item,k) + predictions.append(label) + return predictions + + def closest(self, item,k): + min_ind = 0 + distlst=[] + idxlst=list(range(len(self.X_train))) + #get distance between X_test with all X_train + for i in range(0,len(self.X_train)): + distlst.append(distance.euclidean(item, self.X_train[i])) + #make up a dictionary with distance and order + distdict=dict(zip(idxlst,distlst)) + distdict=dict(sorted(distdict.items(),key=lambda item:item[1])) + #get first K nearest position + min_ind=list(dict(list(distdict.items())[:k]).keys()) + min_dist=[self.Y_train[i] for i in min_ind] + return max(min_dist,key=min_dist.count) \ No newline at end of file -- Gitee From f8a36094cd7000083863bb3b7ae4f4a5707a46f8 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 20:55:06 +0800 Subject: [PATCH 04/40] add 19210680053/Re. --- 19210680053/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 19210680053/README.md diff --git a/19210680053/README.md b/19210680053/README.md new file mode 100644 index 0000000..e69de29 -- Gitee From d224225eb14012e3afadf7e2bd2ae054b22fb649 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:04:05 +0800 Subject: [PATCH 05/40] update 19210680053/README.md. --- 19210680053/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/19210680053/README.md b/19210680053/README.md index e69de29..565ed77 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -0,0 +1,5 @@ +我使用的包为numpy,在class KNN中: +a-使用函数euclidean进行向量间欧式距离的计算 +b-使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 +c-使用predict函数将全部test data逐个输入,得到预测结果 +d-使用choose函数,将预测结果与test label \ No newline at end of file -- Gitee From d975940163fae805da655733248068f59e5c52cd Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:04:23 +0800 Subject: [PATCH 06/40] update 19210680053/README.md. --- 19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 565ed77..4704aea 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,4 +1,4 @@ -我使用的包为numpy,在class KNN中: +我使用的包为numpy,在class KNN中:\n a-使用函数euclidean进行向量间欧式距离的计算 b-使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 c-使用predict函数将全部test data逐个输入,得到预测结果 -- Gitee From 703d4d489f9fcd210f20ae9a43d8a5a467db9483 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:43:44 +0800 Subject: [PATCH 07/40] update 19210680053/README.md. --- 19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 4704aea..81a9c00 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,4 +1,4 @@ -我使用的包为numpy,在class KNN中:\n +我使用的包为numpy,在class KNN中:\\\n a-使用函数euclidean进行向量间欧式距离的计算 b-使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 c-使用predict函数将全部test data逐个输入,得到预测结果 -- Gitee From a0514c03bbb889626f45945d8e76b531a88bf61a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:44:22 +0800 Subject: [PATCH 08/40] update 19210680053/README.md. --- 19210680053/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 81a9c00..96d9885 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,5 +1,13 @@ -我使用的包为numpy,在class KNN中:\\\n +我使用的包为numpy,在class KNN中: + + a-使用函数euclidean进行向量间欧式距离的计算 + + b-使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 + + c-使用predict函数将全部test data逐个输入,得到预测结果 + + d-使用choose函数,将预测结果与test label \ No newline at end of file -- Gitee From d610ebbd83f12077829a44a7d321d168e040b6ce Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:56:20 +0800 Subject: [PATCH 09/40] update 19210680053/README.md. --- 19210680053/README.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 96d9885..aa7889d 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -10,4 +10,42 @@ b-使用closest函数进行逐个向量输入,分别计算它与全部train da c-使用predict函数将全部test data逐个输入,得到预测结果 -d-使用choose函数,将预测结果与test label \ No newline at end of file +d-使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 + + +我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 0 \\\\ +0 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +23 & 0 \\\\ +0 & 22 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +16 & -5 +\end{array}\right] +\end{array} +$$ + +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ \ No newline at end of file -- Gitee From 43f987e842066f66269f26895581746c74695552 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:57:12 +0800 Subject: [PATCH 10/40] update 19210680053/README.md. --- 19210680053/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index aa7889d..1f18499 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -25,6 +25,7 @@ $$ \end{array}\right] \end{array} $$ +$$ $$ \begin{array}{l} @@ -37,7 +38,7 @@ $$ \end{array}\right] \end{array} $$ - +$$ $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -48,4 +49,5 @@ $$ 20 & 25 \end{array}\right] \end{array} +$$ $$ \ No newline at end of file -- Gitee From f5cc77913a33460f12597826c794c9cfaf5d3ceb Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:58:07 +0800 Subject: [PATCH 11/40] update 19210680053/README.md. --- 19210680053/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/19210680053/README.md b/19210680053/README.md index 1f18499..e0d31d9 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -25,7 +25,7 @@ $$ \end{array}\right] \end{array} $$ -$$ + $$ \begin{array}{l} @@ -38,7 +38,7 @@ $$ \end{array}\right] \end{array} $$ -$$ + $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -49,5 +49,5 @@ $$ 20 & 25 \end{array}\right] \end{array} -$$ + $$ \ No newline at end of file -- Gitee From e4459d640aeb4e452ed98c7ab9dcacda5227fff6 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 21:58:27 +0800 Subject: [PATCH 12/40] update 19210680053/README.md. --- 19210680053/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index e0d31d9..11af8c0 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -39,6 +39,7 @@ $$ \end{array} $$ + $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -49,5 +50,4 @@ $$ 20 & 25 \end{array}\right] \end{array} - $$ \ No newline at end of file -- Gitee From 27726621674b189a8f3fc568e9eb8932c6bcc15e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:03:33 +0800 Subject: [PATCH 13/40] update 19210680053/README.md. --- 19210680053/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 11af8c0..78d0f1d 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -14,6 +14,7 @@ d-使用choose函数,将预测结果与test label进行比对,结果相同 我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 +label=0 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -27,6 +28,7 @@ $$ $$ +label=1 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -40,6 +42,7 @@ $$ $$ +label=2 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -50,4 +53,7 @@ $$ 20 & 25 \end{array}\right] \end{array} -$$ \ No newline at end of file +$$ + +这是我生成的训练集: +![width="200" alt="训练集"](https://images.gitee.com/uploads/images/2021/0323/220231_8ac75bbc_8850706.png "屏幕截图.png") \ No newline at end of file -- Gitee From d84fa815aa53db390389a4e68a4efe2d03f20e64 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:06:03 +0800 Subject: [PATCH 14/40] update 19210680053/README.md. --- 19210680053/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 78d0f1d..0ebb55a 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -56,4 +56,5 @@ $$ $$ 这是我生成的训练集: -![width="200" alt="训练集"](https://images.gitee.com/uploads/images/2021/0323/220231_8ac75bbc_8850706.png "屏幕截图.png") \ No newline at end of file +测试集 +![width="100" alt="训练集"](https://images.gitee.com/uploads/images/2021/0323/220231_8ac75bbc_8850706.png "屏幕截图.png") \ No newline at end of file -- Gitee From 76c950d92b3bb1e93cf2a7bb7a6b47e1d0ce69cd Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:06:46 +0800 Subject: [PATCH 15/40] update 19210680053/README.md. --- 19210680053/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/19210680053/README.md b/19210680053/README.md index 0ebb55a..f1120e4 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -56,5 +56,4 @@ $$ $$ 这是我生成的训练集: -测试集 -![width="100" alt="训练集"](https://images.gitee.com/uploads/images/2021/0323/220231_8ac75bbc_8850706.png "屏幕截图.png") \ No newline at end of file +测试集 -- Gitee From 38f7e3f08f46e35de1d8a9d1196d5b15813166e8 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:07:09 +0800 Subject: [PATCH 16/40] update 19210680053/README.md. --- 19210680053/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index f1120e4..c3d6972 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -56,4 +56,6 @@ $$ $$ 这是我生成的训练集: -测试集 + + +训练集 -- Gitee From 70661b684d00582c30fea9d54f9050bbe6c6b292 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:07:41 +0800 Subject: [PATCH 17/40] update 19210680053/README.md. --- 19210680053/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/19210680053/README.md b/19210680053/README.md index c3d6972..49d11e2 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -14,6 +14,7 @@ d-使用choose函数,将预测结果与test label进行比对,结果相同 我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 +\begin{array}{l} label=0 $$ \begin{array}{l} -- Gitee From beba617525d7d13ed3bcd9a14a78517b6da5680f Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Tue, 23 Mar 2021 22:10:59 +0800 Subject: [PATCH 18/40] update 19210680053/README.md. --- 19210680053/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 49d11e2..74c120a 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -14,7 +14,8 @@ d-使用choose函数,将预测结果与test label进行比对,结果相同 我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 -\begin{array}{l} + + label=0 $$ \begin{array}{l} @@ -60,3 +61,16 @@ $$ 训练集 + + +这是我生成的测试集: + + +测试集 + + +可以通过如下表格来报告我的实验结果 + +Algo |kvalue|Acc | +-----| ---- |---- | +KNN | 5 |0.6225 | \ No newline at end of file -- Gitee From 097968424e28273da4d7d65fd2e68f4a951f29ea Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:10:55 +0800 Subject: [PATCH 19/40] update 19210680053/README.md. --- 19210680053/README.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/19210680053/README.md b/19210680053/README.md index 74c120a..35d5816 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,22 +1,22 @@ 我使用的包为numpy,在class KNN中: -a-使用函数euclidean进行向量间欧式距离的计算 +a.使用函数euclidean进行向量间欧式距离的计算 -b-使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 +b.使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 -c-使用predict函数将全部test data逐个输入,得到预测结果 +c.使用predict函数将全部test data逐个输入,得到预测结果 -d-使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 +d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 -label=0 + label=0 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -30,7 +30,7 @@ $$ $$ -label=1 + label=1 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -44,7 +44,7 @@ $$ $$ -label=2 + label=2 $$ \begin{array}{l} \Sigma=\left[\begin{array}{cc} @@ -73,4 +73,8 @@ $$ Algo |kvalue|Acc | -----| ---- |---- | -KNN | 5 |0.6225 | \ No newline at end of file +KNN | 5 |0.6225 | + + + +对于label=0和label=2的分布较靠近彼此,进而导致判定新输入的测试实例所属label的准确性下降。 \ No newline at end of file -- Gitee From 5559b55994d40a77bba54e10be64ff2647d05496 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:18:38 +0800 Subject: [PATCH 20/40] update 19210680053/README.md. --- 19210680053/README.md | 69 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index 35d5816..5a01a8b 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -77,4 +77,71 @@ KNN | 5 |0.6225 | -对于label=0和label=2的分布较靠近彼此,进而导致判定新输入的测试实例所属label的准确性下降。 \ No newline at end of file + +由于label=0和label=2的对应分布较靠近,进而导致判定新输入的测试实例所属label的准确性仅为62.25%。 + + +改变高斯分布距离,我使用以下参数生成高斯分布。 + + + label=0 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 2.1 \\\\ +2.1 & 12 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + + + label=1 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +23 & 0 \\\\ +0 & 22 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +16 & -5 +\end{array}\right] +\end{array} +$$ + + + label=2 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +3 & 5 +\end{array}\right] +\end{array} +$$ + +这是我生成的训练集: + + +训练集 +![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/101631_7ff0453f_8850706.png "屏幕截图.png") + +这是我生成的测试集: + + +测试集 +![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/101657_ceefbdc0_8850706.png "屏幕截图.png") + +可以通过如下表格来报告我的实验结果 + +Algo |kvalue|Acc | +-----| ---- |---- | +KNN | 2 |0.9975 | + + +此时3个高斯分布距离较远,通过较少的k值 \ No newline at end of file -- Gitee From e61439f32efb0891b17d1f68e4aa37c579f0fcac Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:22:03 +0800 Subject: [PATCH 21/40] update 19210680053/source.py. --- 19210680053/source.py | 101 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 11 deletions(-) diff --git a/19210680053/source.py b/19210680053/source.py index 968f4d3..f44bde6 100644 --- a/19210680053/source.py +++ b/19210680053/source.py @@ -1,13 +1,19 @@ -from scipy.spatial import distance +import matplotlib.pyplot as plt +import numpy as np +import sys class KNN(): + def __init__(self, train_data, train_label): + self.train_data = train_data + self.train_label = train_label + def euclidean(self,v1,v2): + return np.sqrt(np.sum(np.square(v1 - v2))) def fit(self, X_train, Y_train): - self.X_train = X_train - self.Y_train = Y_train - - def predict(self, x_test,k): + self.train_data = train_data + self.train_label = train_label + def predict(self, train_data,k): predictions = [] - for item in x_test: + for item in train_data: label = self.closest(item,k) predictions.append(label) return predictions @@ -15,14 +21,87 @@ class KNN(): def closest(self, item,k): min_ind = 0 distlst=[] - idxlst=list(range(len(self.X_train))) + idxlst=list(range(len(self.train_data))) #get distance between X_test with all X_train - for i in range(0,len(self.X_train)): - distlst.append(distance.euclidean(item, self.X_train[i])) + for i in range(0,len(self.train_data)): + distlst.append(self.euclidean(item, self.train_data[i])) #make up a dictionary with distance and order distdict=dict(zip(idxlst,distlst)) distdict=dict(sorted(distdict.items(),key=lambda item:item[1])) #get first K nearest position min_ind=list(dict(list(distdict.items())[:k]).keys()) - min_dist=[self.Y_train[i] for i in min_ind] - return max(min_dist,key=min_dist.count) \ No newline at end of file + min_dist=[self.train_label[i] for i in min_ind] + return max(min_dist,key=min_dist.count) + + def choose(self,test_data,test_label): + acclst=[] + for k in range(2,7): + res=self.predict(test_data,k) + acc=np.mean(np.equal(res, test_label)) + acclst.append(acc) + max_acc=max(acclst) + max_k=acclst.index(max_acc)+2 + return max_k,max_acc + + +def generate(): + mean = (20, 25) + cov = np.array([[10,2.1], [2.1, 12]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[23, 0], [0, 22]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (3, 5) + cov = np.array([[10,5],[5,10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + idx = np.arange(2000) + np.random.shuffle(idx) + data = np.concatenate([x,y,z]) + label = np.concatenate([ + np.zeros((800,),dtype=int), + np.ones((200,),dtype=int), + np.ones((1000,),dtype=int)*2 + ]) + data = data[idx] + label = label[idx] + + train_data, test_data = data[:1600,], data[1600:,] + train_label, test_label = label[:1600,], label[1600:,] + np.save("data.npy",((train_data, train_label), (test_data, test_label) + )) + +def display(data, label, name): + datas =[[],[],[]] + for i in range(len(data)): + datas[label[i]].append(data[i]) + + for each in datas: + each = np.array(each) + plt.scatter(each[:, 0], each[:, 1]) + label=[str(i) for i in list(range(len(datas)))] + plt.legend(['label '+i for i in label]) + plt.show() + +def read(): + (train_data, train_label), (test_data, test_label) = np.load("data.npy",allow_pickle=True) + return (train_data, train_label), (test_data, test_label) + + +if __name__ == "__main__": + mode=0 + if mode == 0: + generate() + if mode == 1: + (train_data, train_label), (test_data, test_label) = read() + display(train_data, train_label, 'train') + display(test_data, test_label, 'test') + else: + (train_data, train_label), (test_data, test_label) = read() + + model = KNN() + model.fit(train_data, train_label) + k ,acc = model.choose(test_data,test_label) + print("k=",k,"acc=",acc) \ No newline at end of file -- Gitee From 0247b1ad6765faeac19610e475f0a66a74e7c914 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:45:40 +0800 Subject: [PATCH 22/40] update 19210680053/source.py. --- 19210680053/source.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/19210680053/source.py b/19210680053/source.py index f44bde6..e3fc856 100644 --- a/19210680053/source.py +++ b/19210680053/source.py @@ -22,10 +22,10 @@ class KNN(): min_ind = 0 distlst=[] idxlst=list(range(len(self.train_data))) - #get distance between X_test with all X_train + #get distance between test_data with train_data for i in range(0,len(self.train_data)): distlst.append(self.euclidean(item, self.train_data[i])) - #make up a dictionary with distance and order + #make up a dictionary with distance and index distdict=dict(zip(idxlst,distlst)) distdict=dict(sorted(distdict.items(),key=lambda item:item[1])) #get first K nearest position -- Gitee From 7013392dd910386f0b3047d2b5ce18f6d4f47cfd Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:46:20 +0800 Subject: [PATCH 23/40] update 19210680053/source.py. --- 19210680053/source.py | 1 - 1 file changed, 1 deletion(-) diff --git a/19210680053/source.py b/19210680053/source.py index e3fc856..3fc823c 100644 --- a/19210680053/source.py +++ b/19210680053/source.py @@ -1,6 +1,5 @@ import matplotlib.pyplot as plt import numpy as np -import sys class KNN(): def __init__(self, train_data, train_label): -- Gitee From 7dbc387d2a5182280ff995d09488d55b6960ff5e Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 10:53:11 +0800 Subject: [PATCH 24/40] update 19210680053/README.md. --- 19210680053/README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/19210680053/README.md b/19210680053/README.md index 5a01a8b..7981fe0 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -129,13 +129,13 @@ $$ 训练集 -![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/101631_7ff0453f_8850706.png "屏幕截图.png") + 这是我生成的测试集: 测试集 -![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/101657_ceefbdc0_8850706.png "屏幕截图.png") + 可以通过如下表格来报告我的实验结果 @@ -144,4 +144,12 @@ Algo |kvalue|Acc | KNN | 2 |0.9975 | -此时3个高斯分布距离较远,通过较少的k值 \ No newline at end of file +此时3个高斯分布距离较远,通过较少的k值即可得到较为准确的判断。增加高斯分布间的距离可以提升实验的准确性。 + +## 代码使用方法 + +```bash +改变mode数值: +mode=0 #数据生成 +mode=1 #数据可视化 +mode取非0-1值 #训练和测试 -- Gitee From 35022e12753c9a3c5cff5ef48a4aab5eae1bfa36 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 16:38:39 +0800 Subject: [PATCH 25/40] update 19210680053/README.md. --- 19210680053/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/19210680053/README.md b/19210680053/README.md index 7981fe0..a21c437 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,3 +1,5 @@ +#课程报告 + 我使用的包为numpy,在class KNN中: -- Gitee From 87a5bc75f0a3683b7cea9b49f88c8a4bff17aa16 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 16:40:32 +0800 Subject: [PATCH 26/40] update 19210680053/README.md. --- 19210680053/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/19210680053/README.md b/19210680053/README.md index a21c437..1776560 100644 --- a/19210680053/README.md +++ b/19210680053/README.md @@ -1,4 +1,6 @@ -#课程报告 +# 课程报告 + +## 说明 我使用的包为numpy,在class KNN中: -- Gitee From 9eb136aa218dc061b2d07ddf2c1c39cf0b5f8690 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 16:57:41 +0800 Subject: [PATCH 27/40] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2019210680053?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/19210680053/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/19210680053/.keep diff --git a/assignment-1/submission/19210680053/.keep b/assignment-1/submission/19210680053/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From c7387d9067a74990132d2e604732181ff0bac70d Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 17:05:58 +0800 Subject: [PATCH 28/40] add assignment-1/submission/19210680053/source.py. --- assignment-1/submission/19210680053/source.py | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 assignment-1/submission/19210680053/source.py diff --git a/assignment-1/submission/19210680053/source.py b/assignment-1/submission/19210680053/source.py new file mode 100644 index 0000000..a7bdf92 --- /dev/null +++ b/assignment-1/submission/19210680053/source.py @@ -0,0 +1,106 @@ +import matplotlib.pyplot as plt +import numpy as np + +class KNN(): + def __init__(self, train_data, train_label): + self.train_data = train_data + self.train_label = train_label + def euclidean(self,v1,v2): + return np.sqrt(np.sum(np.square(v1 - v2))) + def fit(self, X_train, Y_train): + self.train_data = train_data + self.train_label = train_label + def predict(self, train_data,k): + predictions = [] + for item in train_data: + label = self.closest(item,k) + predictions.append(label) + return predictions + + def closest(self, item,k): + min_ind = 0 + distlst=[] + idxlst=list(range(len(self.train_data))) + #get distance between test_data with train_data + for i in range(0,len(self.train_data)): + distlst.append(self.euclidean(item, self.train_data[i])) + #make up a dictionary with distance and index + distdict=dict(zip(idxlst,distlst)) + distdict=dict(sorted(distdict.items(),key=lambda item:item[1])) + #get first K nearest position + min_ind=list(dict(list(distdict.items())[:k]).keys()) + min_dist=[self.train_label[i] for i in min_ind] + return max(min_dist,key=min_dist.count) + + def choose(self,test_data,test_label): + acclst=[] + for k in range(2,7): + res=self.predict(test_data,k) + acc=np.mean(np.equal(res, test_label)) + acclst.append(acc) + max_acc=max(acclst) + max_k=acclst.index(max_acc)+2 + return max_k,max_acc + + +def generate(): + mean = (20, 25) + cov = np.array([[10,2.1], [2.1, 12]]) + x = np.random.multivariate_normal(mean, cov, (800,)) + + mean = (16, -5) + cov = np.array([[23, 0], [0, 22]]) + y = np.random.multivariate_normal(mean, cov, (200,)) + + mean = (3, 5) + cov = np.array([[10,5],[5,10]]) + z = np.random.multivariate_normal(mean, cov, (1000,)) + + idx = np.arange(2000) + np.random.shuffle(idx) + data = np.concatenate([x,y,z]) + label = np.concatenate([ + np.zeros((800,),dtype=int), + np.ones((200,),dtype=int), + np.ones((1000,),dtype=int)*2 + ]) + data = data[idx] + label = label[idx] + + train_data, test_data = data[:1600,], data[1600:,] + train_label, test_label = label[:1600,], label[1600:,] + np.save("data.npy",((train_data, train_label), (test_data, test_label) + )) + +def display(data, label, name): + datas =[[],[],[]] + for i in range(len(data)): + datas[label[i]].append(data[i]) + + for each in datas: + each = np.array(each) + plt.scatter(each[:, 0], each[:, 1]) + label=[str(i) for i in list(range(len(datas)))] + plt.legend(['label '+i for i in label]) + plt.show() + +def read(): + (train_data, train_label), (test_data, test_label) = np.load("data.npy",allow_pickle=True) + return (train_data, train_label), (test_data, test_label) + + +if __name__ == "__main__": + mode=0 + if mode == 0: + generate() + if mode == 1: + (train_data, train_label), (test_data, test_label) = read() + display(train_data, train_label, 'train') + display(test_data, test_label, 'test') + else: + (train_data, train_label), (test_data, test_label) = read() + + model = KNN() + model.fit(train_data, train_label) + k ,acc = model.choose(test_data,test_label) + print("k=",k,"acc=",acc) \ No newline at end of file -- Gitee From 23e46ae70ff9d1c9522ad9c7654fbf7618c19688 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 17:06:32 +0800 Subject: [PATCH 29/40] add assignment-1/submission/19210680053/README.md. --- assignment-1/submission/19210680053/README.md | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 assignment-1/submission/19210680053/README.md diff --git a/assignment-1/submission/19210680053/README.md b/assignment-1/submission/19210680053/README.md new file mode 100644 index 0000000..327490f --- /dev/null +++ b/assignment-1/submission/19210680053/README.md @@ -0,0 +1,159 @@ +# 课程报告 + +## 说明 + +我使用的包为numpy,在class KNN中: + + +a.使用函数euclidean进行向量间欧式距离的计算 + + +b.使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 + + +c.使用predict函数将全部test data逐个输入,得到预测结果 + + +d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 + + +我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 + + + label=0 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 0 \\\\ +0 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + + + label=1 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +23 & 0 \\\\ +0 & 22 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +16 & -5 +\end{array}\right] +\end{array} +$$ + + + label=2 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + +这是我生成的训练集: + + +训练集 + + +这是我生成的测试集: + + +测试集 + + +可以通过如下表格来报告我的实验结果 + +Algo |kvalue|Acc | +-----| ---- |---- | +KNN | 5 |0.6225 | + + + + +由于label=0和label=2的对应分布较靠近,进而导致判定新输入的测试实例所属label的准确性仅为62.25%。 + + +改变高斯分布距离,我使用以下参数生成高斯分布。 + + + label=0 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 2.1 \\\\ +2.1 & 12 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + + + label=1 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +23 & 0 \\\\ +0 & 22 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +16 & -5 +\end{array}\right] +\end{array} +$$ + + + label=2 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +3 & 5 +\end{array}\right] +\end{array} +$$ + +这是我生成的训练集: + + +训练集 + + +这是我生成的测试集: + + +测试集 + + +可以通过如下表格来报告我的实验结果 + +Algo |kvalue|Acc | +-----| ---- |---- | +KNN | 2 |0.9975 | + + +此时3个高斯分布距离较远,通过较少的k值即可得到较为准确的判断。增加高斯分布间的距离可以提升实验的准确性。 + +## 代码使用方法 + +```bash +改变mode数值: +mode=0 #数据生成 +mode=1 #数据可视化 +mode取非0-1值 #训练和测试 -- Gitee From f5c6c053ebc0dd2aec7c8cd769106c2722bf809b Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:02:42 +0800 Subject: [PATCH 30/40] update assignment-1/submission/19210680053/README.md. --- assignment-1/submission/19210680053/README.md | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/assignment-1/submission/19210680053/README.md b/assignment-1/submission/19210680053/README.md index 327490f..92ff9d2 100644 --- a/assignment-1/submission/19210680053/README.md +++ b/assignment-1/submission/19210680053/README.md @@ -85,6 +85,76 @@ KNN | 5 |0.6225 | 由于label=0和label=2的对应分布较靠近,进而导致判定新输入的测试实例所属label的准确性仅为62.25%。 +为进一步探究高斯分布距离对预测准确性影响,我使用如下参数进行分布生成: + + label=0 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 2.1 \\\\ +2.1 & 12 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + + + label=1 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +23 & 0 \\\\ +0 & 22 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + + + label=2 +$$ +\begin{array}{l} +\Sigma=\left[\begin{array}{cc} +10 & 5 \\\\ +5 & 10 +\end{array}\right] \\\\ +\mu=\left[\begin{array}{ll} +20 & 25 +\end{array}\right] +\end{array} +$$ + +这是我生成的训练集: + + +训练集 + +这是我生成的测试集: + + +测试集 + + +可以通过如下表格来报告我的实验结果 + +Algo |kvalue|Acc | +-----| ---- |---- | +KNN | 5 |0.4725 | + +此时3个高斯分布距离彼此都很近,进行不同k值选取,提升实验的准确性最高达到47.25%。 + +|kvalue|Acc | +| ---- |---- | +| 2 |0.465 | +| 3 |0.465 | +| 4 |0.4425 | +| 5 |0.4725 | +| 6 |0.46 | + 改变高斯分布距离,我使用以下参数生成高斯分布。 -- Gitee From 25ea92950e81d86f954d56d49088e9306fd63ddb Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:04:14 +0800 Subject: [PATCH 31/40] update assignment-1/submission/19210680053/README.md. --- assignment-1/submission/19210680053/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-1/submission/19210680053/README.md b/assignment-1/submission/19210680053/README.md index 92ff9d2..001eadb 100644 --- a/assignment-1/submission/19210680053/README.md +++ b/assignment-1/submission/19210680053/README.md @@ -17,6 +17,8 @@ c.使用predict函数将全部test data逐个输入,得到预测结果 d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 +## 数据生成 实验探究 + 我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 -- Gitee From 1c03c0d24201f5d67c50ab702b56c154f48f13d1 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:08:38 +0800 Subject: [PATCH 32/40] update assignment-1/submission/19210680053/README.md. --- assignment-1/submission/19210680053/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-1/submission/19210680053/README.md b/assignment-1/submission/19210680053/README.md index 001eadb..e760382 100644 --- a/assignment-1/submission/19210680053/README.md +++ b/assignment-1/submission/19210680053/README.md @@ -84,7 +84,7 @@ KNN | 5 |0.6225 | -由于label=0和label=2的对应分布较靠近,进而导致判定新输入的测试实例所属label的准确性仅为62.25%。 +由于label=0和label=2的对应高斯分布较靠近,导致训练准确性为62.25%。 为进一步探究高斯分布距离对预测准确性影响,我使用如下参数进行分布生成: @@ -147,7 +147,7 @@ Algo |kvalue|Acc | -----| ---- |---- | KNN | 5 |0.4725 | -此时3个高斯分布距离彼此都很近,进行不同k值选取,提升实验的准确性最高达到47.25%。 +此时3个高斯分布距离彼此都很近,进行不同k值选取,实验的准确性最高达到47.25%。 |kvalue|Acc | | ---- |---- | -- Gitee From 08bad2b98c66515324c50602abf156d5bd267860 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:12:27 +0800 Subject: [PATCH 33/40] =?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/19210680053/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/19210680053/img/.keep diff --git a/assignment-1/submission/19210680053/img/.keep b/assignment-1/submission/19210680053/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 3e607e286ae67b775046c712fb61ac44a58cb45f Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:14:34 +0800 Subject: [PATCH 34/40] display --- .../submission/19210680053/img/test 1.png | Bin 0 -> 12714 bytes .../submission/19210680053/img/test 2.png | Bin 0 -> 19098 bytes .../submission/19210680053/img/test 3.png | Bin 0 -> 12989 bytes .../submission/19210680053/img/train 1.png | Bin 0 -> 15830 bytes .../submission/19210680053/img/train 2.png | Bin 0 -> 20871 bytes .../submission/19210680053/img/train 3.png | Bin 0 -> 14542 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-1/submission/19210680053/img/test 1.png create mode 100644 assignment-1/submission/19210680053/img/test 2.png create mode 100644 assignment-1/submission/19210680053/img/test 3.png create mode 100644 assignment-1/submission/19210680053/img/train 1.png create mode 100644 assignment-1/submission/19210680053/img/train 2.png create mode 100644 assignment-1/submission/19210680053/img/train 3.png diff --git a/assignment-1/submission/19210680053/img/test 1.png b/assignment-1/submission/19210680053/img/test 1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf515460fd3bf6e81d027117399749a3b10c29fe GIT binary patch literal 12714 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 VFY8Z+r{m#X>MB~wrHW=j{|n2SU1I+q{<_P_o(` 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 YFrLJHF6Orlm{SMrtpAO#vh*YU52rFtm;e9( literal 0 HcmV?d00001 diff --git a/assignment-1/submission/19210680053/img/test 3.png b/assignment-1/submission/19210680053/img/test 3.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab9d8b6157ed19597c283688c34daeef54beeeb GIT binary patch literal 12989 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

Hi}S(=xRb z+Icy`6jr`>(zxzsJzwV7>UMHT$R{6y=llG3p*7vEMebcNvX%HbpPMb*l5y^ zYJW7)xH+VGso(im-_F~6#gFau*7xi-E|D=#^j#r}SZBIDz=a4(uoZx=WnEFdtF7x7 zc`ds2)2K5;QZr5Qf1~)r_d7$-z2$0BWZhUSbdTBqb{e2@D39UXOv5(2tN{gth>FOT z08nG>56jn8%GbI+_Ou>ej+D35X17@8Bg3C91v0-U-Bge)pqUlOQ$7+y{BLo-KA*Lk zjVAGb;;#8mYv~PL*(LjFz)q~Di}dG+#mZfG-CcR}sFEaRtN*>l26_`8DzC7{@+0(L zFgVVY3SW^Cd6+i6+J5+Z^v}Ko&~R1VFIoW8SWPW6mo$~mq;<2z(pa0KG@2^-Lugq+ zC*$Q=-ACB+9jVo)N-X1iyh#5SGDY-E0!PLui^ZThMj49Q&1tE5j2ItqlPI7%1)J_m z6|g{>Wv)}dy-9Aa!tC*&Iz`I%NKsY!iB z|M)LHHHQmBNV4w~1BwT~;``d!;a&UqTSw$nc+n&G*5Y(Ag|qa$3FlBFrB3Lg zflPR7z@kW<=TOKCG$crUG*zf{8^F$?yOYzi_aWvzNcqv)>Tdk+E6YsJXU*r~2;*+n<%K4_Xiv#Aj@_CQ|(wb*@+!0Bq<#uYav#sR7CXYg24(0>48!V-+lfl7tBFg`I>vQ9|! z!uPABr}rgZ4rNS3UUSEvmX0|D=iH(~B|X!c^CSC$o|?wuFoZ^FGYiJAyz8ww=^Wt) zxp|SnV6I-Y%%+so1;C3XqOgCYVG*MOwH&oZaj?gJaoC5qX}qblO>E%iU(HhjmyWxN zj@W!4$Q?OE(PppN;XUfAbLxR!91EM@ODm6D_<58;sdGMXyw9LF+Qv;}>VSS(P0j{! zZ8E7L=j-5sbs9yi#~`7JLeJ}?yWgR22e4FiPcQ}@NOjwsq+t4;J%;Xd(_wseirZ#W z@{;_y26Hzs&13C*Qc4Zzhv0y_c}Ki7h+q@joZ~Xmium7|qYZqqp;mRXI{58=M@A>6Bt zM?{$Sl=W^tC=ojcG*fIE=xn61T^JSdm=Q(D2`w3pmfm=_8tST$XCfl*Ioj|9wUC?8 z^kDi_P~bFk`*SaB*N(3Kk$JV=OWrHa>l%rNrA!+G?^%eKPT%^uLVubC{1Dw}&1#wZ z+~$+IuwxtrMM|p^VbOXgOMICpoK|R1YqU&*PsAnX2 zPeG{D2uDlD4oe0f2Mi38ka!w#_lrCJiFnaHF;*{hsK?2#Dg%uaO2ZHuR?x)@U2oSe zc3qQPJI@K@qMPIT^-WH?MC85=SE1(En25%V5g*@A;q+V)K?m+@xAX>jM5dt?nm6{f1Q`>eO-uSCyhREY0@LChMO12=xCWdpWF zuz24BtDSN7siRx6NmC+hxt8yMqA!3dqCkDK5YZEE)DBqK({IkksL9I3V{9EIZat+6zyb(^0 zte92{wD<`ZkB!esrDhTGIdA4vT?BP;8ham}uiK<1$#g?_SpPt`dWeML3*s8kn_JGn zSVmmW%EK+RSHLP^HU}ZLE>>HC2!mTm4gr}Vpl@=S=R}DD-^OUK&>v-Zw>DlF6I^ZF z@e>}jZn}E2BKaM}Kr%*3c<+Dr<+~%-Lycq~bhcqU;3q${;q#<&b9Louoo6^;2nBh?|tZgsz94IaGY;FhGZV{o1yXe z$o-zvn@}npi9w#wVa=&O&|rT+BM*g@sdK&#vQciFnNaP#Vo&P-W6v}E8_>i4g0yW$ zlX5g`43$Y@iG>cyK!MOEWxmpPWAs38fm|J%9#~n3(L<~3xOABWUl&!X#VU;%^SK79 z;WlHemBxeN#qGO&1CG+bgXRj&^obQp{sHJ;oTI9>?(ckeg6K8{AGdw&wft6;W4+kA zAVka7-e+$>+SC8E_HU*I%aCiSBZsgJr=Zy4xn1qB;hL4ZP*cRpFVWj<=~{$@>fNmk zt}b&G(KB(Rk=bsL$fUQG&k={)|Bg>l6zw4dQW^9F_kgx0xfCpSpq!kSt=-(7fov7Ht@DzC{{Vj%mc0+;u_fsa_O(o;oeVBnz%4|CKu|bQr-h>91X=ckXq@t z*F;%k5+Ts~wG}g0f;731(B((xZM%MiBMmo?jdy83(iE`hh$qPD zV(8>%>@wEX&3nfvbA*j;XLk+*zsTBnK70<->x;mm|0XL|mOtEkTSx#ss7;~|rk1;> zFrbnO?Cl;@?{Zk>TZrK9Q2->A?*WLCOrdPxjRa%?6c@Oud}B;#^qnm7J-uP(N3OnXAewfIXnrTAH=?zI*qOL~aZLp2(GLKND zst&SabYj^a)foev1{b>-*eq`>jm9?{r`96tyg}Io_2+9;Fb`oFL$mt6ij!yA;Q`Gl zo<_qmnpqL8@w=JRUlP7~e97|5kHZiwxe0g94VZnr6F5a9O?8X!9zmxRq*P#D?|raI zVHEu_Wulg;c^kurf=_A6fYHAx3>3Do(uI@4@D`HYa_|C)zb|JwdJe5l_lv+ zC1OVWfBDzy-H+Nh?$fMnv5Dw#Q=COQT&S`&Y{hY%3=7dj?aSvLs>s;S2nbr_=t3Ch}W<3JRDp!UAvjc8+%K zUFEk0wTu1`6w=*GKx*nB@>KPSczAo!Ue0qA*^c{dZIn?Yf_s=G0y}vm{7!xGH~&(< zivJ61p8q{sXbmCtq-SG-rIG0lF;w)UTUD-}F&X(jo4a(8@uq`QBr>Jn5e?Nyv~-{F zuFZch@l#S5i!BEupwvG%)E0+PMP2I?(1NS-m3VD`#}|9cdcB1NeY@ct?^1Fx>4^+=1gJq_kG=3IGTG zmo;RLZ}x_){`!^Rb=thYGEA3syyo}n^Lho#(zoZ!^#}95FQj3c>=>gE!($kDe&F^; ztFI)$Xp2wAsOk1)0isQCK>W7lI~@KvZqu`vZWNKi_8VMAv5K?E7hSQ8Kmp^>`-_WVS4!Z2&H20&H;w#-Qf z5sAO{d{ve+3`@KUuUVNe*64*+bT`vClN|388^*t zh~9)j%$9M@X@bM{3rC`+D_pYImAHJwcE%LpY{!i1H+6Z!@$V^4F-_REJ=5g^U*xJv zuH1)mG!cfGUlRNNW3Da<;$*lHl~K)P{Fw@&CVcTW^PR1U`UoXI z$9Fj4ws2 z+xT4yns)40TjtW0$-DgDqR}@QzQ9$AQ$$7r0=y5+sB1*GHw38piOV0_y;N>XRnISs zcA&|E-j0rJ?Kb36`8me?QGzrO>YnU%kj9${l8c4|yyET-A8%K=)>K5q&Ye@ixG+T} zjm*W=PFDk}4=8A;y;k@oxcBP&G_Lu^`sdCAVMAhD2M4sGGqHsHWN*4yqud5jBD%is z1V?)avA!y`CS^iX@Qsd$N8JD%W|*Eoa$NTqj|-f3K}gM)Vy1!)f-8&d!YtSQzfp+}tqSu62|-W`H1?0MJwXEN8pN7YL8&xz2G*OT_EU!R?lPV-`=WE39bvWARtRm-sfr z#{uL7j)&h3zx-l8=y}RFh%(81B-dC>jXtw+iz=>zuh8w3NXN?f6&B(uMHpkfSRI@f z$9`7!SaLPWSgPL%UP-kU|J~|dsb6gp1OsW#-A;*TZdVO{ zb5l6sVwwcL;YoLBGBF~|L|V|*QX@4`lVb-0v(5a|dUy9Q;JCd%~-d z&2l*?L#*D%#d})u7;>}(2pAOeq%=zC^<#2U3QX1Vdx&(eveLKF|3e4qbe}x5)4JOw zkNInm$KTAqaGvjb^}J6TU-T1sE-X25?xxx`af$5SD#HVIcG529D7|ydo|YIe6o?db zMro6$;HD^H&ZC21-1V9Hi!|8h6IN+=YGJ9|hbhLGWi z`YA?89HShdi^I_XUVHUW6@3XcWUE!LYjJ~;`Y>4%+ zPDDN-d^>%P-|*dfC|cmM<(m+N0=-Jn?!B>}!ffItC1wAN@}WCJ#F*$$i8WdAr7;9& zB`e9~h|?{15{;s4*R7{idM70+r16OOTd&xf2jBvrP5xI%H#iJrpz;2F zTmv#^x06uY)SX6hg_LEPr1sqxHlI4N83P8x4`i3(qeZU!tK=u*PUGAwBMymjfz6=; zIV+eli!S*YVcRN2WtY#4DLN#e<2FVj=stz!wYwM>OPZ9bY>PvG>}tgB_|tE_4uY~TVKK$n4EW=f zfvH0au7mbFRwtmEjT41d6aIlkn($f1i#C@X0gtRdU$!TDCjdfNIRY<+*9DgSgC&Vs z_D>$UrDu+LSbE%a)XzR*}vU}`H6 zKd>-XFZI&n(ZBDx`J8B$Z2Q2HvPQxz53^M9@?h|v1hv=C9$`b7V{&S>ECJubA|#Bc zEHb4*wWhJ=**-IUq{)ft8YZ9%&K+$5rC^^{m(21gB;4#cT?!^6N-@1ioPk~2_YG{T z$qm--mZ!4QntY@#qm!6_>zc5taDzKs)5V@X_2dZ0?}teNu^AV6jN)vf0%i)$JL zVv%adKCFmHvW?GKOg|!Vd@0!`*xNBeefG=?KPh1;={LB8Ysh08)NO6_F;8lP&a?II zy-{n6EeQxL2pL7Y*oyXfR!;npGSh%pvBe@$A**I`(IR@b&NyoZ#C(q>{W1yDc}E z_L#I;L8n_Jutm~U#SRS!e2YQsYK>FY<||xzN^Tv)SLaxV>|IxB9;JKH^>BUgJ%i+w zi0j748h+Jp7?qI!besl20Hsr1d`p3CH8zZjkfL#pv+C+;rG*@OcSJNP3*^3}P|6$< zxTfRrDUTcy=gg5ST2)zPB%4Uc;SYvvzC4kXwksJtlo+DE6*@9ae6= z=H;kvp`y05yfnH$Rl$kOe2tPQ8AzNgyui-_L1q;1?O*h!`Ifip>!u2@ybJ3X-awLO zz6U4|>~rv*Rt+C`-Tv5Hm^V5fa`}EvecuWU&M5!7oW4hBTT`QZD(M9H;5s3-`)1P_ z!_YH*YAvogI1_GDKmO5dqrzR>5yNL{8`|b zF&On@zw`dC#BZiT9u}2bWmRL@Z4+}=B-NVHarb#Lc)3Z!OHDCDJH$i2>5-qef zh)DbII(Ndzp@nw*a~z$udU>QbDz<_C5)X!l_-f#GG9Dhi0#&*gV6x{8Z6uA6wXZzp zB>Yl)wNlnjU?FBLRy~vVVoQOivIrq>TFe;d@4Ro0l^F_sl^-WvF?r$7WR4gWuAU^7 zB7|c1l7%#6wbgVBlaK80YrNdILo}$PycS39N0k;_X2@5ajr8WFmvSW06NACjDdVahPpWgf0P_j;_OD~Oy2mc|{xn`l{B4B%T-^6H2v&}Bnrt$Km3U_J<6eJhM*>*z` z;q8%WyZhk!2d(W8JtQrMB?p?y!vm^jLdw8~=XAHJJ6OIg3!tykR59&SgUy#yA`6ch5q4q0e@yi+0GIS}1=Q{YIgf)RAn6I99na)qCyqgE8<~U)pUqKGo zd~;4Zjr=ecDQ$he2H1&tzBopS}Eb z0AZcSFN7B++nDT*?zs%xqhjtWon1jP8%Y^DpQ@c9xf~(1C^mi2J@hMN0gEz$E!&E@ zfa7gn_tT6bS~}#*r-CQgRcgpt(4UGv>5bKXUe;SNLK=E=y2J3Rr~ZJjAp6omZU7y% z;Y(O8S_7K`*xa^nm2#U~FsXhwub<@FA@YfH*Ut6J!Sy!=@5=Xn&XFRsW;Tyjep#t9 zQ`OUUa>~CJV^K7a1k7ya{iD5z1%jPz4tQg#H1T%iKO(3iAC@W|S&qEBGgT`+*Pq}`p29k7~@`V^PZ4e8V)XyG+ij#1{{NGxysC5tK7W$T1E`j?mnG5+NetKour|x7= z(Xup_7F_;Vx>&b^_-1q!T;A}F6r+@}(5B%*bF$fr*2mKi|C55S%<=K*=?l}0_l5Z8 z7y3JoQ~@7;`t`CLX5rj#`0s9%UUP+AtxJ^Sc#xDZdmU|mu1ae{lNg^#zj7fvx{4dB zH$#l2MrRu;_7i*kWKunl>S}<717-f4^!7WGbR}ZPOX^|~c=ZKEKdv>fqE{B*TQ*toU%KDRvqSAC2-lqUK~R4+}N zP(wPEFUA@&aOh*48A=xXzC8qQo%$SwpY6;0(p}^XI`BpuL|UIQ)Z*-JukzmaS}MIW zn>gi&6#gHNg6Xmgig0?rpLILE=6S^8KEc1=gm3844ejE!T}nt6`rAq?$*BI>zQ$$) z#`!X`%3m*ML?j5IMw^01(ZTOwE^O=V)C1h(aF0WC(&;{Rp7>9(h-_f_tY|))G0Y*FJJvZieY@9^nRG?VC6@y zG^8l^_X=3xC?w(2aaVk36w1?7j)dLrNaAT2UFLaQ$J6EL>A`f~X#ke6L*t55INe1X zqow#x0nzokTzt^HKQh_vN>H!z-vZ+!>-#8K&adY}jwE}f;Cy!L7zmPu{=4dQ@%iZ0 zmAcV@JIBgIgqZAqg+x-u=1LQL1c5iv*Ni7&p^ywZ+x$YHvIjacYbR1HvJql8w^6jlRr1B(Nf` zsE0ZCmXI0TdCm>LBe-HRVT^edc}T#zgx6RcEc>p;>38kUEm)7b<0x~Mk%~CZOw&gQ z|1QSGEW>1~uW`(}q3(Bn;G%Lp3(hW;I!LWyxEJmWs` zHfb*eLnvsBo}ch55F+?pA3Hs2gi+NZO&>d&1#mf?fWXSM#Ce>+;dr`l!NU_B({B|& zCH9CpJN+>s4C*psUJp&+mZ1L!={y}4Wx2u3aMfVfVS4_jw9*Yme-(b3QDAfZF~!Xf zqNuy;#jYry*oYV1tiqKfVwKb94p+h{;*AFPOAKaQVh7)Ene{;M2q?XrCmIThho^H3 zBV*9dfh+70xDrk$Crf|%7O0CgL=)OkWsnt@|4iSTP;ws)LECP+53u7`CEL!$)>8Ne zuf+VC2CGq5f>04AzmjvGmn9mtnMgR4J6fA;iqGW*afn^E3{*Y7)Qa>P(P65G!@I zX%^7d8yry$ZG5k`)6Iy(%PdRb*LhUqikdP1#x;_FTgk0r)2`D`%vs%baD*>z_OgVs z4N*)x=mW18*v;N=B0^Q=r1U%ngNnEw=!!kI71I@|A}u4E*J2n%b+`)&@%u^A&~ARZsj+5TA~5(bYV56O zrRbsLeGa~$SsL!?8)(6=#!qoA`=yzAY?8+IVs}}i;{284-Ss>HMI}i*U3Y) zJY{Cv7^tQ?GU3v2*k1+!LZqda9AC*&7CmAlzmL+U zuh^0$aXaQ;?f5;7GI(_L(nQy3;2!llGTWHMciw_-`#zGn@&PN0jd>fJ_T!A0b+Me< zgv)QE`tgc*PJOdC=|0dz5?D9&*1!Ck$mh4tBX&WbYU98mG(FMtOzPcjeUZXj3%F$S zcvUBa-okq+=}UVYzy=>WDks>6$?e!DLlEu0UyP}LOB2^MTBc-bj36hAq)w{$No(&t z%WK=YZ*mr$QR;d%At0}?R-dRWG+{Wz936w`w)-gu$AQ zd@lQs?s3wYOV>0?@Y)w+ZVb_uL>|c_XRZx}&_Qxc|LYxh?=3c3T^u@cWy%G4kOQOS zR3Eq>u8yhFrU4gqCj8-U}u72%+mZN)^G55g;4Ow>2(Dn=!%frc!vJE{=6 z&7{scbA4fwP5D&7Cbl)z_gt|}arEuG_7V&zNYMjN^qsa5|`xApeXn$n@Dv+wD{_4lD()z$_b8?AlqLlpHHi-WS3qh zCmHE7Jt2Sd3P=a+_4)idb z?X#NHz3+>0Mjy6FoPJQM0n7KA+t!4{S4iUsDX+QWLBL>X%NDjdlR-RNeq+(f;a$6H zdnf4mojo{9r?C5C;xybWyJ{^fz zT~p;!;xRp_HQzihbFsNi$w`eUE5m6j^D9bTF}PA0WUD2C7m7njS0~W{mer%dWm3>@ z!>qrgbOkfDY8kmU)B0u+-O}O_YjXpAiJKEM0h-o2#Rdt7Is#hfZB``h;0@bK4Hbll zE-zGfW#hMks9_$%tPJf_0E7>6dIYYB+k$ikU-g~CU7a;#JXxAj&W<&$6x@KgaNzax z97r4z<~VS{1wKpDj;PvA_LusHDbuggz=Q@RTFQ;);Mpk8g1Y9Hl_ve0Wc-$k-^D+p z>Lc6~_ZrVtOUf)*_KO>`T0>zR4E*jBw|QN?*urAtrcCazp!KGY^D0%g_Ez(h-D51b zWG%a35Ki9pH9rqSrbtW}iP3j2`JxBs?b9}rT{_`*V)EDKVEvDRd!2T@?pa&xZ1u-@ zV%zRJRC6euVnk~muY;(rNb0FWeuoHIj$Nt`86ofIqQus!Vy_x@c%1+2OmmRiucRNb z!6-J*{UTZq7x<2o(!x&XD;_kl$+}hx@CLmLj1lrt_nX1_%+(yG2Lp}9_Zyt;yG5QjK%L4(sU}#)|gUl=3WE%FgGPAO_}~w;CaD*VEJAsoVADN>%7R?#>0A$8JsA$Anl< zUSnI);yhKjuIZ8p?^^r%VH4QFv+-Xnko~Mxm@_n|Oz1TdX=Fi&y(asdh;Caz!2#Af zKYS}vaj)WGOK4%NDr7I-UDJ>hCPs47))g!T$cdqQSQ@YDio;MG2 zaFOl`sTv{F3gnDOp)}AhFW1~WgqEJM!|U@!+R2jM8F(dSB6}j8JAgBICse!b$(`=h z2iI>L^h8zusZ{B4_*n&82UTsHqCE10O9{Clt*01_Pzr4n2|%ZAr8Wfh<=n+ZU*#;z zn!1fB**v7l;z)%OQ_Gp*QSd5jXBbKZ7yizbTl&Nj?;>x5D7O10A802fLnq%EB21?g ztNFg1IKKa`(1b_f3T+mXXY+jeXzdQmyn9AS52(d%@zh zvc+~Lw*-VZ&FGNsZ=#ZJsXaO1dIY5#J>2(g_D^?+$Pw~2h_f{dwtvN9V>e`#qlz<> zrqnpK?)#odzhqxs$`F$|G6PzR`Qdbiw$##$PL1XrYolKZcJtkJE~bejUtn(b_~4t* zvG61h1nq{AjP}=+21db?$Y}Fl6P*!Ei-pMaTzbY0l*RIHImHb+2Q=l|TBE|n`iiWl z%a4#={-+NH$bnKXOx02ygY72K-DuX_zbhQQC&rNWq<@=@x1yfLX-J>u^JZ_e@k(*X zBnU@2;LKE$RI*@e*Nj&iiS?hj9U)1>c$Gau$-yNGUzlRUe8YgOOn<|U`D!#S>D}H3il(;Vrb`l=}9mpTYr&b!yRM)x~ym6eJ7DlIiG-L zjzKARtUWdxjC+}f`BUnNTrGx5`3QkFko&yXD9&!b>9s`gculgT>E@{W{clzKo#M^@ zD_Y!y!I(rbvz+l|MZLC_X1QpVOrkn2V!vPyuRPoZ-#m|BD1nnStJa4=Lp0uN$aKgGgBg^Jk_Q_-wTN6_AB zye!?q?r;1+2a6sZa&A0A;oa;WN6k(yKV}SHB8BUV5SEaBj>Nr(xkphnU-hI;3R&mE z<(^~kjc1q41*FMpg})_Bvs5-uM<)?6j*IuaY*Ava&!X{dId)=q*9+F8a z*VQFEHXw@aT##9Z4 zP7X$YhU&Z_e2U_Wb%^7S3P$%eXMnniteMT<-(6wK*!b2*=u8W)W7$M>@&9>$Gq9vU z5XbU8dd`754uFz)84qI)RnliA5nE-T%YINUMF_s#3Dp$ud{>Ry7gaMA+tnR%6W(TQ zADlX{T%$iY7tE>YNTwW^>l{c-Jb3i7+0rmE=gwLiZ)d{e#f4LMqiQ|B6!eGcqr@-L zIF(8KJ^8de#AQ^rO;Ch!0gCtQ%d;JfCt`OvQ}C~3%obL>w($CQ!N?u|vrDXgn@9C6 z7O7B5csQ-3T~7&>rX^PRwBcwdSsd~yjSL%0Y=G(6e5n5z_0kzR4kNDu0`fiZFyW%P zU8iSuIV*tWNz0Ykz%VVpj~<0Og@1TRfMUrZ;M%alp(eq$Wy|)b>yH?@KUEOD6TO~F z8$-Phcxzs;8rL!I9Aa3N%*WTKE5ohEHP6uu=L!DPAbdjy-ZhUr79A5 zhgBV^ihRq+^Jx7sBbi*DSiOOZD1+X7Ch|Fj5c=c-P_cxT0&3vHPzKlh^O%DM5%X!$tj%Vas%2%$6H>nK+S$&MtFG z^UbA|DdI`Ykc0x7`nGlPVJ0BlJBBY5tCTzGjJX-pTV}wq;X_)jW@i;umk+_fY!Hvb zvFdK;tgAk$GlpLpr4I(_%QBJQYJ5Qh$55qg^Ycz%U%ffz_}8XMXFa+Joo)}x5F9R> zio!EnMJ~&g4@w&$m?Tb2Iu$M|LKlH-Y)M^>cB_9>`CjmtKVef@+i(4X1MFvokN)a#d<-KDs25&ws2S;)0K8WIS zCUWVl7@s}mZlu@0C@2h(NeFZq*JCWdxnzV#@ijL(o~(kqCwb&M2AUb*EZ$qsCVYXC_Ex#A!bhWG_X&h zJ}H|qhFJ(LO2gxArcEfy@?C;iWKu~{v1xc%?zPcklJpio!p=4u z6ct1Gf_%l!-=e)J9kDz9{4rrI)3C_rNqP$S2R*Y|=&)+y<{H@jRd`!N6Q?9wC?!ii zXP~noC8cXD(>*BPv6pigH@O!ht7EGU%g@A3IGs+2~ zng5r1&YS}4PTXz@T24VxG{g^EnSy1CD0JcloY8D*idlrAb)T%28;r0mkC8*;o&0yb z-(imPCE(Xs{|!dMX)#MC z3MZ#QT*7q=#R3x6sijcn+N`q7_Ph-}$+gA#)*88y}@ zWFIoNMD`^#24&xkt!&8_8vBwgWl7e^MA>B|Lxk|{`Hbg#o^zhx@6Y?3nd>v3``q_6 z=en-<`xVEVVP`uH!7qsqU)0o7ovf%XkRCR^do=9th$~}*nHaynjz#SwuRJ-~=Tv;E zvtu+qqbp5Oi<4bGD9~5oJ(~f=1HOW~Uj!amBGRAA@|z^d8;T3L7{DpH{Ej}oMk|o` zKFbVL&l5+`oCPQY17q2fjR-4)X08QBltNJVv4ye33i~ zzYt3mW^P4vE#m+jM!?LW_rWiqJ2Llkm|-0H1n98lVs5GZ(nH9lJcGJA)YP1K<#d&N zWW*+9$mz_^UO(<_AcVfb@o>q#MnT@oxWz@V9Ym;9qD2keCow3Pl|YKxei}-UKRsJ| zLfVr94c>Y2334z>J(5-P@-bQ25+~koJeX4TOBi+zPJWu^9Ee&*2I+@a(bc^B(l|K{_2d{# zBk80g?NEwFz_@FkLm2{eJXo|8ALrG!OWoa)#Ech-^otA?RpvTa@6on}wN`5fEfyrT z4$SNZiNfiTy{OK{^**EDXLxCMz|*0{W;8O(m&eA&RblFAl$&Yra8jSyr^y)y6WfB# zp$j50S_kbkxC@SGe|&`x(>sePjqkdu zTU)m7MEF=s!gD-nAQsWJ>^}$?`>j`&ZzXj9B0{AgmOlq(?=nE7)eVYi{4P8Z|Frg3 zcNq5vg(tOzIBsfZ=7Fu=>RMa9`SVehSyh8>X}S}UyVoYbDH8h)m%np0Ga!}jL)m3% z@{OvruZ$1Eu(^t~YM?>pnTn(hB~a5^H4`-|Em5FF&`ONp;~A#%V*=gtUPVoOqpPB|8nA#oduK`f0BYBT;E!6rPH2T;)01P}R!0^W_? z$4Y;M?V7?Aw;%E>^dEbkHxM@FkmjV0n}ja{0}Aox-X5ZK(U>ZK@?`{?I*oDBUWfYP zp7i3imIkFw^DkGCdg)1qI@T6k{&JIJ{IhpESmk&EJBVi033_hetPA?m_+?ct88`H; z^5bV9Jbf&|yZWP+a!%7-ug)^{(&zv!8kVap$-d2XqVR3jNTJgJpjWp;DjLT0t08Uv zeNg36J*uizt9!b%wuFy)RnPkt5i6?SyG##tW_w+ysTb3Z0I~!t-1NMlTggUEd1 z`gO^$W0q)saCY|1U;;@e^{fa4>zftBlH@+!1NgTN$c;AX%aF0Ceoe1~>MFB_<*D_M zd=DOrUtTjCPhGRig?6-GP`z=@zm(8aSZVlVa;}i!>thqGnR~A2iHvOWbgcqtI{76s zkdHgFy3GG)oJPQflCem7tsf6R-+t)WFk0`ov|dsl+(E()J>C%8Y>n|hG)AwK8k;WeXXP2;wEcC3V$vY9^DNdC{_nAe@4$=jEv<6K)JhN#OV|m|sOM_1(ro zCXkL>Ti;sm*L}48g{ZUnsNhn4PD#&X%H&*Cy-l94-n`PIKu5SYa%s5!ytZV9zi}eN zRk5LNNlYhtWB5etux%ejs;tSEQHBXS28%Y;_mV#laa5di?9~=SaMesVjDW@}p$zl4)0|=Y*@j=e)87&em zIEg|DJ$n4RekJcmHeSPjjTbC4YRw5ZZg2>ZD`3u=I|CDqm*ky3NIA5Q%ETX4*jRAu zUS~2NQdT%b!kl=5SU%JK?1v|!9H%N?4zbEp8{-bdJvEL^VS&+jBMs7Qlfo6R?Dped zc1Ewf#GUZ#*3KmJTFktX+lXn2a><_TtR)g(!e-PmwT5MeGW;CgI}|SmpO2PnyK|VYLZ!Jc2=J2j?ovJyux&q){w<}IJv&xQdRpI zWfHT`aug}i@u)2Ky3zWoiyMF!dk4?&jn+v@S*p z&lWg9_oda(eIUIj&4Zm3JN3U$S?iD#e90EbMv$sGg@@5#fqYM;go|?oz%w{aHsDta zjkf+Ky3dKf$XkRZ=s}MDt6Oxe9M5UW`=7TNSLYV@;b?y=fMNx^ktO5jib*tqi|%hoM-NT%(B`r&d~=O$??^OjwOlg*bM@L zD3n#fcbXd2f_KYRHuAl@>BD!A08vV-?o*CSC`L1g zN|1=gb10eDwl3toZ4Q=vhxo#K^)A}1Pn@7Ly3mF1HECUHgP z&GF8p@G2mT%63~*{hCe3H&#*j_jqj%^CEv0vHP5*g@RJ@{MI?w0h~(;8E^MS=Dd?Q zQSR!?#M^dZ4Lx$~%4Faq!E*?_Q^AOn-3hO+?LnQ0Pz*YsXj|!oewqMv0M{@dQ-1^gDr*eRIsEghdHbrCkKulacD#{__@Ob< zGGcDz-{Izkwlbn$Ymw=-DZ-lNeu7N@*ZVHdZlm+gno|2l+x2EwDDyTS-Dr zEUz}qfB&|tk+H5Q)hcjQ2-SgSp{*+@|6VzLhZO1?%cvVx2)tb?SwR|mM$s(GEtF5fG5OmyBfmL6vfY+pwxZAmk|1@EmupU6MI&8nGxIzqb zxba61x&~5C$R+-htDZd-Cy!bg$gwgofzoWH2{r`ZpFG@4oUB6cR(wy2T58F+Qm-o| zw`f)$nBP$4NQ)cQwl{z#l5cPIPNK68#sVBGvJY=YE~pa@9|#I!)oHRS^i~b1gBy_4 z`k7{@9l*Q^m4Y2bnck(d-8nL0BQ@s3t!_(E5?6z2BNaw1OCMZLw>4_*mxXH`|8&2S zaNnQ%BFv;dP+Rk)8P9+h)m=ossnDM_I}Q-C{^@peG;I_LS>%q5cbKmUJu{{mAL8DY zj)sMa+=T@DKF7_(Kv4N#=IFJ!mkS-Xo{S(ihDWv3#J(-R4Tp^jZIPd>Q$5W6cvszh zdlV+YOXYW};SN^|xK6w}@aV7|lX&p0ecyxTa(VRUhhZd)n8P@IR>~;dMUiH_gnOTR zIg#q%78ebnvJ6AL;%L9@Zhg4Fna}t%OG5nWU0mB0%D{Lk-|+2mYyhybfV;Cz;*LwX zbM~8tjyuT7n8@MBjgC9G!_x{H#kj20)S-$giCW9?!XD|0IF5lFMp|$xhO_q4IV&g0 zfWVp4H|kgu$%RHIGotcJ{rVx_4OSDbfSbkDC)5Gw^Ojp4-G>1WJ|}mF0jsxXl>vMv zce}bzcmJaQdbmE@tM$gZGOSo3{|dI7cdu}Cn|FfmdfgC`Jb|ToAIZiAZ0CfH@XZ<~ zK0tQ_+K;2390lGkHMyLKAjNechFC{U?h(W;zvPHFHqL`ky_PGg-|miafebd!dTZd> zU!I=Lc!)U=-QQ()hv@qG)refEy;Va;xhkZ+x;bbWU-I57pZC4}gBvgawE}rARLr+{ zIJme!`&8Ps z1l*2yeC#;-*df5s|(PNOFj|F!_%-QVy-huWLUJCWt0TTr9bajtZ=% zLpE;L&?N?_TJNvM1Nc|3#ym!bzOjx@7ATEY2HfraV8ukp$B++F9{eSIBMR$f{br~+ z;8Lnw@ngSefE(_Zr35#e$jkiCWM(Yz*sAakjw}87aSpRTlA;HO>k=0l1N((``7=Hv z0xGO2%I2sDU}YFH1yHOj_faBAT?;kJMRxLZ4fcXLCgX*~%I8Do{cO=H!^6zkaU4Yk zWd_W!MFFwuqq@D(2fgF>%t))mL18bwULhBU_%CS-eAQjP5^Yhqy7lmzJlVx!f|c3M z31eej{Z>)@DntGebKm`7Q7P;xb1H7vTYYLP4aoxox_zl`+(pZqxvdU}OzfV9B#lXI zOnFUioWqPOY6cP>edmH>zS;B{{Q;bGAv334@SRc=%C*X}JtCSB*5P31&1M9cl4gr? zhnzTvJAw@yXGw+>7ojd;0cvu*k@q1`Kk36^CDX$53JLLdH$+b^3$1+t#rliR=Dalr zVpVqEP$0RBli+J3>9Hfu-EbBsGX>`h(oLiJ4S%YhHIhSwtdy|Ph)7k|-vX*>IC!fW zbBCCGF5N5p>~XO4y-h7(Qjzidtg(;Eu4aeLJMBUvVmiD9PB&T)5Fy-mV#^e=2#XnH zp#IVuwEwU@>(krjRC?D2P|fC|OB`ma{oMPN%;JZv(^F^5 zI;*H3`VPNb&2XC?qzK2aw|;mz5W8OXdGKwhC^Od;c_%UfWa1ee16Ng1LE5cxl0E}d~9ltXa3 zne_$st1BKMm=@KD^ErbCgP1(VPT<}-vZZZt{|3R@oMMv2FRA(4VU7;oaL4!~up#J% zwX*d?Mf8^T+5Cpc=G#-cw2&aXG`DFZCO<_ABB41Wa2oeU8EQ!x2`2KGe z;_!2?d3eI}sGmF<4hM60y_6iznb<$;XvIFbWnV)-dmE}E#bkUeAsV2P@E5(wBMGFr zXJEdYq1%PQ8&-){#pm1oe9p^b94GHp-EGoPuRhaWIr+|TMjOzmz0n>oJ9yR)-P-N# ztX8Iw?S4zup0qPN`&oQGe><=_wUl*25H{F*vEnms=ss`0S&(cz)GnVfgyePmHedZO zxk|8aj}Kz~vh)vQmha@qcb@)q=OO0J5uR}Z2_*U*eEjyU*@6LX`UKQ3>Jq1lfxB0x zRwk@ugLzbos%bID-WK}?BFzx3@c?mP1x-l`nO|r+05>oycCp0s9Zo6;nwY(Hj}~i( zlC#3rEu|M|3kP^s5;_<UHa0MGN;LIu7}Oak*iYsTA5R zAp7ezfy+O6$^YabkAcFUPH1O;vb%igsZa31zjpfEDZHQAz-q}5xBiP6qqW8h#K+>8 zbQkUSeXM28N6iWa?M#L?G8>5^YCUfZ?#{=|P9W81|gv`MCkp#wQ2$agCKR<1fmD8aA|ZP8>6+BKMkUEd5v9x?0;>1PVp27A<9- zFr@80|CYk^{ZXjqK>rR|Bn*jW0YAJX4VkSxtsU>@Xz6cfLJ|Vla@WO~Aq|y4ZS^l9 z$TOytsV>803(~><0{{lf%^_6;}961OnM?EdjXsJW7r@3nZr3Rltd`-a10D7`<8a)->}OI!=)5W zxqI&jzKcjB5MD##bp7?U0@UCqbJWRq+pR@0p-FZe1?Ke#Vi)7=N6xk`M9%mu>W_pe zDFZ8&VB~$w3$%p5jSvvdJ-!ve+A#>%8r8kVD?P{95n z!l>ypyMi}Ph>%Hlqi{(;#XZsbDp{Mau@vwjEBnGL1yti`io$ zg0=HCY(f@)$WeF4s@dkqU&Rh%Rt(3+jFH0}1GJmsHq2KY*U5 z3i?zw zm%r|_zn$&+it5|VpY;V>jDShl%iw$mUJCO-H8IIo{LmXn)+zll6*2k^CS&4q8$@XJ zvVg_qxyRlzO&!h{ec+% z8O_qZ^;A-5Bk|3)mgcz~H7UV#zT=~v0sIJw>Bp>qvOmgmm`+~;W zsx?P}azUwis?{p9Fi=`tg`->y58N1z4?@Y8rk>hEu;$HeCM0wlX%^}?Nw=r^FEkfn zUFNziTPD*`>aXR)N$oXebQ$-q#%GvdtNu3-mwEH#@AOJZDFsT&q_-5>`FZlOscw6} zzlUNITU=F}^#|u23z6FWAk+?$1xr)o8sTY=WtrKsvwBepWU957 z495jwxK#X=9rxb9*Ftc`IirZ!xNj~F1=0i@_!ps&;i1QrjoxZ{%c`ncM;(k$7?*9< z^TG|}1M@6!9vq+Q_&N-o4Ks_J)}nQ>{zc~#F;z6f2KL?m@x-evYyT*cwStqQ^(a`c z)w8+_Iq(ztRu0UCcUq^i47mi$F|LN@OPe_vqAtsB_QhW=-W=J~3F&Yb<{XNmWQdwg z*@pk4Btk?O4h1)mfk3?;?k+~Br?tDv=4&m9$96v6oWs#@{#qU^HEI87V&NnLgXj}ppFB$4IQW_$tvOFM-gZcj#^ ztBJ-B;$wRm$YkZYi;3xgcXc|W6$2pCN!DST67Jc?B!$T3UT{Ky`yQZsm#XZ~-)$Ok)a5yKY0 zf9P5CMiN@gl)jxG&lK|+iKmqxS*W+I)n$rb|2Fjh$p^K5kYb-nT(g*E1lpG zBbRY_Sc(1Dz26jDLP5Hu#BJvBK)(X?$ z2v)RQJjgmw`JGs{U`x^uyb|?i3sw&g5iPy{C)Bb7g*`cxNLn4g?JAQ~Ex;@yIlRioe8%gsPA~ z1+rFTT~en1rK*K?MVU>9QM{R6DeuqF`WORE$g+}e*Q84I&;qhIfi0Cb`zB=a0eEo= z5hgP9so6BjwjYQABk@U2^T*Y5BuGIo(njiaPM~x<)k$%lRSq($Ge|2kl3p+`9Up07 z6oQw>fjKulb`NH)p_r1GnQ2V}a=aEHhg~;pg76^E0Trqg>-XVcuCArzL=^j zgHxVgX_=P*q56P_%gXc~CaXFzIep-BSL;0nw4XEvP?bxyl9=8|JL{Fl#lh2_pD|^3 z9-y?0UK{O=MuzEr6dLQ#pv%q`rFV(~ccnPbeL-^i!nSA;nWf**@;JSSM;k(vXsOtv zD+YT65th6qAxI^#T>v5S$r5!B##lo&6;P|TUPSm&NJoy&Ia#&2vt-9PY_&caDkE^D z{SN>|Wm(Fa(BO9vsj_G(X5RrIbm!w5hhoY|0#GZAefJoI6N9~N{w~UJ#T5`}l)@oqZVNT=T_+bn)3hla zHhGpfJ%L zaqRh|`7(=qrh#e=;5z*_5Zt5*5|Q(_12;J=uKD6S^w$k06Fdzw)}@g+6_M;;wE-^> zh&2o*>!|4ur)v!~*hx=kAh1r4rzF$PyB1+eS1lhs*$5FmX(#%x_fbj@_1Q9bUQbw( z`71^`l{-IMi)3mZYw#Qro?$QRCqdXJC>n+{;rf0ocEAVPr6N{oey4Rm;U z=?NT@7f5fLU&qPgEVje;3~Y#b7)r{M%8>nZ0Q7Qep0JN0h-5<{M`0CRdnfg&mk*bd zk?d+2rQX}iUF7usS5Msb2b1+om$NqkyDFb6vd*^4y?hd{-eRrVC!k2EO&DwVW1If+^3Gm#tEU z;wwzn*gd9+@~&wwXxc9Y^G$jVR;CjROa20-$#l=XoX=UbXe-=X-2F9{XD z*(e^CTRq3q1gZJ0kCMI7?%U7~8!nJz1TW=4UR9W|X@M6ifQjHd)7b&|)1Y@IvK(^V zAU5=^6z9QH=Oba7BkW8~v!|4P~g zr3iL7_Jm2IDK6y;nLL-V_k?&=SYP zTu6t!5^v|)d|i$*El*YF_-83??H#E@C9CL#C^pE zUH|Uj*^HSge8h>>G&J`3e*nVkB`NQzgk6h4SG`fhX+2@MmNGIiC;$A&;@O^?bY$&D z(jTc}?2(F$So1Xcs5Q3E=ldEJiiB1X$l~t&XjdgACEZ7s&Sx!#7Ba-o zUcJ;KtEmRn!l_F)DAk)gJU?F0Qkb!#_$$sbYQ(T*;mu)t9p6{vvDW8c zeSO>6KNcb5|NjC2^ZvOKcaY17u>eF)Atb7v2a{UhS5aF53WW2X1rrWe<9#=6F*mKy z9{F>@T^UOm713-&JI)RwM3Iu6YA3K|EUaYz9dTFJV~vs0l9id=fC)erv^|d^(X0Q3Fi@pgq(hS8g?Q2IPcApnaqmR9{M_ne$~A_>)(ogE=TNuL z;Hd;&^#>`0fX7UNr`lGw{Z4oLt+xqFRO5Hq9O1$hzsweLhJ^#LH{=|P-nmut#T#*X z8AyxkGCE0cIYj~T(ZM;+*do+YwLO*x*KZ;I0DBc#?|0#JGH^LnSl7%f+2Sf~LE`dz zyLnID1+C1|KsP<0CqzioIdp7T;_A`Q>k{{EUr(##f}It$z7+fzl}z^5BeYURq7orQ zL=PSaj6gaR*a$X<=izKOQ!)7&+BkQ4=P-H{{R*r)1;9o`G30$=Z7+67&^XP%fl9!? z{vw2jILv)6K+QW_WrZQ zn+4WbFOiTCf$Y#q`YMSRb3T2EAnV1OFTa{|c64h?C2fHqUx1fz(tv}>TY=J z;GwyLNQ%~Nh)%*-RgX2?rV_Y*tAMW);O(i77X@V@^OuXXp{wD=&NSzg=m0{>{yh|% zOu`<5%RX!E_90!V)}L@!RI(ymJ7H%8!#2S zK1f-<@E!f}&|q#6deYz5r1s`o9om&6KF{zVXQ$6XZ-eog58rUR@Jwml7Kbt}0LA<-@ zTL&D9iqwdI)&Hjl%x^HMm8hi}P`T7`T=#?}rIE87WrL~zm_15r9Rjr&jJVoLDHZ2V+*xH<;Y zc9kdHnTs#FD-%R)c|En{*y#mg}!AOeOxE142a53y__( z&vy7)Ja0l4CY&4ldt1g|+pLHcC;zZwa&E585Lp-*8c}N$bN<$ULfwpuiY&;UY z7LsHvQmwGo1g76{n8_7Yg7^f^L*>Fg{h&QOncJNxD&QwT1Vu#52Lm};A;>$_?JPXA z5bXWeVQC@tFZqU^4VmWxbUQB24dzE_Kyh6+{aIR^lZz|f7biWwJcXaX?zFLyX@Ze9 zm2?|hMI)v)`+}^4r{yri_V+_2y+yCga1Hs^d5>-lPf{x+N;M-S=0)1U{A`IQ8(KKf1&c8d}RDRIQCt<{|}l9;}@o9UaP{q&ajeaW*mTKQG^k_D{{#ton{9n( zAbwlXSQJM!`jsQ00SN$fbwFb>i=2&=C%p!cu&Z5p9kQJU^|I?s@34%C#@91XX!9#~z&j261d$e!?TwUCH!XEcz<*EIOa9oW?&lBF{b7%!)-6;G%}UFF1-os5 zT!EKP?x)b2^=d$5>~_ItcOQ~p)P(?)0FsDDE`Ydv?`wLFxwwQtTNJ}!%C%72IxEL4EV>)Wt0FGi zt=qgk=)PgwkNq6;&A$OAIvh(S>orF?=j&s=;VEnO8|00>=Xr88Q$6#2B{F$6RTX)M zPU9M3Hz(D#8Uu&REwgrWRW!*52Q7#Em+=YX8YL>GpiCGBu%^gS3)dl7le?d!6`nIJLOgXft zYRKy|yOXyX>6U9*;xP6Z)wAN(q}}4lbzLRW=H#N}#QSv8ruEE^s}&q5f>|UmK)4VJ z0;r&sF*S{ARBJ?F2l66~j$*EXyqT`{8{J#nDQm|wxfw2y+!Pkq+;CC}y3ojCS$@7Q z#;-D5>!vJNf}Sxv4OCVyY_PE-%Q34PTrj|n;`mS@Lrbb=BR<%!l!D55j*Tt>kx#FK-*_}D*s`q*pN>Vi;+4@x28G;@B? zKaDm&V~(5j`@Udzw57u7*BKnR6(1rn0{JDKl(V6J3A@b@BuVs^lt|yZHcC*3GQ{Sa>sp+t>a8cV(Otfdl!=x zcDJe?;r${-u=tHB!+SHA)qs~=Hts7ApQB%0*Hhb~%!rS@+zhu`vQMO7ggW&f?h@{C zTyLIw!1ug(uoSu^BZQ8tYn=v)iq~CudsS_WaQaX=v&z+56d~i;Ci->KRrPy+r_k8m zaltw7MfD`>J1i{|g@xOG?b5+Sc35MNG!*0~*jB4}j$X%YD|E_$oer=oFYwi^f42THh`86m&|D`FFZvBt)+cENZr*@8p+6 z#9&v_=mvLbp=fZ_FhWGn$Odj61Q_wJCrU#Z1IG1y={V$anAB9-A7p>$e&t{Sc|U38 z(y1Ho6Xm-j1grF9?B|)7;BUU9Vw{)CEG-kWpX}O-GEO9n+hpeL_#zi7N*ifJ*G00? zPGG~xh77t)UH$PL$(RhPX@JbWLEv=*+D8$Xm-2a29P9FB+%kFBvI)KTd)q^!=k;MN z{#w(WJelNyQ%+C#^Bsw2L8IWLy3R&_(;x2m{o;}7J6(*o5eFer%_So{tLNbUC1ifH zC$t9np|&9+Tl>x~1NAdC-?65Pi=_PvTSM^!znEHX@n2#+ea)ETPHqT^yD?>9qlN|u z7Q$*ng=R5sA*NApmfWN2?$-Af+c#q(sO@LFs*PfO z!_@5Crd`I^=ZltR7G}`}a6k5s{o=4>?4w$Yp;TjC8`Ii1R5lohAwa}XA6R4b+4~8{ zTFX1CL`I4kD4?3d>M(jQrNqOC7)q1V*EeOgEoG<)HkKi$EAjI>$O177Z4Kh} z-Y4;uxQJzFHLb6364Z3}G+vh`S3B~R#sLZ$I;#mC%Na`XBx`J_xb^DdkW)s&cqX<_ z3q`%h-rSaUQ3?6N{2gHo?fI1!v^|wHWWgMWE^BM1P2O34eKr5aYwvRuY>&z{_tv&@3;fJb_Dn@6T_bIGe|Mn!z_DUBpCW4B^S8*G_^6mE32e>w zJ$UAV{jn{Mc(TjnZhp+aliE1v≪⃒jeHj?1B7YE0<0M66$MV$ZROAN&+|oQrhH!l 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 Date: Wed, 24 Mar 2021 22:15:49 +0800 Subject: [PATCH 35/40] update assignment-1/submission/19210680053/source.py. --- assignment-1/submission/19210680053/source.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/assignment-1/submission/19210680053/source.py b/assignment-1/submission/19210680053/source.py index a7bdf92..8d25c9b 100644 --- a/assignment-1/submission/19210680053/source.py +++ b/assignment-1/submission/19210680053/source.py @@ -2,9 +2,6 @@ import matplotlib.pyplot as plt import numpy as np class KNN(): - def __init__(self, train_data, train_label): - self.train_data = train_data - self.train_label = train_label def euclidean(self,v1,v2): return np.sqrt(np.sum(np.square(v1 - v2))) def fit(self, X_train, Y_train): @@ -103,4 +100,4 @@ if __name__ == "__main__": model = KNN() model.fit(train_data, train_label) k ,acc = model.choose(test_data,test_label) - print("k=",k,"acc=",acc) \ No newline at end of file + print("k=",k,"acc=",acc*100,"%") \ No newline at end of file -- Gitee From f796c989c9a102b99a4888b2a3d8d4470e449ec6 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:16:13 +0800 Subject: [PATCH 36/40] update assignment-1/submission/19210680053/source.py. --- assignment-1/submission/19210680053/source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-1/submission/19210680053/source.py b/assignment-1/submission/19210680053/source.py index 8d25c9b..0f5e242 100644 --- a/assignment-1/submission/19210680053/source.py +++ b/assignment-1/submission/19210680053/source.py @@ -100,4 +100,4 @@ if __name__ == "__main__": model = KNN() model.fit(train_data, train_label) k ,acc = model.choose(test_data,test_label) - print("k=",k,"acc=",acc*100,"%") \ No newline at end of file + print("k=",k,"acc=",acc*100,"%") \ No newline at end of file -- Gitee From 0b97487717e841fdc2e4c4f438b14afbed55b3f4 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:19:59 +0800 Subject: [PATCH 37/40] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20as?= =?UTF-8?q?signment-1/submission/19210680053/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/19210680053/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-1/submission/19210680053/.keep diff --git a/assignment-1/submission/19210680053/.keep b/assignment-1/submission/19210680053/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From 8264c7a9afc5a792816f8a1da3263547e2e2384a Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:20:04 +0800 Subject: [PATCH 38/40] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20as?= =?UTF-8?q?signment-1/submission/19210680053/img/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-1/submission/19210680053/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment-1/submission/19210680053/img/.keep diff --git a/assignment-1/submission/19210680053/img/.keep b/assignment-1/submission/19210680053/img/.keep deleted file mode 100644 index e69de29..0000000 -- Gitee From c81e87de9fcd102d79d59256611f048584aae4a8 Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:51:44 +0800 Subject: [PATCH 39/40] update assignment-1/submission/19210680053/README.md. --- assignment-1/submission/19210680053/README.md | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/assignment-1/submission/19210680053/README.md b/assignment-1/submission/19210680053/README.md index e760382..6ae1a49 100644 --- a/assignment-1/submission/19210680053/README.md +++ b/assignment-1/submission/19210680053/README.md @@ -14,7 +14,7 @@ b.使用closest函数进行逐个向量输入,分别计算它与全部train da c.使用predict函数将全部test data逐个输入,得到预测结果 -d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 +d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围根据训练与测试集数量决定(最小值为2,最大值为数据量的10%),从中选取使预测结果准确率最高k值,并输出对准确率预测 ## 数据生成 实验探究 @@ -145,17 +145,32 @@ $$ Algo |kvalue|Acc | -----| ---- |---- | -KNN | 5 |0.4725 | +KNN | 12 |0.485 | + +此时3个高斯分布距离彼此都很近,进行不同k值选取,实验的准确性最高达到48.5%。 + +|k |Acc | +----- | ---- | +| 2 | 0.4525 | +| 3 | 0.4375 | +| 4 | 0.4475 | +| 5 | 0.4300 | +| 6 | 0.4675 | +| 7 | 0.4525 | +| 8 | 0.4775 | +| 9 | 0.4450 | +| 10 | 0.4650 | +| 11 | 0.4700 | +| 12 | 0.4850 | +| 13 | 0.4750 | +| 14 | 0.4650 | +| 15 | 0.4625 | +| 16 | 0.4775 | +| 17 | 0.4650 | +| 18 | 0.4800 | +| 19 | 0.4700 | +| 20 | 0.4725 | -此时3个高斯分布距离彼此都很近,进行不同k值选取,实验的准确性最高达到47.25%。 - -|kvalue|Acc | -| ---- |---- | -| 2 |0.465 | -| 3 |0.465 | -| 4 |0.4425 | -| 5 |0.4725 | -| 6 |0.46 | 改变高斯分布距离,我使用以下参数生成高斯分布。 -- Gitee From 1a239e26150103d97a5baf68105940a723e565ec Mon Sep 17 00:00:00 2001 From: Yantong He <8850706+yantong-he@user.noreply.gitee.com> Date: Wed, 24 Mar 2021 22:54:12 +0800 Subject: [PATCH 40/40] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=2019?= =?UTF-8?q?210680053?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 19210680053/.keep | 0 19210680053/README.md | 159 ------------------------------------------ 19210680053/source.py | 106 ---------------------------- 3 files changed, 265 deletions(-) delete mode 100644 19210680053/.keep delete mode 100644 19210680053/README.md delete mode 100644 19210680053/source.py diff --git a/19210680053/.keep b/19210680053/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/19210680053/README.md b/19210680053/README.md deleted file mode 100644 index 1776560..0000000 --- a/19210680053/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# 课程报告 - -## 说明 - -我使用的包为numpy,在class KNN中: - - -a.使用函数euclidean进行向量间欧式距离的计算 - - -b.使用closest函数进行逐个向量输入,分别计算它与全部train data的欧氏距离,并输出距它最近k个点出现次数最多train label。当最近k个点不存在出现次数最多train label(如出现次数均等),将进行label随机输出 - - -c.使用predict函数将全部test data逐个输入,得到预测结果 - - -d.使用choose函数,将预测结果与test label进行比对,结果相同取值为1,不同为0,进行准确率计算。k值选择范围是2,3,...6,从中选取使预测结果准确率最高k值,并输出准确率预测 - - -我使用以下参数生成了如下三个二维高斯分布,label分别为0,1,2 - - - label=0 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -10 & 0 \\\\ -0 & 10 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -20 & 25 -\end{array}\right] -\end{array} -$$ - - - label=1 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -23 & 0 \\\\ -0 & 22 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -16 & -5 -\end{array}\right] -\end{array} -$$ - - - label=2 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -10 & 5 \\\\ -5 & 10 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -20 & 25 -\end{array}\right] -\end{array} -$$ - -这是我生成的训练集: - - -训练集 - - -这是我生成的测试集: - - -测试集 - - -可以通过如下表格来报告我的实验结果 - -Algo |kvalue|Acc | ------| ---- |---- | -KNN | 5 |0.6225 | - - - - -由于label=0和label=2的对应分布较靠近,进而导致判定新输入的测试实例所属label的准确性仅为62.25%。 - - -改变高斯分布距离,我使用以下参数生成高斯分布。 - - - label=0 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -10 & 2.1 \\\\ -2.1 & 12 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -20 & 25 -\end{array}\right] -\end{array} -$$ - - - label=1 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -23 & 0 \\\\ -0 & 22 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -16 & -5 -\end{array}\right] -\end{array} -$$ - - - label=2 -$$ -\begin{array}{l} -\Sigma=\left[\begin{array}{cc} -10 & 5 \\\\ -5 & 10 -\end{array}\right] \\\\ -\mu=\left[\begin{array}{ll} -3 & 5 -\end{array}\right] -\end{array} -$$ - -这是我生成的训练集: - - -训练集 - - -这是我生成的测试集: - - -测试集 - - -可以通过如下表格来报告我的实验结果 - -Algo |kvalue|Acc | ------| ---- |---- | -KNN | 2 |0.9975 | - - -此时3个高斯分布距离较远,通过较少的k值即可得到较为准确的判断。增加高斯分布间的距离可以提升实验的准确性。 - -## 代码使用方法 - -```bash -改变mode数值: -mode=0 #数据生成 -mode=1 #数据可视化 -mode取非0-1值 #训练和测试 diff --git a/19210680053/source.py b/19210680053/source.py deleted file mode 100644 index 3fc823c..0000000 --- a/19210680053/source.py +++ /dev/null @@ -1,106 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np - -class KNN(): - def __init__(self, train_data, train_label): - self.train_data = train_data - self.train_label = train_label - def euclidean(self,v1,v2): - return np.sqrt(np.sum(np.square(v1 - v2))) - def fit(self, X_train, Y_train): - self.train_data = train_data - self.train_label = train_label - def predict(self, train_data,k): - predictions = [] - for item in train_data: - label = self.closest(item,k) - predictions.append(label) - return predictions - - def closest(self, item,k): - min_ind = 0 - distlst=[] - idxlst=list(range(len(self.train_data))) - #get distance between test_data with train_data - for i in range(0,len(self.train_data)): - distlst.append(self.euclidean(item, self.train_data[i])) - #make up a dictionary with distance and index - distdict=dict(zip(idxlst,distlst)) - distdict=dict(sorted(distdict.items(),key=lambda item:item[1])) - #get first K nearest position - min_ind=list(dict(list(distdict.items())[:k]).keys()) - min_dist=[self.train_label[i] for i in min_ind] - return max(min_dist,key=min_dist.count) - - def choose(self,test_data,test_label): - acclst=[] - for k in range(2,7): - res=self.predict(test_data,k) - acc=np.mean(np.equal(res, test_label)) - acclst.append(acc) - max_acc=max(acclst) - max_k=acclst.index(max_acc)+2 - return max_k,max_acc - - -def generate(): - mean = (20, 25) - cov = np.array([[10,2.1], [2.1, 12]]) - x = np.random.multivariate_normal(mean, cov, (800,)) - - mean = (16, -5) - cov = np.array([[23, 0], [0, 22]]) - y = np.random.multivariate_normal(mean, cov, (200,)) - - mean = (3, 5) - cov = np.array([[10,5],[5,10]]) - z = np.random.multivariate_normal(mean, cov, (1000,)) - - idx = np.arange(2000) - np.random.shuffle(idx) - data = np.concatenate([x,y,z]) - label = np.concatenate([ - np.zeros((800,),dtype=int), - np.ones((200,),dtype=int), - np.ones((1000,),dtype=int)*2 - ]) - data = data[idx] - label = label[idx] - - train_data, test_data = data[:1600,], data[1600:,] - train_label, test_label = label[:1600,], label[1600:,] - np.save("data.npy",((train_data, train_label), (test_data, test_label) - )) - -def display(data, label, name): - datas =[[],[],[]] - for i in range(len(data)): - datas[label[i]].append(data[i]) - - for each in datas: - each = np.array(each) - plt.scatter(each[:, 0], each[:, 1]) - label=[str(i) for i in list(range(len(datas)))] - plt.legend(['label '+i for i in label]) - plt.show() - -def read(): - (train_data, train_label), (test_data, test_label) = np.load("data.npy",allow_pickle=True) - return (train_data, train_label), (test_data, test_label) - - -if __name__ == "__main__": - mode=0 - if mode == 0: - generate() - if mode == 1: - (train_data, train_label), (test_data, test_label) = read() - display(train_data, train_label, 'train') - display(test_data, test_label, 'test') - else: - (train_data, train_label), (test_data, test_label) = read() - - model = KNN() - model.fit(train_data, train_label) - k ,acc = model.choose(test_data,test_label) - print("k=",k,"acc=",acc) \ No newline at end of file -- Gitee