机器学习:Linear Discriminant Analysis(过程详解+实例代码MATLAB实现

LDA概念

线性判别分析(Linear Discriminant Analysis)是一种有监督学习的降维方法,用于找到分隔两个或多个对象类的特征的线性组合。

也就是给定有标签的数据集,利用LDA实现一个较好的分类。谈及分类,那么就说一说特征提取: 特征提取(维数约简/特征约简)是指将原始高维数据映射到低维空间。而LDA就是给定数据集,将训练样本投影到一条直线上。使得类间距离最大化,同时使得类内距离最小化。

线性判别分析(LDA)-二分类

给定两个类中的一组点(2-d),我们希望将它们投影到一条可以很好地分离它们的行。

在这里插入图片描述

• 最大化类间距离Maximize the between-class distance (means)
• 最小化类内距离Minimize the within-class variability (scatter)
若只考虑如上第一个标准,仍然无法得到一个好的效果。如左图。使用以上两个标准,我们就能得到如下图右边这样的效果。

在这里插入图片描述
那么我们具体怎样计算出那条投影直线呢?

假设我们有一个d维的样本集,{x1,x2,x3,···,xd},C1有n1个样本点,C2有n2个样本点,那么我们求一个转换,将d维投影到一条线上,实现降维。那么它的公式如下。

在这里插入图片描述
θ代表将x投影到y的投影向量

那么我们又怎么计算类内距离和类间距离呢?

首先计算每个类的均值:在这里插入图片描述
使得投影间距离最大化:
在这里插入图片描述
计算类间散度矩阵:
在这里插入图片描述
计算类内散度矩阵:
在这里插入图片描述
最小化投影
在这里插入图片描述

LDA二分类过程

figure

1.从训练集中构造样本 X 1 X_1 X1和有样本 X 2 X_2 X2。即分为2类,分别取两个类别的样本。
2.计算每个类别的样本均值 μ 1 \mu_1 μ1 μ 2 \mu_2 μ2
3.计算类内散度矩阵
4.计算类内散度矩阵的逆。(矩阵的逆 A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I AA1=A1A=I I I I是单位矩阵)
5.计算 θ ∗ = S w − 1 ( μ 1 − μ 2 ) \theta^*=S^{-1}_w(\mu_1-\mu_2) θ=Sw1(μ1μ2),这里的 θ ∗ \theta^* θ是投影向量。
6.给出一个测试函数。(就是实际的用于分类的目标函数): y = θ ∗ T x y=\theta^{*T}x y=θTx,因为是二分类,所以y∈{-1,1}
7.计算阈值 γ \gamma γ
8.比较阈值γ和y,确定测试点的类别。若 y < γ y<\gamma y<γ,为负类,类别号为-1,反之则为1。
9.注意,LDA是用来降维的!不是用来分类的。

举个例子

计算下列二维数据集的线性判别投影。

在这里插入图片描述

由上图,这是一个二分类问题,我们分别计算出每一类的均值。

在这里插入图片描述
第一个类别的协方差矩阵
在这里插入图片描述
第二个类别的协方差矩阵
在这里插入图片描述

类内散度矩阵

在这里插入图片描述

类间散度矩阵

在这里插入图片描述

计算特征值

在这里插入图片描述

最优投影就是最小化的投影
在这里插入图片描述
归一化

在这里插入图片描述

线性判别分析-多分类

多分类与二分类不同的是类间散度矩阵和类内散度矩阵计算公式不同。其余根据概念计算即可。
在这里插入图片描述

在这里插入图片描述

LDA多分类过程

figure

Experiment 3: Linear Discriminant Analysis

LDA二分类讲解

1. 数据加载
下载数据 exe3Data.zip 并解压。在 exe3red、exe3green、exe3blue 中分别有 14 行红色 的点,14 行绿色的点和 14 行蓝色的点。用该数据来实现 LDA 算法。
2. LDA 的实现过程
a.两个类别的 LDA 你必须根据课堂上正确的原则自己实现 LDA。不允许直接使用 Matlab 提供的可用 LDA 代码, 这些代码可用于检查结果。 在本节中,需要实现两个类的 LDA。这里我们选择对两个类使用红色和蓝色的点。你应该加 载数据到你的矩阵和绘图:
在这里插入图片描述
b.成功完成代码后,LDA 结果应该如下所示:
在这里插入图片描述
c.投影点绘制
在这里插入图片描述

LDA二分类代码

%upload data
x1=load('ex3red.dat');
x2=load('ex3blue.dat');
x3=load('ex3green.dat');
figure %first
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
xlabel('x');
ylabel('y');
xlim([0.00 10.00])
ylim([0.00 10.00])
m1=mean(x1);%compute mean value
m2=mean(x2);
%LDA for 2-class
Sb=(m1-m2)'*(m1-m2);%compute Between-class scatter
Sw=(x1-m1)'*(x1-m1)+(x2-m2)'*(x2-m2);%compute Within-class scatter
[V,L]=eig(inv(Sw)*Sb);
[a,b]=max(max(L));
theta = Sw\(m1-m2)';%left
disp(theta)
figure % second
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
x=linspace(0,10,100);
y=(theta(2)/theta(1))*x;
plot(x,y,'black')
title('LDA for two-classes')
xlabel('x')
ylabel('y')
%compute the projection
k=theta(2)/theta(1);
s1=size(x1,1);
s2=size(x2,1);
x1_tag=[];
x2_tag=[];
for i=1:s1
    y0=x1(i,2);
    x0=x1(i,1);
    xn=(k*(y0-b)+x0)/(k^2+1);
    x1_tag=[x1_tag;xn];
end
y1_tag=k*x1_tag + b;
x1_final=[x1_tag y1_tag];
for i=1:s2
    y0=x2(i,2);
    x0=x2(i,1);
    xn=(k*(y0-b)+x0)/(k^2+1);
    x2_tag=[x2_tag;xn];
end
y2_tag=k*x2_tag + b;
x2_final=[x2_tag y2_tag];
figure%third
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
x=linspace(0,10,100);
y=(theta(2)/theta(1))*x + b;
plot(x,y,'black')
title('LDA for two-classes')
xlabel('x')
ylabel('y')
plot(x1_final(:,1),x1_final(:,2),'ro','markerfacecolor','r');
plot(x2_final(:,1),x2_final(:,2),'bo','markerfacecolor','b');

LDA多分类讲解

LDA 可以用于多分类实现,这部分,对于 LDA 实现的 N 分类,不妨取 N=3,将所有的红、蓝、 绿点加载到矩阵中并绘制它们。实际上,对于 N 个类实现 LDA 比较困难。完成代码后,看看 结果有多令人满意。
** a. 加载数据集并绘制散点图:**
在这里插入图片描述

b. 计算类内散度矩阵和类间散度矩阵。绘制直线
在这里插入图片描述
c.投影。
在这里插入图片描述

LDA多分类代码

%upload data
x1=load('ex3red.dat');
x2=load('ex3blue.dat');
x3=load('ex3green.dat');
figure%figure 1
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlabel('x');
ylabel('y');
title('scatter diagram of 3-classes');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
hold off
m1=mean(x1);%compute mean value
m2=mean(x2);
m3=mean(x3);
m=mean([x1;x2;x3]);
%LDA for 3-class
Sb=((m1-m)'*(m1-m)+(m2-m)'*(m2-m)+(m3-m)'*(m3-m))/3;%compute Between-class scatter
Sw=((x1-m1)'*(x1-m1)+(x2-m2)'*(x2-m2)+(x3-m3)'*(x3-m3))/3;%compute Within-class scatter
%LDA for N class where N=3
[V,L]=eig(inv(Sw)*Sb);
[a,b]=max(max(L));% The eigenvector corresponds to the largest eigenvalue.
theta = V(:,b);
k=theta(2)/theta(1);%calculate the slope
figure%figure 2
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
xlabel('x');
ylabel('y');
x=linspace(0,10,100);
y=k*x+b;
plot(x,y,'black')
title('LDA for 3-classes')
xlabel('x')
ylabel('y')
hold off
s1=size(x1,1);
s2=size(x2,1);
s3=size(x3,1);
x1_tag=[];
x2_tag=[];
x3_tag=[];
for i=1:s1
    y0=x1(i,2);
    x0=x1(i,1);
    xn=(k*(y0-b)+x0)/(k^2+1);
    x1_tag=[x1_tag;xn];
end
y1_tag=k*x1_tag + b;
x1_final=[x1_tag y1_tag];
for i=1:s2
    y0=x2(i,2);
    x0=x2(i,1);
    xn=(k*(y0-b)+x0)/(k^2+1);
    x2_tag=[x2_tag;xn];
end
y2_tag=k*x2_tag + b;
x2_final=[x2_tag y2_tag];
for i=1:s3
    y0=x3(i,2);
    x0=x3(i,1);
    xn=(k*(y0-b)+x0)/(k^2+1);
    x3_tag=[x3_tag;xn];
end
y3_tag=k*x3_tag+b;
x3_final=[x3_tag y3_tag];
figure%third
hold on
plot(x1(:,1),x1(:,2),'ro','markerfacecolor','r');
plot(x2(:,1),x2(:,2),'b*','markerfacecolor','b');
plot(x3(:,1),x3(:,2),'gs','markerfacecolor','g');
xlim([0.00 10.00]);
ylim([0.00 10.00]);
x=linspace(0,10,100);
y=k*x+b;
plot(x,y,'black')
title('LDA for 3-classes')
xlabel('x')
ylabel('y')
plot(x1_final(:,1),x1_final(:,2),'ro','markerfacecolor','r');
plot(x2_final(:,1),x2_final(:,2),'bo','markerfacecolor','b');
plot(x3_final(:,1),x3_final(:,2),'go','markerfacecolor','g');
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值