LDA(线性判别分析(普通法))详解 —— python

        在这里和大家道个歉,因为我有一篇matlab的LDA和这篇内容大致相同,我就犯懒了,直接复制,没想到公式复制过来全变成了图片,然后造成了,排版有问题,非常难看,真的很抱歉!!!以后大家督促哈,我再犯懒记得call我哦,我及时改正,谢谢!!

目录

前言

正题

1.LDA的思想

2. 瑞利商(Rayleigh quotient)与广义瑞利商(genralized Rayleigh quotient) 

3. 二类LDA原理

4.多类LDA原理

5.LDA分类

6.LDA算法流程

二类LDApython举例:

1.首先看一下所需库

2.读取数据

3.定义x,y和x0,x1

4.定义LDA函数

5.分离训练集和测试集

6.得到降维后的数据

7.分类


前言

        在主成分和因子分析中,我们对降维算法做了总结。这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结。LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用,因此我们有必要了解下它的算法原理。

    在学习LDA之前,有必要将其自然语言处理领域的LDA区别开来,在自然语言处理领域, LDA是隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA),他是一种处理文档的主题模型。我们本文只讨论线性判别分析,因此后面所有的LDA均指线性判别分析。

在做具体解释之前,请允许我放上我之前的一些链接:

主成分分析 —— matlab :传送门

主成分分析 —— python :传送门

因子分析 —— matlab :传送门

因子分析 —— python :传送门

正题

