模式识别 (一):Fisher线性判别
程序员文章站
2022-04-22 13:04:25
...
- 问题描述
要求:在UCI数据集上的Iris和sonar数据上验证算法的有效性;Iris数据3类,4维,150个数据;Sonar数据2类,60维,208个样本;
训练和测试样本有三种方式进行划分:(三选一)
1)将数据随机分训练和测试,多次平均求结果
2)k折交叉验证
3)留1法
(针对不同维数,画出曲线图;)
仿真结果+报告。
- 基本原理
- 实验结果
- sonar数据集(2类,60维)
表2. sonar数据集上实验结果
|
准确率 |
不拆分训练集 |
0.9135 |
留一法验证 |
0.7500 |
图1展示了sonar数据集在投影矩阵上的投影结果。
图 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)