机器学习笔记——LDA线性判别分析

前言

机器学习的东西真是又多又杂啊,之前刷吴恩达就见过主成分分析,即PCA(Principle Component Analysis),没见过线性判别分析,即LDA(Linear Discriminant Analysis)。才知道前者是对无标签数据作压缩的,而后者可以对有标签的二分类、多分类任务的数据作压缩。

本文主要讲述了LDA算法的推导,以及展示了LDA算法的代码实现和应用。

参考资料:

周志华《机器学习》,人称西瓜书

更详细的算法推导:机器学习算法推导&手写实现03——线性判别分析 - 知乎 (zhihu.com)

一、算法推导

由前言可知,LDA相比于PCA,是用来处理有标签数据的,为了使压缩后的数据仍然能表示分类的情况,我们应该让同类的样本尽可能靠近,异类的样本尽可能远离

数学表示为:给定数据集 D = { x i , y i } i = 1 m D = \{x_i, y_i\}_{i=1}^m D={xi,yi}i=1m,该数据集共有 m m m个样本,每个样本包含一个数据,即一个 n n n维的向量 x i x_i xi,以及一个标签,即一个数 y i y_i yi,代表该数据点所在的类别。

y i ∈ { 0 , 1 } y_i \in \{0, 1\} yi{0,1},说明这是一个二分类任务,我们先从简单的二分类开始讨论。

1. 二分类

1.1 优化目标

接下来,我们要用数学语言来表示同类的样本尽可能靠近,异类的样本尽可能远离这两个任务。

同类的样本尽可能靠近,也就是同类之间的方差要尽可能小

设压缩前,两个类的协方差矩阵分别为 Σ 0 \Sigma_0 Σ0 Σ 1 \Sigma_1 Σ1

那么,压缩后的两个类的协方差矩阵为 ω T Σ 0 ω \omega^T \Sigma_0 \omega ωTΣ0ω ω T Σ 1 ω \omega^T \Sigma_1 \omega ωTΣ1ω

定义“类内散度矩阵”(with-class scatter matrix)为

S ω = Σ 0 + Σ 1 = ∑ x ∈ X 0 ( x − μ 0 ) T + ∑ x ∈ X 1 ( x − μ 1 ) T S_{\omega} = \Sigma_0 + \Sigma_1 = \sum \limits_{x \in X_0} (x - \mu_0)^T + \sum \limits_{x \in X_1} (x - \mu_1)^T Sω=Σ0+Σ1=xX0(xμ0)T+xX1(xμ1)T

那么,同类之间的方差要尽可能小,就是要最小化 ω T S ω ω \omega^T S_{\omega} \omega ωTSωω

异类的样本尽可能远离,也就是异类样本的均值的差值要尽可能大

设压缩前,两个类的均值分别为 μ 0 \mu_0 μ0 μ 1 \mu_1 μ1

那么,压缩后的两个类的均值为 ω T μ 0 \omega^T \mu_0 ωTμ0 ω T μ 1 \omega^T \mu_1 ωTμ1

定义“类间散度矩阵”(between-class scatter matrix)为

S b = ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T S_b = (\mu_0 - \mu_1)(\mu_0 - \mu_1)^T Sb=(μ0μ1)(μ0μ1)T

那么,异类的样本尽可能远离,就是要最大化 ω T S b ω \omega^T S_b\omega ωTSbω

将上述两条件统一到一个式子,我们的优化目标就变为了

最大化 J = ω T S b ω ω T S ω ω J = \frac{\omega^T S_b\omega}{\omega^T S_{\omega} \omega} J=ωTSωωωTSbω

1.2 数学推导

由于 J = ω T S b ω ω T S ω ω J = \frac{\omega^T S_b\omega}{\omega^T S_{\omega} \omega} J=ωTSωωωTSbω分子分母都是关于 ω \omega ω的二次项,因此,求解上述问题与 ω \omega ω的大小无关,只与 ω \omega ω的的方向有关。

我们不妨假设 ω T S ω ω = 1 \omega^T S_{\omega} \omega = 1 ωTSωω=1,问题转化为

m i n ω   − ω T S b ω min_{\omega} \space -\omega^T S_b\omega minω ωTSbω

s t .   ω T S ω ω = 1 st. \space \omega^T S_{\omega} \omega = 1 st. ωTSωω=1

