一天一个机器学习小知识——线性判别分析

    科技2024-10-17  6

    文章目录

    前言一、算法推导1.模型2.策略3.算法 二、应用场景三、代码实现1.导入相关库2.读取样例数据3.划分训练集和测试集4.建立模型5.评估模型 四、优缺点1.优点2.缺点


    前言

    本小节将介绍线性判别分析(Linear Discriminant Analysis, LDA),它是一种分类算法,同时也是一种有监督的降维算法。

    一、算法推导

    李航老师的《统计学习方法》中提到,统计学习方法都是由模型、策略和算法构成的,因此本文在算法推导也主要从这三部分进行展开讨论。

    1.模型

    LDA的主要思想是:给定训练集,想办法将这些样本投影到一条直线上,使得投影后同类的样本尽可能靠近,不同类的样本尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。 所以我们的模型就是要找到这条投影后的直线 y = w T x y=w^{T}x y=wTx

    2.策略

    上面我们讨论了LDA就是要找到一个投影向量 w w w,使得投影后满足:“类内差异小、类间差异大”。类内差异我们可以用同一个类的方差来衡量,方差越大表示数据波动越大,差异越大,反之差异越小;类间差异可以用两个类的均值向量之间的距离来衡量,如果两个类的均值向量距离较大,表明它们相距越远,差距越大。为了简化运算,这里假设只有两个类,z={0,1},计算均值向量 u 0 = ∑ i x i , ( y i = 0 ) u_{0}=\sum_{i}x_i,(y_{i}=0) u0=ixi(yi=0) u 1 = ∑ i x i , ( y i = 1 ) u_{1}=\sum_{i}x_i,(y_{i}=1) u1=ixi(yi=1)由于 x x x w w w方向上的投影就是 x x x w w w做内积,所以类别0和1在 w w w上的投影分别为 w T u 0 w^{T}u_{0} wTu0 w T u 1 w^{T}u_{1} wTu1。同一类别之间的差异小等价于 w T u 0 w^{T}u_{0} wTu0 w T u 1 w^{T}u_{1} wTu1自身的方差较小。令 s 0 , s 1 s_{0},s_{1} s0s1分别为投影后类别0和1的方差,那么 s 0 = V a r ( w T u 0 ) = w T V a r ( u 0 ) w = w T s c 0 w s_{0}=Var(w^{T}u_{0})=w^{T}Var(u_{0})w=w^Ts_{c0}w s0=Var(wTu0)=wTVar(u0)w=wTsc0w s 1 = w T s c 1 w s_{1}=w^Ts_{c1}w s1=wTsc1w 其中 s c 0 , s c 1 s_{c0},s_{c1} sc0sc1分别表示投影前类别1和类别2的方差。所以用 s 0 + s 1 s_{0}+s_{1} s0+s1就表示了投影后的类内样本距离。 对于类间样本距离,我们直接用两个均值向量的之间的欧式距离表示 ∣ ∣ w T u 0 − w T u 1 ∣ ∣ 2 2 ||w^Tu_{0}-w^Tu_{1}||^2_2 wTu0wTu122 所以要满足类内小,类间大,我们可以采用如下损失函数 J ( w ) = − ∣ ∣ w T u 0 − w T u 1 ∣ ∣ 2 2 s 0 + s 1 J(w)=-\frac{||w^Tu_{0}-w^Tu_{1}||^2_2}{s_{0}+s_{1}} J(w)=s0+s1wTu0wTu122 = − w T ( u 0 − u 1 ) ( u 0 − u 1 ) T w w T ( s c 0 + s c 1 ) w =-\frac{w^T(u_0-u_1)(u_0-u_1)^Tw}{w^T(s_{c0}+s_{c1})w} =wT(sc0+sc1)wwT(u0u1)(u0u1)Tw通过最小化损失函数 J ( w ) J(w) J(w)即可求得最优的投影方向。 w ∗ = a r g m i n J ( w ) w^*=argminJ(w) w=argminJ(w)

    3.算法

    怎么求解 a r g m i n J ( w ) argmin J(w) argminJ(w)呢?为了方便运算,不妨令 s b = ( u 0 − u 1 ) ( u 0 − u 1 ) T s_{b}=(u_0-u_1)(u_0-u_1)^T sb=(u0u1)(u0u1)T,表示类间散度矩阵(between-class scatter matrix);令 s w = s 0 + s 1 s_{w}=s_{0}+s_{1} sw=s0+s1表示类内散度矩阵(within-class scatter matrix),则 J ( w ) = − w T s b w w T s w w J(w)=-\frac{w^Ts_bw}{w^Ts_ww} J(w)=wTswwwTsbw又由于分子分母都有 w T 和 w w^T和w wTw,所以最终的计算结果将与 w w w的大小无关(会上下约掉),只与 w w w的方向有关。所以不妨令 w T s w w = 1 w^Ts_ww=1 wTsww=1,则优化方程可以写成如下形式 min ⁡ w − w T s b w  s.t.  w T s w w = 1 \begin{aligned} \min _{\boldsymbol{w}} &-\boldsymbol{w}^{\mathrm{T}} \mathbf{s}_{b} \boldsymbol{w} \\ \text { s.t. } & \boldsymbol{w}^{\mathrm{T}} \mathbf{s}_{w} \boldsymbol{w}=1 \end{aligned} wmin s.t. wTsbwwTsww=1根据拉格朗日乘子法,可以求得 s b w = λ s w w s_bw=\lambda s_ww sbw=λsww,又因为 s b w s_bw sbw的方向是 u 0 − u 1 u_0-u_1 u0u1,所以不妨令 s b w = λ ( u 0 − u 1 ) s_bw=\lambda (u_0-u_1) sbw=λ(u0u1),从而 λ s w w = λ ( u 0 − u 1 ) \lambda s_ww=\lambda (u_0-u_1) λsww=λ(u0u1),求得 w ∗ = s w − 1 ( u 0 − u 1 ) w^*=s^{-1}_w(u_0-u_1) w=sw1(u0u1)

    二、应用场景

    LDA在降维方向应用比较多,在分类方面应用反而不多,因为投影到新的坐标轴后,有可能带来线性不可分的情况。但是这种思想是可以借鉴的,所谓的降维打击吧,这跟svm和神经网络这种先升维再分类的思想刚好反过来。

    三、代码实现

    这里主要使用sklearn这个库来实现机器学习算法。

    1.导入相关库

    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.datasets import load_breast_cancer from sklearn.metrics import accuracy_score import pandas as pd import numpy as np

    2.读取样例数据

    data = load_breast_cancer() # 获取样例数据,这里的数据乳腺癌检测,y=0代表没有乳腺癌,y=1代表有 X = pd.DataFrame(data.data,columns=data.feature_names) y = data.target

    3.划分训练集和测试集

    X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.3,random_state=0)

    4.建立模型

    model = LinearDiscriminantAnalysis().fit(X_train,y_train) y_pred = model.predict(X_test) 最终模型参数

    5.评估模型

    由于是分类问题,所以我们可以直接使用准确率来评估模型

    print('ACC:%.3f'%(accuracy_score(y_test,y_pred))) ACC:0.971

    其实上面用的方法是留出法,我们也可以使用交叉验证法来计算模型误差。这样就把划分训练集和测试集、建立模型以及评估模型这几步合并在一起。

    acc = np.mean(cross_val_score(LinearDiscriminantAnalysis(),X,y,cv=10,scoring='accuracy')) print('ACC:%.3f'%(acc)) ACC:0.956

    可以看到两者比较接近。

    四、优缺点

    1.优点

    (1)在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。

    2.缺点

    (1)当总共有K个类别时,LDA最多降到K-1维,而PCA没有这个限制

    Processed: 0.040, SQL: 8