最近邻法和k-近邻法

合集下载

最近邻算法(KNN)

最近邻算法(KNN)

最近邻算法(KNN)最近邻算法:1.什么是最近邻是什么? kNN算法全程是k-最近邻算法(k-Nearest Neighbor) kNN算法的核⼼思想是如果⼀个样本在特征空间中的k个最相邻的样本中的⼤多数数以⼀个类型别,则该样本也属于这个类别,并具有该类别上样本的特征。

该⽅法在确定分类决策上,只依据最近邻的⼀个或者⼏个样本的类别来决定待分样本所属的类别。

下⾯举例说明:即使不知道未知电影属于哪个类型,我们也可以通过某种⽅式计算,如下图现在,我们得到了样本集中与未知电影的距离,按照距离的递增顺序,可以找到k个距离最近的电影,假设k=3,则三个最靠近的电影是he is not realy into Dudes,Beautiful women, California man , kNN 算法按照距离最近的三部电影类型决定未知电影的类型,这三部都是爱情⽚,所以未知电影的类型也是爱情⽚。

2:kNN算法的⼀般流程step.1---初始化距离为最⼤值step.2---计算未知样本和每个训练样本的距离diststep.3---得到⽬前K个最邻近样本中的最⼤距离maxdiststep.4---如果dist⼩于maxdist, 则将训练样本作为K-最近邻样本step.5---重复步骤2,3,4,直到未知样本和所有训练样本的距离都算完step.6---统计K-最近邻样本中每个类标号出现的次数step.7---出现频率最⼤的类标号最为未知样本的类标号3.距离公式在KNN算法中,通过计算对象间距离作为各个对象之间的⾮相似性指标,避免了对象之间的匹配问题,在这⾥距离⼀般使⽤欧式距离或者曼哈顿距离:对应代码如下# kNN算法全称是k-最近邻算法(K-Nearest Neighbor)from numpy import *import operator# 创建数据函数def createDataSet():""" 创建数据集,array 创建数组array数组内依次是打⽃次数, 接吻次数group⼩组, labels标签"""group = array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])labels = ["爱情⽚", "爱情⽚", "爱情⽚", "动作⽚", "动作⽚", "动作⽚"]return group, labels# 归类函数def classify(inX, dataSet, labels, k):""" 获取维度,inX 待测⽬标的数据,dataSet 样本数据,labels 标签,k 设置⽐较邻近的个数"""dataSetSize = dataSet.shape[0] # 训练数据集数据⾏数print(dataSetSize)print(tile(inX, (dataSetSize, 1)))diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 测试数据,样本之间的数据矩阵偏差print(diffMat)sqDiffMat = diffMat**2 # 平⽅计算,得出每个距离的值print(sqDiffMat)sqDistance = sqDiffMat.sum(axis=1) # 输出每⾏的值print(sqDistance)distances = sqDistance**0.5 # 开⽅计算print(distances)sortedDistances = distances.argsort() # 排序按距离从⼩到⼤输出索引print(sortedDistances)classCount = {}for i in range(k):voteIlabel = labels[sortedDistances[i]] + 1.0 # 按照排序,获取k个对应的标签classCount[voteIlabel] = classCount.get(voteIlabel, 0) # 在字典中添加距离最近的k个对应标签 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]group, labels = createDataSet()res = classify([18, 90], group, labels, 3)print(res)运⾏结果:知识扩展:。

模式识别:K_近邻法

模式识别:K_近邻法

模式识别:K_近邻法最近邻法:保存两个已知分类的样本,用新样本依次与已经保存的两类样本计算欧式距离,分类结果指向距离最小的样本。

K-近邻法:在最近邻法的基础上,引进投票机制,选择若干个距离新样本最近的已知样本,用他所得类别最大票数做为新样本所属类别。

注意:为保证公平,投票数量(k)为奇数欧式距离:||xi-xj||xi,xj为特征向量,||。

||先取绝对值再取模错误率:样本趋于无穷,k值趋于无穷时 k-近邻法的错误率接近贝叶斯错误率算法:涉及的语言以及依赖库:本算法采用python3完成,事先需要安装python3的numpy,pandas,random库。

其中numpy库涉及矩阵运算,以及科学数据处理。

pandas涉及excel文档数据的导入。

random库涉及随机数的产生,用于产生本程序所需要的k_折交叉验证用到的随机分包索引矩阵。

程序:# -*- coding: utf-8 -*-"""Created on Sun Nov 19 17:27:04 2017@author: hasee"""import pandas as pdimport mathimport randomimport numpy as np#读取文件的数据集def read_file(filename):file_data = pd.read_excel(filename,index_col=None,header=None,sheetna me=0)example_data = np.array(file_data)example_data = example_data.tolist()example_data = np.mat(example_data)return example_data#计算矩阵中各元素平方def numplus(plus_data):m,n = np.shape(plus_data)for i in list(range(0,m)):for j in list(range(0,n)):plus_data[i,j]=plus_data[i,j]**2target_data = plus_data.sum(1)m1,n1 = np.shape(target_data)for k in list(range(0,m1)):for v in list(range(0,n1)):target_data[k,v]=np.sqrt(target_data[k,v])return target_data#寻找数量最多的元素的值def maxnum(label_map):label_list = label_map.tolist()num_list=[]m,n=np.shape(label_map)for i in list(range(0,m)): #获取标签矩阵中个数最多的元素b=label_list[i]d=max(b,key=b.count)num_list.append(d)label_mat = np.mat(num_list).Treturn label_mat#K折交叉验证随机分包行标记,row_big为样本集最大行数def rndom_rows(row_big,k):rows = list(range(0,row_big))goals = []rows = set(rows)for i in list(range(0,k)):a = random.sample(rows,int(row_big/k)) #在给定的rows里面选择row_big/k个不同的数b = set(a)rows = rows -bgoals.append(a)goal = np.array(goals)index_matrix = np.mat(goal)return index_matrix#用k_折交叉验证获取训练数据以及测试数据def k_validation(example_data,index_matrix,k1): #k1表式取索引矩阵的第k1组数据作为测试集合exm_list=example_data.tolist() #样本数据转化为列表index_list = index_matrix.tolist() #分包索引矩阵转化问列表m,n = np.shape(exm_list) #获取样本数据大小m1,n1 = np.shape(index_list) #获取索引矩阵大小test=[]train=[]for i in list(range(0,int(m/10))): #遍历index_matrix中数据集测试集索引c = index_list[k1][i]test.append(exm_list[c]) #根据index_d=matrix的索引获取样本集,保存在test列表中test_data=np.mat(test) #样本列表转换成矩阵for x in test: #删除样本集中取出的测试集相等子集exm_list.remove(x)train = exm_listtrain_data = np.mat(train) #训练样本列表转矩阵return test_data,train_data #返回样本集,测试集#获取测试集与训练集的欧式距离矩阵def get_distance(train_data,test_data):m,n = np.shape(train_data)m1,n1=np.shape(test_data)r_train = train_data[:,0:n-1] #获取除标签外的test_data和train_datar_test = test_data[:,0:n1-1]each_row = np.mat(np.zeros((m+1,1))) #建立按列增加的矩阵each_col = np.mat(np.zeros((1,n-1))) #建立按行增加的矩阵for i in list(range(0,m1)):for j in list(range(0,m)):a=r_train[j,:]-r_test[i,:] #计算样本和测试集坐标差each_col=np.vstack((each_col,a)) #按行增加保存在each_col矩阵中target_data = numplus(each_col) #根据坐标差调用numplus()函数,计算欧式距离each_row = np.hstack((each_row,target_data)) #按列增加模式保存在each_row距离矩阵中each_col = np.mat(np.zeros((1,n-1)))distance = each_row #距离矩阵赋值给distancem2,n2 = np.shape(distance)distance_data = distance[1:m2,1:n2] #删除空间分配时产生的零行和零列m,n = np.shape(distance_data)return distance_data #返回距离矩阵#在距离矩阵中实现分类def classify_data(distance,train_data,test_data,K):m,n = np.shape(train_data)pre_clsy = np.hstack((distance,train_data[:,n-1])) #将训练集的标签按行增加的方式,贴到距离矩阵中,距离矩阵中的每一列代表一个样本和所有训练集的欧氏距离pre_clsy = pre_clsy.T #求距离矩阵的转置标签变为最后一行m1,n1=np.shape(pre_clsy)clsy_index = np.mat(np.zeros((1,n1)))for i in list(range(0,m1-1)):index_sort = np.argsort(pre_clsy[i,:]) #按行排序把排好序的数据在未排序之前的元素所在的位置保存在位置矩阵中clsy_index = np.vstack((clsy_index,index_sort))clsy_index = clsy_index[1:m1,:] #获取除标签外的所有行的数据排序后的位置矩阵target_index = clsy_index[:,0:K] #K_近邻法要求取的前k各最小的元素,索引矩阵前k行m2,n2 =np.shape(target_index)for i in list(range(0,m2)):for j in list(range(0,n2)):a=target_index[i,j]target_index[i,j] =train_data[a,n-1] #将索引矩阵映射到原矩阵的标签处label_map = target_indexlabel = maxnum(label_map) #投票求出得票数最多的类型,并将其标签保存target_clsy = np.hstack((test_data,label)) #得到的标签保存后按列扩增后贴到测集合上return target_clsy,label#获取分类的错误率def get_accuracy(target_classify_data):m,n=np.shape(target_classify_data)count=0for i in list(range(0,m)):if target_classify_data[i,n-1] !=target_classify_data[i,n-2]: #判断分类后的标签与原测试数据是否相等,若不相等则count+1 count+=1else:true_rate=(m-count)/m #计算正确率target_classify_data[:,n-2]=target_classify_data[:,n-1] classify_data = target_classify_data[:,0:n-1] #删除原标签,贴上分类判断得到的结果标签return classify_data,true_rate #返回分类最终结果,以及正确率#构建分类器def classify_cot(filename,K):data = read_file(filename) #获取iris数据集m,n = np.shape(data) #获取原数据集行,列大小for k0 in list(range(0,1)): #k_折交叉验证循环,循环次数为子集个index_matrix = rndom_rows(m,10) #获取样本随机分包索引test_data,train_data = k_validation(data,index_matrix,1) #分包得到测试集以及数据集distance = get_distance(train_data,test_data)target_index,label = classify_data(distance,train_data,test_data,K)clsy_data,true_rate = get_accuracy(target_index)print("\n\n")print("------------------------%s-----------------------------------------------------------"%filename)print("分离出来的训练集:")print(train_data)print("分离出来的测试集:")print(test_data)print("标签匹配矩阵")print(target_index)print("分类结果矩阵")print(clsy_data)print("分类正确率")print(true_rate)print("原数据行数:")print(m)print("-------------------------%s-----------------------------------------------------------"%filename)print("\n\n")#定义最近邻分类子函数def B_NN():#最近邻法iris数据集分类iris='iris.xlsx'classify_cot(iris,1)#最近邻法sonar分类sonar = 'sonar.xlsx'classify_cot(sonar,1)#定义k_近邻子函数def K_NN():#最近邻法iris数据集分类iris='iris.xlsx'classify_cot(iris,80)#最近邻法sonar分类sonar = 'sonar.xlsx'classify_cot(sonar,80)B_NN()K_NN()最后:代码是自己根据原理敲出来的,有什么不足之处希望大佬们斧正。

