LDA-作为线性判别 分类器 推导

LDA, 即 Linear Discriminant Analysis, 中文翻译为, 线性判别分析. 比较有趣的一点是:LDA 既可以直接用作分类算法, 也可作为特征降维的方法. 给人感觉, 这是将特征工程和建模一并给做了呀.

LDA 作为分类器

可以通过熟知的SVM来比较, 为啥总提SVM呢, 我非常喜欢呀, 理论完美, 推导不易, 但一旦啃下来了, 那就是真的明白了, 再去其他相类似的算法, 都是一碟小菜.

svm 的思想是要找到 一条最优的 类别间的分割线(面) wTx+b=0, 到类别两边的 "距离相等" 且尽可能的大, 即max margin, 且这个距离是:

max margin=2||w||

而 LDA 是要找到一条线 wTx+b=y, 让类别的点都向该直线 投影 (有点像PCA). 而分割线的是方向与该投影线垂直 通过 w 的一变化, 该投影线也在变化, 目标是找个一条适合的 投影线, 使得不同类别点投影下来, 有同类间隔很近, 不同类较远.

假设类别A的中心是 μ1,: σ1, 类别B的中心是 μ2, : σ2 即要实现 高内聚,低耦合 的效果.

即: max (μ1μ2)2σ12+σ22

LDA 分类器推导

知识准备

假设有大 K 个类别.

假设 $f_k(x) 为类别 G=k 的数据的条件概率密度函数, πk 为类别 G=k 的数据的先验概率.

真实中先验是不知道, 根据参数估计 可知抽样分布的样本去估计总体.

πk=NkN ,k=1Kπk=1

  • Nk 表示 k类 的样本数 占 总样本数 N 的比例, 记为 πk

  • 数据共K个类别, 即所有 πk (比例)之和为1

  • 一个类别下有很多数据, 分布函数是 f(x)

理想中, 我们是上帝, 已知先验概率, 那正常的逻辑是:

离散和连续是一样的哈, 离散用 连续用 (莱布尼兹 发明, 灵感就是 'sum' 都表示"累积求和")

知道 总体有 A1,A2...AK 各类别, 及其对应出现的概率 P(A1),P(A2)...P(Ak)

知道 每个类别下, 某类事件(样本)x 出现的概率: P(x|A1),P(x|A2)...P(x|Ak)

现在随机来一个抽样, 恰好是该类事件的概率有多大?

分析:

最终该事件的发生概率, 其实是分散在, 总体中, 各类别下的该事件发生概率 的累加.(先类别发生的前提下 再发生的概率) 这样的逻辑关系 (条件概率)

即 **全概率 ** =i=1KP(Ai)P(x|Ai)=i=1Kπifi(x)

本篇最初假设: πk 为类别 k 出现的概率;

fi(x) 表示类别 k 发生前提下的 概率密度分布函数;

共大 K 个类别;

现实中, 我们只是凡人, 只凭经验动态猜测先验概率, 现在的问题是:

已知该事件 x 发生了, x 是哪一个类别 的可能性最大?