1.LDA的思想

        线性判别分析((Linear Discriminant Analysis ,简称 LDA)是一种经典的线性学习方法,在二分类问题上因为最早由 [Fisher,1936] 提出,亦称 ”Fisher 判别分析“。并且LDA也是一种监督学习的降维技术,也就是说它的数据集的每个样本都有类别输出。这点与主成分和因子分析不同,因为它们是不考虑样本类别的无监督降维技术。

        LDA 的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同样样例的投影尽可能接近、异样样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。其实可以用一句话概括:就是“投影后类内方差最小,类间方差最大”。

图为 LDA的二维示意图。”+“,”-“分别代表正侧和反侧,椭圆表示数据簇的外轮廓,虚线表示投影,红色实心圆和实心三角形分别表示两类样本投影后的中心点。

2. 瑞利商(Rayleigh quotient)与广义瑞利商(genralized Rayleigh quotient) 

        我们先来看一下瑞丽商的定义。

        瑞丽商是指这样的函数R(A,x):

R(A,x) = \frac{x^HAx}{x^Hx}

        其中x为非零向量,而A为 n*n 的Hermitan矩阵。所谓的Hermitan矩阵就是满足共轭转置矩阵和自己相等的矩阵,即A^{H}=A . 如果我们的矩阵A是实矩阵,则满足A^{T}=A的矩阵即为Hermitan矩阵。

        瑞利商R(A,x)有一个非常重要的性质,即它的最大值等于矩阵A最大的特征值,而最小值等于矩阵A的最小的特征值,也就是满足

\lambda_{min} \leq \frac{x^HAx}{x^Hx} \leq \lambda_{max}

        至于证明过程就不在这里介绍了。当向量x是标准正交基时,即满足x^{H}x=1时,瑞利商退化为:R(A,x)=x^{H}Ax,这个形式在谱聚类和PCA中都有出现。

以上就是瑞丽商的内容。

        下面我们再来介绍一下广义的瑞丽商,

        广义的瑞丽商是指这样的函数 R(A,B,x) :

R(A,x) = \frac{x^HAx}{x^HBx}

        其中x为非零向量,而A,B为n×n的Hermitan矩阵。B为正定矩阵。它的最大值和最小值是什么呢?其实我们只要通过将其通过标准化就可以转化为瑞利商的格式。我们令x=B^{-1/2}x',则分母转化为:

x^HBx = x'^H(B^{-1/2})^HBB^{-1/2}x' = x'^HB^{-1/2}BB^{-1/2}x' = x'^Hx'

而分子转化为:

x^HAx = x'^HB^{-1/2}AB^{-1/2}x'

此时我们的R(A,B,x)转化为R(A,B,x′):

R(A,B,x') = \frac{x'^HB^{-1/2}AB^{-1/2}x'}{x'^Hx'}

        利用前面的瑞利商的性质,我们可以很快的知道,R(A,B,x′)的最大值为矩阵B^{-1/2}AB^{-1/2}的最大特征值,或者说矩阵B^{-1}A的最大特征值,而最小值为矩阵B^{-1}A的最小特征值。

3. 二类LDA原理

        我们先介绍一下稍微简单,容易理解的二分类LDA入手,详细了解一下LDA的原理

        首先给定数据集 D={(x1,y1),(x2,y2),...,((xm,ym))} ,其中任意样本xi为n维向量,yi∈{0,1}。另外我们定义Nj(j=0,1)为第j类样本的个数,Xj(j=0,1)为第j类样本的集合,而μj(j=0,1)为第j类样本的均值向量,定义Σj(j=0,1)为第j类样本的协方差矩阵(严格说是缺少分母部分的协方差矩阵)。

其中:

        μj的表达式为:

\mu_j = \frac{1}{N_j}\sum\limits_{x \in X_j}x\;\;(j=0,1)

        Σj的表达式为:

\Sigma_j = \sum\limits_{x \in X_j}(x-\mu_j)(x-\mu_j)^T\;\;(j=0,1)

我们将数据投影到一条直线上即可。我们假设我们的投影直线是向量w,则对任意一个样本本xi,它在直线w的投影为w^{T}x_{i},对于我们的两个类别的中心点μ0,μ1在在直线ww的投影为w^{T}u_{0}w^{T}u_{1}

由于LDA需要让不同类别的数据的类别中心之间的距离尽可能的大,也就是我们要最大化 ||w^T\mu_0-w^T\mu_1||_2^2 ,同时我们希望同一种类别数据的投影点尽可能的接近,也就是要同类样本投影点的协方差w^T\Sigma_0w 和 w^T\Sigma_1w 尽可能的小,即最小化w^T\Sigma_0w+w^T\Sigma_1w 。综上所述,我们的优化目标为:

\underbrace{arg\;max}_w\;\;J(w) = \frac{||w^T\mu_0-w^T\mu_1||_2^2}{w^T\Sigma_0w+w^T\Sigma_1w} = \frac{w^T(\mu_0-\mu_1)(\mu_0-\mu_1)^Tw}{w^T(\Sigma_0+\Sigma_1)w}

在这里,大家是否有很多问好???

就是 w , w^T 在哪,怎么算,下面就是我们求解的过程,在本小节最后就是哦!!!

我们一般定义类内散度矩阵Sw为:

S_w = \Sigma_0 + \Sigma_1 = \sum\limits_{x \in X_0}(x-\mu_0)(x-\mu_0)^T + \sum\limits_{x \in X_1}(x-\mu_1)(x-\mu_1)^T

同时定义类间散度矩阵Sb为:

S_b = (\mu_0-\mu_1)(\mu_0-\mu_1)^T

全局散度矩阵S_t=S_{b }+ S_{w}=\sum_{i=1}^{m} (x_i-\mu)(x_i-\mu)^T

这样我们的优化目标重写为:

\underbrace{arg\;max}_w\;\;J(w) = \frac{w^TS_bw}{w^TS_ww}

        仔细一看上式,这不就是我们的广义瑞利商嘛!这就简单了,利用我们第二节讲到的广义瑞利商的性质,我们知道我们的J(w')最大值为矩阵S^{-1/2}_wS_bS^{-1/2}_w的最大特征值,而对应w'为S^{-1/2}_wS_bS^{-1/2}_w 的最大特征值对应的特征向量! 而S{^{-1}_{w}}S_{b}的特征值和S^{-1/2}_wS_bS^{-1/2}_w的特征值相同,的特征向量S{^{-1}_{w}}S_{b}的特征向量w和S^{-1/2}_wS_bS^{-1/2}_w的特征向量w′满足w=S_{w}^{-1/2}w'的关系! 

在这里我们就求到了 w 了哦 !!!

        注意到对于二类的时候,S_bw的方向恒平行于μ0−μ1,不妨令S_bw=\lambda (\mu_0-\mu _1),将其带入:(S_w^{-1}S_b)w=\lambda w,可以得到w=S_w^{-1}(\mu _0-\mu_1), 也就是说我们只要求出原始二类样本的均值和方差就可以确定最佳的投影方向w了。

4.多类LDA原理

        前面我们介绍了二分类的LDA,接下来我们再来看看多类别的LDA。

        假设我们的数据集,D=\{(x_1,y_1), (x_2,y_2), ...,((x_m,y_m))\},其中任意样本x_i 为n维向量,y_i \in \{C_1,C_2,...,C_k\} 。我们定义N_j(j=1,2...k)为j类样本的个数,X_j(j=1,2...k)为j类样本的集合,而\mu_j(j=1,2...k) 为第j类样本的均值向量,定义\Sigma_j(j=1,2...k) 为第j类样本的协方差矩阵。从在二类LDA里面定义的公式可以很容易的类推到多类LDA。

        由于我们是多类向低维投影,则此时投影到的低维空间就不是一条直线,而是一个超平面了。假设我们投影到的低维空间的维度为d,对应的基向量为(w_1,w_2,...w_d),基向量组成的矩阵为W,它是一个n*d的矩阵。

        此时我们的优化目标应该可以变成为:

\frac{W^TS_bW}{W^TS_wW}

其中,S_b = \sum\limits_{j=1}^{k}N_j(\mu_j-\mu)(\mu_j-\mu)^T\mu为所有样本的均值向量。S_w = \sum\limits_{j=1}^{k}S_{wj} = \sum\limits_{j=1}^{k}\sum\limits_{x \in X_j}(x-\mu_j)(x-\mu_j)^T

但是在这里会有一个问题

        就是W^TS_bW 和W^TS_wW都是矩阵,不是标量,无法作为一个标量函数来优化!也就是说,我们无法直接用二类LDA的优化方法,怎么办呢?

        一般来说,我们可以用其他的一些替代优化目标来实现。

        比如,常见的一个LDA多类优化目标函数定义为:

\underbrace{arg\;max}_W\;\;J(W) = \frac{\prod\limits_{diag}W^TS_bW}{\prod\limits_{diag}W^TS_wW}

        其中,\prod\limits_{diag}A  为 A的主对角线元素的乘积,W为n×d的矩阵。

        J(W)的优化过程可以转化为:

J(W) = \frac{\prod\limits_{i=1}^dw_i^TS_bw_i}{\prod\limits_{i=1}^dw_i^TS_ww_i} = \prod\limits_{i=1}^d\frac{w_i^TS_bw_i}{w_i^TS_ww_i}

此时,我再来观察一下上式,会发现最右边的式子,就是我们上面所讲的广义瑞丽商!!!最大值是矩阵S_w^{-1}S_b的最大特征值,最大的d个值的乘积就是矩阵S_w^{-1}S_b 的最大的d个特征值的乘积,此时对应的矩阵W为这最大的d个特征值对应的特征向量张成的矩阵。

    由于W是一个利用了样本的类别得到的投影矩阵,因此它的降维到的维度d最大值为k-1。为什么最大维度不是类别数k呢?

        因为Sb中每个μj−μ的秩为1,因此协方差矩阵相加后最大的秩为k(矩阵的秩小于等于各个相加矩阵的秩的和),但是由于如果我们知道前k-1个μj后,最后一个μk可以由前k-1个μj线性表示,因此Sb的秩最大为k-1,即特征向量最多有k-1个。

5.LDA分类

那么在最佳的分类空间如何对样本进行分类?

1)对二分类问题。由于只有两个类别,在经过上面的求解后,最后所有样本将会映射到一维空间中,设两个不同样本映射后的中心点分别为 \large \large \bar{z_1},\large \bar{z_2};我们将两个类别的中心点之间中心点作为分类点。

\large \bar{z}\frac{\bar{z_1}+\bar{z_2}}{2}

最后,我们将

\large w^{T}x>\bar{z}

的x分为一类,其他的分为另一类。

  2)对多分类问题。通过LDA方法最终将原始数据映射到c-1个维度上,现在我们需要在这c-1个维度上将样本集分成c类。这个怎么分呢?本人暂时也不知道,能想到的只是将问题转化为二分类问题。实际上,对于多类的情况主要考虑用来降维。

  对于此类问题,我们主要将它转化为二分类来处理,我们使用一对其余的方法。简单来说就是先将所有c类样本分成1和2~c,然后再将2~c分为2和3~c,以此类推,直到完全分开。

6.LDA算法流程

输入:数据集D=\{(x_1,y_1), (x_2,y_2), ...,((x_m,y_m))\} ,其中任意样本xixi为n维向量,\large y_i \in \{C_1,C_2,...,C_k\},降维到的维度d。

输出:降维后的样本集D′

1) 计算类内散度矩阵Sw

