欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模式识别 (一):Fisher线性判别

程序员文章站 2022-04-22 13:04:25
...
  •  
  • 问题描述

要求:在UCI数据集上的Iris和sonar数据上验证算法的有效性;Iris数据3类,4维,150个数据;Sonar数据2类,60维,208个样本;

训练和测试样本有三种方式进行划分:(三选一)

1)将数据随机分训练和测试,多次平均求结果

2)k折交叉验证

3)留1法

(针对不同维数,画出曲线图;)

仿真结果+报告。

  • 基本原理

 

 

模式识别 (一):Fisher线性判别

模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别

模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别

  • 实验结果
  1. sonar数据集(2类,60维)

                                                                           表2. sonar数据集实验结果

 

准确率

不拆分训练集

0.9135

留一法验证

0.7500

                            模式识别 (一):Fisher线性判别

图1展示了sonar数据集在投影矩阵上的投影结果。

图 1

 

  1. iris数据集(3类,4维)

表3. iris数据集实验结果

 

准确率

不拆分训练集

0.9800

留一法验证

0.9800

 

图2、图3、图4展示了iris数据集分别在三个投影矩阵上的投影结果。

模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别模式识别 (一):Fisher线性判别

 

                                  图 2                                                             图 3                                                        图 4     

 

  • 代码展示

4.1 fisher函数(输入为两个类的数据集,输出为投影向量和阈值)

function [w,w0] = fisher(class0,class1) 
dataset=[class0;class1];
 
r1 = size(class0,1); %返回r1的行数 
r2 = size(class1,1); 
a1 = mean(class0)'; %求均值 
a2 = mean(class1)'; 
 
s1 = cov(class0) * (r1 - 1); % 样本一类内离散度
s2 = cov(class1) * (r2 - 1); % 样本二类内离散度
sw = s1 + s2; % 总样本类内离散度
w = inv(sw) * (a1 - a2) ; % 变换向量
y1 = mean(w' * a1); 
y2 = mean(w' * a2);
w0 = (y1 + y2) / 2; % 阈值
end

4.2 iris数据集(不拆分数据集)

clc,clear
filename = 'Iris.csv';
dataset = csvread(filename);
 
X=dataset(:,1:end-1);
[n,p]=size(X);
Y=dataset(:,end);
class0=[];
class1=[];
class2=[];
for i=1:length(Y)
    if Y(i)==0
       class0=[class0;X(i,:)]; 
    end
    if Y(i)==1
       class1=[class1;X(i,:)]; 
    end
    if Y(i)==2
       class2=[class2;X(i,:)];
    end
end
[w0,w00]=fisher(class0,class1);
[w1,w01]=fisher(class1,class2);
[w2,w02]=fisher(class2,class0);
result0=w0'*X'-w00;
result1=w1'*X'-w01;
result2=w2'*X'-w02;
decision=zeros([1,length(X)]);
acc=[];
for i=1:length(X)
    if result0(i)>0 && result2(i)<0
        decision(i)=0;
    end
    if result1(i)>0 && result0(i)<0
        decision(i)=1;
    end
    if result2(i)>0 && result1(i)<0
        decision(i)=2;
    end
    acc(end+1)=Y(i)==decision(i);
end
result=[result0',result1',result2'];
mean(acc)
 
figure(1)
plot(result0(1:50),zeros([1,50]),'bo')
hold on
plot(result0(51:100),zeros([1,50]),'ro')
plot(result0(101:150),zeros([1,50]),'go')
hold off
figure(2)
plot(result1(1:50),zeros([1,50]),'bo')
hold on
plot(result1(51:100),zeros([1,50]),'ro')
plot(result1(101:150),zeros([1,50]),'go')
hold off
figure(3)
plot(result2(1:50),zeros([1,50]),'bo')
hold on
plot(result2(51:100),zeros([1,50]),'ro')
plot(result2(101:150),zeros([1,50]),'go')
hold off

4.3 iris数据集(留一法)

clc,clear
filename = 'iris.csv';
dataset_iris = csvread(filename);
acc_iris=[];
 
for k=1:length(dataset_iris)
    test_data=dataset_iris(k,1:end-1);
    test_label=dataset_iris(k,end);
    X=dataset_iris(:,1:end-1);
    Y=dataset_iris(:,end);
    X(k,:)=[];
    Y(k,:)=[];
    % 两组训练数据
    class0=[];
    class1=[];
    class2=[];
    for i=1:length(Y)
        if Y(i)==0
           class0=[class0;X(i,:)]; 
        end
        if Y(i)==1
           class1=[class1;X(i,:)]; 
        end    
        if Y(i)==2
           class2=[class2;X(i,:)]; 
        end  
    end
 
    [w0,w00]=fisher(class0,class1);
    [w1,w01]=fisher(class1,class2);
    [w2,w02]=fisher(class2,class0);
    result0=w0'*test_data'-w00;
    result1=w1'*test_data'-w01;
    result2=w2'*test_data'-w02;
 
%     验证测试数据
    if result0>0 && result2<0
        decision=0;
    end
    if result1>0 && result0<0
        decision=1;
    end
    if result2>0 && result1<0
        decision=2;
    end
 
    acc_iris(end+1)=decision==test_label;
end
mean(acc_iris)

4.4 sonar数据集(不拆分数据集)

clc,clear
filename = 'sonar.csv';
dataset = csvread(filename);
 
X=dataset(:,1:end-1);
[n,p]=size(X);
Y=dataset(:,end);
class0=[];
class1=[];
for i=1:length(Y)
    if Y(i)==0
       class0=[class0;X(i,:)]; 
    end
    if Y(i)==1
       class1=[class1;X(i,:)]; 
    end    
end
 
[w,w0]=fisher(class0,class1);
 
result=w'*X'-w0;
Y_=[];
acc=[];
for i=1:length(result)
    if result(i)>0 
        Y_(end+1)=0;
    else
        Y_(end+1)=1;
    end
    acc(end+1)=Y(i)==Y_(i);
end
mean(acc)
plot(result(1:110),zeros([1,length(result(1:110))]),'bo')
hold on
plot(result(111:end),zeros([1,length(result(111:end))]),'ro')
plot([0,0],[-0.5,0.5],'k-')
hold off

 4.5 sonar数据集(留一法)

clc,clear
filename = 'sonar.csv';
dataset_sonar = csvread(filename);
acc_sonar=[];
 
for k=1:length(dataset_sonar)
    test_data=dataset_sonar(k,1:end-1);
    test_label=dataset_sonar(k,end);
    X=dataset_sonar(:,1:end-1);
    [n,p]=size(X);
    Y=dataset_sonar(:,end);
    X(k,:)=[];
    Y(k,:)=[];
    % 两组训练数据
    class0=[];
    class1=[];
    for i=1:length(Y)
        if Y(i)==0
           class0=[class0;X(i,:)]; 
        end
        if Y(i)==1
           class1=[class1;X(i,:)]; 
        end    
    end
 
    [w,y0]=fisher(class0,class1);
 
    %     验证测试数据
    if w'*test_data'-y0>0
        test_result=0;
    else
        test_result=1;
    end
    acc_sonar(end+1)=test_result==test_label;
end
mean(acc_sonar)

 

 

 

相关标签: 大作业