由拉格朗日乘子法,得

L ( ω ) = − ω T S b ω + λ ( ω T S ω ω − 1 ) L(\omega) = -\omega^T S_b\omega + \lambda (\omega^T S_{\omega} \omega - 1) L(ω)=ωTSbω+λ(ωTSωω1)

∂ L ( ω ) ∂ ω = − 2 S b ω + 2 λ S ω ω = 0 \frac{\partial L(\omega)}{\partial \omega} = -2 S_b \omega + 2 \lambda S_{\omega} \omega = 0 ωL(ω)=2Sbω+2λSωω=0

S b ω = λ S ω ω    1 ◯ S_b \omega = \lambda S_{\omega} \omega \space \space \textcircled{1} Sbω=λSωω  1

S b ω = ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T ω S_b \omega = (\mu_0 - \mu_1)(\mu_0 - \mu_1)^T \omega Sbω=(μ0μ1)(μ0μ1)Tω,其中 ( μ 0 − μ 1 ) T ω (\mu_0 - \mu_1)^T \omega (μ0μ1)Tω可看作是个标量,因此 S b ω S_b \omega Sbω的方向恒与 μ 0 − μ 1 \mu_0 - \mu_1 μ0μ1相同,不妨令

S b ω = λ ( μ 0 − μ 1 )    2 ◯ S_b \omega = \lambda (\mu_0 - \mu_1) \space \space \textcircled{2} Sbω=λ(μ0μ1)  2

1 ◯ 2 ◯ \textcircled{1} \textcircled{2} 12

S ω ω = μ 0 − μ 1 S_{\omega} \omega = \mu_0 - \mu_1 Sωω=μ0μ1

ω = S ω − 1 ( μ 0 − μ 1 ) \omega = S_{\omega}^{-1} (\mu_0 - \mu_1) ω=Sω1(μ0μ1)

在实践中,常常对 S ω S_{\omega} Sω做奇异值分解: S ω = U Σ V T S_{\omega} = U \Sigma V^T Sω=UΣVT,故有 S ω − 1 = V Σ − 1 U T S_{\omega}^{-1} = V \Sigma^{-1} U^T Sω1=VΣ1UT,从而得到 S ω − 1 S_{\omega}^{-1} Sω1

2. 多分类

2.1 问题求解

将问题扩展到多分类,定义所有样本的均值为 μ \mu μ,每个类对应的样本数量为 m i m_i mi,那么重新定义“类间散度矩阵”为

S b = ∑ i = 1 N m i ( μ i − μ ) ( μ i − μ ) T S_b = \sum\limits_{i=1}^N m_i (\mu_i - \mu) ( \mu_i - \mu )^T Sb=i=1Nmi(μiμ)(μiμ)T

设总共由$ N $个类,重新定义“类内散度矩阵”为

S ω = ∑ i = 1 N ∑ x ∈ X i ( x − μ i ) ( x − μ i ) T S_{\omega} = \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x - \mu_i) (x - \mu_i )^T Sω=i=1NxXi(xμi)(xμi)T

在上述二分类中,我们将样本投影到一维空间,也就是一条直线上,而在多分类中,我们将样本投影到 N − 1 N - 1 N1维空间,记投影矩阵 W ∈ R d × ( N − 1 ) W \in R^{d \times (N -1)} WRd×(N1),其中 d d d表示原样本的维度数。

同理可得

S b W = λ S ω W S_b W = \lambda S_{\omega} W SbW=λSωW

S ω − 1 S b W = λ W S_{\omega}^{-1} S_b W = \lambda W Sω1SbW=λW

因此 W W W的解是 S ω − 1 S b S_{\omega}^{-1} S_b Sω1Sb的最大 N − 1 N - 1 N1个特征值所对应特征向量所组成的矩阵

2.2 全局散度矩阵

除了使用 S b S_b Sb S ω S_{\omega} Sω作为度量的标准,多分类LDA还可以有多种不同的实现,引入“全局散度矩阵

S t = ∑ i = 1 m ( x i − μ ) ( x i − μ ) T S_t = \sum \limits_{i=1}^m (x_i - \mu)(x_i - \mu)^T St=i=1m(xiμ)(xiμ)T

可以证明 $ S_t = S_b + S_{\omega} $,如下:

