MATLAB实现K-近邻算法(源码)
Posted wyy_persist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB实现K-近邻算法(源码)相关的知识,希望对你有一定的参考价值。
K-近邻算法原理
算法原理自己总结:
即将准备分类的样本同已经分类过的样本逐一计算之间的距离,然后将所有的距离进行从小到大的排序,然后取前K个最近的距离,然后遍历这K个最近样本距离中的每一个样本的类别,统计所有类别在这K个样本中的数量,那么准备分类的样本的类别就是这其中数量最多的类别。
这里的距离可以使用欧式距离。
采用最典型的划分方法,将80%的样本作为训练样本,剩下的20%作为测试样本。
使用欧式距离作为两个样本之间的方法。
代码如下
clc
clear
close all
file = importdata('balance-scale.txt');
wholeData=file.data;
%交叉验证选取训练集和测试集
cv=cvpartition(size(wholeData,1),'holdout',0.04);%0.04表明测试数据集占总数据集的比例
trainData=wholeData(training(cv),:);
testData=wholeData(test(cv),:);
label=file.textdata;% 得到对应的文本数据目的是为了后边得到每一行数据的类别
attributeNumber=size(trainData,2);% 得到数据中属性的个数就是trainData的列数(2表示返回trainData的列数)
attributeValueNumber=5;% 表示属性值从1-5是一个范围
%%
%将分类标签转化为数据
sampleNumber=size(label,1);% 得到样例的数量
labelData=zeros(sampleNumber,1);% 表示生成已给n行1列的0矩阵
% 循环将对应每一行数据进行分类
for g=1:sampleNumber
if label{g,1}=='R'
labelData(g,1)=1;
elseif label{g,1}=='B'
labelData(g,1)=2;
else
labelData(g,1)=3;
end
end
trainLabel=labelData(training(cv),:);% 得到训练标签的数据行数
trainSampleNumber=size(trainLabel,1);
testLabel=labelData(test(cv),:);% 得到数据对应的测试标签的数量
%而后使用for循环计算test集合中每一个元素与train集合中每个数据的距离
K=9; %两个类,K取奇数才能够区分测试数据属于那个类,这里K=9表示取前9个最近距离的元素
%先定义一个保存每个测试元素与训练元素距离的列表
%得到训练集的长度
trainLength = size(trainData,1);
%保存距离矩阵
distance = zeros(trainLength,1);% 定义一个n * 1列的矩阵
%定义一个测试数据
% 假设test是L
test = [1,4,1,1];
%测试数据,KNN算法看这个数属于哪个类
for tindex = 1:size(trainLabel,1) % 使用size函数得到训练数据有多少行
%计算所有的距离
dis = 0;
for ii = 1 : attributeNumber
dis = dis + (test(ii)-trainData(tindex,ii)).^2;
end
distance(tindex) = sqrt(dis); % 开根号得到欧式距离
end
% 使用选择排序的方法
%选择排序法,只找出最小的前K个数据,对数据和标号都进行排序
for g=1:K
ma=distance(g);
tmp = 1;
label_ma = 0;
% 表示从第i个向后边遍历
for j=g+1:size(trainData,1)
if distance(j)<ma % 表示如果距离小于ma,那么交换两个数
ma=distance(j);
label_ma=trainLabel(j);
tmp=j;
end
end
distance(tmp)=distance(g); %排数据
distance(g)=ma;
trainLabel(tmp)=trainLabel(g); %排标号,主要使用标号
trainLabel(g)=label_ma;
end
% 然后统计前K个元素对应的类别个数,最多的就是该测试用例对应类
cls1=0; %统计类1中距离测试数据最近的个数
for i=1:K
disp(trainLabel(i));
if trainLabel(i)==1
cls1=cls1+1;
end
end
cls2=0; %类2中距离测试数据最近的个数
for i=1:K
if trainLabel(i)==2
cls2=cls2+1;
end
end
cls3 = K - cls1 -cls2;
if cls1 > cls2
if cls1 > cls3
disp('this item belongs to No.1(R)')
else
disp('this item belongs to No.3(L)')
end
else
if cls2 < cls3
disp('this item belongs to No.3(L)')
else
disp('this item belongs to No.2(B)')
end
end
这里仅使用了单个测试样例进行测试,可以读取数据集进行大量的测试,进而得到准确率等指标。
以上是关于MATLAB实现K-近邻算法(源码)的主要内容,如果未能解决你的问题,请参考以下文章