文档库 最新最全的文档下载
当前位置:文档库 › K近邻算法

K近邻算法

K近邻算法
K近邻算法

第一部分、K近邻算法

1.1、什么是K近邻算法

何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙。

用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。根据这个说法,咱们来看下引自维基百科上的一幅图:

如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在,我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。

我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他/她身边的朋友入手,所谓观其友,而识其人。我们不是要判别上图中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从上图中,你还能看到:

?如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一

类。

?如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形

一类。

于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。

1.2、近邻的距离度量表示法

上文第一节,我们看到,K近邻算法的核心在于找到实例点的邻居,这个时候,问题就接踵而至了,如何找到邻居,邻居的判定标准是什么,用什么来度量。这一系列问题便是下面要讲的距离度量表示法。但有的读者可能就有疑问了,我是要找邻居,找相似性,怎么又跟距离扯上关系了?

这是因为特征空间中两个实例点的距离和反应出两个实例点之间的相似性程度。K近邻模型的特征空间一般是n维实数向量空间,使用的距离可以使欧式距离,也是可以是其它距离,既然扯到了距离,下面就来具体阐述下都有哪些距离度量的表示法,权当扩展。

? 1. 欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点x = (x1,...,xn) 和y = (y1,...,yn) 之间的距离为:

(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

(3)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的欧氏距离:

也可以用表示成向量运算的形式:

其上,二维平面上两点欧式距离,代码可以如下编写:

1.//unixfy:计算欧氏距离

2.double euclideanDistance(const vector& v1, const vector& v2)

3.{

4. assert(v1.size() == v2.size());

5.double ret = 0.0;

6.for (vector::size_type i = 0; i != v1.size(); ++i)

7. {

8. ret += (v1[i] - v2[i]) * (v1[i] - v2[i]);

9. }

10.return sqrt(ret);

11. }

2. 曼哈顿距离,我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,

也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距

离总和。例如在平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈

顿距离为:,要注意的是,曼哈顿距离依赖座标系统的

转度,而非系统在座标轴上的平移或映射。

通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,此即曼哈顿距离名称的来源,同时,曼哈顿距离也称为城市街区距离(City Block distance)。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

(2)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的曼哈顿距离

? 3. 切比雪夫距离,若二个向量或二个点p 、and q,其座标分别为及,则两者之间的切比雪夫距离定义如下:,

这也等于以下Lp度量的极值:,因此切比雪夫距离也称为L∞度量。

以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。

在平面几何中,若二点p及q的直角坐标系坐标为及,则切比雪夫距离为:。

玩过国际象棋的朋友或许知道,国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?。你会发现最少步数总是

max( | x2-x1 | , | y2-y1 | ) 步。有一种类似的一种距离度量方法叫切比雪夫距离。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

(2)两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的切比雪夫距离

这个公式的另一种等价形式是

? 4. 闵可夫斯基距离(Minkowski Distance),闵氏距离不是一种距离,而是一组距离的定义。

(1) 闵氏距离的定义

两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

5. 标准化欧氏距离 (Standardized Euclidean distance ),标准化欧氏距离是针对

简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。至于均值和方差标准化到多少,先复习点统计学知识。

假设样本集X的数学期望或均值(mean)为m,标准差(standard deviation,方差开根)为s,那么X的“标准化变量”X*表示为:(X-m)/s,而且标准化变量的数学期望为0,方差为1。

即,样本集的标准化过程(standardization)用公式描述就是:

标准化后的值 = ( 标准化前的值-分量的均值 ) /分量的标准差

经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)

间的标准化欧氏距离的公式:

如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离

(Weighted Euclidean distance)。

? 6. 马氏距离(Mahalanobis Distance)

(1)马氏距离定义

有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X 到u的马氏距离表示为:

(协方差矩阵中每个元素是各个矢量元素之间的协方差Cov(X,Y),Cov(X,Y) = E{ [X-E(X)]

[Y-E(Y)]},其中E为数学期望)

而其中向量Xi与Xj之间的马氏距离定义为:

若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

也就是欧氏距离了。

若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

(2)马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

「微博上的seafood高清版点评道:原来马氏距离是根据协方差矩阵演变,一直被老师误导了,怪不得看Killian在05年NIPS发表的LMNN论文时候老是看到协方差矩阵和半正定,原来是这回事」

?7、巴氏距离(Bhattacharyya Distance),在统计中,Bhattacharyya距离测量两个离散或连续概率分布的相似性。它与衡量两个统计样品或种群之间的重叠量的Bhattacharyya系数密切相关。Bhattacharyya距离和Bhattacharyya系数以20世

纪30年代曾在印度统计研究所工作的一个统计学家A. Bhattacharya命名。同时,Bhattacharyya系数可以被用来确定两个样本被认为相对接近的,它是用来测量中

的类分类的可分离性。

(1)巴氏距离的定义

对于离散概率分布 p和q在同一域 X,它被定义为:

其中:

是Bhattacharyya系数。

对于连续概率分布,Bhattacharyya系数被定义为:

在这两种情况下,巴氏距离并没有服从三角不等式.(值得一提的是,Hellinger距离不服从三角不等式

)。

对于多变量的高斯分布,

和是手段和协方差的分布。

需要注意的是,在这种情况下,第一项中的Bhattacharyya距离与马氏距离有关联。

(2)Bhattacharyya系数

Bhattacharyya系数是两个统计样本之间的重叠量的近似测量,可以被用于确定被考虑的两个样本的相对接近。

计算Bhattacharyya系数涉及集成的基本形式的两个样本的重叠的时间间隔的值的两个样

本被分裂成一个选定的分区数,并且在每个分区中的每个样品的成员的数量,在下面的公式中使用

