【数据挖掘】使用 matlab 编程实现K最近邻算法 并进行归一化操作
发布日期:2021-06-29 14:32:32
浏览次数:2
分类:技术文章
本文共 2903 字,大约阅读时间需要 9 分钟。
实验内容
训练数据见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); endaccurate =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(训练数据集的分类标签0、1、2...,M*1矩阵), testingSample(测试数据,1*N矩阵)输出参数:class(测试数据对应类别标签)算法流程:1、得到训练数据集trainingSamples的大小M,N2、初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离。3、对每一个训练样本trainingSamples(i,:)【for i=1:M】,计算其与测试样本testingSample之间的距离,存储在Distance(i)中。【计算两个样本之间的欧氏距离,调用函数dist_E(vect1,vect2),其中dist_E()为自定义函数,参见上机练习2】4、对Distance数组排升序【sort函数】5、取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs 6、得到labs数组的不重复元素,存储在数组All_labs 【unique函数】7、得到不重复元素(数组All_labs )的个数LabNum8、 (for i=1: LabNum )对每一个不重复的分类标签All_labs(i) ,查找【find函数】最近的k个类别标签labs中,等于All_labs(i)的有几个,将该数目作为第i类的投票数Vote(i)9、求投票数Vote(i)的最大值所在的索引ind10、All_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,NDistance=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 )的个数LabNumLabNum=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)是最大投票数对应的类别标签,即为算法输出结果classc=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;endend
测试数据
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); endaccurate =sum(predictlabel==tstLabels)/length(tstLabels);disp(accurate);
测试结果
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/106468085 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月12日 02时16分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2019 RT-Thread 开发者大会上海站议程发布
2019-04-29
RT-Thread Nano 3.1.3 正式发布
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(一)
2019-04-29
12月8日 RCEA - RT-Thread能力认证考试考前通知
2019-04-29
论坛热贴 | RT-Thread音频驱动开发(一)
2019-04-29
基于 Keil MDK 移植 RT-Thread Nano
2019-04-29
【报名截至今晚】12月14日深圳嵌入式与音频开发专题会议预告
2019-04-29
移植 RT-Thread Nano 到 RISC-V
2019-04-29
软件包应用分享|基于RT-Thread的百度语音识别(二)
2019-04-29
在 RT-Thread Nano 上添加控制台与 FinSH
2019-04-29
2019深圳国际嵌入式系统展,RT-Thread展台等你来!
2019-04-29
开源啦!基于RT-Thread的百度语音识别——录音功能的实现(三)
2019-04-29
今晚8点直播预告:资深软件工程师在线答疑快来提问吧!
2019-04-29
基于 IAR 移植 RT-Thread Nano
2019-04-29
STM32 上使用 USB Host 读写 U 盘
2019-04-29
2019 RT-Thread 开发者大会圆满落幕(附大会PPT领取方式)
2019-04-29
2019年12月RT-Thread能力认证考试可以查询成绩啦!
2019-04-29
一站式开发工具:RT-Thread Studio 正式发布
2019-04-29
留言有礼|谢谢你悄悄点了小星星,让我们跃居GitHub RTOS Star榜第一
2019-04-29
功能更新!C 函数也能在 MicroPython 中被调用啦
2019-04-29