线性判别分析(Linear Discriminant Analysis, LDA)是一种统计模式识别方法
,用于寻找数据集中的线性组合
,以最大化类别之间的差异,同时最小化类别内部的差异
。
LDA通常用于监督
学习场景,例如分类任务
,其中已知数据点属于不同的预定义类别
,并且目标是
找到能够最好地区分这些类别的低维表示。
LDA的基本公式和参数
目标函数
LDA的目标是找到一个投影矩阵 W
,使得投影后的数据在类别间具有最大的方差,在类别内具有最小的方差
。这通过最大化下面的比率来实现:
J ( W ) = W T S B W W T S W W J(W) = \frac{W^TS_BW}{W^TS_WW} J(W)=WTSWWWTSBW
其中:
-
S
B
S_B
SB 表示
类间散度矩阵
(Between-class scatter matrix),反映了类别间的差异。
-
S
W
S_W
SW 表示
类内散度矩阵
(Within-class scatter matrix),反映了类别内的差异。
-
J
(
W
)
J(W)
J(W) 是
判别准则函数。
散度矩阵
类内散度矩阵
S
W
S_W
SW 是所有类别内散度矩阵的加权和
:
S
W
=
∑
i
=
1
C
S
i
S_W=\sum_{i=1}^CS_i
SW=i=1∑CSi
其中,
S
i
S i
Si 表示第
i
i
i 类的类内散度矩阵,计算方式为:
S i = ∑ x ∈ C i ( x − μ i ) ( x − μ i ) T S_i=\sum_{x\in C_i}(x-\mu_i)(x-\mu_i)^T Si=x∈Ci∑(x−μi)(x−μi)T
μ
i
\mu_i
μi 是第
i
i
i 类的均值向量
,
C
i
C_i
Ci 是第
i
i
i 类的样本集合。
即
S
W
=
∑
i
=
1
C
∑
x
∈
C
i
(
x
−
μ
i
)
(
x
−
μ
i
)
T
S_W = \sum_{i=1}^C\sum_{x\in C_i}(x-\mu_i)(x-\mu_i)^T
SW=i=1∑Cx∈Ci∑(x−μi)(x−μi)T
类间散度矩阵
S
B
S_B
SB 描述了各类均值之间的差异:
S
B
=
∑
i
=
1
c
N
i
(
μ
i
−
μ
)
(
μ
i
−
μ
)
T
S_B = \sum_{i=1}^{c}N_i(\mu_i - \mu)(\mu_i - \mu)^T
SB=i=1∑cNi(μi−μ)(μi−μ)T
其中
-
μ
i
\mu_i
μi 是第
i
i
i
类的样本均值向量
-
μ
\mu
μ 是
整个数据集的样本均值向量。
样本协方差矩阵
的公式是用来估计一组多维数据之间线性相关性的强度和方向
的。对于一个由多个随机变量组成的样本数据集,样本协方差矩阵
S
S
S 可以通过以下公式计算:
设我们有一个包含 m m m 个样本的 n n n-维数据集 { x 1 , x 2 , … , x m } \{x_1, x_2, \ldots, x_m\} {x1,x2,…,xm},其中每个样本 x i x_i xi 是一个 n n n-维向量。
样本均值向量为:
x
ˉ
=
1
m
∑
i
=
1
m
x
i
\bar{x} = \frac{1}{m} \sum_{i=1}^{m} x_i
xˉ=m1i=1∑mxi
样本协方差矩阵
S
S
S 定义为:
S
=
1
m
−
1
∑
i
=
1
m
(
x
i
−
x
ˉ
)
(
x
i
−
x
ˉ
)
T
S = \frac{1}{m-1} \sum_{i=1}^{m} (x_i - \bar{x})(x_i - \bar{x})^T
S=m−11i=1∑m(xi−xˉ)(xi−xˉ)T
其中
- ( x i − x ˉ ) (x_i - \bar{x}) (xi−xˉ) 是第 i i i 个样本与其均值的差
- 而 ( x i − x ˉ ) T (x_i - \bar{x})^T (xi−xˉ)T 是这个差的转置。
矩阵中的每个元素
S
i
j
S_{ij}
Sij 都代表了第
i
i
i 和第
j
j
j 个变量之间的样本协方差,计算公式为:
S
i
j
=
1
m
−
1
∑
k
=
1
m
(
x
k
i
−
x
ˉ
i
)
(
x
k
j
−
x
ˉ
j
)
S_{ij} = \frac{1}{m-1} \sum_{k=1}^{m} (x_{ki} - \bar{x}_i)(x_{kj} - \bar{x}_j)
Sij=m−11k=1∑m(xki−xˉi)(xkj−xˉj)
其中
-
x
k
i
x_{ki}
xki 和
x
k
j
x_{kj}
xkj 分别是第
k
k
k 个
样本
在第 i i i 和第 j j j 个维度上的值 - 而
x
ˉ
i
\bar{x}_i
xˉi 和
x
ˉ
j
\bar{x}_j
xˉj 则是
相应维度的样本平均值。
值得注意的是,分母
m
−
1
m-1
m−1 而不是
m
m
m 是为了得到无偏估计
,这是因为样本均值
x
ˉ
\bar{x}
xˉ 是基于同样的样本数据集计算出来的,从而导致了所谓的“自由度损失”。这种修正被称为 Bessel’s correction。
求解W
要最大化
J
(
W
)
J(W)
J(W),需要求解以下广义特征值问题:
S
B
w
=
λ
S
W
w
S_Bw = \lambda S_Ww
SBw=λSWw
这里的
w
w
w 是
W
W
W 的列向量
,而
λ
\lambda
λ 是相应的特征值
。通常,选择那些具有最大特征值
的
w
w
w 作为
W
W
W 的列向量,因为它们提供了最大的类间可分离性。
解释
-
W
W
W:
投影矩阵,用于将原始数据映射到较低维度空间。
- S B S_B SB:类间散度矩阵,量化了类别间的差异。
- S W S_W SW:类内散度矩阵,量化了类别内的差异。
- λ \lambda λ:特征值,决定了投影方向的重要性。
- w w w:特征向量,指示了投影的方向。
通过LDA,可以找到一个或多个投影方向
,使得数据在这些方向上的投影能最大限度地区分不同的类别
,从而提高分类性能。在实际应用中,LDA经常用于降维,以便在保持类别信息的同时减少数据的复杂性。
python代码
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib
matplotlib.use('TkAgg') # 或者尝试 'Agg'
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用LDA进行特征提取
lda = LinearDiscriminantAnalysis(n_components=2) # 我们将数据降到2维
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)
# 利用LDA结果进行分类
# 这里我们直接使用LDA的预测功能
y_pred = lda.predict(X_test)
# 评估模型性能
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
# 可视化LDA结果:
plt.figure()
colors = ['navy', 'turquoise', 'darkorange']
lw = 2
for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
plt.scatter(X_train_lda[y_train == i, 0], X_train_lda[y_train == i, 1], color=color, alpha=.8, lw=lw,
label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA of IRIS dataset')
plt.show()