gusucode.com > ​用mushrooms数据对模式识别课程讲述的各种模式分类方法matlab源码程序 > pattern-recognition-simulation/KNN1.m

    clc;
clear;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%读取数据,取16个特征
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
samples = textread('data2000.txt');
samples = samples(:,[1:6,9:15,19:22]);  %17列 第1列标号,16列特征

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对样本进行归一化处理
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[ms ns]=size(samples);
TMax=max(samples);
TMin=min(samples);
% 第一列是样本标签,从第二列开始归一化
for i=2:ns
    samples(:,i)=(samples(:,i)-TMin(i))/(TMax(i)-TMin(i));
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%将样本分为测试样本,第一类训练样本,第二类训练样本
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p = randperm(2000);%对1:2000的整数随机排序
experiment_test=samples(p(1:500),:);%测试样本
exper_test=experiment_test(:,2:ns);%测试样本,不带标签
experiment_train=samples(p(501:2000),:);%训练样本
index1=find(experiment_train(:,1)==1);%找到训练样本中第一类的行号
index2=find(experiment_train(:,1)==2);%找到训练样本中第二类的行号
exper_train_class1=experiment_train(index1,2:ns);%训练样本里属于第一类的样本,不带标签
exper_train_class2=experiment_train(index2,2:ns);%训练样本里属于第二类的样本,不带标签

[m n]=size(exper_test);
[m1 n1]=size(exper_train_class1);
[m2 n2]=size(exper_train_class2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算类条件概率密度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%设定参数
k1=3;k2=4;
d=16;
Cd=pi()^(d/2)/gamma(d/2+1);
V1=zeros(m,1);
V2=zeros(m,1);
R1=zeros(m,1);%记录待测样本在第一类的测试结果
R2=zeros(m,1);%记录待测样本在第二类的测试结果
Result=zeros(m,1);%记录最后分类结果
Radius1=zeros(m,m1);%记录每个待测样本到Y中每个训练样本的距离,欧氏距离的平方
Radius2=zeros(m,m2);
%处理第一类
for i=1:m%对experiment_test的每一行
    for j=1:m1
        for k=1:n1
            Radius1(i,j)=Radius1(i,j)+(exper_test(i,k)-exper_train_class1(j,k))^2;
        end
    end
end
for i=1:m
    temp=Radius1(i,:);
    temp=sort(temp);
    V1(i)=temp(3);
end
R1=k1./(m1*Cd*V1.^(d/2));
%处理第二类
for i=1:m%对experiment_test的每一行
    for j=1:m2
        for k=1:n2
            Radius2(i,j)=Radius2(i,j)+(exper_test(i,k)-exper_train_class2(j,k))^2;
        end
    end
end
for i=1:m
    temp=Radius2(i,:);
    temp=sort(temp);
    V2(i)=temp(4);
end
R2=k2./(m2*Cd*V2.^(d/2));

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%画类条件概率密度图,并分类
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%绘图
plot(R1,'-r','LineWidth',2);
hold on;
plot(R2,'-b','LineWidth',2);
xlabel ('待测样本'); 
ylabel ('类条件概率密度 P(x|wi)');
title ('类条件概率密度图');
%分类
for i=1:m
    if R1(i)*0.518>=R2(i)*0.482
        Result(i,1)=1;
    else
        Result(i,1)=2;
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%分析结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[correct,error,ROC] = analyse_result(experiment_test,Result);