机器学习入门 之 《集体智慧编程》 KNN算法

knn算法:k nearest neighbors 也就是k个最近的邻居算法。
它的大概意思是,在样本空间中,找到与待估计的样本最临近的K个邻居,用这几个邻居的类别来估计待测样本的类别(或者值)

knn算法就是这么简单.

knn算法 需要注意的地方
1、需要将数据量化:比如一些非数值的参数量化为数值的参数
2、需要一个distance函数以计算两个样本之间的距离

3、最简单的作法是:找出最近的K个邻居,然后取将这K个邻居的分类的均值,
这样有个坏处,比如有5个邻居,3个邻居的距离是10,2个邻居的距离是1000,显然距离为1000的邻居已经没有什么参考价值了,把他们拉进来取均值会有问题。

解决办法: 给邻居进行加权,越远的邻居权值越小
               我们可以是用高斯函数(或者其他适当的减函数)计算距离,比如
                new_distance =gaussian(distance) 这样距离越远得到的值就越小
                我们使用new_distance对结果进行加权得到更为准确的估计。

4、除了这个意外我们还应该确定K的值(选择几个邻居),K的值也直接影响最后的估计。
     我们可以使用 cross-validate(交叉验证):所谓交叉验证就是去除样本的一部分作为训练样本,一部分作为测试样本。比如选择95%作为训练样本,剩下的用作测试样本。每做一次计算误差的值,可以用:(每个测试样本的误差平方和/测试样本个数)作为指标
    比如我么选择k=5,做100次交叉验证,计算出每一次的误差和,再算出100次的总的误差和。
    同理我们选择k =1,2,3.............找到误差和最小的那个k作为邻居的个数

5、scale每一个变量
     对于一个样本而言比如对一瓶酒
    (age, rating, bottlesize)他有三个参数,每一个参数都有一个定义域:
    比如 0<age <100  1<rating<10 1000<bottlesize<1500(ml)
    对于这些参数他们的范围不一样,对distance计算的影响就不一样,所以需要给每一个参数进行scale. 而且也许某一个参数根本就与估计结果无关,这样的参数应该去除。
    scale就是做的这个事情。
    我们对每一个样本向量乘以一个scale向量 比如
    对于一瓶酒(10,10,900)*(1,2,0)然后再做distance计算
    
   那么怎么寻找这个向量呢?
   也是运用交叉验证与优化算法(模拟退火等)

  比如最后得到了一个(8.5,  2.1, 0)的scale向量,从这个向量我们也可以得出一个结论,
   第三个参数是0,这就是所第三个参数跟我们的预测结果无关。这也可以让我们以后不用去搜集第三个参数的数据了。

6、估计值在一个区间的概率
    现在我们需要知道估计值落在一个区间的概率是多少?
    比如我们给定一瓶酒,参数是(10,10,900), 酒的价格落在(100,300)之间的概率
    我们可以这样做:
    比如选定K个邻居:第i个邻居的估计值为Resulti,到第i个邻居的距离是distancei(同样适用高斯函数处理过的).
    distance = distancei的和。
    把 100<resulti < 300的distancei 加到一起,记为 disatance_within
    那么 酒的价格在(100,300)之间的概率就是 distance_within/distance;

  我们可以计算(0,1),(1,2),(2,3)......的概率 从而可以看出概率分布来
   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值