编程实现线性判别分析,并给出西瓜数据3.0a上的结果。
首先分类知道编号(1-8)为一类,编号(9-17)为另一类
计算
u
1
=
[
0.691
+
0.774
+
.
.
.
+
0.437
8
;
0.460
+
0.376
+
.
.
.
+
0.211
8
]
u_1=[\frac{0.691+0.774+...+0.437}{8} ;\frac{0.460+0.376+...+0.211}{8}]
u1=[80.691+0.774+...+0.437;80.460+0.376+...+0.211]
u
0
=
[
0.666
+
0.243
+
.
.
.
+
0.719
9
;
0.091
+
0.267
+
.
.
.
+
0.103
9
]
u_0=[\frac{0.666+0.243+...+0.719}{9} ;\frac{0.091+0.267+...+0.103}{9}]
u0=[90.666+0.243+...+0.719;90.091+0.267+...+0.103]
计算出类内散度矩阵
S
w
S_w
Sw
由公式 w = S w − 1 ∗ ( u 0 − u 1 ) w=S_w^{-1}*(u_0-u_1) w=Sw−1∗(u0−u1)得系数
matlab程序实现如下:
clear;clc
tic
%初始数据集
x=[0.697 0.460
0.774 0.376
0.634 0.264
0.608 0.318
0.556 0.215
0.403 0.237
0.481 0.149
0.437 0.211
0.666 0.091
0.243 0.267
0.245 0.057
0.343 0.099
0.639 0.161
0.657 0.198
0.360 0.370
0.593 0.042
0.719 0.103]';
y=[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0];
%%线性判别分析
%前期数据处理
k_1=sum(y==1); %获取真例的个数
k_0=sum(y==0); %获取假例的个数
X1=x(:,1:k_1); %获取真例的数据
X0=x(:,(k_1+1):end); %获取假例的数据
u1=mean(X1,2); %计算真例的均值向量
u0=mean(X0,2); %计算假例的均值向量
k=size(x,1); %获取x的维数
M_1=zeros(k,k);
for i=1:k_1
M_1=M_1+(X1(:,i)-u1)*(X1(:,i)-u1)';
end
M_0=zeros(k,k);
for i=1:k_0
M_0=M_0+(X0(:,i)-u0)*(X0(:,i)-u0)';
end
S_w=M_1+M_0; %类内散度矩阵
w=inv(S_w)*(u0-u1)