LDA(Linear Discriminant Analysis)线性判别分析是一种有监督数据降维算法,它与我们之前提到的PCA都是数据清洗过程中最常用的两种数据降维技术。但它们又有所不同,PCA的核心是将现有数据转换到低维度得空间中,数据的方差都变得最大。LDA的核心含义是对将现有数据进行转换,数据类别变得容易区分,其方差不一定是最大的。
LDA的作用:
1.将数据的维度降低,除去那些对结果影响不大的特征。如今我们的数据集中,数据的特征往往会达到成百上千维,可是这些维度都会对最终结果产生影响吗?其实不然,所以需要对数据进行降维处理。
2.将高维度的数据转换为低维度的数据,减小了计算时的数据量,相应的提升了计算效率。
图解LDA原理
如图所示,我们现在有两类数据,‘-’,‘x’,外边的椭圆形是数据的外围轮廓。现在我们沿着图中的这条新的轴线,对这两类数据进行投影。投影后,数据从二维变成了一维,我们希望两类数据在低维空间中能更好的的区分,也就是离得越远越好。如图所示,用红色小圆点和红色小三角形分别表示两类数据的中心点,这两个点的距离越大越好,两类数据分的越开。
如下图所示,u1,u2分别为红色,蓝色数据的中心点,现我们分别将其沿着X1,X2轴进行投影。
从图中可以看出投影到X1轴,两点之间的间距要大于投影到X2轴,但是投影到X1轴后,两类数据将出现部分重叠,这显然无法达到我们对数据进行分类的目的。投影到X2轴,虽然u1与u2之间的距离较小,但是可以将两类数据清楚地区分开。
综上所述:对于投影后的数据,须同时满足两个要求。1:两类数据之间的距离越大越好,2:每类数据越聚集越好。
最终问题的落脚点:怎样找到这条最合适的投影轴?
LDA的数学原理推导
SKlearn-LDA介绍
1.API文档
sklearn.discriminant_analysis.LinearDiscriminantAnalysis(solver=’svd’, shrinkage=None,
priors=None, n_components=None, store_covariance=False, tol=0.0001)
2.参数说明
- solver:样本数据的处理方法,字符型,默认svd。当solver = 'svd'时,svd全称singular value decomposition,此时lda不用计算协方差矩阵,当数据特征比较多时,推荐使用'svd'。当solver = 'lsqr'时,可与第二个参数shrinkage组合使用。当solver = 'eigen',可与第二个参数Shrinkage组合使用。
- shrinkage:是否使用参数收缩,默认为None。当shrinkage = 'auto'时,使用Ledoit-Wolf lemma。当shrinkage是一个0~1之间的浮点数的时候,按照比例进行收缩。
- n_components:int型,要保留的特征个数,<= n_features - 1。
3.LDA属性说明
- covariance_ :协方差矩阵,[n_features,n_features]
- explained_variance_ratio_ :方差的比例,[n_components]
- means_:类均值,[n_classes,n_features]
- priors_:归一化的先验概率,[n_classes,]
4.样例演示
数据集下载:链接:https://pan.baidu.com/s/1JgTFW0pGvbA6MxFvQ63Nlg
提取码:j99o
import pandas as pd
from sklearn.preprocessing import LabelEncoder #对类别值进行编码,
#因为计算机无法识别字符型数值,所以需将其转化为数值型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
#由于数据集中列没有名称,我们自己指定列名
columns = ['sepal length','sepal width','petal length','petal width','category']
data = pd.read_csv('D:\\Py_dataset\\iris.data',names = columns)
#将数据划分为特征X与标签y
X = data[['sepal length','sepal width','petal length','petal width']]
y = data['category']
#对标签进行编码
lbn = LabelEncoder()
y = lbn.fit_transform(y)
#使用lda对数据进行降维
lda = LinearDiscriminantAnalysis(n_components = 2)
X_lda = lda.fit_transform(X,y)
X_lda[:10]
array([[-8.0849532 , 0.32845422],
[-7.1471629 , -0.75547326],
[-7.51137789, -0.23807832],
[-6.83767561, -0.64288476],
[-8.15781367, 0.54063935],
[-7.72363087, 1.48232345],
[-7.23514662, 0.3771537 ],
[-7.62974497, 0.01667246],
[-6.58274132, -0.98737424],
[-7.36884116, -0.91362729]])
LDA除过能对数据进行降维还能对数据进行分类,下面是LDA的分类过程。
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
lda = LinearDiscriminantAnalysis()
lda.fit(X_train,y_train)
lda.score(X_test,y_test)
1.0
5.LDA小结
LDA是有监督的数据降维方式,其目的是寻找最合适的投影方向,以便将数据清楚地分出。
LDA既可用于降维,也可用于分类。
LDA不适用于对非高斯分布样本进行降维。
LDA最多可将样本降至k-1维(k为类别的数量),最少为1维。