Source: Python Machine Learning 3rd
由此可见,面对监督学习问题时,PCA的表现大大下降了。为此我们使用PCA来寻找并确定不同类的子空间在某一维度上差别最大的分布情况,帮助我们对监督学习数据实现降维
使用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降至只有二维仍然能够近乎完美地预测出监督学习分类结果
通过之前的比较,我们可以发现LDA相比PCA在监督学习分类问题中巨大的优势,然后LDA正如其名,只能够进行线性分析,看看scikit learn上的一个例子:
面对交叉分布的两组样本点,LDA无法地很好地对两类进行区分,这种情况下如果使用(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=k∣x)=logP(x∣y=k)+logP(y=k)+Cst=−21log∣Σk∣−21(x−μk)tΣk−1(x−μk)+logP(y=k)+Cst欢迎感兴趣的同学前去探讨,我先撤了
附上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]