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```