KNN算法总结

KNN算法总结

KNN算法总结1 KNN分类算法1.1KNN简述K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。

该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

KNN算法中,所选择的邻居都是已经正确分类的对象。

该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别[1]。

KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。

由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN最邻近规则,主要应用领域是对未知事物的识别,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近。

1.2 KNN原理最近邻方法(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)选取类别。

第6章_近邻法

第6章_近邻法

i
K近邻法
(1)已知N个已知 类别样本X
(2)输入未知类别 样本x
(3)计算x到 xiX,(i=1, 2,…,N)的 距离di(x)
(6) 判xω2 (4)找出x的k个最近邻 元Xk={xi,i=1,2,…,k} (5)看Xk中属于哪一类的样 本最多k1=3<k2=4

讨论k为奇数时的两类问题
xi X p
第二阶段用搜索算法
检验未知样本x的最近邻是否在X p中的两个规则。 规则1:如果存在 B rp D x, M p 则xi X p 不可能是x的最近邻。其中B是在算法执行过程 中,对于已涉及到的那些样本集X p中的样本到x 的最近 距离。初始B可置为, 以后的B在算法中求得。
c * P P P 2 P c 1 * 其中P 为贝叶斯错误率,c为类数。
* *
可以证明,当样本数相当多时,近邻法错误 率与贝叶斯错误率存在以下关系:
• 上式表明,当样本数相当多时,近邻法的错误 率在贝叶斯错误率和两倍的贝叶斯错误率之间。
最近邻法错误率上下界与贝叶斯错误率的关系
5在目录表中选择最近节点p, 它使D x, M p 最小化,并
称该p为当前执行节点,从目录表中去掉p。如果当前 的水平L是最终水平,则转步骤6。否则置L L 1,转 步骤2。
6对现在执行节点p中的每个x,利用规则2作如下检验。
如果
D x, M p D xi , M p B
规则2:如果存在
B xi , M p D x, M p
其中xi X p,则xi 不是x的最近邻。 D x, xi D x, M p D xi , M p B D xi , M p 在计算rp中已用到,并可存储在机器中。

