【机器学习系列3】K近邻算法KNearestNeignbors——思路推导和纯Numpy实现


这一系列是学习公众号“机器学习实验室”的笔记,跟着大佬的脚步一个个实现,今天实现的是kNN,kNN是一个思想比较简单的监督算法,没有数学推导,计算的东西比较多,因此我将数学推导换成思路推导来考虑怎么写代码。

思路推导

kNN的思想

没有预训练这些过程,kNN单纯是暴力求距离,然后统计k个距离近的样本的标签,谁多听谁的,显而易见这是个近邻匹配的思想。我之前总结过优化思想和出发点:

优化思想 出发点
最小二乘法 最小均方差
最大似然法 最大似然概率

近邻匹配的出发点就是用相似的个体进行投票,我们把重点放在代码上。

手动实现kNN

首先分析有几个部分:KNearestNeignbors作为一个类,应该满足喂入训练数据x和y,然后放入要预测的测试样本,并不经过训练,直接计算这个样本和所有训练样本的距离,统计k个距离最近的样本的标签,最多的标签设为该样本的标签。值得注意的是,我们在计算距离的时候是放入整个矩阵的,因此这个地方需要设计计算的代码。
由此我们可以很快想到造一个计算距离distant、一个预测器predict和一个评价器evaluation,在这里我还加入了一个交叉验证validation
代码如果有不对的还请指正。

计算距离 distant

思路

  1. 在这里我设计了两个距离,一个是向量2-范数,一个是余弦相似度cosine。
  2. 这两个公式都比较熟悉, l 2 = ( x − y ) 2 l_2=\sqrt{(x-y)^2} l2=(xy)2 ,在矩阵中则需要一些技巧。首先先考虑两个矩阵计算,最后我们想要得到的是 n 1 × n 2 n_1\times n_2 n1×n2大小的矩阵,分别为测试集和训练集的大小,因为从测试集 n 1 n_1 n1出发要知道和每一个训练集样本的距离。
    • 分解后先是求 x − y x-y xy,因为一共需要求 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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值