即: P(Ak|x)=P(Ak)P(x|Ak)i=1KP(Ai)P(x|Ai)

  • 其实这个公式就是 大家熟知但又不熟悉的 贝叶斯公式

  • 简单点, 解决类似 已知 P(x|Ai) 求解 P(Ai|x) 的问题

  • 深刻点, 贝叶斯思想 (总体不可知, 参数不固定(变量), 动态来修正(概率分布)

即在本篇中, 样本 x 发生下, 属于类别 k 的概率表示为:

Pr(G=k|X=x)=πkfk(x)i=1Kπkfi(x)

LDA 模家型假设

多元正态分布假设

直到目前, 对于 fk(x) 这个概率分布函数的具体形式尚未给出, 这里给出具体形式, 注意的是, x 可以是 一元, 也可以是多元(向量) , 为了更一般化, 假设 x 是多元 (向量), 分布呢, 就假定是 多元正态分布

fk(x)=12πp2|Σk|0.5e12(xμk)Tk1(xμk)

  • p 表示 x 向量的维度 (几(维) 元)

  • Σk 是样本 X 矩阵的 协方差矩阵, 主对角线是 各特征的方差

  • |Σ|0.5 是对协方差矩阵求 行列式 再开根号 (得到一个实数)

  • μk 是样本 X 矩阵中, 属于 k 类的 那些 行, 然后分别对 每个特征 求均值, 最后组成的 均值向量

等方差假设

LDA 假设 不论有 多少个类别, 都认为他们的 协方差是一样的, 为啥要这样, 嗯... 可以回顾 数理统计中 关于 假设检验 - 方差分析 F 分布 这部分内容, 这里不暂时不展开了. 这样假设的好处,嗯... 理论上方便推导和计算吧大概.

k  Σk=Σ

注意这里的 Σ, 是先求: 对 属于某个类别 k 下的协方差阵 (X 是 n个样本(行), p维度 (列))

咱平时说的向量, 默认都是列向量

i=1n(xiμk)(xiμk)T 注 xi 表示 一行, 即 p x1 维, 输出维度 (p x 1) ( 1xp) -> pxp 的 协方差, 方阵

再对每个类别 进行 求和起来, 相当于 二重的 for 循环

即: Σ=i=1Ki=1n(xiμk)(xiμk)T

嗯, 概念类似, excel 表格(多行多列), 其中有一个字段是 "类别", 现进行 "筛选", 不同的类别, 晒出来的表格是不一样的, 当 "筛选所有值" 不就是 "整体了吗" . 没一个类值, 对应一个 pxp 的 协方差阵(方阵), 然做 K个类别, 即

1+2+....k= 对应元素相加呀, 简单吧

latex, 注意, 求和符号 \sum 和 协方差(大写西格玛) \Sigma 感觉是一样的 , ,Σ, 难怪之前会看糊涂, 果然, 符号使用跟 写代码是一样的, 一定要先声明 (标量,行/列向量, 矩阵, 函数...., 不然就不知道是啥了

对于:

Pr(G=k|X=x)=πkfk(x)i=1Kπkfi(x)

不论 x 是什么, 在先验概率下, x 的全概率 是不变的, 即 P(x) = i=1Kπkfi(x) 是个常数, 假设用 1c 来代替 则:

Pr(G=k|X=x)=cπkfk(x)=cπk2πp2|Σk|0.5e12(xμk)Tk1(xμk)

在训练中, p 是固定的, Σ 也是假设相等的, 因此这项 c2πp2|Σk|0.5 也是固定的, 也 记为 常数 c (覆盖之前的哈), 则化简为:

Pr(G=k|X=x)=cπke12(xμk)Tk1(xμk)

再两边取对数, 乘法边加法

Pr(G=k|X=x)=logc+logπk12(xμk)Tk1(xμk)

判断 x 是属于哪一类, 带入上面公式即可, 如果有 K个类别, 那就算 K 次, 概率最大的类别, 即为最可能的类别.

log c 也是对 所有类别的影响一样, 可以忽略, 继续简化:

=logπk12[xTΣ1xxTΣ1ukμkTΣ1x+μkTΣ1μk]

xTΣ1ukμkTΣ1x 二者的值是一样的, 形式上 相差了一个 "转置", 随便写哪个都可以

=logπk12[xTΣ1x2xTΣ1uk+μkTΣ1μk]

xTΣ1x 的值 与 x 属于哪类别 k 也是无关的

于是最终优化的目标函数为:

f(x)=logπk+xTΣ1μk12μkTΣ1μk

πk 是当前类别的 先验概率, μk 是类别为 k 的样本矩阵的 特征均值向量

LDA分类模型应用

根据:

f(x)=logπk+xTΣ1μk12μkTΣ1μk

输出一批样本 X:

Pk = [ ]

for k in 如果有大 K 个类别, 就要计算 K 次 f(x) 的值, 是个概率. k = 1, 2, 3 ...

​ for 每次计算, 都会从总样本矩阵 X 中, 筛选出 当前 属于 k 的 "k 样本矩阵" 进行计算.

​ 输出一个 概率值 f(k).

​ Pk.append (fk))

Pk.sort( )

return Pk[-1] 最大概率 及对应类别

(补充) 协方差矩阵

样本 X 是nxp 的矩阵, 每行表示一个样本, 每列表示一个 特征 , 即我们所的一个样本(一个行)是 px1 的列向量 即: (如表示第6个样本, 第一行表示为:)

x6=(X61X62...X6p)=[X61,X62...X6p]T

Xij 表示第 i 个样本 的 第 j 个特征, 是一个实数值

xiXi 的区别, xi 表示 X 的 第 i 行, 共 n 行; Xi 表示的第 i 个特征变量 (字段), 共 p 维.

因此, 样本矩阵 X 可以写为:

X=(XiTX2T...XnT)=[X1,X2,...Xp]T 尤其注意这里 样本和变量 不要混淆

即: 此处的样本矩阵 X (mxp), 表示 一个 p 维 随机向量 x=[X1,X2,...Xp]T 的一次 n 次抽样, x1,x2...()

μi Xi,μi=E(Xi) 即对对第 i 个特征 (列) 求均值, 所有的特征, 的均值就组成了

则样本 X 的 均值向量(中心)

μ=[μi,μ2,μ3,...μp]T

特征 i 与 特征 j 间的协方差为:

Σij=E[(Xiμi)(Xjμj)T] 是一个 pxp 的方阵

从而 样本 X 的协方差矩阵为:

Σ=E[(XE(X)(XE(X)T] 也是 pxp 的方阵

小结 - LDA 作为分类器

理论核心其实, 就是 贝叶斯公式

这个过程可简单描述为:

已知 大类的先验分布, 及在各大类发生的前提下, B事件发生的条件概率.

则可 求出 B 事件发生的 全概率 (各条件概率之和)

BUT 已经B事件已经发生

求解 B 最可是属于哪一类(先验)

这妥妥的贝叶斯呀, 不过, 如果样本不均衡, 我感觉如果不加权重, 就要凉凉了.

写代码实现来看, 对于样本 X 是已知的, 大类的先验概率, 就以 "分类字段" 进行 group by 再 count 就得到频率了, 用抽样分布参数估计总体, 即 频率 = 概率 这样每个大类的先验就ok了.

然后是事件的分布, 假设是服从多元的高斯分布, 也是可通过每个 类 的 抽样估计总体, 其实就是算一个 均值 和协方差, 这也搞定了

然后是 输入一个 新 X', 遍历每行,计算 之前推到出的判别函数, 共计算 K 次

f(x)=logπk+xTΣ1μk12μkTΣ1μk

则会输出 某样本 分别在 每个类别的 概率可能性, 是个 向量, list

返回最大即可 (其实这里是有 2层的 for 循环, 负责度是 O(n**2) 大概.

嗯, 下篇 就整一波, LDA 作为 降维 vs PCA 吧!

posted @   致于数据科学家的小陈  阅读(1544)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航