笔记
KNN部分
1.python中一个向量,每个元素平方后求和:
方法1
sum = 0
for item in vector:
sum += item*item
方法2
summ = numpy.sum(vector**2) # 不知可否?
2.CPU运算速度和运算量问题
只使用像素数据,求一张图片和另外5000张图片之间的L2 Distance,利用两层for循环实现。Intel® Core™ i7-4790 CPU @ 3.60GHz × 8 的配置,计算了几分钟了还没输出结果。。
怀疑是否在运算,那查看一下CPU使用率,linux系统咋看?在终端使用top命令
mortimerli@mortimerli-All-Series:~$ top
发现有一个cpu使用率100%,放心了,在运算,等着就行了。计算了大概10分钟终于输出结果了。。
3.KNN如何找到最近的m个样例(predict_labels)
-
首先,对于test数据集中的一张图,得找到它和training数据集中5000张图片最小的欧式距离,并返回下标:
根据提示,查了一下numpy.argsort()
indexes = np.argsort(dists[i,:]) # 使用默认参数时,对一个向量的所有元素从小到大进行排序,按顺序返回下标
-
找到下标之后,要找到这些下标对应什么label,并找到最多的那个label,把它当作给这张test图片预测的标签:
最直接的想法是,记录每一个label记录出现的次数,求最大值(感觉会有更好的方法?)def predict_labels(self, dists, num_classes , k=1): num_test = dists.shape[0] y_pred = np.zeros(num_test) for i in xrange(num_test): # 行循环 closest_samples_for_one_test_sample = np.argsort(dists[i,:]) # 对一个向量的所有元素从小到大进行排序,按顺序返回下标 for j in range(k): closest_k_indexes = closest_samples_for_one_test_sample[0:k] closest_y = self.y_train[closest_k_indexes] # 标签,是一堆数 count = np.zeros(num_classes) for item in closest_y: for mm in range(num_classes): count[mm] += ((item == mm)+0) index_of_maxcount