目录
这一系列是学习公众号“机器学习实验室”的笔记,跟着大佬的脚步一个个实现,今天实现的是kNN,kNN是一个思想比较简单的监督算法,没有数学推导,计算的东西比较多,因此我将数学推导换成思路推导来考虑怎么写代码。
思路推导
kNN的思想
没有预训练这些过程,kNN单纯是暴力求距离,然后统计k个距离近的样本的标签,谁多听谁的,显而易见这是个近邻匹配的思想。我之前总结过优化思想和出发点:
优化思想 | 出发点 |
---|---|
最小二乘法 | 最小均方差 |
最大似然法 | 最大似然概率 |
近邻匹配的出发点就是用相似的个体进行投票,我们把重点放在代码上。
手动实现kNN
首先分析有几个部分:KNearestNeignbors作为一个类,应该满足喂入训练数据x和y,然后放入要预测的测试样本,并不经过训练,直接计算这个样本和所有训练样本的距离,统计k个距离最近的样本的标签,最多的标签设为该样本的标签。值得注意的是,我们在计算距离的时候是放入整个矩阵的,因此这个地方需要设计计算的代码。
由此我们可以很快想到造一个计算距离distant、一个预测器predict和一个评价器evaluation,在这里我还加入了一个交叉验证validation
代码如果有不对的还请指正。
计算距离 distant
思路
- 在这里我设计了两个距离,一个是向量2-范数,一个是余弦相似度cosine。
- 这两个公式都比较熟悉, l 2 = ( x − y ) 2 l_2=\sqrt{(x-y)^2} l2=(x−y)2,在矩阵中则需要一些技巧。首先先考虑两个矩阵计算,最后我们想要得到的是 n 1 × n 2 n_1\times n_2 n1×n2大小的矩阵,分别为测试集和训练集的大小,因为从测试集 n 1 n_1 n1出发要知道和每一个训练集样本的距离。
-
分解后先是求 x − y x-y x−y,因为一共需要求 n 1 × n 2 n_1\times n_2 n1×n2个距离,我分别把两个矩阵扩展到这个大小,直接减后再reshape。以测试集为例,大小为 n 1 × d n_1\times d n1×d,先是reshape为 ( n 1 , 1 , d ) (n_1, 1,d) (n1,1,d)的张量,这样用tile扩展的时候就可以形成连续相同样本。
例:a = a r r a y ( [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ) ( 2 × 3 ) a = array([1,2,3],[4,5,6])\quad (2\times 3) a=array([1,2,3],[4,5,6])(2×3)
-