LDA和PCA类似,只是在 PCA 中, 没有考虑数据的标签(类别) , 只是把原数据映射到一些方差比较大的方向上,而LDA考虑类别标签了。

LDA 首先是为了分类服务的,使得投影后的样本尽可能按照原始类别分开 。 LDA 的目标一一最大化类间距菌和最小化类内距离 。

如图:如果按照PCA降维,主成分方向为Y轴,而LDA降维,主成分分析为x。显然以x方向为主成分降维后的数据更便于分类,用最简单的线性分类器就能实现。

深度学习linear层降维 lda降维 python_数据


假设最后的主成分方向为w,为求得使得距离最大的w,目标函数为:

深度学习linear层降维 lda降维 python_深度学习linear层降维_02


python程序:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator 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)
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,y)
X_new = lda.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()

 
PCA与LDA算法在目标函数上有何区别与联系?
PCA 选择的是投影后数据方差最大的方向 。 由于PCA是无监督的,因此 PCA 假设方差越大,信息量越多,用主成分来表示原始数据可以去除冗余的维度达到降维 。 而 LDA 选择的是投影后类内方差小、类间方差大的方向 。 真用到了类别标签信息,为了找到数据中具有判别性的维度,使得原始数据在这些方向上投影后, 不同类别尽可能区分开 。
举一个简单的例子,在语音识别中,我们想从一段音频中提取出人的语音信号,这时可以使用 PCA 先进行降维,过滤掉一些固定频率(方差较小)的背景噪声 。 但如果我们的需求是从这段音频中区分出声音属于哪个人,那么我们应该使用 LDA 对数据进行降维 , 使每个人的i吾吾信号具有区分性 。LDA其实都相当于一个简单的分类器了。
从应用的角度,我们可以掌握一个基本的原则一一对无监督的任务使用 PCA 进行降维,对有监督的则应用 LDA 。