考虑样品a 和 b ,n是的分区数,并且,被一个和 b i的日分区中的样本数量的成员。更多介绍请参看:https://www.wendangku.net/doc/8314801478.html,/wiki/Bhattacharyya_coefficient。

?8. 汉明距离(Hamming distance),两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”

之间的汉明距离为2。应用:信息编码(为了增强容错性,应使得编码间的最小汉

明距离尽可能大)。

或许,你还没明白我再说什么,不急,看下上篇blog中第78题的第3小题整理的一道面试题目,便一目了然了。如下图所示:

1.//动态规划:

2.

3.//f[i,j]表示s[0...i]与t[0...j]的最小编辑距离。

4.f[i,j] = min { f[i-1,j]+1, f[i,j-1]+1, f[i-1,j-1]+(s[i]==t[j]?0:1) }

5.

6.//分别表示:添加1个,删除1个,替换1个(相同就不用替换)。

与此同时,面试官还可以继续问下去:那么,请问,如何设计一个比较两篇文章相似性的算法?(这个问题的讨论可以看看这里:https://www.wendangku.net/doc/8314801478.html,/zl82CAH,及这里关于simhash 算法的介绍:https://www.wendangku.net/doc/8314801478.html,/linecong/archive/2010/08/28/simhash.html),接下来,便引出了下文关于夹角余弦的讨论。

(上篇blog中第78题的第3小题给出了多种方法,读者可以参看之。同时,程序员编程艺术系列第二十八章将详细阐述这个问题)

?9. 夹角余弦(Cosine) ,几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

(2) 两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度,即:

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

10. 杰卡德相似系数(Jaccard similarity coefficient)

(1) 杰卡德相似系数

两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

杰卡德相似系数是衡量两个集合的相似度一种指标。

(2) 杰卡德距离

与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。

杰卡德距离可用如下公式表示:

杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

(3) 杰卡德相似系数与杰卡德距离的应用

可将杰卡德相似系数用在衡量样本的相似度上。

举例:样本A与样本B是两个n维向量,而且所有维度的取值都是0或1,例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

M11:样本A与B都是1的维度的个数

M01:样本A是0,样本B是1的维度的个数

M10:样本A是1,样本B是0 的维度的个数

M00:样本A与B都是0的维度的个数

依据上文给的杰卡德相似系数及杰卡德距离的相关定义,样本A与B的杰卡德相似系数J 可以表示为:

这里M11+M01+M10可理解为A与B的并集的元素个数,而M11是A与B的交集的元素个数。而样本A与B的杰卡德距离表示为J':

11.皮尔逊系数(Pearson Correlation Coefficient)

在具体阐述皮尔逊相关系数之前,有必要解释下什么是相关系数( Correlation coefficient )与相关距离(Correlation distance)。

相关系数 ( Correlation coefficient )的定义是:

(其中,E为数学期望或均值,D为方差,D开根号为标准差,E{ [X-E(X)] [Y-E(Y)]}称为随机变量X 与Y的协方差,记为Cov(X,Y),即Cov(X,Y) = E{ [X-E(X)] [Y-E(Y)]},而两个变量之间的协方差和标准差

的商则称为随机变量X与Y的相关系数,记为)

相关系数衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

具体的,如果有两个变量:X、Y,最终计算出的相关系数的含义可以有如下理解:

1. 当相关系数为0时,X和Y两变量无关系。

2. 当X的值增大(减小),Y值增大(减小),两个变量为正相关,相关系数在0.00

与1.00之间。

3. 当X的值增大(减小),Y值减小(增大),两个变量为负相关,相关系数在-1.00

与0.00之间。

相关距离的定义是:

OK,接下来,咱们来重点了解下皮尔逊相关系数。

在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,又称作PPMCC或PCCs, 用r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。

通常情况下通过以下取值范围判断变量的相关强度:

相关系数0.8-1.0 极强相关

0.6-0.8 强相关

0.4-0.6 中等程度相关

0.2-0.4 弱相关

0.0-0.2 极弱相关或无相关

在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔森相关系数r”。

(1)皮尔逊系数的定义:

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:

以上方程定义了总体相关系数, 一般表示成希腊字母ρ(rho)。基于样本对协方差和方差进行估计,可以得到样本标准差, 一般表示成r:

一种等价表达式的是表示成标准分的均值。基于(Xi, Yi)的样本点,样本皮尔逊系数是

其中、及,分别是标准分、样本平均值和样本标准差。

或许上面的讲解令你头脑混乱不堪,没关系,我换一种方式讲解,如下:

假设有两个变量X、Y,那么两变量间的皮尔逊相关系数可通过以下公式计算:?公式一:

注:勿忘了上面说过,“皮尔逊相关系数定义为两个变量之间的协方差和标准差的商”,其中标准差的计算公式为:

?公式二:

?公式三:

?公式四:

1. 两个变量之间是线性关系,都是连续数据。

2. 两个变量的总体是正态分布,或接近正态的单峰分布。

3. 两个变量的观测值是成对的,每对观测值之间相互独立。

(3)如何理解皮尔逊相关系数

rubyist:皮尔逊相关系数理解有两个角度

其一, 按照高中数学水平来理解, 它很简单, 可以看做将两组数据首先做Z分数处理之后, 然后两组数据的乘积和除以样本数,Z分数一般代表正态分布中, 数据偏离中心点的距离.等于变量减掉平均数再除以标准差.(就是高考的标准分类似的处理)

样本标准差则等于变量减掉平均数的平方和,再除以样本数,最后再开方,也就是说,方差开方即为标准差,样本标准差计算公式为:

所以, 根据这个最朴素的理解,我们可以将公式依次精简为:

其二, 按照大学的线性数学水平来理解, 它比较复杂一点,可以看做是两组数据的向量夹角的余弦。下面是关于此皮尔逊系数的几何学的解释,先来看一幅图,如下所示:

回归直线:y=gx(x) [红色] 和x=gy(y) [蓝色]

如上图,对于没有中心化的数据, 相关系数与两条可能的回归线y=gx(x) 和x=gy(y) 夹角的余弦值一致。

对于没有中心化的数据(也就是说, 数据移动一个样本平均值以使其均值为0), 相关系数也可以被视作由两个随机变量向量夹角的余弦值(见下方)。

举个例子,例如,有5个国家的国民生产总值分别为10, 20, 30, 50 和80 亿美元。假设这5个国家(顺序相同) 的贫困百分比分别为11%, 12%, 13%, 15%, and 18% 。令x 和y 分别为包含上述5个数据的向量: x = (1, 2, 3, 5, 8) 和y = (0.11, 0.12, 0.13, 0.15, 0.18)。利用通常的方法计算两个向量之间的夹角 (参见数量积), 未中心化的相关系数是:

我们发现以上的数据特意选定为完全相关: y = 0.10 + 0.01 x。于是,皮尔逊相关系数应该等于1。将数据中心化(通过E(x) = 3.8移动x 和通过E(y) = 0.138 移动y ) 得到x = (?2.8, ?1.8, ?0.8, 1.2, 4.2) 和y = (?0.028, ?0.018, ?0.008, 0.012, 0.042), 从中

(4)皮尔逊相关的约束条件

从以上解释, 也可以理解皮尔逊相关的约束条件:

1 两个变量间有线性关系

? 2 变量是连续变量

? 3 变量均符合正态分布,且二元分布也符合正态分布

? 4 两变量独立

在实践统计中,一般只输出两个系数,一个是相关系数,也就是计算出来的相关系数大小,在-1到1之间;另一个是独立样本检验系数,用来检验样本一致性。

简单说来,各种“距离”的应用场景简单概括为,空间:欧氏距离,路径:曼哈顿距离,国际象棋国王:切比雪夫距离,以上三种的统一形式:闵可夫斯基距离,加权:标准化欧氏距离,排除量纲和依存:马氏距离,向量差距:夹角余弦,编码差别:汉明距离,集合近似度:杰卡德类似系数与距离,相关:相关系数与相关距离。

1.3、K值的选择

除了上述1.2节如何定义邻居的问题之外,还有一个选择多少个邻居,即K值定义为多大的问题。不要小看了这个K值选择问题,因为它对K近邻算法的结果会产生重大影响。如李航博士的一书「统计学习方法」上所说:

1. 如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似

误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

2. 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以

减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。

3. K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在

训练实例中最多的累,模型过于简单,忽略了训练实例中大量有用信息。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

k近邻分类算法

第2章k-近邻算法(kNN) 引言 本章介绍kNN算法的基本理论以及如何使用距离测量的方法分类物品。其次,将使用python从文本文件中导入并解析数据,然后,当存在许多数据来源时,如何避免计算距离时可能碰到的一些常见的错识。 2.1 k-近邻算法概述 k-近邻(k Nearest Neighbors)算法采用测量不同特征之间的距离方法进行分类。它的工作原理是:存在一个样本数据集合,并且样本集中每个数据都存在标签,即我们知道样本每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签。一般来说,我们只选择样本数据集中前k 个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。 k-近邻算法的优点是精度高,对异常值不敏感,无数据输入假定;缺点是计算复杂度高、空间复杂度高。适用于数值和离散型数据。 2.1.1 准备知识:使用python导入数据 首先,创建名为kNN.py的python模块,然后添加下面代码: from numpy import * #引入科学计算包 import operator #经典python函数库。运算符模块。

#创建数据集 def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels 测试:>>> import kNN >>> group,labels=kNN.createDataSet() 注意:要将kNN.py文件放到Python27文件夹下,否则提示找不到文件。 2.2.2 实施kNN算法 使用k-近邻算法将每组数据划分到某个类中,其伪代码如下: 对未知类别属性的数据集中的每个点依次执行以下操作: 1.计算已知类别数据集中的点与当前点之间的距离; 2.按照距离递增交序排序; 3.选取与当前点距离最小的k个点; 4.确定前k个点所在类别的出现频率; 5.返回前k个点出现频率最高的类别作为当前点的预测分类。 用欧氏距离公式,计算两个向量点xA和xB之间的距离: 例如,点(0, 0)与(1, 2)之间的距离计算为: python函数classify()程序如下所示:

模式识别(K近邻算法)

K 近邻算法 1.算法思想 取未知样本的x 的k 个近邻,看这k 个近邻中多数属于哪一类,就把x 归于哪一类。具体说就是在N 个已知的样本中,找出x 的k 个近邻。设这N 个样本中,来自1w 类的样本有1N 个,来自2w 的样本有2N 个,...,来自c w 类的样本有c N 个,若c k k k ,,,21 分别是k 个近邻中属于c w w w ,,,21 类的样本数,则我们可以定义判别函数为: c i k x g i i ,,2,1,)( == 决策规则为: 若i i j k x g max )(=,则决策j w x ∈ 2.程序代码 %KNN 算法程序 function error=knn(X,Y ,K) %error 为分类错误率 data=X; [M,N]=size(X); Y0=Y; [m0,n0]=size(Y); t=[1 2 3];%3类向量 ch=randperm(M);%随机排列1—M error=0; for i=1:10 Y1=Y0; b=ch(1+(i-1)*M/10:i*M/10); X1=X(b,:); X(b,:)=[]; Y1(b,:)=[]; c=X; [m,n]=size(X1); %m=15,n=4 [m1,n]=size(c); %m1=135,n=4 for ii=1:m for j=1:m1 ss(j,:)=sum((X1(ii,:)-c(j,:)).^2); end [z1,z2]=sort(ss); %由小到大排序 hh=hist(Y1(z2(1:K)),t); [w,best]=max(hh); yy(i,ii)=t(best); %保存修改的分类结果 end

基于K近邻的分类算法研究-WORD

K近邻算法 算法介绍: K最近邻(k-Nearest neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。 KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。 该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

K近邻分类数据模拟和实例分析

K近邻分类数据模拟和实例分析 3.1 数据模拟 用MATLAB随机生成150组数据,类别为三类,编程如下 # 程序1: A1=rand(50,2); hold on plot(A1(:,1),A1(:,2),'.') A2=rand(50,2)+0.75; hold on plot(A2(:,1),A2(:,2),'.') hold on A3=rand(50,2)+1.5; plot(A3(:,1),A3(:,2),'.') 再用k近邻分类算法对这150组数据进行分类,取k=15近邻,程序如下# 程序 2: clear all

clc y=importdata('C:\Users\adm\Desktop\test.txt'); p=y(:,2:3); p=p'; Add=zeros(150,1); Add(1:50,:)=ones(50,1); Add(51:100,:)=2*ones(50,1); Add(101:150,:)=3*ones(50,1); figure(1),plot(y(:,1),Add,'g.'); hold on grid on; count=0; for i=1:3 for j=1:50 for k=1:150 distance(k)=mse(p(:,k)-p(:,(i-1)*50+j));%保存每个向量与所有训练样本之间的距离 end [d1 index1]=sort(distance);%对距离distance向量进行从小到大的排序 num=[0 0 0]; for m=1:20 % 考察num,存放的是排序后distance前20个属于每一类别的个数 if index1(m)<=50 num(1)=num(1)+1; elseif index1(m)<=100 num(2)=num(2)+1; else num(3)=num(3)+1; end end [d2 class]=max(num);%属于哪类的个数最多,就属于哪类,class 即就是该向量所属的类别 if i==class count=count+1; end A((i-1)*50+j)=class;%存放判断的结果 end end count rate=count/150 figure(2),plot(y(:,1),A,'r.');grid on;%画图分类 程序运行后得到 count =143 rate =0.9533

第6章-k近邻算法--机器学习与应用第二版

第6章k 近邻算法 k 近邻算法(kNN 算法)由Thomas 等人在1967年提出[1]。它基于以下朴素思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k 个样本,统计这些样本的类别进行投票,票数最多的那个类就是分类结果。因为直接比较待预测样本和训练样本的距离,kNN 算法也被称为基于实例的算法。 6.1基本概念 确定样本所属类别的一种最简单的方法是直接比较它和所有训练样本的相似度,然后将其归类为最相似的样本所属的那个类,这是一种模板匹配的思想。k 近邻算法采用了这种思路,下图6.1是使用k 近邻思想进行分类的一个例子: 图6.1k 近邻分类示意图 在上图中有红色和绿色两类样本。对于待分类样本即图中的黑色点,我们寻找离该样本最近的一部分训练样本,在图中是以这个矩形样本为圆心的某一圆范围内的所有样本。然后统计这些样本所属的类别,在这里红色点有12个,绿色有2个,因此把这个样本判定为红色这一类。上面的例子是二分类的情况,我们可以推广到多类,k 近邻算法天然支持多类分类问题。 6.2预测算法 k 近邻算法没有要求解的模型参数,因此没有训练过程,参数k 由人工指定。它在预测时才会计算待预测样本与训练样本的距离。 对于分类问题,给定l 个训练样本(),i i y x ,其中i x 为维特征向量,i y 为标签值,设定

参数k ,假设类型数为c ,待分类样本的特征向量为x 。预测算法的流程为: 1.在训练样本集中找出离x 最近的k 个样本,假设这些样本的集合为N 。 2.统计集合N 中每一类样本的个数,1,...,i C i c =。 3.最终的分类结果为arg max i i C 。 在这里arg max i i C 表示最大的i C 值对应的那个类i 。如果1k =,k 近邻算法退化成最近邻算法。 k 近邻算法实现简单,缺点是当训练样本数大、特征向量维数很高时计算复杂度高。因为每次预测时要计算待预测样本和每一个训练样本的距离,而且要对距离进行排序找到最近的k 个样本。我们可以使用高效的部分排序算法,只找出最小的k 个数;另外一种加速手段是k-d 树实现快速的近邻样本查找。 一个需要解决的问题是参数k 的取值。它需要根据问题和数据的特点来确定。在实现时可以考虑样本的权重,即每个样本有不同的投票权重,这称方法称为为带权重的k 近邻算法。另外还其他改进措施,如模糊k 近邻算法[2]。 kNN 算法也可以用于回归问题。假设离测试样本最近的k 个训练样本的标签值为i y ,则对样本的回归预测输出值为: 1/k i i y y k =??= ??? ∑即所有邻居的标签均值,在这里最近的k 个邻居的贡献被认为是相等的。同样的也可以采用带权重的方案。带样本权重的回归预测函数为: 1/k i i i y w y k =??= ??? ∑其中i w 为第i 个样本的权重。权重值可以人工设定,或者用其他方法来确定,例如设置为与距离成反比。 6.3距离定义 kNN 算法的实现依赖于样本之间的距离值,因此需要定义距离的计算方式。本节介绍几种常用的距离定义,它们适用于不同特点的数据。 两个向量之间的距离为() ,i j d x x ,这是一个将两个维数相同的向量映射为一个实数的函数。距离函数必须满足以下条件,第一个条件是三角不等式:()()() ,,,i k k j i j d d d +≥x x x x x x 这与几何中的三角不等式吻合。第二个条件是非负性,即距离不能是一个负数: (),0 i j d ≥x x 第三个条件是对称性,即A 到B 的距离和B 到A 的距离必须相等:

k近邻算法

k近邻算法(knn, k nearest neighbor) 前两天受朋友之托,帮忙与两个k近邻算法,k近邻的非正式描述,就是给定一个样本集exset,样本数为M,每个样本点是N维向量,对于给定目标点d,d也为N维向量,要从exset中找出与d距离最近的k个点(k<=N),当k=1时,knn问题就变成了最近邻问题。最naive的方法就是求出exset中所有样本与d的距离,进行按出小到大排序,取前k个即为所求,但这样的复杂度为O(N),当样本数大时,效率非常低下. 我实现了层次knn(HKNN)和kdtree knn,它们都是通过对树进行剪枝达到提高搜索效率的目的,hknn的剪枝原理是(以最近邻问题为例),如果目标点d与当前最近邻点x的距离,小于d与某结点Kp中心的距离加上Kp的半径,那么结点Kp中的任何一点到目标点的距离都会大于d 与当前最近邻点的距离,从而它们不可能是最近邻点(K近邻问题类似于它),这个结点可以被排除掉。 kdtree对样本集所在超平面进行划分成子超平面,剪枝原理是,如果某个子超平面与目标点的最近距离大于d与当前最近点x的距离,则该超平面上的点到d的距离都大于当前最近邻点,从而被剪掉。两个算法均用matlab实现(应要求),把代码帖在下面,以备将来查用或者需要的朋友可以参考. function y = VecDist(a, b) %%返回两向量距离的平方 assert(length(a) == length(b)); y = sum((a-b).^2); end 下面是HKNN的代码

classdef Node < handle %UNTITLED2 Summary of this class goes here % Detailed explanation goes here % Node 层次树中的一个结点,对应一个样本子集Kp properties Np; %Kp的样本数 Mp; %Kp的样本均值,即中心 Rp; %Kp中样本到Mp的最大距离 Leafs; %生成的子节点的叶子,C * k矩阵,C为中心数量,k是样本维数。如果不是叶结点,则为空 SubNode; %子节点, 行向量 end methods function obj = Node(samples, maxLeaf) global SAMPLES

模式识别 最近邻法和K近邻法MATLAB实现

最近邻法和k-近邻法 学号:02105120姓名:吴林一.基本概念: 最近邻法:对于未知样本x,比较x与N个已知类别的样本之间的欧式距离,并决策x与距离它最近的样本同类。 K近邻法:取未知样本x的k个近邻,看这k个近邻中多数属于哪一类,就把x归为哪一类。K取奇数,为了是避免k1=k2的情况。 二.问题分析: 要判别x属于哪一类,关键要求得与x最近的k个样本(当k=1时,即是最近邻法),然后判别这k个样本的多数属于哪一类。 可采用欧式距离公式求得两个样本间的距离s=sqrt((x1-x2)^2+(y1-y2)^2) 三.算法分析: 该算法中任取每类样本的一半作为训练样本,其余作为测试样本。例如iris中取每类样本的25组作为训练样本,剩余25组作为测试样本,依次求得与一测试样本x距离最近的k 个样本,并判断k个样本多数属于哪一类,则x就属于哪类。测试10次,取10次分类正确率的平均值来检验算法的性能。 四.MATLAB代码: 最近邻算实现对Iris分类 clc; totalsum=0; for ii=1:10 data=load('iris.txt'); data1=data(1:50,1:4);%任取Iris-setosa数据的25组 rbow1=randperm(50); trainsample1=data1(rbow1(:,1:25),1:4); rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25组按行下标大小顺序排列testsample1=data1(rbow1(:,26:50),1:4); data2=data(51:100,1:4);%任取Iris-versicolor数据的25组 rbow2=randperm(50); trainsample2=data2(rbow2(:,1:25),1:4); rbow2(:,26:50)=sort(rbow2(:,26:50)); testsample2=data2(rbow2(:,26:50),1:4); data3=data(101:150,1:4);%任取Iris-virginica数据的25组 rbow3=randperm(50); trainsample3=data3(rbow3(:,1:25),1:4); rbow3(:,26:50)=sort(rbow3(:,26:50)); testsample3=data3(rbow3(:,26:50),1:4);

k近邻模型和算法

k 近邻模型和算法 2.1 K 近邻模型 K 近邻法使用的模型实际上对应于对特征空间的划分。模型由三个基本要素 —-距离度量、k 值得选择和分类规则决定。 2.1.1 模型 K 近邻法中,当训练集、距离度量(如欧式距离)、k 值及分类决策规则(如多数表决)确定后,对于任何一个新的输入实例,它所属的类唯一确定。这相当于根据上述要素将特征空间划分为一些子空间,确定子空间里的每个点所述的类。这一事实从最近邻算法中可以看得很清楚。 特征空间中,对每个实例点i x ,距离该点比其他店更近的所有点组成一个区域,叫做单元。每个训练实例点拥有一个单元,所有训练实例点的单元构成对特 征空间的一个划分。最近邻法将实例i x 的类i y 作为其单元中所有点的类标记。这样,每个单元的实例点的类别时确定的。下图是二维特征空间划分的一个例子。 2.1.2 距离度量

特征空间中两个实例点的距离是两个点相似程度的反映。K 近邻模型的特征空间一般是n 维实数向量空间Rn 。使用的距离是欧式距离,但也可以是其他距离,如更一般的Lp 或闽科夫斯基距离。 设特征空间χ是n 维实数向量空间n R ,i x ,,),,,(,) ()2()1(T n i i i i j x x x x x =∈χ ,),,,() ()2()1(T n j j j j x x x x =j i x x ,的距离定义为P L p n l p l j l i j i p x x x x L 11),(? ?? ??-=∑= 这里1≥p 。当2=p 时,称为欧式距离,即 2 1 122,??? ??-=∑=n l l j l i j i x x x x L ) ( 当 时,称为曼哈顿距离,即 ∑=-=n l l j l i j i x x x x L 1 1,) ( 当∞=p 时,它是各个距离坐标的最大值,即 l j l i l j i x x x x L -=∞max ),( 2.1.3 K 值的选择 k 值的选择会对k 近邻法的结果产生重大影响。 如果选择较小的k 值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用。但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果近邻的实例点恰巧是噪声,预测就会出错。换句话说,k 值得减小就意味着整体模型变得复杂,容易发生过拟合。 如果选择较大的k 值,就相当于用较大邻域中的训练实例进行预测。其优点是可以减少学习的估计误差。但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,是预测发生错误。K 值得增大就意味着整体的模型变得简单。 如果k=N ,那么无论输入实例是什么,都将简单的预测它属于在训练实例中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的。 2.1.4 分类决策规则 1 =p

k最近邻算法实验报告

题目k-最近邻算法实现学生姓名 学生学号 专业班级 指导教师 2015-1-2

实验二 k-最近邻算法实现 一、实验目的 1.加强对k-最近邻算法的理解; 2.锻炼分析问题、解决问题并动手实践的能力。 二、实验要求 使用一种你熟悉的程序设计语言,如C++或Java,给定最近邻数k和描述每个元组的属性数n,实现k-最近邻分类算法,至少在两种不同的数据集上比较算法的性能。 三、实验环境 Win7 旗舰版 + Visual Studio 2010 语言:C++ 四、算法描述 KNN(k Nearest Neighbors)算法又叫k最临近方法。假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类, KNN就是计算每个样本数据到待分类数据的距离。如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。因此,采用这种方法可以较好地避免样本的不平衡问题。另外,由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待

分样本集来说,KNN 方法较其他方法更为适合。该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K 个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。 1、 算法思路 K-最临近分类方法存放所有的训练样本,在接受待分类的新样本之前不需构造模型,并且直到新的(未标记的)样本需要分类时才建立分类。K-最临近分类基于类比学习,其训练样本由N 维数值属性描述,每个样本代表N 维空间的一个点。这样,所有训练样本都存放在N 维模式空间中。给定一个未知样本,k-最临近分类法搜索模式空间,找出最接近未知样本的K 个训练样本。这K 个训练样本是未知样本的K 个“近邻”。“临近性”又称为相异度(Dissimilarity ),由欧几里德距离定义,其中两个点 X (x1,x2,…,xn )和Y (y1,y2,…,yn )的欧几里德距离是: 2 222211)()()(),(n n y x y x y x y x D -+?+-+-= 未知样本被分配到K 个最临近者中最公共的类。在最简单的情况下,也就是当K=1时,未知样本被指定到模式空间中与之最临近的训练样本的类。 2、 算法步骤 初始化距离为最大值; 计算未知样本和每个训练样本的距离dist ; 得到目前K 个最临近样本中的最大距离maxdist ; 如果dist 小于maxdist ,则将该训练样本作为K-最近邻样本; 重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完; 统计K-最近邻样本中每个类标号出现的次数; 选择出现频率最大的类标号作为未知样本的类标号。

模式识别 最近邻法和k近邻法MATLAB实现

学号:02105120 姓名:吴林一.基本概念: 最近邻法:对于未知样本x,比较x与N个已知类别的样本之间的欧式距离,并决策x与距离它最近的样本同类。 K近邻法:取未知样本x的k个近邻,看这k个近邻中多数属于哪一类,就把x归为哪一类。K取奇数,为了是避免k1=k2的情况。 二.问题分析: 要判别x属于哪一类,关键要求得与x最近的k个样本(当k=1时,即是最近邻法),然后判别这k个样本的多数属于哪一类。 可采用欧式距离公式求得两个样本间的距离s=sqrt((x1-x2)^2+(y1-y2)^2) 三.算法分析: 该算法中任取每类样本的一半作为训练样本,其余作为测试样本。例如iris中取每类样本的25组作为训练样本,剩余25组作为测试样本,依次求得与一测试样本x距离最近的k 个样本,并判断k个样本多数属于哪一类,则x就属于哪类。测试10次,取10次分类正确率的平均值来检验算法的性能。 四.MATLAB代码: 最近邻算实现对Iris分类 clc; totalsum=0; for ii=1:10 data=load(''); data1=data(1:50,1:4);%任取Iris-setosa数据的25组 rbow1=randperm(50); trainsample1=data1(rbow1(:,1:25),1:4); rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25组按行下标大小顺序排列 testsample1=data1(rbow1(:,26:50),1:4); data2=data(51:100,1:4);%任取Iris-versicolor数据的25组 rbow2=randperm(50); trainsample2=data2(rbow2(:,1:25),1:4); rbow2(:,26:50)=sort(rbow2(:,26:50)); testsample2=data2(rbow2(:,26:50),1:4); data3=data(101:150,1:4);%任取Iris-virginica数据的25组 rbow3=randperm(50); trainsample3=data3(rbow3(:,1:25),1:4); rbow3(:,26:50)=sort(rbow3(:,26:50)); testsample3=data3(rbow3(:,26:50),1:4); trainsample=cat(1,trainsample1,trainsample2,trainsample3);%包含75组数据的样本集 testsample=cat(1,testsample1,testsample2,testsample3); newchar=zeros(1,75);sum=0; [i,j]=size(trainsample);%i=60,j=4 [u,v]=size(testsample);%u=90,v=4 for x=1:u

R语言与机器学习(1)K-近邻算法

K-近邻算法原理及举例 工作原理:我们知道样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k(通常k<20)数据,选择这k个数据中出现最多的分类作为新数据的分类。 算法描述: (1) 计算已知类别数据及中的点与当前点的距离; (2) 按距离递增次序排序 (3) 选取与当前点距离最小的k个点 (4) 确定前K个点所在类别出现的频率 (5) 返回频率最高的类别作为当前类别的预测 这里我们使用最常见欧氏距离作为衡量标准,以鸢尾花数据集为例来说明K-近邻算法:鸢尾花数据集包含150个数据,测量变量为花瓣,花萼的长度与宽度,分类变量为setosa, versicolor, 和 virginica。 准备数据:

为了了解数据,我们先通过作图分析,相关分析来看看数据分类指标的合理性,这一点十分重要,有助于减少分类指标中的噪声。 从上图可以看出,我们通过这2个变量大致是可以把鸢尾花分类的,也就是说分类的特征变量选择是合理的,(同理可以分析另外2个,分类效果不如这两个,但大致上还是能区分的)当然我们也可以选择计算相关系数来看特征变量的合理性。 我们很容易发现,数值差最大的属性对距离的影响最大,所以在特征值等权重的假定下,我们先得归一化特征值,计算公式为: Newvalue=(oldvalue-min)/(max-min) R代码:

autonorm<-function(data){ for(iin 1:length(data)) data[i]<-(data[i]-min(data))/(max(data)-min(data)) return(data) } data<-as.matrix(apply(iris[,1:4],2,autonorm)) 得到了归一化后的数据集,下面计算距离。我们在这里取三个数据作为验证集来看看分类的效果,首先将验证集归一化: x<-iris[13,1:4] y<-iris[79,1:4] z<-iris[100,1:4] x<-(x-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min)) y<-(y-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min)) z<-(z-apply(iris[c(-13,-79,-100),1:4],2,min))/(apply(iris[c(-13,-79,-100),1:4],2,max)-apply(iris[c(-13,-79,-100),1:4],2,min)) 计算距离,仅以x为例,运行代码:(k取5) dis<-rep(0,length(data[,1])) for(iin 1:length(data[,1])) dis[i]<-sqrt(sum((z-data[i,1:4])^2)) table(data[order(dis)[1:5],5]) x,y,z的输出结果为 标签xyyz

最近邻法和k-近邻法

最近邻法和k-近邻法 一.基本概念: 最近邻法:对于未知样本x,比较x与N个已知类别的样本之间的欧式距离,并决策x 与距离它最近的样本同类。 K近邻法:取未知样本x的k个近邻,看这k个近邻中多数属于哪一类,就把x归为哪一类。K取奇数,为了是避免k1=k2的情况。 二.问题分析: 要判别x属于哪一类,关键要求得与x最近的k个样本(当k=1时,即是最近邻法),然后判别这k个样本的多数属于哪一类。 可采用欧式距离公式求得两个样本间的距离s=sqrt((x1-x2)^2+(y1-y2)^2) 三.算法分析: 该算法中任取每类样本的一半作为训练样本,其余作为测试样本。例如iris中取每类样本的25组作为训练样本,剩余25组作为测试样本,依次求得与一测试样本x距离最近的k 个样本,并判断k个样本多数属于哪一类,则x就属于哪类。测试10次,取10次分类正确率的平均值来检验算法的性能。 四.MATLAB代码: 最近邻算实现对Iris分类 clc; totalsum=0; for ii=1:10 data=load('iris.txt'); data1=data(1:50,1:4);%任取Iris-setosa数据的25组 rbow1=randperm(50); trainsample1=data1(rbow1(:,1:25),1:4); rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25组按行下标大小顺序排列 testsample1=data1(rbow1(:,26:50),1:4); data2=data(51:100,1:4);%任取Iris-versicolor数据的25组 rbow2=randperm(50); trainsample2=data2(rbow2(:,1:25),1:4); rbow2(:,26:50)=sort(rbow2(:,26:50)); testsample2=data2(rbow2(:,26:50),1:4); data3=data(101:150,1:4);%任取Iris-virginica数据的25组 rbow3=randperm(50); trainsample3=data3(rbow3(:,1:25),1:4); rbow3(:,26:50)=sort(rbow3(:,26:50)); testsample3=data3(rbow3(:,26:50),1:4); trainsample=cat(1,trainsample1,trainsample2,trainsample3);%包含75组数据的样本集testsample=cat(1,testsample1,testsample2,testsample3); newchar=zeros(1,75);sum=0; [i,j]=size(trainsample);%i=60,j=4 [u,v]=size(testsample);%u=90,v=4 for x=1:u for y=1:i

K近邻分类算法

K近邻分类算法(K –nearest neighbors,简称KNN) 1算法的提出与发展 最初的近邻法是由Cover和Hart与1968年提出的,随后得到理论上深入的分析与研究,是非参数法中最重要的方法之一。 2算法原理 2.1 基本原理 最近邻方法(k-nearest neighbor,简称kNN)是一种简洁而有效的非参数分类方法,是最简单的机器学习算法之一,该算法最初由Cover和Hart提出的,用于解决文本的分类问题。 K 近邻算法是最近邻算法的一个推广。该规则将是一个测试数据点x分类为与它最接近的K 个近邻中出现最多的那个类别。K 近邻算法从测试样本点x开始生长,不断的扩大区域,直到包含进K 个训练样本点为止,并且把测试样本点x归为这最近的K 个训练样本点中出现频率最大的类别。其中测试样本与训练样本的相似度一般使用欧式距离测量。 如果K 值固定,并且允许训练样本个数趋向于无穷大,那么,所有的这K 个近邻都将收敛于x。如同最近邻规则一样,K 个近邻的标记都是随机变量,概率P(w i|x),i=1,2,…,K 都是相互独立的。假设P(w m|x)是较大的那个后验概率,那么根据贝叶斯分类规则,则选取类别w m。而最近邻规则以概率P(w m|x)选取类别。而根据K近邻规则,只有当K个最近邻中的大多数的标记记为w m,才判定为类别w m。做出这样断定的概率为 通常K值越大,选择类别w m概率也越大。 2.2K值的选择 K近邻规则可以被看作是另一种从样本中估计后验概率P(w i|x)的方法。为了得到可高的估计必须是的K值越大越好。另一方面,又希望又希望x的K 个近邻x 距离x1越近越好,因为这样才能保证P(w i|x1)尽可能逼近P(w i|x)。在选取K 值的时候,就不得不做出某种折衷。只有当n趋近于无穷大时,才能保证K 近邻规则几乎是最优的分类规则。 K值的选择:需要消除K值过低,预测目标容易产生变动性,同时高k值时,预测目标有过平滑现象。推定k值的有益途径是通过有效参数的数目这个概念。有效参数的数目是和k值相关的,大致等于n/k,其中,n是这个训练数据集中实例的数目。 确定K的值:通过实验确定。进行若干次实验,取分类误差率最小的k值。 2.3算法步骤 1)依公式计算Item 与D1、D2 ……、Dj 之相似度。得到Sim(Item, D1)、Sim(Item, D2)……、Sim(Item, Dj)。 2)将Sim(Item, D1)、Sim(Item, D2)……、Sim(Item, Dj)排序,若是超过相似度门槛t则放入 邻居案例集合NN。 3)自邻居案例集合NN中取出前k名,依多数决,得到Item可能类别。 3KNN优缺点 优点:1)原理简单,实现起来比较方便; 2)支持增量学习;

