十九.降维之线性判别分析(LDA)原理和sklearn实现

目录

  • 1.LDA的数学原理
    • (1)类间散度矩阵
    • (2)类内散度矩阵
    • (3)协方差矩阵
  • 2.LDA算法流程
  • 3.LDA与PCA的区别
  • 4.sklearn实现LDA
    • (1)生成数据
    • (2)PCA
    • (3)LDA

1.LDA的数学原理

LDA是一种有监督的降维技术,它的每个样本输出都是有类别的。
LDA的思想是投影后类间方差尽可能大,类内方差尽可能小。

(1)类间散度矩阵

类间散度矩阵为:
S b = ∑ i = 1 C ( μ i − μ ) ( μ i − μ ) T \boldsymbol{S}_{b}=\sum_{i=1}^{C}(\mu _{i}-\mu)(\mu _{i}-\mu)^{T} Sb=i=1C(μiμ)(μiμ)T
其中, C C C为类别总数, μ \mu μ为所有样本的均值:
μ = 1 m ∑ i = 1 m x i \mu =\frac{1}{m}\sum_{i=1}^{m}\mathbf{x}^{i} μ=m1i=1mxi
∣ C i ∣ |C_{i}| Ci为类别为 C i C_{i} Ci的样本数, μ i \mu _{i} μi为类别为 C i C_{i} Ci的样本均值:
μ i = 1 ∣ C i ∣ ∑ i = 1 ∣ C i ∣ x i \mu _{i}=\frac{1}{|C_{i}|}\sum_{i=1}^{|C_{i}|}\mathbf{x}^{i} μi=Ci1i=1Cixi

(2)类内散度矩阵

类间散度矩阵为:
S w = ∑ i = 1 C ∑ x i ∈ C i ( x i − μ i ) ( x i − μ i ) T \mathbf{S}_{w}=\sum_{i=1}^{C}\sum_{\mathbf{x}^{i}\in C_{i}}(\mathbf{x}^{i}-\mu _{i})(\mathbf{x}^{i}-\mu _{i})^{T} Sw=i=1CxiCi(xiμi)(xiμi)T

(3)协方差矩阵

投影后的类间协方差矩阵:
w T S b w \mathbf{w^{T}S_{b}w} wTSbw
投影后的类内协方差矩阵:
w T S w w \mathbf{w^{T}S_{w}w} wTSww
类内方差最小,类间方差最大,等价于最大化下式:
arg ⁡ max ⁡ w w T S b w w T S w w \arg \max_{w}\frac{\mathbf{w^{T}S_{b}w}}{\mathbf{w^{T}S_{w}w}} argwmaxwTSwwwTSbw
分子和分母都为 w \mathbf{w} w的二次项,不失一般性,令 w T S w w = 1 \mathbf{w^{T}S_{w}w}=1 wTSww=1,则上式等价于最小化下式:
arg ⁡ min ⁡ w − w T S b w s . t . w T S w w = 1 \arg\min_{w}-\mathbf{w^{T}S_{b}w}\\ s.t.\mathbf{w^{T}S_{w}w}=1 argwminwTSbws.t.wTSww=1
带约束的最优化问题,使用拉格朗日乘子法:
J ( w ) = − w T S b w − λ ( 1 − w T S w w ) J(\mathbf{w})=-\mathbf{w^{T}S_{b}w}-\lambda(1-\mathbf{w^{T}S_{w}w}) J(w)=wTSbwλ(1wTSww)
此时,求梯度并令梯度为0:
∂ J ( w ) ∂ w = − 2 S b w + 2 λ S w w = 0 \frac{\partial J(\mathbf{w})}{\partial \mathbf{w}}=-2\mathbf{S_{b}w}+2\lambda\mathbf{S_{w}w}=0 wJ(w)=2Sbw+2λSww=0
最终得:
S w − 1 S b w = λ w \mathbf{S_{w}^{-1}S_{b}w}=\lambda \mathbf{w} Sw1Sbw=λw
因此,需要求 S w − 1 S b w \mathbf{S_{w}^{-1}S_{b}w} Sw1Sbw的特征值和特征向量。
由于利用了样本的类别得到的投影矩阵,因此降维到的维度 d d d最大值为类别数减1。

2.LDA算法流程

输入: m m m n n n维样本,有 k k k个类别,需要降到的维度为 d d d
输出:降维后的样本集。
(1)分别求出类间散度矩阵 S b \mathbf{S_{b}} Sb和类内散度矩阵 S w \mathbf{S_{w}} Sw
(2)计算出矩阵 S w − 1 S b \mathbf{S_{w}^{-1}S_{b}} Sw1Sb
(3)计算出矩阵 S w − 1 S b \mathbf{S_{w}^{-1}S_{b}} Sw1Sb的最大 d d d个特征值和对应的特征向量,组成投影矩阵:
W = ( w 1 , w 2 , . . . , w d ) \mathbf{W}=(\mathbf{w}_{1},\mathbf{w}_{2},...,\mathbf{w}_{d}) W=(w1,w2,...,wd)
(4)得到新的样本:
x n e w i = W T x i \mathbf{x^{i}_{new}}=\mathbf{W^{T}x^{i}} xnewi=WTxi

3.LDA与PCA的区别

(1)LDA为有监督降维,PCA为无监督降维。

(2)PCA可以降低到任意维度,LDA只能降维最大至类别数减1。

(3)LDA可以进行分类。

4.sklearn实现LDA

(1)生成数据

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import make_classification
x, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
                           n_clusters_per_class=1,class_sep =0.5, random_state =10)
print(x.shape)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x[:, 0], x[:, 1], x[:, 2],c=y)

输出:
十九.降维之线性判别分析(LDA)原理和sklearn实现_第1张图片

(2)PCA

from sklearn.decomposition import PCA
model1=PCA(n_components=2)
x1 = model1.fit_transform(x)
print(x1.shape)
plt.scatter(x1[:,0],x1[:,1],c=y)
plt.show()

十九.降维之线性判别分析(LDA)原理和sklearn实现_第2张图片

(3)LDA

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
model2 = LinearDiscriminantAnalysis(n_components=2)
model2.fit(x,y)
x2=model2.transform(x)
print(x2.shape)
plt.scatter(x2[:,0],x2[:,1],c=y)
plt.show()

十九.降维之线性判别分析(LDA)原理和sklearn实现_第3张图片

你可能感兴趣的:(机器学习实战,机器学习理论基础)