2) 计算类间散度矩阵Sb 

3) 计算矩阵S^{-1}wSb 

4)计算S^{-1}wSb的最大的d个特征值和对应的d个特征向量(w1,w2,...wd)得到投影矩阵w

5) 对样本集中的每一个样本特征xi,转化为新的样本z_i=W^Tx_i

6) 得到输出样本集 D'=\{(z_1,y_1), (z_2,y_2), ...,((z_m,y_m))\} 

二类LDApython举例:

1.首先看一下所需库

numpy 和 pandas

导入如下:

import numpy as np
import pandas as pd

2.读取数据

data = pd.read_excel('文件路径') #读取excel文件data = pd.read_csv('文件路径') #读取csv文件

3.定义x,y和x0,x1

x = data['x']
y = data['y']
x0 = x[y==0]
x1 = x[y==1]

4.定义LDA函数

def LDA(x1, x2):n1 = np.shape(x1)[0]n2 = np.shape(x2)[0]m = n1print("m = ", m)x1_mean = np.mean(x1)x2_mean = np.mean(x2)print("x1_mean = ", x1_mean)print("x2_mean = ", x2_mean)sigma1 = np.dot((x1 - x1_mean),(x1 - x1_mean).T)sigma2 = np.dot((x2 - x2_mean),(x2 - x2_mean).T)Sw = sigma1 + sigma2print("Sw = ", Sw)w = Sw**(-1)*(x1_mean - x2_mean)return w

