MATLAB核心代码展示
KNN.m文件
function [acc]=KNN(dataset)
m=0.8; % 设置训练样本占总样本的比重
k = 5;
n=size(dataset,1);
r=randperm(n); %生成关于行数的随机排列行数序列
dataset=dataset(r, :); %根据这个序列进行重新排序
% 分为训练数据和测试数据
train_data = dataset(1:round(m*n),:);
test_data = dataset(round(m*n):end,:);
n1 = size(test_data,1);
identity = zeros([1,n1]);
for i=1:n1
k_d = ones([1,k])*10000; % 寻找K个最短距离
k_class=zeros([1,k]); % 分别对应K个标签
for j=1:size(train_data,1)
d = Euclidean(test_data(i,1:end-1),train_data(j,1:end-1));
[maxval,maxindex] = max(k_d);
if maxval > d
k_d(maxindex) = d;
k_class(maxindex) = train_data(j,end);
end
end
identity(i) = mode(k_class); % 找众数
end
acc=zeros([1,n1]);
for i=1:n1
acc(i) = identity(i) == test_data(i,end);
end
mean(acc);
end
PCA_.m文件
function [A V] = PCA_( A, k )
[r c] = size(A);
% 样本均值
meanVec = mean(A);
% 计算协方差矩阵的转置 covMatT
Z = (A-repmat(meanVec, r, 1));
covMatT = Z * Z';
% 计算 covMatT 的前 k 个本征值和本征向量
[V D] = eigs(covMatT, k);
% 得到协方差矩阵 (covMatT)' 的本征向量
V = Z' * V;
% 本征向量归一化为单位本征向量
for i=1:k
V(:,i)=V(:,i)/norm(V(:,i));
end
% 线性变换(投影)降维至 k 维
A = Z * V;
% 保存变换矩阵 V 和变换原点 meanVec
end
Euclidean.m文件
function [out] = Euclidean(x1,x2)
result=0;
for i=1:length(x1)
result=result+(x1(i)-x2(i))^2;
end
out=result^0.5;
end
Run.m文件
clc,clear
n=5;
% 导入usps数据
load usps.mat;
Xte=full(Xte);
Xtr=full(Xtr);
dataset_usps=[[Xte,Yte];[Xtr,Ytr]];
% 导入sonar数据
filename = 'sonar.csv';
dataset_sonar = csvread(filename);
% 导入iris数据
filename = 'iris.csv';
dataset_iris = csvread(filename);
result=zeros([n,3]);
for i=1:n
result(i,1)=mean(KNN(dataset_iris));
result(i,2)=mean(KNN(dataset_sonar));
result(i,3)=mean(KNN(dataset_usps));
end
mean(result)
usps_fisher=PCA_(dataset_usps(:,1:end-1),1);
usps_fisher=[usps_fisher,dataset_usps(:,end)];
sonar_fisher=PCA_(dataset_sonar(:,1:end-1),1);
sonar_fisher=[sonar_fisher,dataset_sonar(:,end)];
iris_fisher=PCA_(dataset_iris(:,1:end-1),1);
iris_fisher=[iris_fisher,dataset_iris(:,end)];
for i=1:n
result(i,1)=mean(KNN(usps_fisher));
result(i,2)=mean(KNN(sonar_fisher));
result(i,3)=mean(KNN(iris_fisher));
end
result
mean(result)