您的位置:首页 > 其它

[Data Mining] kNN: k-nearest neighbor classification

2015-10-31 23:10 288 查看
最近在跟着赖博做一个图片配诗的小pro,需要用到kNN算法。

先转一篇左耳朵兔子的一篇文章K Nearest Neighbor算法

k-Means算法,主要用来聚类,将相同类别的样本点聚为同一类。

kNN算法,主要用来归类,给定一个待分类的样本点,通过计算样本空间中与自己最近的K个样本来判断这个待分类数据属于哪个分类。

所以这里一个待分类的样本点的类别主要由最近的K个样本中最多的类别,下面这个图是经典的图,说明K的选择不懂,对最终归类结果的影响。



如果k=3,最近的3个点中有两个红色一个蓝色,绿色的这个待分类点属于红色类别。

如果k=5,最近的5个点中有两个红色三个蓝色,绿色的这个待分类点属于蓝色类别。

Algorithm

上述中k如果取1的话,则待分类点直接被赋予最近点的类别。

Distance Measure

常见的距离公式有以下三种



对于离散变量而言,需要使用Hamming Distance



Distance Metrics in Matlab

考虑一个mx−by−n\mathrm{mx-by-n}的数据X、Y,将它们看成m\mathrm{m}个1−by−n\mathrm{1-by-n}个行向量,xsx_s和yty_t。

Euclidean distance

d2st=(xs−yt)(xs−yt)′d_{st}^2=(x_s-y_t)(x_s-y_t)'

Standardized Euclidean distance

d2st=(xs−yt)V−1(xs−yt)′d_{st}^2=(x_s-y_t)V^{-1}(x_s-y_t)'

V是一个n*n的对角阵,对角线的元素是权重的倒数。

Mahalanobis distance

d2st=(xs−yt)C−1(xs−yt)′d_{st}^2=(x_s-y_t)C^{-1}(x_s-y_t)'

C是一个方差矩阵。

City block metric

dst=∑j=1n|xsj−ytj|d_{st}=\sum_{j=1}^n |x_{sj}-y_{tj}|

Minkowski metric

dst=∑j=1n|xsj−ytj|−−−−−−−−−−−⎷pd_{st}=\sqrt[p]{\sum_{j=1}^n |x_{sj}-y_{tj}|}

更多的metric可以参考online decumentation

选择一个最优k的最好方法是观察样本数据。一般来说,虽然一个较大的K会减少噪声的影响,得到较准确的结果,但是并不是说K较大就有保证。

有两个方法保证类别的判定,

- 第一个方法是在一个独立的数据集上测试k的有效性,经验而言,K的选择一般是3-10.

- 第二个方法可以滤除一些错误的待测点,检查,,

Example

我们现在有一堆样本,每个样本包含两个数值变量——age和loan,label只有两类——Default和Non-Default。对于一个未知的样本(Age=48,loan=142000),我们使用kNN来对它进行分类。



使用欧式距离统计

D=(48−33)2+(142000−150000)2−−−−−−−−−−−−−−−−−−−−−−−−−√=8000.01>>Default=YD=\sqrt{(48-33)^2+(142000-150000)^2}=8000.01>>\mathrm{Default=Y}



当K=3时,有两个Default = Y 以及一个Default=N,所以未知样本的label是Default = Y

Standardized Distance

为了避免不同样本数据中不同尺度的影响,可以将数据集中归一化。



归一化的方法

Xs=X−MinMax−MinX_s=\frac{X-Min}{Max-Min}

上文主要来自这个tutorialKNN
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: