在實際的應用中,有時候我們會遇到數據的維度太少,我們需要新生成新的維度,可以用我們之前的分享( 如何自動化進行特征工程 );有時候維度太多,這時候我們就需要降維了。降維的方法有許多,我們這裏介紹了sklearn中介紹的7種,供大家學習和收藏。
主成分分析(PCA)用於將多維的數據集分解為壹組具有最大方差的連續正交分量。在sklearn這個包中,PCA是壹個transformer對象,使用fit方法可以選擇前n個主成分,並且用於投射到新的數據中。
PCA有兩種實現方式,壹種是特征值分解去實現,壹種是奇異值分解去實現。特征值分解是壹個提取矩陣特征很不錯的方法,但是它只是對方陣而言的,如果不使用SVD,PCA只會尋找每個特征的中心,但並不會對數據進行縮放(scaled)。使用參數whiten=True ,可以將數據投射到奇異空間中,並且將每個組分縮放到方差為1,這個對於後續分析中,假設每個特征是isotropy 是很有幫助的,例如SVM和Kmeans聚類。
PCA不僅僅是對高維數據進行降維,更重要的是經過降維去除了噪聲,發現了數據中的模式。PCA把原先的n個特征用數目更少的m個特征取代,新特征是舊特征的線性組合,這些線性組合最大化樣本方差,盡量使新的m個特征互不相關。
SVD是壹種矩陣分解法,把壹個大矩陣分解成易於處理的形式,這種形式可能是兩個或多個矩陣的乘積。
參數
例子2:獲取每個主成分與特征的關系
PCA雖然很有用,但是需要將數據全部都存入內存,因此當當要分解的數據集太大,會導致內存很大。這時候,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代,可以通過部分計算的方式,獲得跟PCA壹樣的結果。
IPCA使用與輸入數據樣本數無關的內存量為輸入數據建立低秩近似。它仍然依賴於輸入數據功能,但更改批量大小可以控制內存使用量。
該函數,增加了壹個batch_size的參數,用來控制批次,其余都壹樣,至此不再贅述。
實例
對於大型矩陣的分解,我們往往會想到用SVD算法。然而當矩陣的維數與奇異值個數k上升到壹定程度時,SVD分解法往往因為內存溢出而失敗。因此,Randomized SVD算法,相比於SVD,它更能適應大型矩陣分解的要求,且速度更快。
此外,在某些場景下,我們期望丟掉某些lower sigular values,來達到減少噪音,保留盡可能多的方差,從而達到更好的預測效果。比如人臉的識別,如果是64X64的像素,那麽整個維度有4096個。我們利用這個方法,可以保留重要的維度,從而利於後續的分析。
使用 svd_solver='randomized' 可以實現隨機化的SVD,來去掉部分的奇異矩陣。
主成分分析(Principal Components Analysis, PCA)適用於數據的線性降維。而核主成分分析(Kernel PCA,KPCA)可實現數據的非線性降維,用於處理線性不可分的數據集。kernel的選擇有 {'linear', 'poly', 'rbf', 'sigmoid', 'cosine', 'precomputed'},默認是'linear'。
詳細說明見官方說明,與普通的PCA差不多。
SparsePCA 期望找到壹組可以最優地重構數據的稀疏主成分。稀疏性的大小由參數alpha給出的L1懲罰系數來控制。Mini-batch sparse PCA是sparsePCA的變種,提高了速度,但是降低了精度。
主成分分析(PCA)的缺點是,該方法提取的成分是壹種密集表達式,即用原始變量的線性組合表示時,它們的系數是非零的。這可能會使解釋模型變得困難。在許多情況下,真實的基礎分量可以更自然地想象為稀疏向量;例如,在人臉識別中,主成分會只包含部分的圖像,映射到人臉的某些部分。稀疏主成分產生了壹種更簡潔的、可解釋的表示,清楚地強調是哪些原始特征導致了樣本之間的差異。
通過調節alpha來調整懲罰度,alpha越大,越導致許多系數為0。
TruncatedSVD是普通SVD的壹個變種,只計算用戶指定的前K個奇異值。TSVD通常用於語義分析中,是LSA的其中的壹部分,可以解決壹詞多義和壹義多詞的問題。
LSA潛在語義分析的目的,就是要找出詞(terms)在文檔和查詢中真正的含義,也就是潛在語義,從而解決上節所描述的問題。具體說來就是對壹個大型的文檔集合使用壹個合理的維度建模,並將詞和文檔都表示到該空間,比如有2000個文檔,包含7000個索引詞,LSA使用壹個維度為100的向量空間將文檔和詞表示到該空間,進而在該空間進行信息檢索。而將文檔表示到此空間的過程就是SVD奇異值分解和降維的過程。降維是LSA分析中最重要的壹步,通過降維,去除了文檔中的“噪音”,也就是無關信息(比如詞的誤用或不相關的詞偶爾出現在壹起),語義結構逐漸呈現。相比傳統向量空間,潛在語義空間的維度更小,語義關系更明確。
使用例子如下:
用事先預定義好的字典來對矩陣進行稀疏化編碼,達到降維和簡化的目的。就像人類的所有語言都是由單詞組成壹樣,因此使用已知的詞典可以減少維度;其次,稀疏化可以減少計算的成本,讓後續的計算更快。
這個對象沒有fit的方法,transformation方法會將數據表示為盡可能少的字典原子的線性組合。可以用transform_method來控制初始化參數,有以下幾種:
使用的函數為sklearn.decomposition.DictionaryLearning,會找到壹個可以將fitted data足夠好稀疏化的字典。
將數據表示為壹個overcomplete的字典這個過程,同大腦處理數據的過程類似。這個方法在圖像補丁的字典學習已被證明在諸如圖像完成、修復和去噪以及監督識別任務的圖像處理任務中給出良好的結果。
使用函數為sklearn.decomposition.MiniBatchDictionaryLearning,是壹種快速的,但是精確度降低的版本,適應於大數據集合。
默認情況下,MiniBatchDictionaryLearning將數據分成小批量,並通過在指定次數的叠代中循環使用小批量,以在線方式進行優化。但是,目前它沒有退出叠代的停止條件。也可以用partial_fit來實現小批次的fit。
從變量中提取***性因子。
因子分析要求原有變量間具有較強的相關性,否則,因子分析無法提取變量間的***性特征,如果相關系數小於0.3,則變量間的***線性較小,不適合因子分析;因子分析得到因子和原變量的關系,因此能夠對因子進行解釋。
因子分析可以產生與 PCA 相似的特征(載荷矩陣的列)。不過,不能對這些特征做出任何壹般性的說明(例如他們是否正交)。
使用的函數為sklearn.decomposition.FactorAnalysis。
使用的函數為sklearn.decomposition.FastICA,ICA可以提取出壹系列的主成分,彼此最大的獨立。因此,ICA壹般不用於降維,而用於區分疊加信號。ICA不考慮noise,為了使模型正確,必須使用whitening,可以使用whiten這個參數。
ICA 通常用於分離混合信號(稱為盲源分離的問題),也可以作為壹種非線性降維方法,可以找到具有壹些稀疏性的特征。
主成分分析假設源信號間彼此非相關,獨立成分分析假設源信號間彼此獨立。
主成分分析認為主元之間彼此正交,樣本呈高斯分布;獨立成分分析則不要求樣本呈高斯分布。
非負矩陣分解,顧名思義就是,將非負的大矩陣分解成兩個非負的小矩陣。在數據矩陣不包含負值的情況下,應用NMF而不是PCA或其變體。
NMF可以產生可以代表數據的主成分,從而可以來解釋整個模型。
參數init,可以用來選擇初始化的方法,不同的方法對結果會有不同的表現。
在PCA處理中,假使將特征降維為600個,那麽降維後的每個人臉都包含了600個特征(所以我們看到降維後的人臉有種“伏地魔”的感覺 ,這是因為降維處理相當於刪去了部分細節特征,導致壹部分信息丟失,在圖片中最直觀的體現就是變模糊)。而在NMF的處理中,這1000個特征相當於是被分離了。相當於,壹張人臉是由鼻子、耳朵等這些獨立的特征疊加出來的。
LDA是文檔主題生成模型,對離散數據集(如文本語料庫)的集合的生成概率模型。它也是壹個主題模型,用於從文檔集合中發現抽象主題。LDA是壹種非監督機器學習技術,可以用來識別大規模文檔集(document collection)或語料庫(corpus)中潛藏的主題信息。
sklearn.decomposition.LatentDirichletAllocation是用於進行LDA的函數。
1、 blogs.com/eczhou/p/5433856.html
7、 /p/e90900a3d03a