统计学习方法:KNN

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,给出主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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: 

  

二、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对应链接点击这里

参考:

分类:  读书, 模式识别
标签:  kd treeKNN

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值