完成了assignment-1中knn相关内容的作业,记录一下遇到的知识点和问题
knn.ipynb的内容大致包括:
1、数据集的建立
主要是通过切片函数,如下图选取前5000张图片和其标记作为训练数据

2、计算距离矩阵,test数据500条,train数据5000条,故距离矩阵应该是500*5000
计算的方式有三种,两次循环、一次循环(部分矢量化)和无循环(矢量化)
矢量化(vectorization)可以加速矩阵计算
两次循环:
for i in range(num_test):
for j in range(num_train):
dists[i][j] = np.sqrt(np.sum(np.square(X[i]-self.X_train[j])))
return dists
一次循环:
for i in range(num_test): dists[i, :] = np.sqrt(np.sum(np.square(X[i]-self.X_train), axis=1)) return dists
无循环:
dist_a = np.sum(X**2, axis=1, keepdims=True) dist_b = np.sum(self.X_train**2, axis=1) dist_c = -2*X.dot(self.X_train.T) dists = np.sqrt(dist_a + dist_b + dist_c)
三种方式的速度对比:

3、用交叉验证选择合适的超参数
用5折交叉验证计算10种不同K值的效果
用字典存储每种K值的效果,即每种K值每次交叉验证的acc(用列表存储)
这样方便最后制图

可以观察到K=10时效果最佳
posted on
浙公网安备 33010602011771号