From 14ea8ed5acbf7136d08b3df0db66ee7ffe0a4b65 Mon Sep 17 00:00:00 2001 From: Pryest <495945214@qq.com> Date: Fri, 26 Mar 2021 08:03:02 +0000 Subject: [PATCH] assignment-1 of 18307130213 --- assignment-1/submission/18307130213/README.md | 66 ++++++++ .../submission/18307130213/img/exptest.png | Bin 0 -> 29325 bytes .../submission/18307130213/img/exptrain.png | Bin 0 -> 40003 bytes assignment-1/submission/18307130213/source.py | 148 ++++++++++++++++++ 4 files changed, 214 insertions(+) create mode 100644 assignment-1/submission/18307130213/README.md create mode 100644 assignment-1/submission/18307130213/img/exptest.png create mode 100644 assignment-1/submission/18307130213/img/exptrain.png create mode 100644 assignment-1/submission/18307130213/source.py diff --git a/assignment-1/submission/18307130213/README.md b/assignment-1/submission/18307130213/README.md new file mode 100644 index 0000000..1312179 --- /dev/null +++ b/assignment-1/submission/18307130213/README.md @@ -0,0 +1,66 @@ +# 课程报告 + +## KNN类实现 + +KNN类的实现位于 [source.py](./source.py) 。 + +### 初始化 + +初始化时,我们给 `KNN` 类的 `private` 变量赋值 `None`,表示尚未进行训练,防止使用未训练模型进行测试。 + +### 训练 + +训练函数包括两部分:检查数据是否合法(数据维度是否匹配),以及将所有训练数据中的点保存下来。 + +我们会根据训练数据集的大小 `n` 和标签数 `l` 来决定超参 `K = min(n, log2(n), l + 1)` 。 + +从实验情况来看,这样的超参选择是合理的。 + +### 测试 + +测试函数同样包含两个部分:检测数据是否与训练数据维度相同,并给出对于所有点的标签预测。 + + + +## 数据生成与可视化 + +在给定参数N时,数据生成部分能够生成一套含 `N` 个位置不同,协方差矩阵随机的二维高斯分布的数据。 + +其中 `80%` 会用于训练,剩下 `20%` 用于测试。 + +这是 `N=5` 时生成的训练集: + +![训练集](./img/exptrain.png) + +这是 `N=5` 时生成的测试集: + +![测试集](./img/exptest.png) + + + +## 效果评估 + +以下为随机情况下中获得的一些准确度,当N过大时由于生成数据过密,效果下降。 + +| Algo | Acc | +| ----------- | ------------------ | +| ----- | ----- | +| KNN (N=2) | 0.9983193277310924 | +| KNN (N=3) | 0.9986807387862797 | +| KNN (N=5) | 0.9744360902255639 | +| KNN (N=10) | 0.868824531516184 | +| KNN (N=100) | 0.7205387205387206 | + + + +## 代码使用方法 + +以 `N=3` 为例: + +```bash +python source.py g 3 # 生成数据集 + +python source.py d 3 # 生成数据集的可视化结果(保存在img文件夹下) + +python source.py # 训练和测试 +``` \ No newline at end of file diff --git a/assignment-1/submission/18307130213/img/exptest.png b/assignment-1/submission/18307130213/img/exptest.png new file mode 100644 index 0000000000000000000000000000000000000000..1e95008faf1f147efa733242da45b730ca69e04b GIT binary patch literal 29325 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 S?FOwOVPqv0B}&Bg{QeJJnp<%I literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18307130213/img/exptrain.png b/assignment-1/submission/18307130213/img/exptrain.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a24be956aea669a30fe4562563154da9020047 GIT binary patch literal 40003 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 literal 0 HcmV?d00001 diff --git a/assignment-1/submission/18307130213/source.py b/assignment-1/submission/18307130213/source.py new file mode 100644 index 0000000..7a53de8 --- /dev/null +++ b/assignment-1/submission/18307130213/source.py @@ -0,0 +1,148 @@ +import math +import heapq +import numpy as np +import random +import matplotlib.pyplot as plt +import sys + +class KNN: + + def __init__(self): + self.__data = None + self.__lable = None + self.__num = None + self.__dim = None + self.__k = None + + def fit(self, train_data, train_label): + if type(train_data) != np.ndarray: + print('error: wrong type of train_data') + return + if len(train_data.shape) != 2: + print('error: wrong shape of train_data') + return + if type(train_label) != np.ndarray: + print('error: wrong type of train_label') + return + if len(train_label.shape) != 1: + print('error: wrong shape of train_label') + return + num_data, dim_data = train_data.shape + num_label, = train_label.shape + if num_data != num_label: + print('error: shape of train_data and train_label can not match') + return + if num_data < 1: + print('error: less than 1 data') + return + + label_k = len(np.unique(train_label)) + + self.__data = train_data + self.__label = train_label + self.__num = num_data + self.__dim = dim_data + self.__k = min(num_data, math.floor(math.log(num_data, 2)), label_k + 1) + + print('finish: fit') + return + + def predict(self, test_data): + if self.__k == None: + print('error: not fit yet') + return + if type(test_data) != np.ndarray: + print('error: wrong type of test_data') + return + if len(test_data.shape) != 2: + print('error: wrong shape of test_data') + return + + test_data_num, test_data_dim = test_data.shape + if test_data_dim != self.__dim: + print('error: wrong dimention of test_data') + return + + tmp_ans = [] + for i in range(test_data_num): + tmp_inum = [j for j in range(self.__num)] + closest = heapq.nsmallest(self.__k, tmp_inum, key = lambda s: np.linalg.norm(test_data[i]-self.__data[s])) + tmp_dict = {} + lab, cnt = -1, 0 + for j in range(self.__k): + tmp_cnt = tmp_dict[self.__label[closest[j]]] = tmp_dict.get(self.__label[closest[j]], 0) + 1 + if tmp_cnt > cnt: + lab, cnt = self.__label[closest[j]], tmp_cnt + tmp_ans.append(lab) + + return np.array(tmp_ans) + +def generate(n): + np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning) + if n <= 0: + print('error: n <= 0') + return + r = n/max(1, math.log(n, 2)) + sizs = [] + xs = [] + for i in range(n): + theta = i*(2*math.pi/n) + mean = (r*math.cos(theta) , r*math.sin(theta)) + rand_mat = np.random.rand(2, 2) + cov = rand_mat.transpose()*rand_mat + siz = random.randint(200, 1000) + sizs.append(siz) + x = np.random.multivariate_normal(mean, cov, (siz, )) + xs.append(x) + siz = sum(sizs) + idx = np.arange(siz) + np.random.shuffle(idx) + data = np.concatenate(xs) + label = np.concatenate([np.ones((sizs[j], ), dtype=int)*j for j in range(n)]) + data = data[idx] + label = label[idx] + + train_data, test_data = data[:(siz//n)*(n-1),], data[(siz//n)*(n-1):,] + train_label, test_label = label[:(siz//n)*(n-1),], label[(siz//n)*(n-1):,] + + np.save("data.npy",( + (train_data, train_label), (test_data, test_label) + )) + +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) + +def genimg(n, data, label, name): + datas =[[] for i in range(n)] + 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]) + plt.savefig(f'img/{name}') + plt.close() + # plt.show() + +if __name__ == '__main__': + if len(sys.argv) > 1 and sys.argv[1] == 'g': + try: + n = int(sys.argv[2]) + generate(n) + except: + print('error: wrong n') + elif len(sys.argv) > 1 and sys.argv[1] == 'd': + (train_data, train_label), (test_data, test_label) = read() + try: + n = int(sys.argv[2]) + genimg(n, train_data, train_label, 'train') + genimg(n, test_data, test_label, 'test') + except: + print('somthing goes wrong!') + else: + (train_data, train_label), (test_data, test_label) = read() + model = KNN() + model.fit(train_data, train_label) + res = model.predict(test_data) + print("acc =",np.mean(np.equal(res, test_label))) \ No newline at end of file -- Gitee