机器学习入门 之 《集体智慧编程》 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)......的概率 从而可以看出概率分布来
它的大概意思是,在样本空间中,找到与待估计的样本最临近的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)......的概率 从而可以看出概率分布来
相关文章推荐
- 机器学习入门 之《集体智慧编程》 决策树
- 机器学习入门 之 《集体智慧编程》 聚类(clustering)
- Knn算法(机器学习)入门(Python实现)
- 机器学习入门 之《集体智慧编程》 推荐系统
- 机器学习入门 之 《集体智慧编程》 寻找特征值
- 机器学习入门 之 《集体智慧编程》 贝叶斯分类(bayesian classification)
- 机器学习入门 之 《集体智慧编程》 优化算法
- 机器学习00:如何通过Python入门机器学习
- 【机器学习】Random Forest(随机森林)入门和实战(二)它是个什么东西(What)
- 机器学习最佳入门学习资料汇总
- 机器学习入门——recall与precision的解释
- python机器学习入门资料梳理
- [机器学习入门] 李弘毅机器学习笔记-16 (Unsupervised Learning: Neighbor Embedding;无监督学习:邻域嵌套)
- 机器学习入门笔记(二)----线性回归
- 机器学习笔记6:TensorFlow入门之MNIST数据集训练
- 机器学习的最佳入门学习资源
- 机器学习入门书籍导读-工程高等代数
- Udacity机器学习入门笔记——支持向量机(SVM)
- 个人学习总结一机器学习入门(四)
- 3分钟了解入门「机器学习」该学习什么?(上)