主成分分析(Principal Components Analysis,PCA)是一種數(shù)據(jù)降維技術(shù),通過正交變換將一組相關(guān)性高的變量轉(zhuǎn)換為較少的彼此獨立、互不相關(guān)的變量,從而減少數(shù)據(jù)的維數(shù)枯冈。
1、數(shù)據(jù)降維
1.1 為什么要進(jìn)行數(shù)據(jù)降維办悟?
為什么要進(jìn)行數(shù)據(jù)降維尘奏?降維的好處是以略低的精度換取問題的簡化。
人們在研究問題時病蛉,為了全面炫加、準(zhǔn)確地反映事物的特征及其發(fā)展規(guī)律,往往要考慮很多相關(guān)指標(biāo)的變化和影響铺然。尤其在數(shù)據(jù)挖掘和分析工作中俗孝,前期收集數(shù)據(jù)階段總是盡量收集能夠獲得的各種數(shù)據(jù),能收盡收魄健,避免遺漏赋铝。多變量、大樣本的數(shù)據(jù)為后期的研究和應(yīng)用提供了豐富的信息沽瘦,從不同角度反映了問題的特征和信息革骨,但也給數(shù)據(jù)處理和分析工作帶來了很多困難。
為了避免遺漏信息需要獲取盡可能多的特征變量析恋,但是過多的變量又加劇了問題的復(fù)雜性良哲。由于各種變量都是對同一事物的反映,變量之間經(jīng)常會存在一定的相關(guān)性助隧,這就造成大量的信息重復(fù)筑凫、重疊,有時會淹沒甚至扭曲事物的真正特征與內(nèi)在規(guī)律并村。因此漏健,我們希望數(shù)據(jù)分析中涉及的變量較少,而得到的信息量又較多橘霎。這就需要通過降維方法,在減少需要分析的變量數(shù)量的同時殖属,盡可能多的保留眾多原始變量所包含的有效信息姐叁。
變量之間具有一定的相關(guān)關(guān)系,意味著相關(guān)變量所反映的信息有一定程度的重疊,就有可能用較少的綜合指標(biāo)聚合外潜、反映眾多原始變量所包含的全部信息或主要信息原环。 因此,需要研究特征變量之間的相關(guān)性处窥、相似性嘱吗,以減少特征變量的數(shù)量,便于分析影響系統(tǒng)的主要因素滔驾。例如谒麦,對學(xué)生的評價指標(biāo)有很多,作業(yè)哆致、考勤绕德、活動、獎懲摊阀、考試耻蛇、考核,根據(jù)各種指標(biāo)的關(guān)聯(lián)度和相似性胞此,最終可以聚合為德智體美等幾個主要的類別指標(biāo)反映眾多指標(biāo)中大部分信息臣咖。
降維方法可以從事物之間錯綜復(fù)雜的關(guān)系中找出一些主要因素,從而能有效利用大量統(tǒng)計數(shù)據(jù)進(jìn)行定量分析漱牵,解釋變量之間的內(nèi)在關(guān)系夺蛇,得到對事物特征及其發(fā)展規(guī)律的一些深層次的啟發(fā)。
1.2 常用的降維思想和方法
降維的數(shù)學(xué)本質(zhì)是將高維特征空間映射到低維特征空間布疙,有線性映射和非線性映射兩類主要方法蚊惯。
線性映射方法主要有主成分分析(PCA)和線性判別函數(shù)(LDA)。主成分分析(PCA)的思想是按均方誤差損失最小化原則灵临,將高維原始空間變換到低維特征向量空間截型。線性判別函數(shù)(LDA)的思想是向線性判別超平面的法向量上投影,使得區(qū)分度最大(高內(nèi)聚儒溉,低耦合) 宦焦。
非線性映射方法主要有:基于核的非線性降維, 將高維向量的內(nèi)積轉(zhuǎn)換成低維的核函數(shù)表示顿涣,如核主成分分析(KPCA)波闹、核線性判別函數(shù)(KLDA) ;二維化和張量化涛碑, 將數(shù)據(jù)映射到二維空間上精堕,如二維主成分分析(2DPCA)、二維線性判別分析(2DLDA)蒲障、二維典型相關(guān)分析(2DCCA)歹篓;流形學(xué)習(xí)方法瘫证, 從高維采樣數(shù)據(jù)中恢復(fù)低維流形結(jié)構(gòu)并求出相應(yīng)的嵌入映射,如等距映射 (ISOMap) 庄撮, 拉普拉斯特征映射 (LE)背捌, 局部線性嵌入 (LPP)。本質(zhì)上洞斯,非線性映射的思想和算法與神經(jīng)網(wǎng)絡(luò)是相通的毡庆。
此外,還可以通過聚類分析烙如、神經(jīng)網(wǎng)絡(luò)方法進(jìn)行數(shù)據(jù)降維么抗。
1.3 SKlearn 中的降維分析方法
SKlearn 工具包提供了多種降維分析方法。
- 主成分分析
- decomposition.PCA 主成分分析
- decomposition.IncrementalPCA 增量主成分分析
- decomposition.KernelPCA 核主成分分析
- decomposition.SparsePCA 稀疏主成分分析
- decomposition.MiniBatchSparsePCA 小批量稀疏主成分分析
- decomposition.TruncatedSVD 截斷奇異值分解
- 字典學(xué)習(xí)
- decomposition.DictionaryLearning 字典學(xué)習(xí)
- decomposition.MiniBatchDictionaryLearning 小批量字典學(xué)習(xí)
- decomposition.dict_learning 字典學(xué)習(xí)用于矩陣分解
- decomposition.dict_learning_online 在線字典學(xué)習(xí)用于矩陣分解
- 因子分析
- decomposition.FactorAnalysis 因子分析(FA)
- 獨立成分分析
- decomposition.FastICA 快速獨立成分分析
- 非負(fù)矩陣分解
- decomposition.NMF 非負(fù)矩陣分解
- 隱式狄利克萊分布
- decomposition.LatentDirichletAllocation 在線變分貝葉斯算法(隱式狄利克萊分布)
2厅翔、主成分分析(PCA)方法
2.1 基本思想和原理
主成分分析是最基礎(chǔ)數(shù)據(jù)降維方法乖坠,它只需要特征值分解,就可以對數(shù)據(jù)進(jìn)行壓縮刀闷、去噪熊泵,應(yīng)用十分廣泛。
主成分分析的目的是減少數(shù)據(jù)集變量數(shù)量甸昏,同時要保留盡可能多的特征信息顽分;方法是通過正交變換將原始變量組轉(zhuǎn)換為數(shù)量較少的彼此獨立的特征變量,從而減少數(shù)據(jù)集的維數(shù)施蜜。
主成分分析方法的思想是卒蘸,將高維特征(n維)映射到低維空間(k維)上,新的低維特征是在原有的高維特征基礎(chǔ)上通過線性組合而重構(gòu)的翻默,并具有相互正交的特性缸沃,即為主成分。
通過正交變換構(gòu)造彼此正交的新的特征向量修械,這些特征向量組成了新的特征空間趾牧。將特征向量按特征值排序后,樣本數(shù)據(jù)集中所包含的全部方差肯污,大部分就包含在前幾個特征向量中翘单,其后的特征向量所含的方差很小。因此蹦渣,可以只保留前 k個特征向量哄芜,而忽略其它的特征向量,實現(xiàn)對數(shù)據(jù)特征的降維處理柬唯。
主成分分析方法得到的主成分變量具有幾個特點:(1)每個主成分變量都是原始變量的線性組合认臊;(2)主成分的數(shù)目大大少于原始變量的數(shù)目;(3)主成分保留了原始變量的絕大多數(shù)信息锄奢;(4)各主成分變量之間彼此相互獨立失晴。
2.2 算法步驟
主成分分析的基本步驟是:對原始數(shù)據(jù)歸一化處理后求協(xié)方差矩陣冤议,再對協(xié)方差矩陣求特征向量和特征值;對特征向量按特征值大小排序后师坎,依次選取特征向量,直到選擇的特征向量的方差占比滿足要求為止堪滨。
算法的基本流程如下:
- (1)歸一化處理胯陋,數(shù)據(jù)減去平均值;
- (2)通過特征值分解袱箱,計算協(xié)方差矩陣遏乔;
- (3)計算協(xié)方差矩陣的特征值和特征向量;
- (4)將特征值從大到小排序发笔;
- (5)依次選取特征值最大的k個特征向量作為主成分盟萨,直到其累計方差貢獻(xiàn)率達(dá)到要求;
- (6)將原始數(shù)據(jù)映射到選取的主成分空間了讨,得到降維后的數(shù)據(jù)捻激。
在算法實現(xiàn)的過程中,SKlearn 工具包針對實際問題的特殊性前计,又發(fā)展了各種改進(jìn)算法胞谭,例如:
- 增量主成分分析:針對大型數(shù)據(jù)集,為了解決內(nèi)存限制問題男杈,將數(shù)據(jù)分成多批丈屹,通過增量方式逐步調(diào)用主成分分析算法,最終完成整個數(shù)據(jù)集的降維伶棒。
- 核主成分分析:針對線性不可分的數(shù)據(jù)集旺垒,使用非線性的核函數(shù)把樣本空間映射到線性可分的高維空間,然后在這個高維空間進(jìn)行主成分分析肤无。
- 稀疏主成分分析:針對主成分分析結(jié)果解釋性弱的問題先蒋,通過提取最能重建數(shù)據(jù)的稀疏分量, 凸顯主成分中的主要組成部分舅锄,容易解釋哪些原始變量導(dǎo)致了樣本之間的差異鞭达。
2.3 優(yōu)點和缺點
主成分分析方法的主要優(yōu)點是:
1)僅以方差衡量信息量,不受數(shù)據(jù)集以外的因素影響皇忿;
2)各主成分之間正交畴蹭,可消除原始數(shù)據(jù)各變量之間的相互影響;
3)方法簡單鳍烁,易于實現(xiàn)叨襟。
主成分分析方法的主要缺點是:
1)各個主成分的含義具有模糊,解釋性弱幔荒,通常只有信息量而無實際含義糊闽;
2)在樣本非正態(tài)分布時得到的主成分不是最優(yōu)的梳玫,因此特殊情況下方差小的成分也可能含有重要信息。
3右犹、SKlearn 中的主成分分析(PCA) 方法
3.1 PCA 算法(decomposition.PCA)
sklearn.decomposition.PCA 類是 PCA算法的具體實現(xiàn)提澎,官網(wǎng)介紹詳見:https://scikit-learn.org/stable/modules/decomposition.html#principal-component-analysis-pca
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
class sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)
PCA 類的主要參數(shù):
- n_components: int,float n 為正整數(shù),指保留主成分的維數(shù)念链;n 為 (0,1] 范圍的實數(shù)時盼忌,表示主成分的方差和所占的最小閾值。
- whiten:bool, default=False 是否對降維后的主成分變量進(jìn)行歸一化掂墓。默認(rèn)值 False谦纱。
- svd_solver:{‘a(chǎn)uto’, ‘full’, ‘a(chǎn)rpack’, ‘randomized’} 指定奇異值分解SVD的算法。'full' 調(diào)用 scipy庫的 SVD君编;'arpack'調(diào)用scipy庫的 sparse SVD跨嘉;'randomized' SKlearn的SVD,適用于數(shù)據(jù)量大吃嘿、變量維度多祠乃、主成分維數(shù)低的場景。默認(rèn)值 'auto'唠椭。
PCA 類的主要屬性:
- components_: 方差最大的 n-components 個主成分
- explained_variance_: 各個主成分的方差值
- explained_variance_ratio_: 各個主成分的方差值占主成分方差和的比例
PCA 類的主要方法:
-
fit(X,y=None) 表示用數(shù)據(jù) X 訓(xùn)練PCA模型
fit() 是scikit-learn中的通用方法跳纳,實現(xiàn)訓(xùn)練、擬合的步驟贪嫂。PCA是無監(jiān)督學(xué)習(xí)寺庄,y=None。 - fit_transform(X) 表示用數(shù)據(jù) X 訓(xùn)練PCA模型力崇,并返回降維后的數(shù)據(jù)
- transform(X) 將數(shù)據(jù) X 轉(zhuǎn)換成降維后的數(shù)據(jù)斗塘,用訓(xùn)練好的 PCA模型對新的數(shù)據(jù)集進(jìn)行降維。
- inverse_transform() 將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù)
3.2 decomposition.PCA 使用例程
from sklearn.decomposition import PCA # 導(dǎo)入 sklearn.decomposition.PCA 類
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
modelPCA = PCA(n_components=2) # 建立模型亮靴,設(shè)定保留主成分?jǐn)?shù) K=2
modelPCA.fit(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelPCA
print(modelPCA.n_components_) # 返回 PCA 模型保留的主成份個數(shù)
# 2
print(modelPCA.explained_variance_ratio_) # 返回 PCA 模型各主成份占比
# [0.9924 0.0075] # print 顯示結(jié)果
print(modelPCA.singular_values_) # 返回 PCA 模型各主成份的奇異值
# [6.3006 0.5498] # print 顯示分類結(jié)果
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
modelPCA2 = PCA(n_components=0.9) # 建立模型馍盟,設(shè)定主成份方差占比 0.9
# 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelPCA2,并返回降維后的數(shù)據(jù)
Xtrans = modelPCA2.fit_transform(X)
print(modelPCA2.n_components_) # 返回 PCA 模型保留的主成份個數(shù)
# 1
print(modelPCA2.explained_variance_ratio_) # 返回 PCA 模型各主成份占比
# [0.9924] # print 顯示結(jié)果
print(modelPCA2.singular_values_) # 返回 PCA 模型各主成份占比
# [6.3006] # print 顯示結(jié)果
print(Xtrans) # 返回降維后的數(shù)據(jù) Xtrans
# [[1.3834], [2.2219], [3.6053], [-1.3834], [-2.2219], [-3.6053]]
注意:建立模型時茧吊,PCA(n_components=2) 中的 n_components為正整數(shù)贞岭,表示設(shè)定保留的主成份維數(shù)為 2;PCA(n_components=0.9) 中的 n_components 為 (0,1] 的小數(shù)搓侄,表示并不直接設(shè)定保留的主成份維數(shù)瞄桨,而是設(shè)定保留的主成份應(yīng)滿足其方差和占比 >0.9。
3.3 改進(jìn)算法:增量主成分分析(decomposition.IncrementalPCA)
對于樣本集巨大的問題讶踪,例如樣本量大于 10萬芯侥、特征變量大于100,PCA 算法耗費的內(nèi)存很大,甚至無法處理柱查±螅
class sklearn.decomposition.IncrementalPCA 類是增量主成分分析算法的具體實現(xiàn),官網(wǎng)介紹詳見:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.IncrementalPCA.html#sklearn.decomposit
class sklearn.decomposition.IncrementalPCA(n_components=None, *, whiten=False, copy=True, batch_size=None)
主要參數(shù):
inverse_transform() 將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù)
IncrementalPCA 的使用例程如下:
# Demo of sklearn.decomposition.IncrementalPCA
from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA, PCA
from scipy import sparse
X, _ = load_digits(return_X_y=True)
print(type(X)) # <class 'numpy.ndarray'>
print(X.shape) # (1797, 64)
modelPCA = PCA(n_components=6) # 建立模型唉工,設(shè)定保留主成分?jǐn)?shù) K=6
modelPCA.fit(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelPCA
print(modelPCA.n_components_) # 返回 PCA 模型保留的主成份個數(shù)
# 6
print(modelPCA.explained_variance_ratio_) # 返回 PCA 模型各主成份占比
# [0.1489 0.1362 0.1179 0.0841 0.0578 0.0492]
print(sum(modelPCA.explained_variance_ratio_)) # 返回 PCA 模型各主成份占比
# 0.5941
print(modelPCA.singular_values_) # 返回 PCA 模型各主成份的奇異值
# [567.0066 542.2518 504.6306 426.1177 353.3350 325.8204]
# let the fit function itself divide the data into batches
Xsparse = sparse.csr_matrix(X) # 壓縮稀疏矩陣研乒,并非 IPCA 的必要步驟
print(type(Xsparse)) # <class 'scipy.sparse.csr.csr_matrix'>
print(Xsparse.shape) # (1797, 64)
modelIPCA = IncrementalPCA(n_components=6, batch_size=200)
modelIPCA.fit(Xsparse) # 訓(xùn)練模型 modelIPCA
print(modelIPCA.n_components_) # 返回 PCA 模型保留的主成份個數(shù)
# 6
print(modelIPCA.explained_variance_ratio_) # 返回 PCA 模型各主成份占比
# [0.1486 0.1357 0.1176 0.0838 0.0571 0.0409]
print(sum(modelIPCA.explained_variance_ratio_)) # 返回 PCA 模型各主成份占比
# 0.5838
print(modelIPCA.singular_values_) # 返回 PCA 模型各主成份的奇異值
#[566.4544 541.334 504.0643 425.3197 351.1096 297.0412]
本例程調(diào)用了 SKlearn內(nèi)置的數(shù)據(jù)集 .datasets.load_digits,并給出了 PCA 算法與 IPCA 算法的對比淋硝,兩種算法的結(jié)果非常接近告嘲,說明 IPCA 的性能降低很小。
3.4 改進(jìn)算法:核主成分分析(decomposition.KernelPCA)
對于線性不可分的數(shù)據(jù)集奖地,使用非線性的核函數(shù)可以把樣本空間映射到線性可分的高維空間,然后在這個高維空間進(jìn)行主成分分析赋焕。
class sklearn.decomposition.KernelPCA 類是算法的具體實現(xiàn)参歹,官網(wǎng)介紹詳見:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html#sklearn.decomposition.KernelPCA
class sklearn.decomposition.KernelPCA(n_components=None, *, kernel='linear', gamma=None, degree=3, coef0=1, kernel_params=None, alpha=1.0, fit_inverse_transform=False, eigen_solver='auto', tol=0, max_iter=None, remove_zero_eig=False, random_state=None, copy_X=True, n_jobs=None)
KernelPCA 的使用例程如下:
# Demo of sklearn.decomposition.KernelPCA
from sklearn.datasets import load_iris
from sklearn.decomposition import KernelPCA, PCA
import matplotlib.pyplot as plt
import numpy as np
X, y = load_iris(return_X_y=True)
print(type(X)) # <class 'numpy.ndarray'>
modelPCA = PCA(n_components=2) # 建立模型,設(shè)定保留主成分?jǐn)?shù) K=2
Xpca = modelPCA.fit_transform(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelKPCA
modelKpcaP = KernelPCA(n_components=2, kernel='poly') # 建立模型隆判,核函數(shù):多項式
XkpcaP = modelKpcaP.fit_transform(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelKPCA
modelKpcaR = KernelPCA(n_components=2, kernel='rbf') # 建立模型犬庇,核函數(shù):徑向基函數(shù)
XkpcaR = modelKpcaR.fit_transform(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelKPCA
modelKpcaS = KernelPCA(n_components=2, kernel='cosine') # 建立模型,核函數(shù):余弦函數(shù)
XkpcaS = modelKpcaS.fit_transform(X) # 用數(shù)據(jù)集 X 訓(xùn)練 模型 modelKPCA
fig = plt.figure(figsize=(8,6))
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
for label in np.unique(y):
position = y == label
ax1.scatter(Xpca[position, 0], Xpca[position, 1], label='target=%d' % label)
ax1.set_title('PCA')
ax2.scatter(XkpcaP[position, 0], XkpcaP[position, 1], label='target=%d' % label)
ax2.set_title('kernel= Poly')
ax3.scatter(XkpcaR[position, 0], XkpcaR[position, 1], label='target=%d' % label)
ax3.set_title('kernel= Rbf')
ax4.scatter(XkpcaS[position, 0], XkpcaS[position, 1], label='target=%d' % label)
ax4.set_title('kernel= Cosine')
plt.suptitle("KernalPCA")
plt.show()
本例程調(diào)用了 SKlearn內(nèi)置的數(shù)據(jù)集 .datasets.load_iris侨嘀,并給出了 PCA 算法與 3種核函數(shù)的KernelPCA 算法的對比臭挽,結(jié)果如下圖所示。不同算法的降維后映射到二維平面的結(jié)果有差異咬腕,進(jìn)一步的討論已經(jīng)超出本文的內(nèi)容欢峰。
版權(quán)說明:
本文內(nèi)容及例程為作者原創(chuàng),并非轉(zhuǎn)載書籍或網(wǎng)絡(luò)內(nèi)容涨共。
本文中案例問題來自:
1 SciKit-learn 官網(wǎng):https://scikit-learn.org/stable/index.html
YouCans 原創(chuàng)作品
Copyright 2021 YouCans, XUPT
Crated:2021-05-10