KNN算法(K Nearest Neighbours)

KNN算法(K Nearest Neighbours)

         KNN算法由很朴素的NN算法发展而来,NN算法的想法就是,在X->Y的映射关系中,相似的X映射出相似的Y。在数据大规模暴涨的时代,很多说不明道不清的东西都藏在数据中,很少的情况如物理中加速度和力的关系那样存在明显的物理意义,有解析式来描述,所以不用参数的统计方法,回归模型,有了更多的用武之地。KNN算法就是,根据X0在大量数据中,找到相似的Xi(i=1,2…k),然后使用Xi(i=1,2…k)对应的Yi(i=1,2…k),对Y0进行估计。

         下面简单介绍一下,对KNN算法的理解,有不合适遗漏的地方请指出。

        

 

KNN算法的具体实现由上面三个过程:

 

一.数据准备

一般来说,要使用KNN算法,一定是希望知道一些未知的信息,比如下一期双色球开奖号码,明天的天气情况,采集到的花朵的分类等等,除了这些还不够,还要知道一些对这些未知信息相关联的已知的信息。

数据准备的第一步就是确定一个映射关系X->Y,Y是你希望知道的未知信息,X则是你认为对知道Y可能有用的信息,考虑下面三种情况

(1)      双色球

考虑开奖当天的天气是否会对开奖号码有影响?

考虑上一期开奖号码是否会对开奖号码有影响?

如果这些X和Y没有很大的关联性,则通过这样的模型,不会得到好的结果,这里的X和Y的关联性都不大,这样直接的预测结果就是赔本。在X的选择中,要选择与Y相关的变量。

(2)      明天温度

今天的温度对明天的温度有没有影响,肯定有,那么180天以前的温度呢?根据蝴蝶效应,也有,但是我们用不用180天以前的温度来预测明天的温度呢?一般不用,因为想对比于今天的温度和昨天的温度,180天以前的影响太小了。所以在X的选取时,尽量选择与Y相关性大的变量。

(3)      花朵鉴定

一般来说花瓣的长度和宽度是一种很好的鉴别花的种类的方法,当然是对于那种颜色相近的(假如颜色完全不同的花朵,请用颜色鉴定)。

 

总结来说,第一步的工作很重要,确定合理的X->Y的关系。不过怎样找到合适的X(合适的Y有的时候也要确定,对于相同的目的,也可以使用不同的Y,建立不同的模型),我觉得是一门很深的学问(比如预测明天的温度,究竟选择多少天以前的合适,1天,2天or N天)。我觉得可以使用一些相关分析来做,找到一个Xi,分析Xi与Y的相关性,当然,还要考虑Xi+Xj与Y的相关性等等,如果有深入研究统计学的,希望给一些建议,怎样,使用什么方法确定是否选择X->Y映射中的X。

 

数据准备的第二步是数据清理,这一点逻辑上很好理解,你所拥有的数据质量越高(准确,大量,覆盖面广,无遗漏),你能做的越好,好像身边带个机器猫,要啥有啥,还怕啥。

清理的目的就是提高数据的质量,原因可能不同,比如数据有缺失,需要填充;数据有噪音,清理噪音;存在检测器故障时期的数据,删除数据。

 

二.数据匹配

数据匹配,就是使用当前要估计的Y0对应的X0去数据大仓库中去找相似的数据。

数据匹配的第一步是候选数据选取,这里的意思就是,在匹配前先把数据过滤一遍,就是说不是在任何时候,把所有数据都拿到大街上溜一圈是一件好事:(1)兴师动众,劳民伤财(2)鱼龙混杂,没有针对性。比如,我们预测北京明天的气温,纽约今天的温度就不要用了,虽然你有你可以。这样的话,我们只哪里北京的温度信息,如果需要再加上周边的温度信息也可以。这里大家不要混淆两个概念,一个是建立X中选择的各变量信息,和在数据匹配中,候选数据的选取。第一个是针对匹配大向量的建立,第二个是匹配大向量的形式建立好后,选择那些实际的数据。

 

数据匹配的第二步是距离的定义,比较普通的是欧式距离,文档匹配中的通过余弦值计算的具,当然如果需要也可以选择车比雪夫距离,或者自定义距离,通过距离的定义,如果可以达到下面的目标就是好的定义:

距离相近的Xi,映射相似的Y(Y的相似性,再根据Yi之间的距离定义去琢磨吧)

 

数据匹配的第三步是K的选取,故名思意,就是从候选的数据中,选择几个Xi来进行对Y0的评价。

         这个也属于仁者见仁,智者见智的问题。比较懒惰的方法,就是测试,根据已掌握的信息,模拟估计Y0(当然Y0你已经知道了),把K取不同的值,看哪个好。

         当然懒惰的方法一般不会是最好的方法,看到有些说法是,在每一次的匹配中,看X0附近的Xi是怎样分布的,根据分布模式的不同,K的选择也不同;一般来说,如果Xi都偏向X0的一个方向或者不同Xi之间的距离差距很大,K取小点;如果Xi均匀的分布在X0周围,K可以取大一些。多大多小,仁者见仁,智者见智。

 

三.Y值计算

对于Y值计算,不同模型会有所不同。

(1)      比如对于分类模型

直接把K个Yi平均就是一件很有意思的事情。对于分类的情况,一般可能是通过一定的公式,计算在这K个Yi中,对每种分类的贡献值,最后选择贡献值最大的那一类作为Y0。

(2)      比如对于值预测的情况

可以采取加权平均(如果是离散值,再相应取整)

 

由于,工作时间短,对模型的理解不够深入,有错误和遗漏的地方,请指正,如果有资料提供的话更好,谢谢。

                                                                                                         2012年7月10日星期二

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值