**
cs231n学习笔记 assignment1 knn
**
线性分类器–K近邻分类器:测试图片与和他相邻最近的K个训练集图片比较,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片。
实现过程:
1.加载数据:图像分类数据集CIFAR-10,60000张32X32的小图像,每张图像都有10种分类标签中的一种。这60000张图像被分为包含50000张图像的训练集和包含10000张图像的测试集。
2.可视化数据集
enumerate() 函数:枚举
numpy.flatnonzero():
该函数输入一个矩阵,返回扁平化后矩阵中非零元素的位置(index)
3.采样数据集,训练集采样5000张,测试集采样500张
4.将32323的图片reshape成一行
# Reshape the image data into rows
X_train = np.reshape(X_train, (X_train.shape[0], -1))
X_test = np.reshape(X_test, (X_test.shape[0], -1))
print(X_train.shape, X_test.shape)
训练集变成5000行,不知道多少列(用-1)
5.导入k近邻分类器模块:
6.计算向量间的距离
L2距离:
L1距离:
使用两层循环算L2:
dists[i][j]=np.sqrt(np.sum(np.square(X[i,:]-self.X_train[j,:])))
使用一层循环算L2:
dists[i] = np.sqrt( np.sum(np.square(X[i,:] - self.X_train), axis = 1))
不使用循环算L2:
a=np.sum(np.square(X),axis=1,keepdims=True)
b=np.sum(np.square(self.X_train),axis=1)
c=np.multiply(np.dot(X,self.X_train.T),-2)
dists=np.add(a,b)
dists=np.add(dists,c);
dists=np.sqrt(dists);``
7.预测:
找到k个近邻点,投票决定测试图片的标签
8.优化:找到最好的K——交叉验证(将训练集平均分成5份,其中4份用来训练,1份用来验证。然后我们循环着取其中4份来训练,其中1份来验证,最后取所有5次验证结果的平均值作为算法验证结果。)
https://blog.csdn.net/wangchy29/article/details/87936112
https://blog.csdn.net/u014485485/article/details/79433514?utm_source=blogxgwz5