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

编程入门 行业动态 更新时间:2024-10-17 04:47:43

一天一个机器学习小知识——<a href=https://www.elefans.com/category/jswz/34/1768154.html style=线性判别分析"/>

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

文章目录

  • 前言
  • 一、算法推导
    • 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​=i∑​xi​,(yi​=0) u 1 = ∑ i x i , ( y i = 1 ) u_{1}=\sum_{i}x_i,(y_{i}=1) u1​=i∑​xi​,(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} s0​,s1​分别为投影后类别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=wTsc0​w s 1 = w T s c 1 w s_{1}=w^Ts_{c1}w s1​=wTsc1​w
其中 s c 0 , s c 1 s_{c0},s_{c1} sc0​,sc1​分别表示投影前类别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 ∣∣wTu0​−wTu1​∣∣22​
所以要满足类内小,类间大,我们可以采用如下损失函数
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​+s1​∣∣wTu0​−wTu1​∣∣22​​ = − 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(u0​−u1​)(u0​−u1​)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​=(u0​−u1​)(u0​−u1​)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)=−wTsw​wwTsb​w​又由于分子分母都有 w T 和 w w^T和w wT和w,所以最终的计算结果将与 w w w的大小无关(会上下约掉),只与 w w w的方向有关。所以不妨令 w T s w w = 1 w^Ts_ww=1 wTsw​w=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. ​−wTsb​wwTsw​w=1​根据拉格朗日乘子法,可以求得 s b w = λ s w w s_bw=\lambda s_ww sb​w=λsw​w,又因为 s b w s_bw sb​w的方向是 u 0 − u 1 u_0-u_1 u0​−u1​,所以不妨令 s b w = λ ( u 0 − u 1 ) s_bw=\lambda (u_0-u_1) sb​w=λ(u0​−u1​),从而 λ s w w = λ ( u 0 − u 1 ) \lambda s_ww=\lambda (u_0-u_1) λsw​w=λ(u0​−u1​),求得 w ∗ = s w − 1 ( u 0 − u 1 ) w^*=s^{-1}_w(u_0-u_1) w∗=sw−1​(u0​−u1​)

二、应用场景

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没有这个限制

更多推荐

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

本文发布于:2023-07-28 21:39:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1325296.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线性   小知识   机器

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!