基于spark的K近邻分类算法研究及应用

齐鲁工业大学硕士学位论文 ABSTRACT With the development of information technology,a large amount of information has been produced.How to obtain valuable information from it is a very meaningful research content.With more and more information,a single machine has been unable to deal with such data,Hadoop was born,but Hadoop's computing model is more complex to write code,and the calculation mode is based on disk,which leads to slow calculations,Spark The birth of a good make up for the Hadoop flaw,more and more people choose Spark as a computing framework for big data.Classification algorithm is an important part of data mining,mainly used for prediction and recommendation.Spark MLlib is a machine learning algorithm library in Spark. However,because Spark was just born,its algorithm library is not perfect.However, the K nearest neighbor algorithm is not supported in the machine learning algorithm library MLlib of Spark,but the K nearest neighbor algorithm is simple and effective. It is easy to implement and widely used.Therefore,it is necessary to implement the K nearest neighbor algorithm on the Spark platform. This paper combines the clustering algorithm and the K-nearest neighbor algorithm,and uses the clustering algorithm to first find the center of the sample category of each class in the training sample set,and then finds the distance of each training sample from the center of the sample class in the training set.The reciprocal of each square is used as the weight,and the weights are used to distinguish the K nearest neighbors of the test sample.Finally,a weighted voting strategy is used to classify the K nearest neighbors.Through experimental verification,the improved K-nearest neighbor algorithm has a better accuracy.Then the parallel K-nearest neighbor algorithm is designed and parallelized on the Spark platform.The Spark cluster was set up for experimental analysis.The experimental verification algorithm used to run on the Spark platform was significantly slower than the single machine, and the efficiency of the algorithm was significantly improved. This paper analyzes and studies the data inclining condition when the K nearest neighbor algorithm is parallelized on the Spark platform.The data skew influences the execution efficiency of the algorithm very much.When the K neighbor algorithm calculates the larger data amount,the algorithm execution efficiency is lower.This paper improves and optimizes the K-nearest neighbor algorithm's parallelization,and