K近邻算法PPT课件

K近邻算法PPT课件
• 给定一个目标点,搜索其最近邻。首先找到包含目标点的叶结点 ;然后从该叶结点出发,依次回退到父结点;不断查找与目标点 最邻近的结点,当确定不可能存在更近的结点时终止。这样搜索 就被限制在空间的局部区域上,效率大为提高。
• 包含目标点的叶结点对应包含目标点的最小超矩形区域。以此叶 结点的实例点作为当前最近点。目标点的最近邻一定在以目标点 为中心并通过当前最近点的超球体内部。然后返回当前结点的父 结点,如果父结点的另一子结点的超矩形区域与超球体相交,那 么在相交的区域内寻找与目标点更近的实例点。如果存在这样的 点,将此点作为新的当前最近点。
➢ 问题:给这个绿色的圆分类? ➢ 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝
色小正方形,少数从属于多数,基于统计的方法,判定绿色的这 个待分类点属于红色的三角形一类。 ➢ 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色 正方形,还是少数从属于多数,基于统计的方法,判定绿色的这 个待分类点属于蓝色的正方形一类。
区域内没有实例时终止。在此过程中,将实例保存在相应的结点
上。
2020/7/23
9
K近邻法的实现:kd树
2020/7/23
10
K近邻法的实现:kd树
2020/7/23
11
K近邻法的实现:kd树
➢ 搜索kd树
• 利用kd树可以省去大部分数据点的搜索,从而减少搜索的计算量 。这里以最近邻为例,同样的方法可以应用到K近邻。
2020/7/23
5
K近邻的三个基本要素
2020/7/23
6
K近邻的三个基本要素
➢ K值的选择
• 如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预 测, “学习”的近似误差会减小,只有与输入实例较近的训练实 例才会对预测结果起作用。但缺点是“学习”的估计误差会增大 ,预测结果会对近邻的实例点非常敏感。换句话说,k值的减小意 味着整体模型变得复杂,容易发生过拟合。

13种ai智能算法

13种ai智能算法

13种ai智能算法以下是13种常见的AI智能算法:1.K-近邻算法(K-Nearest Neighbors,KNN):根据周围K个最近邻的类别来预测未知数据的类别。

K值的选择和距离度量方式对结果影响较大。

2.决策树算法(Decision Trees):通过将数据集划分为若干个子集,并根据每个子集的特征进行进一步的划分,从而构建一棵树状结构。

决策树的分支准则通常基于信息增益或信息熵等指标。

3.随机森林算法(Random Forests):通过构建多个决策树,并对它们的预测结果进行投票来预测未知数据的类别。

随机森林算法能够提高预测的准确性和稳定性。

4.梯度提升树算法(Gradient Boosting Trees,GBRT):通过迭代地添加新的决策树来优化损失函数,从而逐步提高预测的准确性。

梯度提升树算法通常能够处理非线性关系和解决过拟合问题。

5.支持向量机算法(Support Vector Machines,SVM):通过将数据映射到高维空间中,并寻找一个超平面将不同类别的数据分隔开来。

SVM算法通常用于分类和回归任务。

6.线性回归算法(Linear Regression):通过拟合一个线性模型来预测连续数值型数据的目标变量。

线性回归算法可以解决回归问题,即预测数值型目标变量。

7.逻辑回归算法(Logistic Regression):通过拟合一个逻辑函数来预测离散二元型数据的目标变量。

逻辑回归算法可以解决分类问题,即预测离散二元型目标变量。

8.朴素贝叶斯算法(Naive Bayes):基于贝叶斯定理和特征条件独立假设来预测未知数据的类别。

朴素贝叶斯算法通常用于文本分类和垃圾邮件过滤等任务。

9.集成学习算法(Ensemble Learning):通过将多个学习模型(如决策树、SVM等)的预测结果进行集成,从而提高预测的准确性和稳定性。

常见的集成学习算法有Bagging和Boosting两种类型。

10.决策树桩算法(Decision Stump):通过对每个特征进行一次划分来构建一个单层决策树,从而简化决策树的构建过程。

近邻法

近邻法
i

则有Bayes条件错误率
P * (e | x) 1 P(m | x)
因此 P* P * (e | x) p ( x) dx


对于两类问题,由前面公式
N
lim PN (e | x) 1 P (i | x)
2 i 1
2
4.5.1最近邻法 二、最近邻法的错误率分析
4.5.1最近邻法 二、最近邻法的错误率分析
图4.14示出近邻法的上下界。一般地,最 近邻法的错误率落在图中的阴影区域 中。 c类别最近邻
分类器可能 渐近误差率
4.5.1最近邻法 二、最近邻法的错误率分析

4.5.1最近邻法 二、最近邻法的错误率分析

可以证明以下关系式成立
c P* P P * (2 P*) c 1

其中P*为贝叶斯错误率,c为类数。
上式实际上给出了最近邻法渐近平均错 误率P的范围,指出它在Bayes错误率P* c 和 P * (2 P*) 之间。 c 1

4.5.1最近邻法 二、最近邻法的错误率分析
c i 1
知样本x,只要比较x与 N N i 个已知类 别的样本之间的欧氏距离,并决策x与离 它最近的样本同类。
4.5.1最近邻法
二、最近邻法的错误率分析

近邻法的错误率很难计算,因为训练样本集的 数量总是有限的,有时多一个少一个训练样本 对测试样本分类的结果影响很大。如图中所示
4.5.1最近邻法 二、最近邻法的错误率分析
P* P * (e | x) p(x)dx [1 P(m | x)] p(x)dx 0
此时P = P*。
4.5.1最近邻法 二、最近邻法的错误率分析

5 近邻法

5 近邻法

