文档库 最新最全的文档下载
当前位置:文档库 › k近邻算法以及实例

k近邻算法以及实例

k近邻算法以及实例
k近邻算法以及实例

【机器学习】k-近邻算法以及算法实例

时间 2015-01-26 14:31:00 博客园-原创精华区

原文https://www.wendangku.net/doc/d49447116.html,/jtianwen2014/p/4249003.html

主题算法数据挖掘

机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法。

一、kNN算法的工作原理

二、适用情况

三、算法实例及讲解

---1.收集数据

---2.准备数据

---3.设计算法分析数据

---4.测试算法

一、kNN算法的工作原理

官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数,最后,选择k个最相似的数据中出现次数最多的分类,作为新数据的分类。

我的理解:k-近邻算法就是根据“新数据的分类取决于它的邻居”进行的,比如邻居中大多数都是退伍军人,那么这个人也极有可能是退伍军人。而算法的目的就是先找出它的邻居,然后分析这几位邻居大多数的分类,极有可能就是它本省的分类。

二、适用情况

优点:精度高,对异常数据不敏感(你的类别是由邻居中的大多数决定的,一个异常邻居并不能影响太大),无数据输入假定;

缺点:计算发杂度高(需要计算新的数据点与样本集中每个数据的“距离”,以判断是否是前k个邻居),空间复杂度高(巨大的矩阵);

适用数据范围:数值型(目标变量可以从无限的数值集合中取值)和标称型(目标变量只有在有限目标集中取值)。

三、算法实例及讲解

例子中的案例摘《机器学习实战》一书中的,代码例子是用python编写的(需要matplotlib和numpy库),不过重在算法,只要算法明白了,用其他语言都是可以写出来的:

海伦一直使用在线约会网站寻找合适自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:1.不喜欢的人(以下简称1 );2.魅力一般的人(以下简称2 );3.极具魅力的人(以下简称3 )

尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当的分类。她觉得可以在周一到周五约会哪些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好的帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。

我们先提取一下这个案例的目标:根据一些数据信息,对指定人选进行分类(1或2或3)。为了使用kNN算法达到这个目标,我们需要哪些信息?前面提到过,就是需要样本数据,仔细阅读我们发现,这些样本数据就是“海伦还收集了一些约会网站未曾记录的数据信息”。好的,下面我们就开始吧!

----1.收集数据

海伦收集的数据是记录一个人的三个特征:每年获得的飞行常客里程数;玩视频游戏所消耗的时间百分比;每周消费的冰淇淋公升数。数据是txt格式文件,如下图,前三列依次是三个特征,第四列是分类(1:不喜欢的人,2:魅力一般的人,3:极具魅力的人),每一行代表一个人。

数据文档的下载链接是:https://www.wendangku.net/doc/d49447116.html,/s/1jG7n4hS

---- 2.准备数据

何为准备数据?之前收集到了数据,放到了txt格式的文档中了,看起来也比较规整,但是计算机并不认识啊。计算机需要从txt文档中读取数据,并把数据进行格式化,也就是说存到矩阵中,用矩阵来承装这些数据,这样才能使用计算机处理。

需要两个矩阵:一个承装三个特征数据,一个承装对应的分类。于是,我们定义一个函数,函数的输入时数据文档(txt格式),输出为两个矩阵。

代码如下:

1def file2matrix(filename):

2fr =open(filename)

3numberOfLines =len(fr.readlines())

4returnMat = zeros((numberOfLines, 3))

5classLabelVector = []

6fr =open(filename)

7 index =0

8for line in fr.readlines():

9 line =line.strip()

10listFromLine = line.split('\t')

11returnMat[index, :] = listFromLine[0:3]

12classLabelVector.append(int(listFromLine[-1]))

13 index += 1

14return returnMat, classLabelVector

简要解读代码:首先打开文件,读取文件的行数,然后初始化之后要返回的两个矩阵(returnMat、classLabelsVector),然后进入循环,将每行的数据各就各位分配给returnMat和classLabelsVector。

----3.设计算法分析数据

k-近邻算法的目的就是找到新数据的前k个邻居,然后根据邻居的分类来确定该数据的分类。

首先要解决的问题,就是什么是邻居?当然就是“距离”近的了,不同人的距离怎么确定?这个有点抽象,不过我们有每个人的3个特征数据。每个人可以使用这三个特征数据来代替这个人——三维点。比如样本的第一个人就可以用(40920,8.326976,0.953952)来代替,并且他的分类是3。那么此时的距离就是点的距离:

A点(x1, x2, x3),B点(y1, y2, y3),这两个点的距离就是:(x1-y1)^2+(x2-y2)^2+(x3-y3)^2的平方根。求出新数据与样本中每个点的距离,然后进行从小到大排序,前k位的就是k-近邻,然后看看这k位近邻中占得最多的分类是什么,也就获得了最终的答案。

这个处理过程也是放到一个函数里的,代码如下:

1def classify0(inX, dataSet, labels, k):

2dataSetSize =dataSet.shape[0]

3diffMat = tile(inX, (dataSetSize,1)) -dataSet

4sqDiffMat = diffMat**2

5sqDistances = sqDiffMat.sum(axis=1)

6 distances = sqDistances**0.5

7sortedDistIndicies =distances.argsort()

8classCount={}

9for i in range(k):

10voteIlabel =labels[sortedDistIndicies[i]]

11classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

12sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)

13return sortedClassCount[0][0]

简要解读代码:该函数的4个参数分别为新数据的三个特征inX、样本数据特征集(上一个函数的返回值)、样本数据分类(上一个函数的返回值)、k,函数返回位新数据的分类。第二行dataSetSize获取特征集矩阵的行数,第三行为新数据与样本各个数据的差值,第四行取差值去平方,之后就是再取和,然后平方根。代码中使用的排序函数都是python自带的。

好了,现在我们可以分析数据了,不过,有一点不知道大家有没有注意,我们回到那个数据集,第一列代表的特征数值远远大于其他两项特征,这样在求距离的公式中就会占很大的比重,致使两点的距离很大程度上取决于这个特征,这当然是不公平的,我们需要的三个特征都均平地决定距离,所以我们要对数据进行处理,希望处理之后既不影响相对大小又可以不失公平:

这种方法叫做,归一化数值,通过这种方法可以把每一列的取值范围划到0~1或-1~1:,处理的公式为:newValue = (oldValue - min)/(max - min)

归一化数值的函数代码为:

1def autoNorm(dataSet):

2minVals =dataSet.min(0)

3maxVals =dataSet.max(0)

4 ranges = maxVals -minVals

5normDataSet =zeros(shape(dataSet))

6 m =dataSet.shape[0]

7normDataSet = dataSet - tile(minVals, (m, 1))

8normDataSet = normDataSet / tile(ranges, (m, 1))

9return normDataSet, ranges, minVals

---4.测试算法

经过了格式化数据、归一化数值,同时我们也已经完成kNN核心算法的函数,现在可以测试了,测试代码为:1def datingClassTest():

2hoRatio = 0.10

3datingDataMat, datingLabels = file2matrix('datingTestSet.txt')

4normMat, ranges, minVals =autoNorm(datingDataMat)

5 m =normMat.shape[0]

6numTestVecs = int(m *hoRatio)

7errorCount = 0.0

8for i in range(numTestVecs):

9classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)

10print"the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])

11if (classifierResult != datingLabels[i]): errorCount += 1.0

12print"the total error rate is: %f" % (errorCount / float(numTestVecs))

通过测试代码我们可以在回忆一下这个例子的整体过程:

?读取txt文件,提取里面的数据到datingDataMat、datingLabels;

?归一化数据,得到归一化的数据矩阵;

?测试数据不止一个,这里需要一个循环,依次对每个测试数据进行分类。

代码中大家可能不太明白hoRatio是什么。注意,这里的测试数据并不是另外一批数据而是之前的数据集里的一部分,这样我们可以把算法得到的结果和原本的分类进行对比,查看算法的准确度。在这里,海伦提供的数据集又1000行,我们把前100行作为测试数据,后900行作为样本数据集,现在大家应该可以明白hoRatio是什么了吧。

整体的代码:

1from numpy import *

2import operator

3

4def classify0(inX, dataSet, labels, k):

5dataSetSize =dataSet.shape[0]

6diffMat = tile(inX, (dataSetSize,1)) -dataSet

7sqDiffMat = diffMat**2

8sqDistances = sqDiffMat.sum(axis=1)

9 distances = sqDistances**0.5

10sortedDistIndicies =distances.argsort()

11classCount={}

12for i in range(k):

13voteIlabel =labels[sortedDistIndicies[i]]

14classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

15sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)

16return sortedClassCount[0][0]

17

18def file2matrix(filename):

19fr =open(filename)

20numberOfLines =len(fr.readlines())

21returnMat = zeros((numberOfLines, 3))

22classLabelVector = []

23fr =open(filename)

24 index =0

25for line in fr.readlines():

26 line =line.strip()

27listFromLine = line.split('\t')

28returnMat[index, :] = listFromLine[0:3]

29classLabelVector.append(int(listFromLine[-1]))

30 index += 1

31return returnMat, classLabelVector

32

33def autoNorm(dataSet):

34minVals =dataSet.min(0)

35maxVals =dataSet.max(0)

36 ranges = maxVals -minVals

37normDataSet =zeros(shape(dataSet))

38 m =dataSet.shape[0]

39normDataSet = dataSet - tile(minVals, (m, 1))

40normDataSet = normDataSet / tile(ranges, (m, 1))

41return normDataSet, ranges, minVals

42

43def datingClassTest():

44hoRatio = 0.10

45datingDataMat, datingLabels = file2matrix('datingTestSet.txt')

46normMat, ranges, minVals =autoNorm(datingDataMat)

47 m =normMat.shape[0]

48numTestVecs = int(m *hoRatio)

49errorCount = 0.0

50for i in range(numTestVecs):

51classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3) 52print"the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) 53if (classifierResult != datingLabels[i]): errorCount += 1.0

54print"the total error rate is: %f" % (errorCount / float(numTestVecs))

运行一下代码,这里我使用的是ipython:

最后的错误率为0.05。

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近邻方法也得到了广泛地应用,有文献利用蛋白质相互作用网络,提出

相关文档