S b = ∑ i = 1 N m i ( μ i − μ ) ( μ i − μ ) T = ∑ i = 1 N m i ( μ i μ i T − μ μ i T − μ i μ T + μ μ T ) \begin{aligned} S_b &= \sum\limits_{i=1}^N m_i (\mu_i - \mu) ( \mu_i - \mu )^T \\ &= \sum\limits_{i=1}^N m_i (\mu_i \mu_i^T - \mu \mu_i^T - \mu_i \mu^T + \mu \mu^T) \end{aligned} Sb=i=1Nmi(μiμ)(μiμ)T=i=1Nmi(μiμiTμμiTμiμT+μμT)

其中, m i μ μ i T = = ∑ x ∈ X i μ x T m_i \mu \mu_i^T == \sum\limits_{x \in X_i} \mu x^T miμμiT==xXiμxT m i μ i μ T = ∑ x ∈ X i X μ T m_i \mu_i \mu^T = \sum\limits_{x \in X_i} X \mu^T miμiμT=xXiXμT,那么有

S b = ∑ i = 1 N ∑ x ∈ X i ( μ i μ i T − μ x T − x μ T + μ μ T ) S_b = \sum\limits_{i=1}^N \sum\limits_{x \in X_i} (\mu_i \mu_i^T -\mu x^T - x \mu^T + \mu \mu^T) Sb=i=1NxXi(μiμiTμxTxμT+μμT)

又有

S ω = ∑ i = 1 N ∑ x ∈ X i ( x − μ i ) ( x − μ i ) T = ∑ i = 1 N ∑ x ∈ X i ( x x T − μ i x T − x μ i T + μ i μ i T ) \begin{aligned} S_{\omega} &= \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x - \mu_i) (x - \mu_i )^T \\ &= \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x x^T - \mu_i x^T - x \mu_i^T + \mu_i \mu_i^T) \end{aligned} Sω=i=1NxXi(xμi)(xμi)T=i=1NxXi(xxTμixTxμiT+μiμiT)

那么,

S b + S ω = ∑ i = 1 N ∑ x ∈ X i ( x x T − μ x T − x μ T + μ μ T − μ i x T − x μ i T + 2 μ i μ i T ) S_b + S_{\omega} = \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x x^T -\mu x^T - x \mu^T + \mu \mu^T - \mu_i x^T - x \mu_i^T + 2 \mu_i \mu_i^T) Sb+Sω=i=1NxXi(xxTμxTxμT+μμTμixTxμiT+2μiμiT)

其中, ∑ i = 1 N ∑ x ∈ X i ( − μ i x T − x μ i T + 2 μ i μ i T ) = 0 \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (- \mu_i x^T - x \mu_i^T + 2 \mu_i \mu_i^T) = 0 i=1NxXi(μixTxμiT+2μiμiT)=0

则有

S b + S ω = ∑ i = 1 N ∑ x ∈ X i ( x x T − μ x T − x μ T + μ μ T ) = ∑ i = 1 N ∑ x ∈ X i ( x − μ ) ( x − μ ) T = ∑ i = 1 m ( x i − μ ) ( x i − μ ) T = S t \begin{aligned} S_b + S_{\omega} &= \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x x^T -\mu x^T - x \mu^T + \mu \mu^T) \\ &= \sum\limits_{i=1}^N \sum \limits_{x \in X_i} (x - \mu) (x - \mu)^T \\ &= \sum\limits_{i=1}^m (x_i - \mu) (x_i - \mu)^T = S_t \end{aligned} Sb+Sω=i=1NxXi(xxTμxTxμT+μμT)=i=1NxXi(xμ)(xμ)T=i=1m(xiμ)(xiμ)T=St

证毕

3. 等价模型表示

以上的算法推导是基于 m a x ω ω T S b ω ω T S ω ω max_{\omega} \frac{\omega^T S_b\omega}{\omega^T S_{\omega} \omega} maxωωTSωωωTSbω,或者说,基于 m a x W t r ( W T S b W ) t r ( W T S ω W ) max_W \frac{ tr(W^T S_b W) }{ tr(W^T S_{\omega} W) } maxWtr(WTSωW)tr(WTSbW),我们称之为LDA的除法模型。

实际上,LDA还有多种等价的模型表示,比如

