线性判别分析(Linear Discriminant Analysis, LDA)算法详解
先说理解:
线性判别分析(LDA,Linear Discriminant Analysis)是一种用来分类和降维的方法,通俗来说,它就像是一个“分组大师”,帮你在数据里找到一条线(或平面),把不同类别的人或东西清楚地分开。相比主成分分析(PCA)更注重“抓住数据的主要变化”,LDA 的目标是“让不同组别分开得越清楚越好”。
让我用一个生活化的例子来解释:
场景:水果摊分类
假设你在水果摊上卖苹果和橙子,顾客拿来一堆水果让你分清楚哪些是苹果,哪些是橙子。你可能会看几个特征:大小、颜色、重量。但这些特征混在一起不好直接判断。LDA 就像你的大脑在想:“我能不能找一个最聪明的办法,用一条线把苹果和橙子分开?”
- 找区别:LDA 先看看苹果和橙子的特征有什么不一样。比如,苹果普遍偏红、稍重,橙子偏橙黄、稍轻。它会找一个“方向”,在这个方向上,苹果和橙子的差异最大。
- 挤在一起:同时,LDA 还希望同一类水果(比如所有苹果)在一条线上尽量靠得近一点,别太分散。
- 画条线:最后,LDA 会算出一条“分界线”,让苹果和橙子在这条线上被清楚分开。你只要把水果往这条线上一放,就能知道它是苹果还是橙子。
和 PCA 的区别
- PCA 像是在整理东西,关心“哪些特征变化最大”,不管这些东西是苹果还是橙子。
- LDA 更像是在分组,关心“怎么让苹果和橙子分得最清楚”。
举个例子
假如你有两组学生的数据:一组是“学霸”,一组是“运动达人”。每个学生有身高、体重、成绩、跑步速度这些特征。
- PCA 可能会说:“身高和体重变化最大,我用‘体型’来概括你们。”
- LDA 会说:“我想分开学霸和运动达人,发现‘成绩和跑步速度’的组合能最好地区分这两组,我用这个来画条线。”
生活中的意义
LDA 就像你在朋友圈里分组:有人爱吃,有人爱玩,有人爱学习。你想把他们分得清清楚楚,LDA 就帮你找到一个“最佳分组方式”,比如用“爱吃指数”和“爱玩指数”把人分开。
简单来说,LDA 就是:放大组间差异,缩小组内分散,帮你把东西分得清清楚楚!
1. LDA的基本概念
线性判别分析(LDA)是一种监督学习的降维方法,主要用于分类任务。与主成分分析(PCA)不同,PCA关注的是数据的方差,而LDA关注的是类别可分性。
核心目标
- 寻找一个最佳投影方向,使得不同类别的样本尽可能分开,而同一类别的样本尽可能聚集。
- 通过计算类内散度和类间散度,最大化类间方差与类内方差的比值。
2. LDA的数学原理
设数据集包含
m
m
m 个样本,每个样本有
n
n
n 维特征,即数据矩阵为:
X
=
[
x
1
,
x
2
,
.
.
.
,
x
m
]
x
i
∈
R
n
X = [x_1, x_2, ..., x_m] \quad x_i \in \mathbb{R}^n
X=[x1,x2,...,xm]xi∈Rn
其中,每个样本
x
i
x_i
xi 具有一个类别标签
y
i
y_i
yi。设数据集有
c
c
c 个类别,LDA 主要步骤如下:
2.1 计算各类别的均值向量
对每个类别
k
k
k,计算其均值向量:
μ
k
=
1
N
k
∑
x
i
∈
C
k
x
i
\mu_k = \frac{1}{N_k} \sum_{x_i \in C_k} x_i
μk=Nk1xi∈Ck∑xi
其中,
N
k
N_k
Nk 表示类别
k
k
k 的样本数,
C
k
C_k
Ck 表示类别
k
k
k 的样本集合。
2.2 计算类内散度矩阵(Within-Class Scatter Matrix)
S W = ∑ k = 1 c S k S_W = \sum_{k=1}^{c} S_k SW=k=1∑cSk
其中,每个类别
k
k
k 的散度矩阵:
S
k
=
∑
x
i
∈
C
k
(
x
i
−
μ
k
)
(
x
i
−
μ
k
)
T
S_k = \sum_{x_i \in C_k} (x_i - \mu_k)(x_i - \mu_k)^T
Sk=xi∈Ck∑(xi−μk)(xi−μk)T
2.3 计算类间散度矩阵(Between-Class Scatter Matrix)
S B = ∑ k = 1 c N k ( μ k − μ ) ( μ k − μ ) T S_B = \sum_{k=1}^{c} N_k (\mu_k - \mu)(\mu_k - \mu)^T SB=k=1∑cNk(μk−μ)(μk−μ)T
其中,
μ
\mu
μ 是所有样本的全局均值:
μ
=
1
m
∑
i
=
1
m
x
i
\mu = \frac{1}{m} \sum_{i=1}^{m} x_i
μ=m1i=1∑mxi
2.4 计算最佳投影方向
LDA的目标是找到一个变换矩阵
W
W
W,使得投影后的类间散度尽可能大,而类内散度尽可能小。数学上,该目标可以表示为最大化广义瑞利商:
J
(
W
)
=
∣
W
T
S
B
W
∣
∣
W
T
S
W
W
∣
J(W) = \frac{|W^T S_B W|}{|W^T S_W W|}
J(W)=∣WTSWW∣∣WTSBW∣
2.5 求解最优解
-
通过特征值分解或奇异值分解(SVD),解出 S W − 1 S B S_W^{-1} S_B SW−1SB 的前 k k k 个最大特征值对应的特征向量,构成变换矩阵 W W W。
-
将数据 X X X 投影到新空间:
X new = X W X_{\text{new}} = X W Xnew=XW
3. LDA的Python实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 示例数据
X = np.array([[2, 3], [3, 4], [4, 5], [8, 9], [9, 10], [10, 11]])
y = np.array([0, 0, 0, 1, 1, 1])
# 训练LDA模型并降维到1维
lda = LinearDiscriminantAnalysis(n_components=1)
X_lda = lda.fit_transform(X, y)
print("投影后的数据:\n", X_lda)
4. LDA的应用场景
- 人脸识别:如 Fisherfaces 方法,将高维图像数据降维并分类。
- 文本分类:降维后提高文本分类模型的性能。
- 医学诊断:用于区分不同病理类别。
5. 总结
- LDA 是一种监督学习的降维方法,用于提高分类效果。
- PCA 关注方差,LDA 关注类别可分性。
- 核心是最大化类间散度与类内散度之比,找到最优投影方向。
- 适用于模式识别、医学诊断、文本分类等任务。