深度学习cs231n之knn学习的一些记录(2)

防止在上篇文章上的修改产生覆盖,我这里就直接重启一篇。继续写
当前在knn.ipynb 里面的box 15

Now implement the function. predict_labels and run the code below:
现在执行classifier.predict_labels 这个函数。运行下面的代码来预测labels
we use k = 1 (which is Nearest Neighbor)

y_test_pred = classifier.predict_labels(dists, k=1)

这个函数的实现同样在cs231n/classifiers里面的k_nearest_neighbor.py中。

from collections import Counter
def predict_labels(self, dists, k=1):
	"""
	Given a matrix of distances between test points and training points, 
	predict a label for each test point.
	给一个test点和train点之间欧式距离的矩阵,来为每一个test点预测一个label.
	Inputs:
	- dists: A numpy array of shape(num_test, num_train) where dists[i, j] gives the distance between 
	the ith test point and the jth training point.
	dists 就是上一篇文章里面 compute_distances_two_loops的结果。
	Returns:
	- y: A numpy array of shape(num_test, ) containing predicted labels for the test data, where y[i] is the predicted label for the test point x[i]. 
	返回的结果也是一个numpy数组,shape为(num_test, ) 里面是test data 的预测labels. y[i] 是对test point x[i] 的预测label.
	"""
	num_test = dists.shape[0]
	y_pred = np.zeros(num_test)  # 这个是要返回的结果。
	for i in range(num_test):
		dists_i = dists[i]		# 这里其实是取出了针对预测图片的一行的数据。5000大小的数组。
		closest_y = self.y_train[dists_i.argsort()[:k]]	# argsort 会返回当前数组排序的下标,这里默认会把self.y_train里面最小的前k给取出来。
		y_pred[i] = Counter(closest_y).most_common(1)[0][0]  # 然后对返回的最小的数组进行计数,Counter 就是投票,通过counter的most common 方法得到出现最多的label.
	return y_pred	
	
	

argsort 举例

>>> import numpy as np
>>> a = np.array([1, 3, 2])
>>> a.argsort()
array([0, 2, 1])
>>> a[a.argsort()[:1]]
array([1])
>>> a[a.argsort()[:2]]
array([1, 2])
>>> a[a.argsort()[:3]]
array([1, 2, 3])


你可能感兴趣的:(python,numpy,深度学习)