用scikit learn進行LDA降維

2021-08-15 08:40:10 字數 2851 閱讀 5640

**性判別分析lda原理總結中,我們對lda降維的原理做了總結,這裡我們就對scikit-learn中lda的降維使用做乙個總結。

在scikit-learn中, lda類是sklearn.discriminant_analysis.lineardiscriminantanalysis。那既可以用於分類又可以用於降維。當然,應用場景最多的還是降維。和pca類似,lda降維基本也不用調參,只需要指定降維到的維數即可。

我們這裡對lineardiscriminantanalysis類的引數做乙個基本的總結。

1)solver : 即求lda超平面特徵矩陣使用的方法。可以選擇的方法有奇異值分解"svd",最小二乘"lsqr"和特徵分解"eigen"。一般來說特徵數非常多的時候推薦使用svd,而特徵數不多的時候推薦使用eigen。主要注意的是,如果使用svd,則不能指定正則化引數shrinkage進行正則化。預設值是svd

2)shrinkage:正則化引數,可以增強lda分類的泛化能力。如果僅僅只是為了降維,則一般可以忽略這個引數。預設是none,即不進行正則化。可以選擇"auto",讓演算法自己決定是否正則化。當然我們也可以選擇不同的[0,1]之間的值進行交叉驗證調參。注意shrinkage只在solver為最小二乘"lsqr"和特徵分解"eigen"時有效。

3)priors :類別權重,可以在做分類模型時指定不同類別的權重,進而影響分類模型建立。降維時一般不需要關注這個引數。

4)n_components:即我們進行lda降維時降到的維數。在降維時需要輸入這個引數。注意只能為[1,類別數-1)範圍之間的整數。如果我們不是用於降維,則這個值可以用預設的none。

從上面的描述可以看出,如果我們只是為了降維,則只需要輸入n_components,注意這個值必須小於「類別數-1」。pca沒有這個限制。

在lda的原理篇我們講到,pca和lda都可以用於降維。兩者沒有絕對的優劣之分,使用兩者的原則實際取決於資料的分布。由於lda可以利用類別資訊,因此某些時候比完全無監督的pca會更好。下面我們舉乙個lda降維可能更優的例子。

我們首先生成三類三維特徵的資料,**如下:

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)

我們看看最初的三維資料的分布情況:

首先我們看看使用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是最先考慮的乙個選擇了。

**:劉建平pinard

用scikit learn進行LDA降維

在scikit learn中,lda類是sklearn.discriminant analysis.lineardiscriminantanalysis。那既可以用於分類又可以用於降維。當然,應用場景最多的還是降維。和pca類似,lda降維基本也不用調參,只需要指定降維到的維數即可。我們這裡對lin...

用scikit learn學習DBSCAN聚類

在dbscan密度聚類演算法中,我們對dbscan聚類演算法的原理做了總結,本文就對如何用scikit learn來學習dbscan聚類做乙個總結,重點講述引數的意義和需要調參的引數。在scikit learn中,dbscan演算法類為sklearn.cluster.dbscan。要熟練的掌握用db...

用scikit learn學習DBSCAN聚類

在dbscan密度聚類演算法中,我們對dbscan聚類演算法的原理做了總結,本文就對如何用scikit learn來學習dbscan聚類做乙個總結,重點講述引數的意義和需要調參的引數。在scikit learn中,dbscan演算法類為sklearn.cluster.dbscan。要熟練的掌握用db...