您的位置:首页 > 编程语言

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

2012-12-26 12:39 295 查看
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)......的概率 从而可以看出概率分布来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: