MATLAB----KNN聚类

286 篇文章 32 订阅
236 篇文章 15 订阅

在这里插入图片描述
在这里插入图片描述

clear;
clc;

DATA = load('D.mat');

%% 绘制训练数据图

first = DATA.train_data(DATA.train_label==1,:,:);
second = DATA.train_data(DATA.train_label==2,:,:);
third = DATA.train_data(DATA.train_label==3,:,:);
fourth = DATA.train_data(DATA.train_label==4,:,:);

figure

scatter3(first(:,1),first(:,2),first(:,3),'*');
hold on
scatter3(second(:,1),second(:,2),second(:,3),'p');
scatter3(third(:,1),third(:,2),third(:,3),'s');
scatter3(fourth(:,1),fourth(:,2),fourth(:,3),'o');
title('训练数据');legend('第1类','第2类','第3类','第4类');

%% KNN寻优
acc = zeros(10,1);
for k = 1:10
    % KNN 算法
    label_test = knn(k, DATA.train_data', DATA.train_label', DATA.test_data');
    % 计算最终结果
    if k ==1
        testResults = label_test;
    else
        [maxCount,idx] = max(label_test);  
        testResults = maxCount;    
    end
    % 存储各分类结果
    RESULTS(k,:) = testResults;
    
    % 计算正确率
    count = 0;
    for i=1:30  
        if (testResults(i) == DATA.test_label(i))  
        count = count+1;  
        end  
    end 
    acc(k) = count/30;  
end

disp('精度:')
disp(acc);

%% 求出最优 K
[~,K] = max(acc);
disp('最佳的K值为:');
disp(K);
%% 绘制K=1时的样本训练数据图,并在命令行窗口显示分类








 
%% 使用最优K进行一次测试
label_test = knn(K, DATA.train_data', DATA.train_label', DATA.test_data');
if K ==1
    testResults = label_test
else
    [maxCount,idx] = max(label_test);  
    testResults = maxCount 
end

%% 绘制测试数据图

first = DATA.test_data(testResults==1,:,:);
second = DATA.test_data(testResults==2,:,:);
third = DATA.test_data(testResults==3,:,:);
fourth = DATA.test_data(testResults==4,:,:);

figure;

scatter3(first(:,1),first(:,2),first(:,3),'*');
hold on
scatter3(second(:,1),second(:,2),second(:,3),'p');
scatter3(third(:,1),third(:,2),third(:,3),'s');
scatter3(fourth(:,1),fourth(:,2),fourth(:,3),'o');
title('测试数据');legend('第1类','第2类','第3类','第4类');
function [label_test] = knn(k, data_train, label_train, data_test)


error(nargchk(4,4,nargin));
%计算出新的特征参数与表3中参数的距离
dist = l2_distance(data_train, data_test);
%对距离进行排序
[sorted_dist, nearest] = sort(dist);
%选出最近的特征
nearest = nearest(1:k,:);
%用最近的特征的故障类型,作为新的特征参数的故障类型
label_test = label_train(nearest);

;```

```clike
function d = l2_distance(X,Y)
% 计算出x,y之间的欧式距离
if (nargin < 2)
    [D N] = size(X);
    lengths = sum(X.^2,1);
    d = repmat(lengths,[N 1]) + repmat(lengths',[1 N]);
    d = d - 2* X'*X;
    
else 
    XX = sum(X.^2,1);
    YY = sum(Y.^2,1);
    d = repmat(XX', [1 size(Y,2)]) + repmat(YY, [size(X,2) 1]);
    d = d - 2*X'*Y;

end```

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值