本文概要
贝叶斯分类器 ,决策数和支持向量机对数值型数据处理能力较弱。本文介绍kNN(K Nearst Neighbor)算法,可以根据已有的数值型训练集合,对数值型数据做出预测。
KNN算法
正对当前被预测对象,在训练集合中找出最近的K个物品价格,算出平均值为预测价格。距离算法有很多,如皮尔森系数,余弦定理,欧氏距离等。本章例子是预测商品价格,采用的是欧氏距离(为什么呢?我的理解:商品的价格一般与商品重量,体积等成正比,所以距离的模大小比较重要,采用欧拉距离,可以将向量摸大小的因素考虑在内)。
K的选取
算法中有K的,都会遇到这个问题,k取多少?在KNN中,k太小,比如1,那么预测价格仅仅与最临近的训练数据相同,那么可能此数据由于噪音,不准确,使得预测数据也不准确。K太大了,也不好,因为范围太大,较小的值容易使整体预期偏低。
权重距离
K太多时,由于范围太大,较远的值会使总体预期偏低,那么可以采用加权平均值的思想,给较远的对象较低的权重,这样可以给出相对准确的预期。权重公司应该是一个单调递减函数,参数为距离,值为权重。有三种权重计算公司:
- 权重函数1: 反函数,f(dist) = 1/(1+dist),分母加1是为了防止无限大。优点:计算快。缺点:较近的数据,给与较大的权重,权重降落的非常快,导致可能会对噪音数据比较敏感。
- 权重函数2: 减函数,f(dist) = a - dist (dist < a) or 0 (dist >= a)。a为大于0的常量。优点,计算快。缺点:距离大于a的数值给出的权重是0,无法对预估起到作用,可能会漏掉一些数据。
- 权重函数3: 高斯函数(如下图),当可距离无限延伸时,权重是无限接近于0的,但是当距离叫小时,权重变化相对平稳,所以对上面两种函数的不足都有弥补。不足的是,计量量较大。
交叉验证 cross validation
数据集被分为两份
- train set: 训练集合,用于训练算法,通常较大,如95%左右。
- test set:测试集合,通常较小,如5%左右。测试集合输入带入算法中,计算的结果对应的测试结果只差的平方(放大差异),求和,就可以作为验证分数。
通常需要重复上面的切分过程。使用这个方法进行验证需要满足一个条件,被验证算法需要输入训练数据集。
伸缩纬度
物品通常是由多为向量描述的,然而由于不同纬度变量描述特质不同,对整体影响也不一样。比如酒,由年份(范围0~100),级别(范围1~5),体积(范围500ml~2500ml)。可以看出,在欧式距离中,体积的影响最大。所以,需要将所有的酒的体积统一缩小,人为的给出一个伸缩比例,使得不同的纬度对距离的贡献相当。可以利用第五章中提到的优化方案自动求出最优伸缩比例。
不均匀的价格分布
有可能训练集合的数据有些因数并不能被对象的纬度描述出来,如果仍然这样计算,可能会低估预期。可以换一个角度预测,预测价格在一个范围区间内的概率。计算方法与knn类似,只不过将区域内的权重之和比上所有的权重之和,结果为概率。
KNN使用场景
距离计算耗时,最优范围选取耗时。
但是数值型预测,范围预测,其他预测方法都办不到,kNN比较直观且可行。