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

  •  
  • 问题描述

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

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

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

2)k折交叉验证

3)留1法

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

仿真结果+报告。

  • 基本原理

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

                                                                           表2. sonar数据集实验结果

 

准确率

不拆分训练集

0.9135

留一法验证

0.7500

                            

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

图 1

 

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

表3. iris数据集实验结果

 

准确率

不拆分训练集

0.9800

留一法验证

0.9800

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

                                  图 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)

猜你喜欢

转载自blog.csdn.net/shunzi1013238638/article/details/107551334