作者:桂。

时间:2017-04-19  21:20:09

链接:http://www.cnblogs.com/xingshansi/p/6736385.html

声明:欢迎被转载,不过记得注明出处哦~


前言

本文为《统计学习方法》第三章:KNN(k-Nearest Neighbor),主要包括:

  1)KNN原理及代码实现;

  2)K-d tree原理;

内容为自己的学习记录,其中多有借鉴他人的地方,最后一并给出链接。

一、KNN原理及代码实现

KNN对应算法流程:

其实就是在指定准则下,最近的K个决定了自身的类别。

  • LP距离

p=2时为欧式距离(Euclidean distance),p=1为曼哈顿距离(Manhattan distance),p=∞对应最大值。

  • K值选择

K通常选较小的数值,且通过交叉验证来寻优。

试着写了三种距离下的KNN,给出主要代码:

function resultLabel = knn(test,data,labels,k,flag)
%%
% test:test database
% data:train database
% labels:train data labels
% flag: distance criteria selection.
% 'E':Euclid Distance.
% 'M':Manhanttan distance.
% 'C':Cosine similarity.
%%
resultLabel=zeros(1,size(test,1));
dats.f=flag;
switch flag
case 'C'
Ifg='descend';
otherwise
Ifg='ascend';
end
for i=1:size(test,1)
dats.tes=test(i,:);
dats.tra=data;
distanceMat =distmode(dats);
[B , IX] = sort(distanceMat,Ifg);
len = min(k,length(B));
resultLabel(1,i) = mode(labels(IX(1:len)));
end
end

 dismode.m: 

function distanceMat =distmode(dats)
%distance calculation.
%%
% dats.tra:train database;
% dats.tes:test database;
% dats.f: distance flag;
%%
switch dats.f
case 'E'%Euclidean distance
p=2;
datarow = size(dats.tra,1);
diffMat = abs(repmat(dats.tes,[datarow,1]) - dats.tra) ;
distanceMat=(sum(diffMat.^p,2)).^1/p;
case 'M'%Manhanttan distance
p=1;
datarow = size(dats.tra,1);
diffMat = abs(repmat(dats.tes,[datarow,1]) - dats.tra) ;
distanceMat=(sum(diffMat.^p,2)).^1/p;
case 'C'%Cosine similarity
datarow = size(dats.tra,1);
tesMat = repmat(dats.tes,[datarow,1]) ;
diffup=sum(tesMat.*dats.tra,2);
diffdown=sqrt(sum(tesMat.*tesMat,2)).*sqrt(sum(dats.tra.*dats.tra,2));
distanceMat=diffup./diffdown;
end

  

二、K-d tree原理

KNN方法对于一个测试数据,需要与所有训练样本比对,再排序寻K个最优,现在换一个思路:如果在比对之前,就按某种规则排序(即构成一个二叉搜索树),这样一来,对于一个新的数据点,只要在前后寻K个最优即可,这样就提高了搜索的效率。

给出构造平衡kd树的算法:

以一个例子分析该思路,给定一个数据集:

对应思路:

步骤一:x(1)的中位数:7,对应数据{7,2};按小于/大于分左右;

步骤二:1mod2+1=2,对x(2)的中位数,对第二层进行划分,左边中位数为5,右边中位数为9,依次划分;

步骤三:2mod2+1=1,对x(1)的第三层进行划分,结束,对应效果图:

为什么KD树可以这么构造?这也容易理解,对于一个数据点(x,y),距离公式为,单单比较x是不够的,如果对x按大小已经切分,下一步怎么做?再按y进行切分,这样距离大小就被细化,查找范围进一步缩小,x切完y切,如果是三维,y切完z再切,对应数学表达就是

构造出了Kd tree之后,如何借助它解决kNN问题呢?

给出搜索kd tree的算法:

给出下图,现有(2,5)这个点,希望找出最近的K=3 个点:

分析步骤:

步骤一:包含(2,5)的叶节点,发现落在(4,7)节点区域内,(4,7)为当前最近点;

步骤二:检查(4,7)对应父节点(5,4)的另一个子节点(2,3),发现距离(2,5)更近,(2,5)记为当前最近点;

步骤三:向上回退到(5,4),此时(5,4)时子节点,其父节点为(7,2),依次类推。

具体如下图所示:

为什么KD树可以这么搜索?对应节点(右图)可以看出搜索按层回溯,对应左图就是先上下搜索,再往右推进。这样理解就比较直观,因为距离是越来越大的。

完成寻最优以后,最简单的办法是删除节点,重复寻最优,当然也可以存储不同结果,在少量样本中挑出K个最优

同理,对于三维数据,可以依次类推:

给出Kd tree的测试代码的效果图,code对应链接点击这里

参考:

统计学习方法:KNN的更多相关文章

  1. 统计学习方法笔记 -- KNN

    K近邻法(K-nearest neighbor,k-NN),这里只讨论基于knn的分类问题,1968年由Cover和Hart提出,属于判别模型 K近邻法不具有显式的学习过程,算法比较简单,每次分类都是 ...

  2. 统计学习方法学习(四)--KNN及kd树的java实现

    K近邻法 1基本概念 K近邻法,是一种基本分类和回归规则.根据已有的训练数据集(含有标签),对于新的实例,根据其最近的k个近邻的类别,通过多数表决的方式进行预测. 2模型相关 2.1 距离的度量方式 ...

  3. 统计学习方法c++实现之二 k近邻法

    统计学习方法c++实现之二 k近邻算法 前言 k近邻算法可以说概念上很简单,即:"给定一个训练数据集,对新的输入实例,在训练数据集中找到与这个实例最邻近的k个实例,这k个实例的多数属于某个类 ...

  4. 《统计学习方法》极简笔记P5:决策树公式推导

    <统计学习方法>极简笔记P2:感知机数学推导 <统计学习方法>极简笔记P3:k-NN数学推导 <统计学习方法>极简笔记P4:朴素贝叶斯公式推导

  5. 【NLP】基于统计学习方法角度谈谈CRF(四)

    基于统计学习方法角度谈谈CRF 作者:白宁超 2016年8月2日13:59:46 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  6. 统计学习方法 --- 感知机模型原理及c++实现

    参考博客 Liam Q博客 和李航的<统计学习方法> 感知机学习旨在求出将训练数据集进行线性划分的分类超平面,为此,导入了基于误分类的损失函数,然后利用梯度下降法对损失函数进行极小化,从而 ...

  7. 统计学习方法笔记--EM算法--三硬币例子补充

    本文,意在说明<统计学习方法>第九章EM算法的三硬币例子,公式(9.5-9.6如何而来) 下面是(公式9.5-9.8)的说明, 本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流 ...

  8. 统计学习方法:罗杰斯特回归及Tensorflow入门

    作者:桂. 时间:2017-04-21  21:11:23 链接:http://www.cnblogs.com/xingshansi/p/6743780.html 前言 看到最近大家都在用Tensor ...

  9. 统计学习方法:核函数(Kernel function)

    作者:桂. 时间:2017-04-26  12:17:42 链接:http://www.cnblogs.com/xingshansi/p/6767980.html 前言 之前分析的感知机.主成分分析( ...

随机推荐

  1. AlloyTouch.js 源码 学习笔记及原理说明

    alloyTouch这个库其实可以做很多事的, 比较抽象, 需要我们用户好好的思考作者提供的实例属性和一些回调方法(touchStart, change, touchMove, pressMove, ...

  2. Spark性能调优之代码方面的优化

    Spark性能调优之代码方面的优化 1.避免创建重复的RDD     对性能没有问题,但会造成代码混乱   2.尽可能复用同一个RDD,减少产生RDD的个数   3.对多次使用的RDD进行持久化(ca ...

  3. SQL server 数据库 ——聚合函数(一列 多行,值类型)

    聚合函数 5种函数: 1.max最大值   select max(price) from car where code='c024' 2.min最小值   select * from car wher ...

  4. 1782: [Usaco2010 Feb]slowdown 慢慢游

    1782: [Usaco2010 Feb]slowdown 慢慢游 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 570  Solved: 346[Sub ...

  5. 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

    1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4 ...

  6. VueJs学习路线

    对于这个东西,我本人也是初学者,收集一些学习资源的链接,用于个人资源的学习,也分享给大家 lavyun的博客 里面有一些给初学者的建议,学习路线 http://www.cnblogs.com/smar ...

  7. POJ 2182 解题报告

    Lost Cows Time Limit: 1000 MS Memory Limit: 65536 KB Description N (2 <= N <= 8,000) cows have ...

  8. linux 私房菜 CH5 笔记

    知识点 linux 大小写敏感 接口的切换 [Ctrl] + [Alt] + [F1] ~ [F6] :文字接口登入 tty1 ~ tty6 终端机: [Ctrl] + [Alt] + [F7] :图 ...

  9. js 判断是否为空对象、空数组

    当需要判断参数是否为空时,总希望 js 能够提供原生的判断方法,可惜并没有,只能自己封装了. function isEmpty(obj) { // 检验 undefined 和 null if(!ob ...

  10. oracle 实例启动报错(ORA-01078: failure in processing system parameters )

    在启动Oracle数据库时报错,如下: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Productio ...