⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distance_ma_nor.m

📁 用matlab实现的几种模式识别的方法
💻 M
字号:
function distance_ma_nor(filename,train_num,chara_num)
Temp_Data=xlsread(filename);

%好,在Temp_Data里,第一列是样品的类别,第2列到第11列是样品的特征,也就是说,一个样品用10个特征来描述。
%因此,我们要从Temp_Data里读出第2列到第11列的数据,并把它保存在另一个矩阵Cork_Data里.Cork_Data的大小是150行10列.
%这个命令也由你们来写.提示:Cork_Data其实是Temp_Data的所有行,第2到第11列.
Cork_Data = Temp_Data(:,2:(chara_num+1));

%好的.现在开始训练了.我们的方法是从第一类的50个样品中取出前20个,然后把这20个样品的特征平均一下,得到一个模板,这个模板就是优等品的标准模板.
Template=zeros(3,chara_num);    %这句话的意思是初始化三个标准模板,因为每个模板有10个特征,所以模板的大小是3*10
for ii = 1:3
    Temp = Cork_Data(1+(ii-1)*20:train_num+(ii-1)*20,:);    %这个命令的意思就是取每一类的前20个样品.
    Template(ii,:) = mean(Temp);  %这个命令其实有两个功能,一是计算前20行的平均值(也就是优等品的标准模板),另一个是把优等品的模板存在Template的第一行中.
end

C=zeros(chara_num,chara_num,3);
%计算第一类的协方差矩阵
for ii =1:3
    Temp = Cork_Data(1+(ii-1)*20:train_num+(ii-1)*20,:); 
    for jj =1:chara_num
        for ll=1:jj
            Temp_Sum = 0;
            for k=1:train_num
                xx=Temp(k,:);
                Temp_Sum = Temp_Sum +(xx(1,jj)-Template(ii,jj))*(xx(1,ll)-Template(ii,ll));
            end
            C(jj,ll,ii)=Temp_Sum/19;
            C(ll,jj,ii)=Temp_Sum/19;
        end
    end
    C1(:,:,ii)=inv(C(:,:,ii));
end

Test_Data = Cork_Data([(train_num+1:50),(train_num+1+50):100,(train_num+1+100):150],:);
%生成测试集的类别库,也就是说,这里保存的是每个样品的真实类别
Test_Class = Temp_Data([(train_num+1:50),(train_num+1+50):100,(train_num+1+100):150],1);
%参考第36页公式(2-19)
CorrectNum = 0;  %初始化记录判断正确的计数器
test_num=(150-3*train_num);
for ii = 1:test_num
    Sum =zeros(3,1);   %因为有累加的过程,所以先初始化记录累加和的变量
    Sample = Test_Data(ii,:);    %Sample代表当前待测目标,取第21个样品的特征
    for jj=1:3
        Sum(jj,1)=(Sample-Template(jj,:))*C1(:,:,jj)*(Sample-Template(jj,:))';    %矩阵是可以对分别进行计算的,所以一次性就能得到对应的结果.MATLAB认大小写,所以Sum和sum是两码事.
    end
    %Sum是三行一列,我们来比较哪个数小,并得到最小那个数的索引号.
    [Result,I] = min(Sum);  %Result是最小的那个数,我们其实是用不到的,就看I,它表示是哪个数是小.
    if I==Test_Class(ii,1)    %Temp_Data(21,1)表示第21个样品的真实类别,如果二者相等,表明计算机判断正确.
        CorrectNum = CorrectNum + 1;
    end
end
disp('用马氏距离法的识别率:');
CorrectNum/test_num
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -