模式识别中K均值与最近邻法matlab实现
模式识别 最近邻法和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:10data=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=4for x=1:ufor y=1:iresult=sqrt((testsample(x,1)-trainsample(y,1))^2+(testsample(x,2)-trainsample(y ,2))^2+(testsample(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次分类识别率为%',ii,sum/75));totalsum=totalsum+(sum/75);enddisp(sprintf('10次分类平均识别率为%',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类第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类第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数据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_samp le(y,2))^2+(test_sample(x,3)-train_sample(y,3))^2+(test_sample(x,4)-train_sampl e(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_samp le(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次分类识别率为%',ii,sum/89)); totalsum=totalsum+(sum/89);enddisp(sprintf('10次分类平均识别率为%',totalsum/10));第2组数据分类后为第1类第4组数据分类后为第1类第5组数据分类后为第3类第6组数据分类后为第1类第8组数据分类后为第1类第10组数据分类后为第1类第11组数据分类后为第1类第14组数据分类后为第1类第16组数据分类后为第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类第79组数据分类后为第3类第81组数据分类后为第2类第82组数据分类后为第3类第83组数据分类后为第3类第84组数据分类后为第2类第86组数据分类后为第2类第87组数据分类后为第2类第88组数据分类后为第2类第93组数据分类后为第2类第96组数据分类后为第1类第98组数据分类后为第2类第99组数据分类后为第3类第102组数据分类后为第2类第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类第165组数据分类后为第3类第167组数据分类后为第3类第168组数据分类后为第3类第173组数据分类后为第3类第174组数据分类后为第3类五:问题和收获:该算法的优缺点总结为:优点:算法简单且识别率较高;缺点:算法需要计算未知样本x与周围每个样本的距离,然后排序选择最近的k个近邻,计算量和时间复杂度高。
matlab kmeans聚类算法代码
一、引言在机器学习和数据分析中,聚类是一种常用的数据分析技术,它可以帮助我们发现数据中的潜在模式和结构。
而k均值(k-means)聚类算法作为一种经典的聚类方法,被广泛应用于各种领域的数据分析和模式识别中。
本文将介绍matlab中k均值聚类算法的实现和代码编写。
二、k均值(k-means)聚类算法简介k均值聚类算法是一种基于距离的聚类算法,它通过迭代的方式将数据集划分为k个簇,每个簇内的数据点与该簇的中心点的距离之和最小。
其基本思想是通过不断调整簇的中心点,使得簇内的数据点与中心点的距离最小化,从而实现数据的聚类分布。
三、matlab实现k均值聚类算法步骤在matlab中,实现k均值聚类算法的步骤如下:1. 初始化k个簇的中心点,可以随机选择数据集中的k个点作为初始中心点。
2. 根据每个数据点与各个簇中心点的距离,将数据点分配给距离最近的簇。
3. 根据每个簇的数据点重新计算该簇的中心点。
4. 重复步骤2和步骤3,直到簇的中心点不再发生变化或者达到预定的迭代次数。
在matlab中,可以通过以下代码实现k均值聚类算法:```matlab设置参数k = 3; 设置簇的个数max_iter = 100; 最大迭代次数初始化k个簇的中心点centroids = datasample(data, k, 'Replace', false);for iter = 1:max_iterStep 1: 计算每个数据点与簇中心点的距离distances = pdist2(data, centroids);Step 2: 分配数据点给距离最近的簇[~, cluster_idx] = min(distances, [], 2);Step 3: 重新计算每个簇的中心点for i = 1:kcentroids(i, :) = mean(data(cluster_idx == i, :)); endend得到最终的聚类结果cluster_result = cluster_idx;```四、代码解释上述代码实现了k均值聚类算法的基本步骤,其中包括了参数设置、簇中心点的初始化、迭代过程中的数据点分配和中心点更新。
matlab knn近邻法代码实现
MATLAB是一种强大的科学计算软件,其具有丰富的工具箱和功能,可以帮助科研人员和工程师进行数据分析、算法设计和模型仿真等工作。
KNN(K-Nearest Neighbors)近邻法是一种常用的机器学习算法,它基于特征空间中的样本进行分类、回归和模式识别。
在本文中,我们将介绍如何使用MATLAB实现KNN近邻法,并给出相应的代码示例。
1. 数据准备在使用KNN算法之前,首先需要准备好样本数据。
假设我们有一个包含N个样本的数据集X,每个样本有M个特征。
另外,我们还需要准备一个包含N个类别标签的向量Y,用于表示每个样本的类别。
在MATLAB中,可以通过以下代码来生成示例数据:```m生成示例数据N = 100; 样本数量M = 2; 特征数量K = 3; 邻居数量X = rand(N, M); 生成N个样本,每个样本包含M个特征Y = randi([1, 3], N, 1); 生成N个随机的类别标签```2. KNN算法实现接下来,我们将使用MATLAB实现KNN算法,并用其对样本数据进行分类。
KNN算法的基本思想是,对于给定的未知样本,找出与其距离最近的K个已知样本,然后通过多数表决的方式来确定未知样本的类别。
在MATLAB中,可以通过以下代码来实现KNN算法:```mKNN算法实现function result = knn_classify(X, Y, x, k)N = size(X, 1); 样本数量distances = sqrt(sum((X - x).^2, 2)); 计算未知样本与已知样本的距离找出距离最近的K个样本[~, index] = sort(distances);knn_labels = Y(index(1:k));统计K个样本中类别出现的次数unique_labels = unique(Y);label_count = histc(knn_labels, unique_labels);多数表决确定类别[~, result] = max(label_count);end```3. 使用KNN算法进行分类有了KNN算法的实现之后,我们可以用它对样本数据进行分类,并观察其分类结果。
matlab分类器算法
matlab分类器算法Matlab是一种常用的科学计算工具,广泛应用于数据分析、图像处理、机器学习等领域。
其中,分类器算法是机器学习中常用的一种技术,可以根据已有的数据集对新的数据进行分类。
本文将介绍几种常用的Matlab分类器算法,并分析其原理和应用。
一、K近邻算法K近邻算法是一种基本的分类器算法,其原理是找出与待分类样本最相似的K个训练样本,然后根据这K个样本的标签进行投票决定待分类样本的类别。
在Matlab中,可以使用fitcknn函数实现K近邻分类器。
该函数可以设置K值、距离度量方法等参数,以适应不同的分类任务。
二、支持向量机算法支持向量机是一种经典的二分类算法,其目标是找到一个超平面,将两个不同类别的样本分隔开来,并使得超平面到最近样本的距离最大化。
在Matlab中,可以使用fitcsvm函数实现支持向量机分类器。
该函数可以设置核函数、惩罚系数等参数,以适应不同的分类任务。
三、决策树算法决策树是一种简单而有效的分类器算法,其原理是通过对特征的逐次划分,将数据集划分为不同的子集,直到子集中的样本属于同一类别或无法再进行划分为止。
在Matlab中,可以使用fitctree函数实现决策树分类器。
该函数可以设置最大深度、最小叶节点数等参数,以控制决策树的复杂度和泛化能力。
四、朴素贝叶斯算法朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立性假设的分类器算法,其原理是通过计算待分类样本属于每个类别的概率,并选择概率最大的类别作为分类结果。
在Matlab中,可以使用fitcnb函数实现朴素贝叶斯分类器。
该函数可以设置类别先验概率、特征条件概率等参数,以适应不同的分类任务。
五、神经网络算法神经网络是一种模拟生物神经网络结构和功能的计算模型,具有良好的非线性拟合能力和适应性。
在Matlab中,可以使用patternnet函数实现基于多层感知器的神经网络分类器。
该函数可以设置隐藏层数、神经元个数等参数,以控制神经网络的复杂度和性能。
fisheriris数据集matlab中knn分类
fisheriris数据集matlab中knn分类fisheriris数据集是一个经典的模式识别数据集,常用于机器学习中的分类问题。
其中包含了150个样本,分为三类鸢尾花:Setosa、Versicolor和Virginica。
每个样本有四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。
本文将以fisheriris数据集和其中的k-最近邻(k-Nearest Neighbors, KNN)分类算法为主题,详细解释该算法的原理和实现过程。
一、数据集介绍Fisheriris数据集由英国生物统计学家罗纳德·费雪收集,用于分类问题的研究。
数据集中的每个样本都代表一朵鸢尾花,共有150朵花。
每朵花有四个特征值(花萼长度、花萼宽度、花瓣长度和花瓣宽度)以及一个类标签,用于表示该花属于鸢尾花的哪个类别。
鸢尾花共分为三个类别:Setosa、Versicolor和Virginica。
Fisheriris数据集可以在MATLAB的datasets 包中找到。
二、KNN算法概述KNN算法是一种基于实例的学习方法,用于解决分类和回归问题。
对于分类问题,KNN算法通过比较待分类样本与已知类别样本的特征相似度,将其归为相似度最高的k个样本所属的类别中出现次数最多的类别。
KNN算法的原理比较简单。
首先,计算待分类样本与已知样本之间的距离,常用的距离度量方法有欧氏距离、曼哈顿距离和闵可夫斯基距离等。
然后,根据距离的大小选择k个最近邻样本,并统计这k个样本中各个类别出现的次数。
最后,将待分类样本归为出现次数最多的类别所属。
三、KNN算法步骤详解1. 导入数据集首先,我们需要导入Fisheriris数据集并查看其中的数据。
在MATLAB中,可以直接使用load命令加载数据集。
Matlabload fisheriris2. 数据集预处理在使用KNN算法之前,我们需要进行数据集的预处理,包括数据归一化、划分训练集和测试集等操作。
matlab knn函数
matlab knn函数MATLAB KNN函数(K-最近邻算法)K-最近邻算法(K-Nearest Neighbors, KNN)是一种经典的分类和回归算法。
在分类问题中,KNN算法根据特征空间中k个最近邻样本的类别标签,来预测待分类样本的类别;在回归问题中,KNN算法根据特征空间中k个最近邻样本的属性值,来预测待回归样本的属性值。
MATLAB提供了一个knnsearch函数用于实现KNN算法,该函数将计算一个数据集中每个样本与其他样本之间的距离,并返回每个样本的k个最近邻。
首先,我们需要创建一个示例数据集。
假设我们有一个数据集包含三个类别的样本,每个样本有两个属性。
我们可以按照以下方式创建数据集:```matlabdata = [1 1; 1 2; 2 1; 2 2; 3 1; 3 2; 4 1; 4 2; 5 1; 5 2;1 4; 1 5;2 4; 2 5;3 4; 3 5;4 4; 4 5;5 4; 5 5;6 1; 6 2;7 1; 7 2;8 1; 8 2;9 1; 9 2; 10 1; 10 2];labels = [1; 1; 1; 1; 1; 1; 1; 1; 1; 1;2; 2; 2; 2; 2; 2; 2; 2; 2; 2;3; 3; 3; 3; 3; 3; 3; 3; 3; 3];```接下来,我们可以使用knnsearch函数来找出每个样本的最近邻。
knnsearch函数的输入参数包括数据集和查询点。
在这个例子中,查询点就是数据集中的每个样本。
我们还可以指定k 值,即返回每个样本的k个最近邻。
在这个例子中,我们将k 设置为3。
```matlabk = 3;[idx, dist] = knnsearch(data, data, 'k', k+1);```在这个例子中,idx是一个矩阵,每一行包含一个样本的k+1个最近邻的索引。
dist是一个矩阵,每一行包含一个样本与其k+1个最近邻之间的距离。
最近邻点法matlab代码
最近邻点法matlab代码最近邻点法是一种基于距离度量的分类算法,它的基本思想是将样本数据空间划分为若干个区域,并将测试样本划分到某个区域中。
对于每个测试样本,最近邻点法会找到与其距离最近的一个或多个训练样本,然后将其类别作为测试样本的类别。
最近邻点法是一种简单有效的分类方法,它的分类结果具有较高的可靠性和鲁棒性。
下面是最近邻点法的MATLAB代码:1. 加载数据load iris;2. 划分训练集和测试集[train,test] = crossvalind('holdOut',species,0.3);trainData = meas(train,:);testData = meas(test,:);trainLabel = species(train);testLabel = species(test);3. 计算距离矩阵distMatrix = pdist2(testData,trainData);4. 找到最近邻点k = 1;[~,index] = sort(distMatrix,2);knnIndex = index(:,1:k);5. 统计类别knnLabel = trainLabel(knnIndex);testResult = mode(knnLabel,2);6. 计算准确率accuracy =sum(strcmp(testLabel,testResult))/length(testLabel);以上就是最近邻点法的MATLAB代码,可以用来分类各种类型的数据。
如果需要应用到实际问题中,还需要根据具体的数据特点进行微调和优化。
聚类matlab
聚类matlab聚类是一种常用的数据分析方法,它可以将一组数据划分为不同的类别,使得同一类别内的数据相似度较高,而不同类别之间的数据相似度较低。
聚类在机器学习、数据挖掘、模式识别等领域都有广泛的应用。
在本文中,我们将介绍一种常用的聚类方法——K-均值聚类算法,并使用MATLAB进行实现。
K-均值聚类算法是一种迭代的、基于距离的聚类算法。
该算法的基本思想是:将数据集划分为K个簇,每个簇具有一个代表性的质心。
质心的选择是随机的,然后根据样本与质心的距离进行簇的划分。
在每次划分后,重新计算每个簇的质心,并重复上述过程,直到质心不再发生变化或达到预定的迭代次数。
下面我们通过一个简单的例子来演示K-均值聚类算法的过程。
假设我们有一个包含100个二维数据点的数据集,我们希望将这些数据点划分为3个簇。
首先,我们随机选择3个数据点作为初始质心。
第一次迭代时,我们计算每个数据点与质心的距离,并将其划分到距离最近的簇中。
然后,根据划分结果,重新计算每个簇的质心。
接下来,我们进行第二次迭代。
同样地,计算每个数据点与质心的距离,并重新划分簇和计算质心。
重复这个过程,直到质心不再发生变化或达到预定的迭代次数。
在MATLAB中,我们可以使用kmeans函数来实现K-均值聚类算法。
该函数的基本用法如下:[idx, C] = kmeans(X, K)其中,X是包含数据点的矩阵,每一行表示一个数据点;K是要划分的簇的个数;idx是一个向量,表示每个数据点所属的簇的索引;C 是一个矩阵,表示每个簇的质心。
除了基本的用法外,kmeans函数还有其他可选的参数,可以用于控制聚类的终止条件、初始质心的选择等。
聚类分析的结果可以通过可视化来展示。
在MATLAB中,我们可以使用scatter函数来将数据点按簇的划分进行绘制,不同簇的数据点可以用不同的颜色来表示。
此外,我们还可以使用plot函数绘制每个簇的质心。
聚类分析的结果可以帮助我们进行数据的分类、数据的压缩、异常检测等任务。
k临近插值法 matlab
k临近插值法 matlabK临近插值法(K-nearest neighbor interpolation)是一种常用的插值方法,用于在给定数据点的情况下估计其他位置的数值。
在Matlab中,可以使用`interp1`函数来实现K临近插值法。
首先,我们需要准备输入数据。
假设我们有一组x和y坐标的数据点,我们可以将这些数据点传递给`interp1`函数进行插值。
接下来,我们需要指定要进行插值的位置,可以是单个位置或者一组位置。
然后,我们可以调用`interp1`函数并指定插值方法为"knn"来进行K临近插值。
在Matlab中,K临近插值法的示例代码如下:matlab.% 准备输入数据。
x = 1:5; % x坐标。
y = [3 8 1 10 5]; % 对应的y坐标。
% 指定要进行插值的位置。
queryPoints = 1:0.5:5; % 从1到5,间隔为0.5。
% 调用interp1函数进行K临近插值。
interpValues = interp1(x, y, queryPoints, 'nearest');在这个示例中,我们首先准备了输入数据x和y,然后指定了要进行插值的位置queryPoints。
最后,我们调用了`interp1`函数并指定插值方法为'nearest',将插值结果存储在interpValues中。
K临近插值法的优点是简单易懂,计算速度快,适用于处理离散数据。
然而,它也有一些缺点,比如对噪声敏感,可能会产生震荡现象。
总的来说,K临近插值法在Matlab中的实现相对简单,通过`interp1`函数可以方便地进行操作,但在使用时需要注意插值方法的选择和对结果的合理解释。
matlab k均值 聚类 实现
I. 导言在现代数据分析中,聚类是一种常用的数据挖掘技术。
K均值(K-means)聚类算法是最常用的聚类方法之一,它可以将一组数据划分为若干个不同的类别,使得同一类内的数据更加相似,不同类别之间的数据更加不同。
而MATLAB作为一个专门用于科学计算和数据分析的工具箱,提供了丰富的聚类算法实现方法,下面我们将介绍如何在MATLAB中使用K均值聚类算法进行数据分类。
II. K均值聚类算法的基本原理1. 初始化K个聚类中心:首先随机选择K个样本作为初始的聚类中心。
2. 分配样本到最近的聚类中心:对于每个样本,计算它与K个聚类中心的距离,将它分配到距离最近的聚类中心所代表的类别。
3. 更新聚类中心:对于每个类别,重新计算它们的聚类中心,即取该类别所有样本的平均值作为新的聚类中心。
4. 重复步骤2和步骤3,直到聚类中心不再发生变化或者达到最大迭代次数。
III. MATLAB中K均值聚类算法的实现在MATLAB中,K均值聚类算法的实现非常简单,可以通过以下几个步骤完成。
1. 准备数据我们需要准备待聚类的数据。
在MATLAB中,可以使用矩阵或者数据集来表示数据,假设我们有一个N维的数据集X,其中包含M个样本。
X = [x1, x2, ..., xm]2. 初始化K个聚类中心接下来,我们需要随机选择K个样本作为初始的聚类中心。
在MATLAB中,可以使用randperm函数来生成一个随机的样本索引序列,然后取前K个样本作为初始聚类中心。
idx = randperm(M, K);centroids = X(idx, :);3. 分配样本到最近的聚类中心我们需要计算每个样本与K个聚类中心的距离,并将每个样本分配到距离最近的聚类中心所代表的类别。
在MATLAB中,可以使用pdist2函数来计算样本与聚类中心之间的距禂,然后使用min函数找到每个样本距离最近的聚类中心。
distances = pdist2(X, centroids);[~, labels] = min(distances, [], 2);4. 更新聚类中心我们需要重新计算每个类别的聚类中心,即取每个类别所有样本的平均值作为新的聚类中心。
模式识别k-均值聚类算法matlaB实现
给定的试验样本为:(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2),(3,2) (6,6),(7,6),(8,6),(6,7),(7,7),(8,7),(9,7),(7,8) (8,8),(9,8),(8,9),(9,9)使用matlab编制程序,程序体如下x=[0,0;1,0;0,1;1,1;2,1;1,2;2,2;3,2;6,6;7,6;8,6;6,7;7,7;8,7;9,7;7,8;8,8;9,8;8,9;9,9];%初始段,给定c个初始聚合中心,生成聚合中心存储矩阵c=3;Z=zeros(1,c*2); %红色加粗为可改变局部%给定聚合中心Z(1)=1;Z(2)=3;Z(3)=6;Z(4)=2;Z(5)=2;Z(6)=3;biaoji=0; %标记用来判定是否结束%大循环判断是否完成聚类while(biaoji==0)y=zeros(20,c*2);%用来存储分类后的矩阵jishu=zeros(1,c); %用来计数类中所含个数%外循环用来检测分类for(i=1:20)t=(x(i,1)-Z(1))^2+(x(i,2)-Z(2))^2;leihan=1;%内循环用来判定类别并处理for(j=1:c)if(((x(i,1)-Z(2*j-1))^2+(x(i,2)-Z(2*j))^2)<t) t=((x(i,1)-Z(2*j-1))^2+(x(i,2)-Z(2*j))^2);leihan=j;endend%处理段jishu(leihan)=jishu(leihan)+1;y(jishu(leihan),2*leihan-1)=x(i,1);y(jishu(leihan),2*leihan)=x(i,2);end%设置聚合中心新的存储矩阵ZZ=zeros(1,c*2);%此循环用来解算新的聚合中心for(i=1:c)for(j=1:jishu(i))ZZ(2*i-1)=ZZ(2*i-1)+y(j,2*i-1);ZZ(2*i)=ZZ(2*i)+y(j,2*i);endZZ(2*i-1)=ZZ(2*i-1)/jishu(i);ZZ(2*i)=ZZ(2*i)/jishu(i);%此循环用来判断聚合中心是否改变for(i=1:2*c)%假设改变那么更改标计量if(ZZ(i)==Z(i)) biaoji=1;else biaoji=0;break;endend%判断标记量是否更改if(biaoji==0)%假设更改那么给定最终聚合中心for(i=1:2*c)Z(i)=ZZ(i)endendend%以下为绘制图形程序段%本程序设定为c=3故仅取前三个绘图i=1;while(i<=jishu(1))plot(y(i,1),y(i,2),'.g');hold on; i=i+1;i=1;while(i<=jishu(2))plot(y(i,3),y(i,4),'.r');hold on;i=i+1;endi=1;while(i<=jishu(3))plot(y(i,5),y(i,6),'.k');hold on;i=i+1;endtitle('k-均值聚类算法,c=3');设定初始聚合中心数c=3时,运行程序,结果如下:图1:k-均值聚类算法初始聚合中心数c=3 设定初始聚合中心数c=2时,修改程序体如下:初始段改变:c=2;Z=zeros(1,c*2);%给定聚合中心Z(1)=1;Z(2)=3;Z(3)=6;Z(4)=2;绘图段改变:i=1;while(i<=jishu(1))plot(y(i,1),y(i,2),'.g');hold on;i=i+1;endi=1;while(i<=jishu(2))plot(y(i,3),y(i,4),'.r');hold on;i=i+1;endtitle('k-均值聚类算法,c=2');图1:k-均值聚类算法初始聚合中心数c=2 比照可以看到改变聚合中心个数,聚类类别数量变化,同时程序运行速度也会改变。
k均值聚类matlab代码
k均值聚类matlab代码k均值聚类是一种常用的非监督学习算法,用来将数据集划分成k个不同的簇。
下面给出的是一个简单的Matlab代码示例,用于实现k均值聚类。
首先,我们需要导入数据集并进行预处理。
这里假设数据集保存在一个名为"data.csv"的CSV文件中,每行代表一个样本,每列代表一个特征。
```matlabdata = csvread('data.csv'); % 导入数据集[m, n] = size(data); % 获取数据集的大小% 对每个特征进行标准化(归一化)mu = mean(data); % 计算每个特征的均值sigma = std(data); % 计算每个特征的标准差data = (data - mu) ./ sigma; % 标准化数据集```接下来,我们可以编写k均值聚类的算法。
```matlabk = 3; % 设置簇的个数max_iters = 10; % 设置最大迭代次数% 随机选择k个样本作为初始质心centroids = data(randperm(m, k), :);for iter = 1:max_iters% 分配样本到最近的质心distances = pdist2(data, centroids);[~, labels] = min(distances, [], 2);% 更新簇的质心new_centroids = zeros(k, n);for i = 1:knew_centroids(i, :) = mean(data(labels == i, :));end% 判断是否收敛if isequal(new_centroids, centroids)break;endcentroids = new_centroids;end```在代码中,我们使用pdist2函数计算样本到质心的距离,并使用min函数找到每个样本离哪个质心最近。
KNN(K-NearestNeighbor)算法Matlab实现
KNN(K-NearestNeighbor)算法Matlab实现%实现KNN算法%%算法描述%1、初始化训练集和类别;%2、计算测试集样本与训练集样本的欧⽒距离;%3、根据欧⽒距离⼤⼩对训练集样本进⾏升序排序;%4、选取欧式距离最⼩的前K个训练样本,统计其在各类别中的频率;%5、返回频率最⼤的类别,即测试集样本属于该类别。
close all;clc;%%算法实现%step1、初始化训练集、测试集、K值%创建⼀个三维矩阵,⼆维表⽰同⼀类下的⼆维坐标点,第三维表⽰类别trainData1=[00;0.10.3;0.20.1;0.20.2];%第⼀类训练数据trainData2=[10;1.10.3;1.20.1;1.20.2];%第⼆类训练数据trainData3=[01;0.11.3;0.21.1;0.21.2];%第三类训练数据trainData(:,:,1)=trainData1;%设置第⼀类测试数据trainData(:,:,2)=trainData2;%设置第⼆类测试数据trainData(:,:,3)=trainData3;%设置第三类测试数据trainDim=size(trainData);%获取训练集的维数testData=[1.60.3];%设置1个测试点K=7;%%分别计算测试集中各个点与每个训练集中的点的欧⽒距离%把测试点扩展成矩阵testData_rep=repmat(testData,4,1);%设置三个⼆维矩阵存放测试集与测试点的扩展矩阵的差值平⽅%diff1=zero(trainDim(1),trianDim(2));%diff2=zero(trainDim(1),trianDim(2));%diff3=zero(trainDim(1),trianDim(2));for i=1:trainDim(3)diff1=(trainData(:,:,1)-testData_rep).^2;diff2=(trainData(:,:,2)-testData_rep).^2;diff3=(trainData(:,:,3)-testData_rep).^2;end%设置三个⼀维数组存放欧式距离distance1=(diff1(:,1)+diff1(:,2)).^0.5;distance2=(diff2(:,1)+diff2(:,2)).^0.5;distance3=(diff3(:,1)+diff3(:,2)).^0.5;%将三个⼀维数组合成⼀个⼆维矩阵temp=[distance1 distance2 distance3];%将这个⼆维矩阵转换为⼀维数组distance=reshape(temp,1,3*4);%对距离进⾏排序distance_sort=sort(distance);%⽤⼀个循环寻找最⼩的K个距离⾥⾯那个类⾥出现的频率最⾼,并返回该类num1=0;%第⼀类出现的次数num2=0;%第⼆类出现的次数num3=0;%第三类出现的次数sum=0;%sum1,sum2,sum3的和for i=1:Kfor j=1:4if distance1(j)==distance_sort(i)num1=num1+1;endif distance2(j)==distance_sort(i)num2=num2+1;endif distance3(j)==distance_sort(i)num3=num3+1;endendsum=num1+num2+num3;if sum>=Kbreak;endendclass=[num1 num2 num3];classname=find(class(1,:)==max(class));fprintf('测试点(%f %f)属于第%d类',testData(1),testData(2),classname); %%使⽤绘图将训练集点和测试集点绘画出来figure(1);hold on;for i=1:4plot(trainData1(i,1),trainData1(i,2),'*');plot(trainData2(i,1),trainData2(i,2),'o');plot(trainData3(i,1),trainData3(i,2),'>');endplot(testData(1),testData(2),'x');text(0.1,0.1,'第⼀类');text(1.1,0.1,'第⼆类');text(0.1,1,'第三类');转载于https:///queyuze/article/details/70195087。
matlab使用近邻法处理实力的例子
近邻法(k-nearest neighbors, k-NN)是一种简单而有效的监督学习算法,常用于模式识别和数据挖掘领域。
它通过在训练集中找到与新样本最相似的k个样本,并利用这些样本的标签来对新样本进行分类或预测。
在本文中,我们将介绍如何使用MATLAB中的近邻法处理实际的例子。
1. 准备数据我们需要准备一组带有标签的数据作为训练集。
数据可以是任何类型,比如图像、文本或数值数据。
在本例中,我们将使用一个包含花卉数据的数据集。
每个样本包含花卉的四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,以及所属的花卉类别。
我们将使用这些特征来预测新样本所属的花卉类别。
2. 加载数据我们需要将数据加载到MATLAB中。
我们可以使用MATLAB内置的函数,比如csvread()或xlsread(),或者直接从工作区导入数据。
在本例中,我们将使用xlsread()函数从Excel文件中读取数据。
3. 数据预处理在使用近邻法之前,我们需要对数据进行预处理。
这包括标准化、归一化或缺失值处理等步骤。
在本例中,我们将对特征进行归一化处理,以便它们具有相同的重要性。
4. 创建模型在MATLAB中,我们可以使用fitcknn()函数来创建近邻法模型。
该函数允许我们指定k值、距离度量和其他参数。
在本例中,我们将使用默认的欧氏距离度量,并将k值设定为3。
5. 模型训练一旦模型创建完成,我们可以使用训练集对模型进行训练。
这将使模型学习训练集中各个类别之间的距离,并为每个样本分配一个类别标签。
6. 模型预测一旦模型训练完成,我们可以使用测试集对模型进行预测。
在本例中,我们将用模型对一组新样本进行分类,并比较预测结果与实际标签的差异。
7. 模型评估我们需要对模型的性能进行评估。
在MATLAB中,我们可以使用confusionmat()函数来计算混淆矩阵,并进一步计算准确率、召回率和F1分数等性能指标。
通过以上步骤,我们成功地使用MATLAB中的近邻法处理了实际的例子。
k临近插值法 matlab
k临近插值法 matlab
k临近插值法(K-nearest neighbor interpolation)是一种常用的插值方法,它可以通过使用最接近的k个已知数据点的值来估计未知点的值。
在Matlab中,可以使用interp1函数来实现k临近插值法。
interp1函数的语法为:
YI = interp1(X, Y, XI, 'nearest')。
其中,X和Y分别是已知数据点的横坐标和纵坐标,XI是要进行插值的点的横坐标,'nearest'表示使用最近邻插值法。
在使用k临近插值法时,需要注意以下几点:
1. 确定k的取值,k的取值会影响插值结果,通常情况下可以通过实验来确定一个合适的k值。
2. 处理边界情况,当要插值的点位于已知数据点的边界时,需要特殊处理,可以使用不同的边界处理方法来解决这个问题。
3. 数据点的分布,k临近插值法对数据点的分布比较敏感,如
果数据点分布不均匀,可能会导致插值结果不准确,因此在使用该方法时需要对数据点的分布进行分析。
除了interp1函数,Matlab中还提供了其他插值方法的函数,如线性插值、三次样条插值等,根据具体的需求和数据特点,可以选择合适的插值方法来进行数据插值。
总之,k临近插值法是一种简单且有效的插值方法,在Matlab 中可以通过interp1函数来实现,但在使用过程中需要注意参数的选择和数据的特点,以获得准确的插值结果。
使用Matlab进行数据聚类的技巧
使用Matlab进行数据聚类的技巧引言:数据聚类是数据挖掘中常用的一种技术,它可以将相似的数据点归为一类,从而揭示数据中的隐藏特征。
Matlab作为一种功能强大的计算工具,提供了丰富的聚类算法和函数库。
本文将介绍几种常用的数据聚类算法,并探讨在使用Matlab 进行数据聚类时的一些技巧。
一、K均值聚类算法K均值聚类算法是一种简单但有效的聚类方法,其思想是将数据点划分为K个簇,其中每个点属于离其最近的质心。
在Matlab中,可以使用自带的kmeans函数来实现K均值聚类。
使用该函数时,需要注意以下几点技巧:1. 数据的预处理:对于不同维度的数据,通常需要进行标准化或归一化处理,以保证每个维度对聚类结果的影响相同。
2. 选择合适的K值:K值的选择对聚类结果有很大的影响。
可以通过尝试不同的K值,并使用评估指标(如轮廓系数或间隔统计量)来评估聚类效果,选择最优的K值。
3. 处理聚类结果:在使用kmeans函数后,可以使用其他函数对聚类结果进行进一步的分析和可视化,如silhouette函数计算样本的轮廓系数,clustergram函数绘制聚类热图等。
二、层次聚类算法层次聚类算法将数据点逐渐合并为越来越大的簇,直到所有点都被合并为一个簇或达到预先设定的簇数。
在Matlab中,可以使用自带的clusterdata函数来实现层次聚类。
使用该函数时,需要注意以下几点技巧:1. 选择合适的距离度量:层次聚类算法中距离度量的选择是非常重要的。
常用的距离度量包括欧氏距离、曼哈顿距离和相关系数等。
根据数据的特点和聚类目标,选择合适的距离度量可以提高聚类效果。
2. 选择合适的链接方式:层次聚类算法中,合并两个簇的方式有很多种,常见的包括单链接、完全链接和平均链接等。
选择合适的链接方式可以影响到聚类结果的紧凑性和分离度。
3. 处理聚类结果:在使用clusterdata函数后,可以使用其他函数对聚类结果进行进一步的分析和可视化,如dendrogram函数绘制谱系图,cophenet函数计算谱系相关系数等。
相邻平均法matlab
相邻平均法matlab相邻平均法是一种常用的信号平滑方法,也被称为移动平均法。
它通过取相邻数据点的平均值来滤波信号,从而减小噪声的影响。
在MATLAB中,可以使用conv函数来实现相邻平均法。
以下是一个示例代码:```matlabfunction smoothed_signal = moving_average(signal, window_size) kernel = ones(1, window_size) / window_size;smoothed_signal = conv(signal, kernel, 'same');end```在上述代码中,signal是输入的信号向量,window_size是平滑窗口的大小。
首先,创建一个平均滤波器kernel,大小为1×window_size并且每个元素的值为1/window_size。
然后,使用conv函数将平滑滤波器应用于信号,'same'表示输出与输入信号大小相同。
最后,将平滑后的信号返回。
以下是如何使用上述函数进行信号平滑的示例代码:```matlab% 生成一个包含噪声的信号t = 0:0.1:10;signal = sin(t) + 0.5*randn(size(t));% 使用相邻平均法平滑信号window_size = 5;smoothed_signal = moving_average(signal, window_size);% 绘制原始信号和平滑后的信号plot(t, signal, 'b', t, smoothed_signal, 'r');legend('原始信号', '平滑信号');```上述代码首先生成一个包含噪声的信号,然后使用相邻平均法平滑信号,并将原始信号和平滑后的信号绘制在同一张图上。
注意,相邻平均法的窗口大小选择会影响平滑的程度。
matlab分类算法
matlab分类算法Matlab是一种功能强大的编程语言和环境,广泛应用于科学计算、机器学习和数据分析等领域。
在机器学习中,Matlab提供了丰富的分类算法,可以帮助研究人员和工程师解决各种分类问题。
一、简介分类是一种常见的机器学习任务,其目标是根据已知的样本数据集,将新的未知样本分配到已定义的类别中。
Matlab提供了多种分类算法,包括K近邻法、支持向量机、决策树、朴素贝叶斯等,可以根据具体问题的特点选择合适的算法进行分类。
二、K近邻法K近邻法是一种基于实例的分类方法,其思想是对于一个新的样本,通过计算其与已知样本的距离,找到距离最近的K个样本,然后根据这K个样本的类别,通过投票或加权投票的方式来确定新样本的类别。
Matlab提供了knnsearch函数实现K近邻法分类,可以设置K值和距离度量方法来进行分类。
三、支持向量机支持向量机是一种二分类模型,其目标是找到一个超平面,将样本空间划分为两个不同类别的区域。
Matlab中的svmtrain函数可以用于训练支持向量机分类器,svmclassify函数用于进行分类预测。
支持向量机具有较强的泛化能力,可以处理高维数据和非线性问题。
四、决策树决策树是一种基于树形结构的分类算法,通过一系列的判断条件对样本进行分类。
Matlab中的classregtree函数用于构建决策树模型,可以通过设置参数来控制树的生长过程。
决策树具有可解释性强、计算效率高等优点,适用于处理特征较多的数据集。
五、朴素贝叶斯朴素贝叶斯是一种基于贝叶斯定理的分类算法,它假设特征之间相互独立,通过计算后验概率来进行分类。
Matlab中的fitcnb函数可以用于训练朴素贝叶斯分类器,predict函数用于进行分类预测。
朴素贝叶斯算法具有计算简单、适用于大规模数据集等特点,但对特征独立性的假设可能会影响分类效果。
六、模型评估在使用分类算法进行实际应用时,需要对模型进行评估来衡量其分类性能。
Matlab提供了多种评估指标,如准确率、召回率、F1值等,可以通过confusionmat函数计算混淆矩阵来得到这些指标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别算法实现——K近邻法&最近邻法一.程序<用MATLAB做的>1. 用Iris数据集验证的程序(1)用Iris数据集验证的M文件:load iris.mat;A=randperm(50);B=randperm(50);C=randperm(50);a1=A(1,1:25);a2=A(1,26:50);a=Iris(a1,1:4);%%随机取第一类数据的25组aa=Iris(a2,1:4);b1=50*ones(1,25)+B(1,1:25);b2=50*ones(1,25)+B(1,26:50);b=Iris(b1,1:4);%%随机取第二类数据的25组bb=Iris(b2,1:4);c1=100*ones(1,25)+C(1,1:25);c2=100*ones(1,25)+C(1,26:50);c=Iris(c1,1:4);%%随机取第三类数据的25组cc=Iris(c2,1:4);train_sample=cat(1,a,b,c);%拼接成包含75组数据的样本集test_sample=cat(1,aa,bb,cc);k=7;%7近邻法cha=zeros(1,75);sum1=0;sum2=0;sum3=0;sum=0;[i,j]=size(train_sample);%i=75,j=4[u,v]=size(test_sample);%u=75,v=4for x=1:ufor y=1:iresult=sqrt((test_sample(x,1)-train_sample(y,1))^2+(test_sa mple(x,2)-train_sample(y,2))^2+(test_sample(x,3)-train_samp le(y,3))^2+(test_sample(x,4)-train_sample(y,4))^2);cha(1,y)=result;end;[z,Ind]=sort(cha);%Ind用来存储排序前在cha中的下标m1=0;m2=0;m3=0;for n=1:kif Ind(1,n)<=25m1=m1+1;elseif Ind(1,n)>25&&Ind(1,n)<=50m2=m2+1;elsem3=m3+1;endendif m1>=m2&&m1>=m3m=1;elseif m2>=m1&&m2>=m3m=2;elseif m3>=m1&&m3>=m2m=3;endif (x<=25&&m==1)sum1=sum1+1;elseif(x>25&&x<=50&&m==2)sum2=sum2+1;elseif(x>50&&x<=75&&m==3)sum3=sum3+1;endif(x<=25&&m==1)||(x>25&&x<=50&&m==2)||(x>50&&x<=75&&m==3) sum=sum+1;endenddisp(sprintf('第一类分类正确率为%4.2f',sum1/25)); disp(sprintf('第二类分类正确率为%4.2f',sum2/25)); disp(sprintf('第三类分类正确率为%4.2f',sum3/25)); disp(sprintf('总分类正确率为%4.2f',sum/75)); (2)验证结果:a)K近邻法:K=7 实验结果表1.b)最近邻法(即令K=1)实验结果表2.(3) 数据分析第一个表格是用K(k=7)近邻法得到的识别率,第二个表格是用最近邻法得到的识别率,可以看出对于Iris数据,两种方法的识别率都达到了95%左右。
2. 用Wine数据集验证的程序(1)用Wine数据集验证的M文件:load wine.mat;A=randperm(59);B=randperm(71);C=randperm(48); a1=A(1,1:30);a2=A(1,31:59);a=wine(a1,1:14);aa=wine(a2,1:14);b1=59*ones(1,36)+B(1,1:36);b2=59*ones(1,35)+B(1,37:71);b=wine(b1,1:14);bb=wine(b2,1:14);c1=130*ones(1,24)+C(1,1:24);c2=130*ones(1,24)+C(1,25:48);c=wine(c1,1:14);cc=wine(c2,1:14);train_sample=cat(1,a,b,c);%拼接成样本集test_sample=cat(1,aa,bb,cc);k=7;%7近邻法cha=zeros(1,90);sum1=0;sum2=0;sum3=0;sum4=0;sum=0;[i,j]=size(train_sample);[u,v]=size(test_sample);for x=1:ufor y=1:iresult=sqrt((test_sample(x,2)-train_sample(y,2))^2+(test_sa mple(x,3)-train_sample(y,3))^2+(test_sample(x,4)-train_samp le(y,4))^2+(test_sample(x,5)-train_sample(y,5))^2+(test_sam ple(x,6)-train_sample(y,6))^2+(test_sample(x,7)-train_sampl e(y,7))^2+(test_sample(x,8)-train_sample(y,8))^2+(test_samp le(x,9)-train_sample(y,9))^2+(test_sample(x,10)-train_sampl e(y,10))^2+(test_sample(x,11)-train_sample(y,11))^2+(test_s ample(x,12)-train_sample(y,12))^2+(test_sample(x,13)-train_ sample(y,13))^2+(test_sample(x,14)-train_sample(y,14))^2); cha(1,y)=result;end;[z,Ind]=sort(cha);%Ind用来存储排序前在cha中的下标m1=0;m2=0;m3=0;for n=1:kif Ind(1,n)<=30m1=m1+1;elseif Ind(1,n)>30&&Ind(1,n)<=66m2=m2+1;elsem3=m3+1;endendif m1>=m2&&m1>=m3m=1;elseif m2>=m1&&m2>=m3m=2;elseif m3>=m1&&m3>=m2m=3;endif (x<=29&&m==1)sum1=sum1+1;elseif(x>29&&x<=64&&m==2)sum2=sum2+1;elseif(x>64&&x<=88&&m==3)sum3=sum3+1;endif(x<=29&&m==1)||(x>29&&x<=64&&m==2)||(x>64&&x<=88&&m==3) sum=sum+1;endenddisp(sprintf('第一类分类正确率为%4.2f',sum1/30)); disp(sprintf('第二类分类正确率为%4.2f',sum2/36)); disp(sprintf('第三类分类正确率为%4.2f',sum3/24)); disp(sprintf('总分类正确率为%4.2f',sum/90)); (2)验证结果:a).K近邻法:K=7 实验结果表1.b).最近邻法(即令K=1)实验结果表2.(3)数据分析这两个是对Wine数据的识别率,第一个表格是用K(k=7)近邻法得到的识别率,第二个表格是用最近邻法得到的识别率,可以看出对于Wine数据,两种方法的识别率只达到了68%~69%左右。
3.大作业收获通过这次的大作业,我学会了用MATLAB,感觉这个软件比C好多了。
而且有一个很重要的收获,我自己刚开始写的没有随机取数的功实用能,后来,和同学聊了聊,才结识了randperm函数,感觉很有帮助。
而且,对于.m文件和.mat文件的调用,也更加熟悉了。
认识了UCI 数据库。
文档。