在线性判别分析LDA原理总结中,咱们对LDA降维的原理作了总结,这里咱们就对scikit-learn中LDA的降维使用作一个总结。html
在scikit-learn中, LDA类是sklearn.discriminant_analysis.LinearDiscriminantAnalysis。那既能够用于分类又能够用于降维。固然,应用场景最多的仍是降维。和PCA相似,LDA降维基本也不用调参,只须要指定降维到的维数便可。python
咱们这里对LinearDiscriminantAnalysis类的参数作一个基本的总结。git
1)solver: 即求LDA超平面特征矩阵使用的方法。能够选择的方法有奇异值分解"svd",最小二乘"lsqr"和特征分解"eigen"。通常来讲特征数很是多的时候推荐使用svd,而特征数很少的时候推荐使用eigen。主要注意的是,若是使用svd,则不能指定正则化参数shrinkage进行正则化。默认值是svdgithub
2)shrinkage:正则化参数,能够加强LDA分类的泛化能力。若是仅仅只是为了降维,则通常能够忽略这个参数。默认是None,即不进行正则化。能够选择"auto",让算法本身决定是否正则化。固然咱们也能够选择不一样的[0,1]之间的值进行交叉验证调参。注意shrinkage只在solver为最小二乘"lsqr"和特征分解"eigen"时有效。算法
3)priors :类别权重,能够在作分类模型时指定不一样类别的权重,进而影响分类模型创建。降维时通常不须要关注这个参数。微信
4)n_components:即咱们进行LDA降维时降到的维数。在降维时须要输入这个参数。注意只能为[1,类别数-1)范围之间的整数。若是咱们不是用于降维,则这个值能够用默认的None。dom
从上面的描述能够看出,若是咱们只是为了降维,则只须要输入n_components,注意这个值必须小于“类别数-1”。PCA没有这个限制。post
在LDA的原理篇咱们讲到,PCA和LDA均可以用于降维。二者没有绝对的优劣之分,使用二者的原则实际取决于数据的分布。因为LDA能够利用类别信息,所以某些时候比彻底无监督的PCA会更好。下面咱们举一个LDA降维可能更优的例子。3d
完整代码参加个人github: https://github.com/nickchen121/machinelearning/blob/master/classic-machine-learning/lda.ipynbcode
咱们首先生成三类三维特征的数据,代码以下:
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) ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)
咱们看看最初的三维数据的分布状况:
首先咱们看看使用PCA降维到二维的状况,注意PCA没法使用类别信息来降维,代码以下:
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()
在输出中,PCA找到的两个主成分方差比和方差以下:
[ 0.43377069 0.3716351 ]
[ 1.20962365 1.03635081]
输出的降维效果图以下:
因为PCA没有利用类别信息,咱们能够看到降维后,样本特征和类别的信息关联几乎彻底丢失。
如今咱们再看看使用LDA的效果,代码以下:
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()
输出的效果图以下:
能够看出降维后样本特征和类别信息之间的关系得以保留。
通常来讲,若是咱们的数据是有类别标签的,那么优先选择LDA去尝试降维;固然也可使用PCA作很小幅度的降维去消去噪声,而后再使用LDA降维。若是没有类别标签,那么确定PCA是最早考虑的一个选择了。
(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)