本篇博客是对斯坦福大学课程cs231n中第一个作业assignment1中对k-Nearest Neighbor部分的解答,解答过程使得对Python库numpy的应用更加熟悉,以及对train/val/test集有了更深的了解,对交叉验证法有了一定的掌握。下面直接进入正题:
KNN算法基本思路:通过测试集与训练集的比较,作业中用的衡量标准是欧氏距离。比如,对于作业中的数据集,其中测试集(test)X是一个[500,3072]的矩阵,其中每一行都是一幅32*32*3大小的图片拉伸成的一个向量,共500张图片,训练集(train)X_train是一个大小为[5000,3072]的矩阵,同理有5000张图片。KNN所做的就是对X中的每一行与X_train中的5000行依次计算欧氏距离,并将距离保存在矩阵dists[500,5000],dists[i,j]即表示X[i,:]与X_train[j,:]的距离。若k=1,对于X中第i幅图,则选取所计算的5000个距离中的最小值,该最小值所对应的X_train中那幅图的类别就作为第i幅图的类别。若k=5,则选取距离最小的5个,其中对应的5张训练集的图片按照其出现次数最多的类别则作为第i幅图的类别。
1、也是在ipython notebook直接调试执行的,很方便,建议大家试一试。关于cifar-10的下载就不说了,打开ipython notebook之后再打开knn.ipynb。下面开始完成作业:首先将所下载的cifar-10数据集所在的路径添加到cifar10_dir中,比如我的:cifar10_dir = '/home/xxx/mydata/CS231n/assignment1/cs231n/datasets/cifar-10-batches-py'。
2、完成距离计算部分。
打开s231n/classifiers/k_nearest_neighbor.py文件
(1)compute_distances_two_loops()函数
def compute_distances_two_loops(self, X):
num_test = X.shape[0]
num_train = self.X_train.shape[0]
dists = np.zeros((num_test, num_train))
for i in xrange(num_test):
for j in xrange(num_train):
dists[i,j] = np.sqrt(np.sum(np.square(self.X_train[j,:] - X[i,:]))) #欧式距离的计算,利用两个循环,将距离存入
pass #dists中,该部分比较简单。
return dists