线性判别分析LDA(linear discriminant analysis)与二次判别分析QDA(quadratic discriminant analysis)

文章目录

  • 什么是LDA
  • LDA与PCA
    • 相同
    • 不同
  • LDA python实现
    • 使用sklearn实现LDA
  • 再进一步QDA
    • QDA数学原理
    • QDA与LDA比较

Source: Python Machine Learning 3rd

什么是LDA

面对有蓝黄两类标签的监督学习问题时:
线性判别分析LDA(linear discriminant analysis)与二次判别分析QDA(quadratic discriminant analysis)_第1张图片

  • 使用PCA:PCA曲线(红线)从两个椭圆之间穿过(最大方差正交分量),投影分布呈LD2维度的正态分布,根据这个正态分布的PCA坐标投影,我们无法分别这两类
  • 使用LDA:LDA曲线(蓝线)会从两个椭圆中间穿过,投影后的数据分布同LD1维度的两个正态分布,由此我们有效进行分类

由此可见,面对监督学习问题时,PCA的表现大大下降了。为此我们使用PCA来寻找并确定不同类的子空间在某一维度上差别最大的分布情况,帮助我们对监督学习数据实现降维

LDA与PCA

相同

  • LDA和PCA都用于数据维度降低

不同

  • PCA不适用于监督学习分类问题
  • LDA可以视为比PCA高级的分类技巧,但在实践情况下,使用PCA比使用LDA在图像识别等领域表现更好
  • LDA用于监督学习,而PCA用于非监督学习(也可以用于监督学习。。。)
  • PCA寻找最大方差的正交分量轴,LDA寻找最优化分类的特征子空间,或者说投影后类内方差最小,类间方差最大

LDA python实现

使用LDA前我们需要注意以下条件:

  • 数据正态分布
  • 样本彼此独立
  • 即使不满足以上两点,LDA还是能有较好的表现

使用sklearn实现LDA

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# 标准化数据输入集
...
# LDA实现监督学习数据降维
lda = LDA(n_components=2)
X_train_lda = lda.fit_transform(X_train_std, y_train)
# 逻辑回归实现预测
lr = LogisticRegression(multi_class='ovr', random_state=1, solver='lbfgs')
lr = lr.fit(X_train_lda, y_train)
# 可视化
plot_decision_regions(X_train_lda, y_train, classifier=lr)
plt.xlabel('LD 1')
plt.ylabel('LD 2')
plt.legend(loc='best')
plt.tight_layout()
plt.show()

很明显,当我们使用LDA来降低数据维度时,fit训练函数需要y_train,而这在PCA中是不需要的

plot_decision_regions是python machine learning 3rd中的可视化方程,可以很好地实现二维数据的可视化
链接:二维数据可视化模型

结果:
线性判别分析LDA(linear discriminant analysis)与二次判别分析QDA(quadratic discriminant analysis)_第2张图片
使用LDA降至只有二维仍然能够近乎完美地预测出监督学习分类结果

再进一步QDA

通过之前的比较,我们可以发现LDA相比PCA在监督学习分类问题中巨大的优势,然后LDA正如其名,只能够进行线性分析,看看scikit learn上的一个例子:
线性判别分析LDA(linear discriminant analysis)与二次判别分析QDA(quadratic discriminant analysis)_第3张图片
面对交叉分布的两组样本点,LDA无法地很好地对两类进行区分,这种情况下如果使用(QDA):
线性判别分析LDA(linear discriminant analysis)与二次判别分析QDA(quadratic discriminant analysis)_第4张图片
QDA在关键的地方可以通过曲线进行过渡,分类表现优异许多。

QDA数学原理

总的来说,QDA和LDA一样,都假设样本是呈正态分布的,但是QDA不会像LDA一样假设所有类的协方差相同。具体而言:
log ⁡ P ( y = k ∣ x ) = log ⁡ P ( x ∣ y = k ) + log ⁡ P ( y = k ) + C s t = − 1 2 log ⁡ ∣ Σ k ∣ − 1 2 ( x − μ k ) t Σ k − 1 ( x − μ k ) + log ⁡ P ( y = k ) + C s t \begin{aligned} \log P(y=k \mid x) &=\log P(x \mid y=k)+\log P(y=k)+C s t \\ &=-\frac{1}{2} \log \left|\Sigma_{k}\right|-\frac{1}{2}\left(x-\mu_{k}\right)^{t} \Sigma_{k}^{-1}\left(x-\mu_{k}\right)+\log P(y=k)+C s t \end{aligned} logP(y=kx)=logP(xy=k)+logP(y=k)+Cst=21logΣk21(xμk)tΣk1(xμk)+logP(y=k)+Cst欢迎感兴趣的同学前去探讨,我先撤了

QDA与LDA比较

  • QDA可以对分类任务通过构建曲线进行区分,在一般分类问题中效果比只能够进行线性区分的LDA要好,还能产生等高线效果
  • LDA可以同时进行分类和降维(如第一个图在垂直方向上进行投影),QDA只能够进行分类任务

附上scikit learn中使用QDA的例子:

>>> from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> y = np.array([1, 1, 1, 2, 2, 2])
>>> clf = QuadraticDiscriminantAnalysis()
>>> clf.fit(X, y)
QuadraticDiscriminantAnalysis()
>>> print(clf.predict([[-0.8, -1]]))
[1]

你可能感兴趣的:(python机器学习,-,人工智能,机器学习,数据分析)