【数据挖掘】MATLAB实现K最近邻算法

13 篇文章 3 订阅
11 篇文章 5 订阅

K最近邻算法的MATLAB实现


代码实现

实现程序如下:

测试代码:

function main
load('testingData.mat');  %载入数据--测试样本
load('trainingData.mat'); %载入数据--训练样本

trAttr = trAttr(:,1:end);
trLabels = trLabels(:,end);
tstAttr = tstAttr(:,1:end);
tstLabels = tstLabels(:,end);

[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);
end

K最近邻算法:

function [class] = KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)

% 1 得到训练数据集trainingSamples的大小M,N
[M,N] = size(trainingSamples); 

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

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

% 4 对Distance数组排升序
[val ind] = sort(Distance); % sort函数默认升序,此处有两个输出参数,val:距离排序后的值,ind:val中每个元素在原矩阵Distance中的位置

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

% 6 得到labs数组的不重复元素,存储在数组All_labs 
All_labs = unique(labs); % unique函数:返回与labs中相同的数据,但是不包含重复项

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

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

% 9 求投票数Vote(i)的最大值所在的索引ind
[val ind] = max(Vote); % max函数 返回Vote的最大元素

% 10 All_labs(ind)是最大投票数对应的类别标签,即为算法输出结果class
class = All_labs(ind);

end

规范化:

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

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

代码执行结果:
在这里插入图片描述

  • 4
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB实现KNN最近算法可以通过以下步骤进行: 1. 收集和准备数据集:首先,需要收集和准备用于训练和测试的数据集。数据集应包含已知标签的样本。 2. 特征提取和预处理:对于每个样本,需要提取适当的特征,并进行必要的预处理,例如归一化或标准化。 3. 计算距离:对于测试样本,计算其与训练样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。 4. 选择K个最近:根据计算得到的距离,选择K个最近样本。 5. 进行分类:根据K个最近样本的标签,使用投票或加权投票的方式确定测试样本的类别。 在MATLAB中,可以使用自带的knnsearch函数来计算距离和选择最近样本。然后,根据最近样本的标签,可以使用投票或加权投票的方式进行分类。 以下是MATLAB实现KNN最近算法的示例代码: ```matlab % 1. 收集和准备数据集 % 假设训练数据集为trainData,包含特征和标签 % 假设测试数据集为testData,包含特征 % 2. 特征提取和预处理 % 可根据具体情况进行特征提取和预处理操作 % 3. 计算距离 % 假设使用欧氏距离作为距离度量 distances = pdist2(testData, trainData); % 4. 选择K个最近 K = 5; % 假设选择5个最近 \[~, indices\] = mink(distances, K); % 5. 进行分类 % 假设训练数据集的标签为trainLabels % 假设测试数据集的标签为testLabels kNearestLabels = trainLabels(indices); predictedLabels = mode(kNearestLabels, 2); % 使用投票方式进行分类 % 输出预测结果 disp(predictedLabels); ``` 请注意,以上代码仅为示例,实际应用中可能需要根据具体情况进行适当的修改和调整。 #### 引用[.reference_title] - *1* [基于matlab采用KNN算法手写体数字识别实现](https://blog.csdn.net/Taplus/article/details/112996077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [knn(k近算法)——matlab](https://blog.csdn.net/qq_25990967/article/details/122753558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值