5.分离训练集和测试集

这个一般得按实际情况决定,我手头没有相关数据,可以看我的其他文章,很多都介绍了,数据集的分离

然后,带入上面函数

w = LDA(x0,x1)

6.得到降维后的数据

predict_y = w * x
print(predict_y)

7.分类

u=np.mean(x*w) #预测数据集到的均值,作为分类的标准
lei_pred=[]
for i in x:h = i * wlei=1*(h<u)lei_pred.append(lei)
print('类别预测的结果为:')
print(lei_pred)

至于实例,下个更新的时候加上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress 通过域名无法访问_VPS主机和宝塔面板搭建WordPress网站教程

这是一篇Wordpress建站教程&#xff0c;记录了我在VPS主机上&#xff0c;通过使用宝塔面板&#xff0c;搭建Wordpress网站或个人博客的详细步骤&#xff0c;外贸新人或小白在建立网站的时候可以作为参考。WordPress是全球最流行的建站程序&#xff0c;而且是免费的。用Wordpres…

猜数字小游戏

java代码 猜数字小游戏 程序分析 根据提示输入内容 获取输入的内容 使用for循环进行遍历使用if循坏进行数值的判断 输出结果 完整代码 import java.util.Scanner; import java.util.Random; public class mulTip{public static void main(String[] args){System.out.println…

LDA(线性判别分析(普通法))详解 —— matlab

目录 前言 正题 1.LDA的思想 2. 瑞利商&#xff08;Rayleigh quotient&#xff09;与广义瑞利商&#xff08;genralized Rayleigh quotient&#xff09; 3. 二类LDA原理 4.多类LDA原理 5.LDA分类 6.LDA算法流程 二类LDA matlab举例&#xff1a; 1.读取数据集 2.分离…

java 异步得到函数返回值_使用JavaScript进行异步编程

毫无疑问&#xff0c;虽然JavaScript的历史比较悠久&#xff0c;但这并不妨碍它成为当今最受欢迎的编程语言之一。对刚接触该语言的人来说&#xff0c;JavaScript的异步特性可能会有一些挑战。在本文中&#xff0c;我们将了解和使用Promise和async/await来编写小型异步程序。通…

ARMA模型的性质之MA模型

目录 一、MA模型的定义 二、MA模型的统计性质 1.常数均值 2.常数方差 3.自协方差函数q阶结尾 4.自相关系数q阶截尾 举例&#xff1a; 三、MA模型的可逆 1.可逆的定义和条件 2.MA与AR模型的对比 3.逆函数的递推公式 举例&#xff1a; 四、MA模型的偏自相关系数拖尾…

ARMA模型的性质之ARMA模型

目录 一、ARMA模型的定义 二、平稳条件与可逆条件 三、传递形式与逆转形式 四、ARMA(p,q)模型的统计性质 1.均值 2.自协方差函数 3.自相关系数 4.ARMA(p,q)模型自相关系数拖尾&#xff0c;偏自相关系数拖尾 小结 一、ARMA模型的定义 具有如下结构的模型称为自回归移动…

R之Excel文件读取与程序包的安装调用

目录 方法一 方法二 1.用命令安装 2.从下拉菜单安装 三、加载所需安装包 方法一 方法二 四、使用新程序包读取数据 方法一 另存为 .csv 文件 这是wps的另存为 然后选择位置&#xff0c;重命名或更改格式为 .csv 这是excel 的另存为 文件 —— 另存为 —— 选择位置 …

diag开关什么意思_双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图...

电工学习网&#xff1a;www.diangon.com关注电工学习网官方微信公众号“电工电气学习”&#xff0c;收获更多经验知识。双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图现在市场上面所出售的开关种类非常的多&#xff0c;双控开关正好能够满足人们…

Office 安装MathType7.4 未找到MathPage.wll等问题

目录 问题描述&#xff1a; 解决方法&#xff1a; 问题描述&#xff1a; MathType v7.4 简体中文版是一款功能很强大的数学公式编辑器,在很多地方都会用的&#xff0c;而wps就不能适应各种场合。 但是该软件总会因为不明原因,有时会出现找不到MathType.dll或者MathPage.wll文…

python导入excel加入折线图_利用python向excel文件写数据并绘制折线图

依赖 python 2.7.15 xlswriter&#xff08;可以使用pip insall xlswriter&#xff09; 具体实现 #!/usr/bin/env python # -*- coding:utf-8 -*- import xlsxwriter # Create a workbook and add a worksheet. workbook xlsxwriter.Workbook(Expenses01.xlsx) worksheet work…

平稳序列的预测和拟合之单位根检验

目录 1.建模步骤 2.单位根检验 2.1 DF检验&#xff08;以AR(1)模型为例&#xff09; DF检验的等价表达 DF检验的三种类型 R语言单位根检验&#xff1a; 2.2 ADF检验 ADF检验的三种类型 小结 1.建模步骤 2.单位根检验 对平稳序列建模&#xff0c;首先要确定序列是平稳的…

如何自己去写一个鼠标驱动_为什么要用哈密顿采样器(Hamiltonian Monte Carlo),以及如何自己写一个...

背景介绍&#xff1a;&#xff08;了解采样的可以跳过&#xff09;1&#xff09;为什么需要采样&#xff1a;简单的分布&#xff0c;比如高斯、exponential、gamma等等的样本都可以直接用numpy.random生成&#xff0c;但复杂的分布需要采样器生成。在贝叶斯、概率编程里面&…

java inputstream read_20191209-java部分流处理

流:流一般分为输入流(InputStream)和输出流(OutputStream)两类.但这种划分并不是绝对的.在Java开发环境中,主要是由包http://java.io中提供的一系列的类和接口来实现输入和输出处理.标准输入和输出处理则是由包java.lang中提供的类来处理的,但这些类又都是从包http://java.io中…

平稳序列的预测和拟合之模型识别

目录 1.计算样本相关系数和偏自相关系数 2.模型识别 模型定阶的困难 样本相关系数的近似分布及模型定阶经验方法 例题&#xff1a; 2.参数估计 常用估计方法&#xff1a; 1.矩估计 2.极大似然估计 3.最小二乘估计 R中&#xff0c;参数估计用arima函数 例题 小结 1.计算…

python自增_Python的自增运算与Python变量的浅析

一、关于Python的自增运算 学了C/C后再学习Python&#xff0c;不自觉地就打出了自增运算符&#xff0c;但是发现Python解释器不认识&#xff0c;查了下资料&#xff0c;发现Python中没有这个运算符。这里暂时不探讨自增运算符的内部实现原理&#xff0c;从语言设计角度来说&…

平稳序列的预测和拟合之模型检验

目录 1.模型的显著性检验 R语言实现 例题 2.参数显著性检验 例题 小结 1.模型的显著性检验 检验模型的有效性&#xff08;对信息的提取是否充分) 判定原则&#xff1a; 一个好的拟合模型应该能够提取几乎所有的样本相关信息&#xff0c;即残差序列应该为白噪声序列。反之…

oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!

Python大数据分析记录 分享 成长Python作为数据科学主流语言&#xff0c;被广泛用于数据读存、处理、分析、建模&#xff0c;可以说是无所不能。数据一般存放在本地文件或者数据库里&#xff0c;之前介绍过如何使用python读取本地文件&#xff0c;也对# PyMySQL、cx_Oracle…

平稳序列的预测和拟合之模型优化

目录 前提 准则 1、AIC准则 2、SBC &#xff08;BIC)准则 优化 小结 前提 问题提出:模型通过检验&#xff0c;说明是有效的&#xff0c;但有效的模型不唯一。 下面我们用一个例子来解释一下&#xff1a; 例4-7:试对某次化学反应的70个过程数据序列进行拟合。 d<-r…

css中如何实现帧布局_浅谈web前端中的表格布局与CSS盒子布局

在web前端设计排版时我们可能会用到表格布局和divCSS布局&#xff0c;但现在主要使用后者&#xff0c;为何&#xff1f;今天我们来谈一谈两者之间的发展和原理。话不多说下面来干货发展过程上个世纪Web开发人员流行使用表格进行文档整体布局。因为当时大部分浏览器不支持CSS&am…

油猴的简介和安装

目录 1.油猴简介 2.油猴插件安装 方法1 方法2 3.获取油猴脚本 4.脚本的使用 4.1 脚本的设置及功能 4.2 安装油猴脚本 4.3 新建脚本 5.脚本编写方法 功能注释 脚本权限 编写脚本 1.油猴简介 油猴脚本是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c…