例题 设在一个二维空间,A类有三个训练样本,图中用 设在一个二维空间,A 红点表示,B 红点表示,B类四个样本,图中用蓝点表示.试问: (1) 按近邻法分类,这两类最多有多少个分界面 (2) 画出实际用到的分界面
B2
A2
B4
B1
A3
B3
A1
解:按近邻法,对任意两个由不同类别的训练样本构成的样本对, 如果它们有可能成为测试样本的近邻,则它们构成一组最小距离 分类器,它们之间的中垂面就是分界面,因此由三个A类与四个B 分类器,它们之间的中垂面就是分界面,因此由三个A类与四个B 类训练样本可能构成的分界面最大数量为3 类训练样本可能构成的分界面最大数量为3×4=12. 12. 实际分界面如下图所示,由10条线段构成: 实际分界面如下图所示,由10条线段构成:
0.5
从上面可以看出近邻法方法简单,但也存在一些缺点: (1)存储量和计算量都很大 (2)没有考虑决策的风险,如果决策的错误代价很大时, 会产生很大的风险 (3)以上的分析——渐近平均错误率,都是建立在样本 )以上的分析——渐近平均错误率,都是建立在样本 数趋向无穷大的条件下得来的,在实际应用时大多是无 法实现的
只要样本足够多,重复执行剪辑近邻分类,可进一 步提高分类性能
5.3.2 压缩近邻法
剪辑结果去掉了分类边界附近的样本,靠近两 类中心的样本几乎未去掉 中心样本对分类决策作用不大 在剪辑的基础上压缩去除一部分中心样本有助 于进一步缩短计算时间和降低存储量
5.4 可做拒绝决策的近邻法
引入拒绝决策,回避出现决策风险较大的情况 最近邻法,考虑近邻距离,样本数无穷失效 k-近邻法
k个近邻中最大类别归属数要足够大,否则拒绝决 策 k +1 如取阈值 k ' = 2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近邻法和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:10data=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=4for x=1:ufor y=1:iresult=sqrt((testsample(x,1)-trainsample(y,1))^2+(testsample(x,2)-trainsample(y,2))^2+(testsampl e(x,3)-trainsample(y,3))^2+(testsample(x,4)-trainsample(y,4))^2); %欧式距离newchar(1,y)=result;end;[new,Ind]=sort(newchar);class1=0;class2=0;class3=0;if Ind(1,1)<=25class1=class1+1;elseif Ind(1,1)>25&&Ind(1,1)<=50class2=class2+1;elseclass3=class3+1;endif class1>class2&&class1>class3m=1;ty='Iris-setosa';elseif class2>class1&&class2>class3m=2;ty='Iris-versicolor';elseif class3>class1&&class3>class2m=3;ty='Iris-virginica';elsem=0;ty='none';endif x<=25&&m>0disp(sprintf('第%d组数据分类后为%s类',rbow1(:,x+25),ty));elseif x<=25&&m==0disp(sprintf('第%d组数据分类后为%s类',rbow1(:,x+25),'none'));endif x>25&&x<=50&&m>0disp(sprintf('第%d组数据分类后为%s类',50+rbow2(:,x),ty));elseif x>25&&x<=50&&m==0disp(sprintf('第%d组数据分类后为%s类',50+rbow2(:,x),'none'));endif x>50&&x<=75&&m>0disp(sprintf('第%d组数据分类后为%s类',100+rbow3(:,x-25),ty));elseif x>50&&x<=75&&m==0disp(sprintf('第%d组数据分类后为%s类',100+rbow3(:,x-25),'none'));endif (x<=25&&m==1)||(x>25&&x<=50&&m==2)||(x>50&&x<=75&&m==3)sum=sum+1;endenddisp(sprintf('第%d次分类识别率为%4.2f',ii,sum/75)); totalsum=totalsum+(sum/75);enddisp(sprintf('10次分类平均识别率为%4.2f',totalsum/10));测试结果:第3组数据分类后为Iris-setosa类第5组数据分类后为Iris-setosa类第6组数据分类后为Iris-setosa类第7组数据分类后为Iris-setosa类第10组数据分类后为Iris-setosa类第11组数据分类后为Iris-setosa类第12组数据分类后为Iris-setosa类第14组数据分类后为Iris-setosa类第16组数据分类后为Iris-setosa类第18组数据分类后为Iris-setosa类第19组数据分类后为Iris-setosa类第20组数据分类后为Iris-setosa类第23组数据分类后为Iris-setosa类第24组数据分类后为Iris-setosa类第26组数据分类后为Iris-setosa类第28组数据分类后为Iris-setosa类第30组数据分类后为Iris-setosa类第31组数据分类后为Iris-setosa类第34组数据分类后为Iris-setosa类第37组数据分类后为Iris-setosa类第39组数据分类后为Iris-setosa类第41组数据分类后为Iris-setosa类第44组数据分类后为Iris-setosa类第45组数据分类后为Iris-setosa类第49组数据分类后为Iris-setosa类第51组数据分类后为Iris-versicolor类第53组数据分类后为Iris-versicolor类第54组数据分类后为Iris-versicolor类第55组数据分类后为Iris-versicolor类第57组数据分类后为Iris-versicolor类第58组数据分类后为Iris-versicolor类第59组数据分类后为Iris-versicolor类第60组数据分类后为Iris-versicolor类第61组数据分类后为Iris-versicolor类第62组数据分类后为Iris-versicolor类第68组数据分类后为Iris-versicolor类第70组数据分类后为Iris-versicolor类第71组数据分类后为Iris-virginica类第74组数据分类后为Iris-versicolor类第75组数据分类后为Iris-versicolor类第77组数据分类后为Iris-versicolor类第79组数据分类后为Iris-versicolor类第80组数据分类后为Iris-versicolor类第84组数据分类后为Iris-virginica类第85组数据分类后为Iris-versicolor类第92组数据分类后为Iris-versicolor类第95组数据分类后为Iris-versicolor类第97组数据分类后为Iris-versicolor类第98组数据分类后为Iris-versicolor类第99组数据分类后为Iris-versicolor类第102组数据分类后为Iris-virginica类第103组数据分类后为Iris-virginica类第105组数据分类后为Iris-virginica类第106组数据分类后为Iris-virginica类第107组数据分类后为Iris-versicolor类第108组数据分类后为Iris-virginica类第114组数据分类后为Iris-virginica类第118组数据分类后为Iris-virginica类第119组数据分类后为Iris-virginica类第124组数据分类后为Iris-virginica类第125组数据分类后为Iris-virginica类第126组数据分类后为Iris-virginica类第127组数据分类后为Iris-virginica类第128组数据分类后为Iris-virginica类第129组数据分类后为Iris-virginica类第130组数据分类后为Iris-virginica类第133组数据分类后为Iris-virginica类第135组数据分类后为Iris-virginica类第137组数据分类后为Iris-virginica类第138组数据分类后为Iris-virginica类第142组数据分类后为Iris-virginica类第144组数据分类后为Iris-virginica类第148组数据分类后为Iris-virginica类第149组数据分类后为Iris-virginica类第150组数据分类后为Iris-virginica类k近邻法对wine分类:clc;otalsum=0;for ii=1:10 %循环测试10次data=load('wine.txt');%导入wine数据data1=data(1:59,1:13);%任取第一类数据的30组rbow1=randperm(59);trainsample1=data1(sort(rbow1(:,1:30)),1:13);rbow1(:,31:59)=sort(rbow1(:,31:59)); %剩余的29组按行下标大小顺序排列testsample1=data1(rbow1(:,31:59),1:13);data2=data(60:130,1:13);%任取第二类数据的35组rbow2=randperm(71);trainsample2=data2(sort(rbow2(:,1:35)),1:13);rbow2(:,36:71)=sort(rbow2(:,36:71));testsample2=data2(rbow2(:,36:71),1:13);data3=data(131:178,1:13);%任取第三类数据的24组rbow3=randperm(48);trainsample3=data3(sort(rbow3(:,1:24)),1:13);rbow3(:,25:48)=sort(rbow3(:,25:48));testsample3=data3(rbow3(:,25:48),1:13);train_sample=cat(1,trainsample1,trainsample2,trainsample3);%包含89组数据的样本集test_sample=cat(1,testsample1,testsample2,testsample3); k=19;%19近邻法newchar=zeros(1,89);sum=0;[i,j]=size(train_sample);%i=89,j=13[u,v]=size(test_sample);%u=89,v=13for x=1:ufor y=1:iresult=sqrt((test_sample(x,1)-train_sample(y,1))^2+(test_sample(x,2)-train_sample(y,2))^2+(test_ sample(x,3)-train_sample(y,3))^2+(test_sample(x,4)-train_sample(y,4))^2+(test_sample(x,5)-train _sample(y,5))^2+(test_sample(x,6)-train_sample(y,6))^2+(test_sample(x,7)-train_sample(y,7))^2+ (test_sample(x,8)-train_sample(y,8))^2+(test_sample(x,9)-train_sample(y,9))^2+(test_sample(x,10)-train_sample(y,10))^2+(test_sample(x,11)-train_sample(y,11))^2+(test_sample(x,12)-train_sa mple(y,12))^2+(test_sample(x,13)-train_sample(y,13))^2); %欧式距离newchar(1,y)=result;end;[new,Ind]=sort(newchar); class1=0; class 2=0; class 3=0;for n=1:kif Ind(1,n)<=30class 1= class 1+1;elseif Ind(1,n)>30&&Ind(1,n)<=65class 2= class 2+1;elseclass 3= class3+1;endendif class 1>= class 2&& class1>= class3m=1;elseif class2>= class1&& class2>= class3m=2;elseif class3>= class1&& class3>= class2m=3;endif x<=29disp(sprintf('第%d组数据分类后为第%d类',rbow1(:,30+x),m));elseif x>29&&x<=65disp(sprintf('第%d组数据分类后为第%d类',59+rbow2(:,x+6),m));elseif x>65&&x<=89disp(sprintf('第%d组数据分类后为第%d类',130+rbow3(:,x-41),m));endif (x<=29&&m==1)||(x>29&&x<=65&&m==2)||(x>65&&x<=89&&m==3)sum=sum+1;endenddisp(sprintf('第%d次分类识别率为%4.2f',ii,sum/89));totalsum=totalsum+(sum/89);enddisp(sprintf('10次分类平均识别率为%4.2f',totalsum/10));第2组数据分类后为第1类第4组数据分类后为第1类第5组数据分类后为第3类第6组数据分类后为第1类第8组数据分类后为第1类第10组数据分类后为第1类第11组数据分类后为第1类第14组数据分类后为第1类第19组数据分类后为第1类第20组数据分类后为第3类第21组数据分类后为第3类第22组数据分类后为第3类第26组数据分类后为第3类第27组数据分类后为第1类第28组数据分类后为第1类第30组数据分类后为第1类第33组数据分类后为第1类第36组数据分类后为第1类第37组数据分类后为第1类第43组数据分类后为第1类第44组数据分类后为第3类第45组数据分类后为第1类第46组数据分类后为第1类第49组数据分类后为第1类第52组数据分类后为第1类第54组数据分类后为第1类第56组数据分类后为第1类第57组数据分类后为第1类第60组数据分类后为第2类第61组数据分类后为第3类第63组数据分类后为第3类第65组数据分类后为第2类第66组数据分类后为第3类第67组数据分类后为第2类第71组数据分类后为第1类第72组数据分类后为第2类第74组数据分类后为第1类第76组数据分类后为第2类第77组数据分类后为第2类第79组数据分类后为第3类第81组数据分类后为第2类第82组数据分类后为第3类第83组数据分类后为第3类第84组数据分类后为第2类第86组数据分类后为第2类第87组数据分类后为第2类第88组数据分类后为第2类第93组数据分类后为第2类第96组数据分类后为第1类第98组数据分类后为第2类第99组数据分类后为第3类第104组数据分类后为第2类第105组数据分类后为第3类第106组数据分类后为第2类第110组数据分类后为第3类第113组数据分类后为第3类第114组数据分类后为第2类第115组数据分类后为第2类第116组数据分类后为第2类第118组数据分类后为第2类第122组数据分类后为第2类第123组数据分类后为第2类第124组数据分类后为第2类第133组数据分类后为第3类第134组数据分类后为第3类第135组数据分类后为第2类第136组数据分类后为第3类第139组数据分类后为第3类第140组数据分类后为第3类第142组数据分类后为第3类第144组数据分类后为第2类第145组数据分类后为第1类第146组数据分类后为第3类第148组数据分类后为第3类第149组数据分类后为第2类第152组数据分类后为第2类第157组数据分类后为第2类第159组数据分类后为第3类第161组数据分类后为第2类第162组数据分类后为第3类第163组数据分类后为第3类第164组数据分类后为第3类第165组数据分类后为第3类第167组数据分类后为第3类第168组数据分类后为第3类第173组数据分类后为第3类第174组数据分类后为第3类五:问题和收获:该算法的优缺点总结为:优点:算法简单且识别率较高;缺点:算法需要计算未知样本x与周围每个样本的距离,然后排序选择最近的k个近邻,计算量和时间复杂度高。

相关文档
最新文档