【机器学习】西瓜书_周志华,MATLAB编程实现线性判别分析,给出西瓜数据集3.0a上的结果。

参考博客:https://blog.csdn.net/qq_20406597/article/details/80166589

MATLAB编程实现线性判别分析,给出西瓜数据集3.0a上的结果。

1.线性判别分析理论

  • LDA(Linear Discriminant Analysis)的思想非常朴素:找出一条支线,使同类的样本在直线上的投影点尽可能近,异类的样本在直线上的投影点尽可能远。
  • 涉及的公式:
    1. 类内散度矩阵:
      类内散度矩阵计算
      类内散度矩阵计算
      其中,μi为第i类样本的均值。
    2. 类间散度矩阵:
      类间散度矩阵
      其中,mi为第i类样本的数量,μ为全部样本的均值。
    3. 求最大广义特征值所对应的特征向量
      广义特征值
      广义特征值
      求出W中的最大特征向量,就可以确定直线的方向k,再利用y=kx+b基本公式,即可求出二维的直线方程。
    4. 点到直线的投影
      在这里插入图片描述
      注: 这里打草稿的时候默认b等于0了吼。。(因为b只影响直线的上下位移,不影响投影情况,所以可以直接把b看作0方便计算)。

2.Matlab代码实现

X = load('data.txt');
True_number = find(X(:,3)==1);
False_number = find(X(:,3)==0);
X1 = X(True_number,1:2);
X0 = X(False_number,1:2);
hold on;
plot(X1(:,1),X1(:,2),'r+','markerfacecolor',[1,0,0]);
plot(X0(:,1),X0(:,2),'b*','markerfacecolor',[0,0,1]);
grid on;

%%%%求均值
M1 = mean(X1);
M0 = mean(X0);
M = mean([X1;X0]);

%%%%将需要的数据化为对应的矩阵形式,方便后续计算
p = size(X1,1);
q = size(X0,1);
M1_p = repmat(M1,p,1);
M0_q = repmat(M0,q,1);
M_p = repmat(M,p,1);
M_q = repmat(M,q,1);

%%%%计算类内散度矩阵
Sw1 = (X1-M1_p)'*(X1-M1_p);
Sw0 = (X0-M0_q)'*(X0-M0_q);
Sw = Sw1+Sw0;

%%%%计算类间散度矩阵
Sb1 = p*(M1_p-M_p)'*(M1_p-M_p);
Sb0 = q*(M0_q-M_q)'*(M0_q-M_q);
Sb = Sb1+Sb0;

%%%%求出最大特征值对应的最大特征向量
[vector,eigen] = eig(inv(Sw)*Sb);
[a,b] = max(max(eigen));
max_vector = vector(:,b);

%%%%求出直线方程
k = max_vector(2)/max_vector(1);
b = 0;
x = 0:1;
y = k*x + b;
hold on;
plot(x,y);

%%%%计算两类样本在直线上的投影
points1=zeros(p,2);
for i=1:p
    x1 = (X1(i,1)+k*X1(i,2))/(k^2+1);
    y1 = k*x1+b;
    points1(i,1)=x1;
    points1(i,2)=y1;
end 

points0=zeros(q,2);
for i=1:q
    x0 = (X0(i,1)+k*X0(i,2))/(k^2+1);
    y0 = k*x0+b;
    points0(i,1)=x0;
    points0(i,2)=y0;
end 
hold on;
plot(points1(:,1),points1(:,2),'r+','markerfacecolor',[1,0,0]);
plot(points0(:,1),points0(:,2),'b*','markerfacecolor',[0,0,1]);

3. 绘制结果

在这里插入图片描述

附:data.txt

0.697 0.460 1
0.774 0.376 1
0.634 0.264 1
0.608 0.318 1
0.556 0.215 1
0.403 0.237 1
0.481 0.149 1
0.437 0.211 1
0.666 0.091 0
0.243 0.267 0
0.245 0.057 0
0.343 0.099 0
0.639 0.161 0
0.657 0.198 0
0.360 0.370 0
0.593 0.042 0
0.719 0.103 0

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值