目录

  • LDA概念
  • 线性判别分析(LDA)-二分类
    • LDA二分类过程
    • 举个例子
  • 线性判别分析-多分类
    • LDA多分类过程
  • Experiment 3: Linear Discriminant Analysis
    • LDA二分类讲解
    • LDA二分类代码
    • LDA多分类讲解
    • LDA多分类代码

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二分类过程

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

举个例子

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

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


第一个类别的协方差矩阵

第二个类别的协方差矩阵

类内散度矩阵

类间散度矩阵

计算特征值

最优投影就是最小化的投影

归一化

线性判别分析-多分类

多分类与二分类不同的是类间散度矩阵和类内散度矩阵计算公式不同。其余根据概念计算即可。

LDA多分类过程

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:s1y0=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:s2y0=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:s1y0=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:s2y0=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:s3y0=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');

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

  1. Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码

    前言 Pandas常用作数据分析工具库以及利用其自带的DataFrame数据类型做一些灵活的数据转换.计算.运算等复杂操作,但都是建立在我们获取数据源的数据之后.因此作为读取数据源信息的接口函数必然拥 ...

  2. 主成分分析,PCA(Principle Component Analysis)详解 ,结合matlab

    https://my.oschina.net/gujianhan/blog/225241 一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用 ...

  3. HiveSQL分位数函数percentile()使用详解+实例代码

    目录 前言 一.percentile() 二.percentile_approx() 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 作为数据分析师每个SQL数据库的函数以及使用技能操作都得 ...

  4. Python正则表达式一文详解+实例代码展示

    目录 前言 一.正则表达式 1.简介 2.概念 3.目的 4.特点 二.Re库 1.re.match() ?2.fullmatch() ?3.search() 4.?sub() ?5.subn() 6 ...

  5. Pandas中read_excel函数参数使用详解+实例代码

    目录 前言 一.数据展示 1.io 2.sheet_name 3.header 4.names 5.index_col 6.usecols 7.squeeze 8.dtype 9.engine 10. ...

  6. nn.Linear()函数详解及代码使用

    这是官方给出的文档,需要注意的是,虽然在神经网络中,我们一般输入都是二维的tensor矩阵(batch,input_size),但其实输入的维度是不做限制的.如果是三维的输入,会将前两维的数据先乘一起 ...

  7. Bellman-Ford算法图解及手算过程详解 —— C++代码实现

    0. <算法导论>讲解 1. 图24-4 手算过程 2. 代码实现(自己根据算法导论伪代码实现的代码,有错请指出,谢谢) #include<iostream> #include ...

  8. 一文速学(二十一)-数据分析之Pandas快速图表可视化各类操作详解+实例代码(三)

    目录 前言 一.六边形箱图 二.饼图 三.缺失数据绘制处理

  9. 【线索二叉树】C++代码及线索化过程详解

    文章目录 线索二叉树的概念 中序线索二叉树的构造 中序线索二叉树的遍历 过程详解版代码 纯享版代码 我在这里不仅写了线索二叉树的普通代码,在代码中我还加入了线索化过程的打印,更好的帮助理解! 线索二叉 ...

最新文章

  1. dm9000 driver 1
  2. windows Hyper-V Server 2012创建脚本运行环境
  3. JavaFX 8的弹出式编辑器
  4. mac下安装mysql-pyhon_mac下安装MySQL-python模块
  5. 计算机网络-UDP和TCP套接字编程
  6. 【POJ1804】Brainman 【求逆序数】
  7. 第1章 Linux内核概述
  8. 手指滑动控制系统全局音量的程序(上)
  9. 从零开始学OpenCV(一)——OpenCV的安装
  10. omv安装mysql插件_Openmediavault第三方插件安装教程
  11. linux 使用team实现双网卡绑定单个IP
  12. SpringMVC注解@valid与@validata,@null,@notblank,@NotEmpty
  13. c#控制台模拟dos_超好用的C#控制台应用模板
  14. iOS 15提示“此App的开发者需要更新APP以在此IOS版本上正常工作”
  15. pytorch框架--简单模型预测
  16. 双开助手多开分身版 v5.1.8
  17. 速度收藏!史上最全Spring 面试题 92 问!【附答案】高清PDF下载
  18. 什么是指令重排序?为什么要重排序?
  19. 【论文】低光图像增强的零参考深度曲线估计
  20. 家用无盘服务器打游戏,开20台的电竞网咖酒店,无盘服务器用千兆网卡够用吗?...

热门文章

  1. 【STC单片机学习】第五课:动手写代码之前必须的准备工作
  2. 西北大学Latex学位论文模板
  3. 原生微信小程序实现号码隐藏,用****代替
  4. 反编译“微软纸牌集合”资源文件
  5. sed命令删除行操作
  6. MCMC蒙特卡洛马尔可夫过程
  7. STM32全链路开发实战教程专栏总目录(2022.10.19更新)
  8. 详细解读微信内置浏览器不支持下载APK(APP)软件的解决方法
  9. C语言中 *x++ (*x)++ ++*x *++x的区别
  10. NRF52832学习笔记(39)——设备信息服务(DIS)