(1) 减法模型:

m a x W t r ( W T S b W ) − t r ( W T S ω W ) max_W tr(W^T S_b W) - tr(W^T S_{\omega} W) maxWtr(WTSbW)tr(WTSωW)

s t .    t r ( W T W ) = 1 st. \space \space tr(W^T W) = 1 st.  tr(WTW)=1

求解得到

( S ω − S b ) W = λ W (S_{\omega} - S_b) W = \lambda W (SωSb)W=λW

W W W S ω − S b S_{\omega} - S_b SωSb N − 1 N-1 N1个最大特征值对应的特征向量组成的矩阵

(2) 除法正则模型:

m a x W t r ( W T S b W ) t r ( W T S ω W ) + λ t r ( W T W ) max_W \frac{ tr(W^T S_b W) }{ tr(W^T S_{\omega} W) } + \lambda tr(W^T W) maxWtr(WTSωW)tr(WTSbW)+λtr(WTW)

s t .    t r ( W T S ω W ) = 1 st. \space \space tr(W^T S_{\omega} W) = 1 st.  tr(WTSωW)=1

由拉格朗日乘子法,得

L = t r ( W T S b W ) + λ t r ( W T W ) + β ( t r ( W T S ω W ) − 1 ) L = tr(W^T S_b W) + \lambda tr(W^T W) + \beta (tr(W^T S_{\omega} W) - 1) L=tr(WTSbW)+λtr(WTW)+β(tr(WTSωW)1)

∂ L ∂ W = 2 S b W + 2 λ W + 2 β S ω W = 0 \frac{\partial L}{\partial W} = 2 S_b W + 2 \lambda W + 2 \beta S_{\omega} W = 0 WL=2SbW+2λW+2βSωW=0

S ω − 1 ( S b + λ I ) W = − β W S_{\omega}^{-1}(S_b + \lambda I) W = -\beta W Sω1(Sb+λI)W=βW

W W W S ω − 1 ( S b + λ I ) S_{\omega}^{-1}(S_b + \lambda I) Sω1(Sb+λI) N − 1 N-1 N1个最大特征值对应的特征向量组成的矩阵

(3) 减法正则模型:

m a x W t r ( W T S b W ) − t r ( W T S ω W ) − λ t r ( W T W ) max_W tr(W^T S_b W) - tr(W^T S_{\omega} W) - \lambda tr(W^T W) maxWtr(WTSbW)tr(WTSωW)λtr(WTW)

s t .    t r ( W T W ) = 1 st. \space \space tr(W^T W) = 1 st.  tr(WTW)=1

求得问题的解仍然是 S ω − S b S_{\omega} - S_b SωSb N − 1 N-1 N1个最大特征值对应的特征向量组成的矩阵

二、代码示例

大半都是gpt写的(

X, y = read_data(PATH)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)

accuracy_pca = []
accuracy_lda = []

n_components_range = range(1, 35, 2)
for n_components in n_components_range:
    # PCA
    pca = PCA(n_components=n_components)
    X_train_pca = pca.fit_transform(X_train)
    X_test_pca = pca.transform(X_test)
    knn_pca = KNeighborsClassifier()
    knn_pca.fit(X_train_pca, y_train)
    y_pred_pca = knn_pca.predict(X_test_pca)
    accuracy_pca.append(accuracy_score(y_test, y_pred_pca))

    # LDA
    lda = LinearDiscriminantAnalysis(n_components=n_components)
    X_train_lda = lda.fit_transform(X_train, y_train)
    X_test_lda = lda.transform(X_test)
    knn_lda = KNeighborsClassifier()
    knn_lda.fit(X_train_lda, y_train)
    y_pred_lda = knn_lda.predict(X_test_lda)
    accuracy_lda.append(accuracy_score(y_test, y_pred_lda))

fig, ax = plt.subplots()
ax.plot(n_components_range, accuracy_pca, label='PCA')
ax.plot(n_components_range, accuracy_lda, label='LDA')
ax.set_xlabel('n_components')
ax.set_ylabel('Accuracy')
ax.legend()
plt.show()

在ORL数据集的测试结果如下:

image.png

其实可以再探讨一下减法模型还有正则模型的性能,但是sklearn貌似不支持(?),得手搓,急着交作业就没再搞了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值