【数据挖掘】使用 matlab 编程实现K最近邻算法 并进行归一化操作

实验内容

训练数据见trainingData.mat,测试数据见testingData.mat。编程实现K最近邻算法。函数为:[class]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)。

数据

测试代码如下:

load('testingData.mat');
load('trainingData.mat');
%[trAttr]=normalize(trAttr);
%[tstAttr]=normalize(tstAttr);
k=3;
predictlabel =zeros(length(tstLabels),1);
for i=1:length(tstLabels)
   predictlabel(i) =KNN_Classify_E(trAttr, trLabels ,tstAttr(i,:) ,k);   
end
accurate =sum(predictlabel==tstLabels)/length(tstLabels);
disp(accurate);

训练数据见trainingData.mat,测试数据见testingData.mat

链接:https://pan.baidu.com/s/1Or3DpNVoCdzXoI2z3iu_mw
提取码:wa6z

算法处理

KNN_Classify_E函数的处理流程与说明如下:

输入参数:k值、trainingSamples(训练数据集,M*N矩阵,M为样本数,N为属性数)、trainingLabels(训练数据集的分类标签012...,M*1矩阵), testingSample(测试数据,1*N矩阵)
输出参数:class(测试数据对应类别标签)
算法流程:
1、得到训练数据集trainingSamples的大小M,N
2、初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离。
3、对每一个训练样本trainingSamples(i,:)for i=1:M】,计算其与测试样本testingSample之间的距离,存储在Distance(i)中。【计算两个样本之间的欧氏距离,调用函数dist_E(vect1,vect2),其中dist_E()为自定义函数,参见上机练习24、对Distance数组排升序【sort函数】
5、取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs 
6、得到labs数组的不重复元素,存储在数组All_labs 【unique函数】
7、得到不重复元素(数组All_labs )的个数LabNum
8、 (for i=1: LabNum )对每一个不重复的分类标签All_labs(i) ,查找【find函数】最近的k个类别标签labs中,等于All_labs(i)的有几个,将该数目作为第i类的投票数Vote(i)
9、求投票数Vote(i)的最大值所在的索引ind
10All_labs(ind)是最大投票数对应的类别标签,即为算法输出结果class

函数 [class]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k):

实验代码

function [c]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)
[M,N]=size(trainingSamples);  %得到训练数据集trainingSamples的大小M,N

Distance=zeros(M,1);  %初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离

%对每一个训练样本trainingSamples(i,:)for i=1:M】,
%计算其与测试样本testingSample之间的距离,存储在Distance(i)中
for i=1:M
    trainingS=trainingSamples(i,:);
    Distance(i)=dist_E(trainingS,testingSample);
end

[val idx]=sort(Distance);  %对Distance数组排升序

%取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs 
labs=trainingLabels(idx(1:k));

%得到labs数组的不重复元素,存储在数组All_labs 【unique函数】
All_labs=unique(labs);

%得到不重复元素(数组All_labs )的个数LabNum
LabNum=length(All_labs);

%for i=1: LabNum )对每一个不重复的分类标签All_labs(i)%查找【find函数】最近的k个类别标签labs中,等于All_labs(i)的有几个,
%将该数目作为第i类的投票数Vote(i)
Vote=zeros(LabNum,1);
for i=1:LabNum
    Vote(i)=length(find(labs==All_labs(i)));
end

%求投票数Vote(i)的最大值所在的索引ind
[val idx]=max(Vote);
%All_labs(ind)是最大投票数对应的类别标签,即为算法输出结果class
c=All_labs(idx);

end

测试结果

matlab 工具函数 —— normalize(归一化数据)

function [Samples2]=normalize(Samples)
[M,N] = size(Samples);

Samples2 = zeros(M,N); %初始化Samples2数组(M*N)
for i=1:N
    allAtr = Samples(:,i);
    STD = std(allAtr);    % 求标准差
    MEAN = mean(allAtr);  % 求均值
    x = (allAtr-MEAN)/STD;
    Samples2(:,i)=x;
end
end

测试数据

load('testingData.mat');
load('trainingData.mat');
[trAttr]=normalize(trAttr);
[tstAttr]=normalize(tstAttr);
k=3;
predictlabel =zeros(length(tstLabels),1);
for i=1:length(tstLabels)
   predictlabel(i) =KNN_Classify_E(trAttr, trLabels ,tstAttr(i,:) ,k);   
end
accurate =sum(predictlabel==tstLabels)/length(tstLabels);
disp(accurate);

测试结果

学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 Vue爱好者 博客之星
不是只会写业务代码的前端开发攻城狮!博客网站:yangchaoyi.vip做限量版的自己,就这样安静地努力。一个还在苦学前端的小小Chocolate,我的博客主要分享前端、算法、大学课程笔记、平常遇到的bug、心得感悟体会,感谢您的访问,若喜欢可以关注一下~每一个清晨,记得鼓励自己。没有奇迹,只有你努力的轨迹;没有运气,只有你坚持的勇气!每一份坚持都是成功的累积,只要相信自己,总会遇到惊喜!座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值