天天看点

模式识别 (二)近邻法

模式识别 (二)近邻法
模式识别 (二)近邻法
模式识别 (二)近邻法

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)