K近邻分类的算法实现

K近邻分类的算法实现 K近邻(KNN)法的输入为实例的特征向量,对应于特征空间的点;输入为实例的类别,可以取多类。K近邻法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此K近邻不具有显式的学习过程。K近邻法实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 1.1 选题背景 现如今,数据的爆炸式增长、广泛可用和巨大数量使得我们的时代成为真正的数据时代。急需功能强大和通用的工具,以便从这些海量数据中发现有价值的信息,把这些数据转化成有组织的知识。这种需求导致了数据挖掘的诞生。这个领域是年轻的、动态变化的、生机勃勃的。数据挖掘已经并且将继续在我们从数据时代大步跨入信息时代的历程中作出贡献。 K近邻方法是20世纪50年代早期首次引进的。当给定大量数据集时,该方法是计算密集的,直到20世纪60年代计算能力大大增强之后才流行起来。此后它广泛用于模式识别领域。 K近邻分类法是基于类比学习,即通过将给定的检验元组与它相似的训练元组进行比较来学习。训练元组用n个属性描述。每个元组代表n维空间的一个点。这样,所有的训练元组都存放在n维模式空间中。当给定一个未知元组时,k近邻分类法搜索模式空间,找出最接近元组的k个训练元组。这k个训练元组即为该元组的k个“最近邻”。 1.2 研究现状 国内外学者为此算法在实际生活中更好地应用做出了许多努力。例如对k近邻方法的不足做出的一些改进如文献[2],[7],[8],[9],[10]等等。在其他领域的应用如文献[5]将K近邻算法改进为非线性分类算法,以达到分类动态心电图波形的目的。文献[6]在KNN算法的基础上提出了图像自动分类模型。在生物学上,K近邻方法也得到了广泛地应用,有文献利用蛋白质相互作用网络,提出

相关文档