中文文檔: http://sklearn.apachecn.org/cn/stable/modules/decomposition.html
英文文檔: http://sklearn.apachecn.org/en/stable/modules/decomposition.html
官方文檔: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)
貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者
關於我們: http://www.apachecn.org/organization/209.html
2.5. 分解成分中的信號(矩陣分解問題)
2.5.1. 主成分分析(PCA)
2.5.1.1. 準確的PCA和概率解釋(Exact PCA and probabilistic interpretation)
PCA 用於對一組連續正交分量中的多變量數據集進行方差最大方向的分解。 在 scikit-learn 中, PCA
被實現爲一個變換對象,
通過 fit
方法可以降維成 n 個成分, 並且可以將新的數據投影(project,
亦可理解爲分解)到這些成分中。
可選參數 whiten=True
使得可以將數據投影到奇異(singular)空間上,同時將每個成分縮放到單位方差。 如果下游模型對信號的各向同性作出強烈的假設,這通常是有用的,例如,使用RBF內核的
SVM 算法和 K-Means 聚類算法。
以下是iris數據集的一個示例,該數據集包含4個特徵, 通過PCA降維後投影到方差最大的二維空間上:
可以通過在交叉驗證(cross-validation)中使用 score 方法來實現:
2.5.1.2. 增量PCA (Incremental PCA)
PCA
對象非常有用,
但對大型數據集有一定的限制。 最大的限制是 PCA
僅支持批處理,這意味着所有要處理的數據必須適合主內存。 IncrementalPCA
對象使用不同的處理形式使之允許部分計算,
這一形式幾乎和 PCA
以小型批處理方式處理數據的方法完全匹配。 IncrementalPCA
可以通過以下方式實現核外(out-of-core)主成分分析:
- 使用
partial_fit
方法從本地硬盤或網絡數據庫中以此獲取數據塊。- 通過
numpy.memmap
在一個 memory mapped file 上使用 fit 方法。
IncrementalPCA
僅存儲成分和噪聲方差的估計值,並按順序遞增地更新解釋方差比(explained_variance_ratio_)。
這就是爲什麼內存使用取決於每個批次的樣本數,而不是數據集中要處理的樣本數。
Examples:
2.5.1.3. PCA 使用隨機SVD
通過丟棄具有較低奇異值的奇異向量成分,將數據降維到低維空間並保留大部分方差是非常有意義的。
例如,如果我們使用64x64像素的灰度級圖像進行人臉識別,數據的維數爲4096, 在這樣大的數據上訓練含RBF內核的支持向量機是很慢的。 此外我們知道數據本質上的維度遠低於4096,因爲人臉的所有照片都看起來有點相似。 樣本位於許多的很低維度(例如約200維)。PCA算法可以用於線性變換數據,同時降低維數並同時保留大部分方差。
在這種情況下,使用可選參數 svd_solver='randomized'
的 PCA
是非常有用的。
因爲我們將要丟棄大部分奇異值,所以對我們將保留並實際執行變換的奇異向量進行近似估計的有限的計算更有效。
例如:以下顯示了來自 Olivetti 數據集的 16 個樣本肖像(以 0.0 爲中心)。 右側是前 16 個奇異向量重畫爲肖像。因爲我們只需要使用大小爲 和 的數據集的前 16 個奇異向量, 使得計算時間小於 1 秒。
注意:使用可選參數 svd_solver='randomized'
,在 PCA
中我們還需要給出輸入低維空間大小 n_components
。
如果我們注意到: 且 ,
對於PCA中實施的確切方式,隨機 PCA
的時間複雜度是: ,
而不是 。
對於確切的方式,隨機 PCA
的內存佔用量正比於 ,
而不是
注意:選擇參數 svd_solver='randomized'
的 PCA
,在執行 inverse_transform
時,
並不是 transform
的確切的逆變換操作(即使 參數設置爲默認的 whiten=False
)
2.5.1.4. 核 PCA
KernelPCA
是
PCA 的擴展,通過使用核方法實現非線性降維(dimensionality reduction) (參閱 成對的矩陣, 類別和核函數)。
它具有許多應用,包括去噪, 壓縮和結構化預測( structured prediction ) (kernel dependency estimation(內核依賴估計))。
KernelPCA
支持transform
和inverse_transform
。
示例:
2.5.1.5. 稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )
SparsePCA
是
PCA 的一個變體,目的是提取能最好地重建數據的稀疏組分集合。
小批量稀疏 PCA ( MiniBatchSparsePCA
)
是一個 SparsePCA
的變種,它速度更快但準確度有所降低。對於給定的迭代次數,通過迭代該組特徵的小塊來達到速度的增加。
Principal component analysis(主成分分析) (PCA
)
的缺點在於,通過該方法提取的成分具有唯一的密度表達式,即當表示爲原始變量的線性組合時,它們具有非零係數,使之難以解釋。在許多情況下,真正的基礎組件可以更自然地想象爲稀疏向量; 例如在面部識別中,每個組件可能自然地映射到面部的某個部分。
稀疏的主成分產生更簡潔、可解釋的表達式,明確強調了樣本之間的差異性來自哪些原始特徵。
以下示例說明了使用稀疏 PCA 提取 Olivetti 人臉數據集中的 16 個組分。可以看出正則化項產生了許多零。此外,數據的自然結構導致了非零係數垂直相鄰 (vertically adjacent)。該模型不會在數學上強制執行: 每個組分都是一個向量 ,除非人性化地的可視化爲 64x64 像素的圖像,否則沒有垂直相鄰性的概念。 下面顯示的組分看起來局部化(appear local)是數據的內在結構的影響,這種局部模式使重建誤差最小化。有一種考慮到鄰接性和不同結構類型的導致稀疏的規範(sparsity-inducing norms),參見 [Jen09] 對這種方法進行了解。 有關如何使用稀疏 PCA 的更多詳細信息,請參閱下面的示例部分。 更多關於 Sparse PCA 使用的內容,參見示例部分,如下:
請注意,有多種不同的計算稀疏PCA 問題的公式。 這裏使用的方法基於 [Mrl09] 。優化問題的解決是一個帶有懲罰項(L1範數的) 的一個 PCA 問題(dictionary learning(字典學習)):
導致稀疏(sparsity-inducing)的 規範也可以避免當訓練樣本很少時從噪聲中學習成分。可以通過超參數 alpha
來調整懲罰程度(從而減少稀疏度)。值較小會導致溫和的正則化因式分解,而較大的值將許多係數縮小到零。
Note
雖然本着在線算法的精神, MiniBatchSparsePCA
類不實現 partial_fit
,
因爲在線算法沿特徵方向,而不是樣本方向。
參考文獻:
[Mrl09] | “Online Dictionary Learning for Sparse Coding” J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009 |
[Jen09] | “Structured Sparse Principal Component Analysis” R. Jenatton, G. Obozinski, F. Bach, 2009 |
2.5.2. 截斷奇異值分解和隱語義分析
TruncatedSVD
實現了一個奇異值分解(SVD)的變體,它只計算 個最大的奇異值,其中 是用戶指定的參數。
當截斷的 SVD被應用於 term-document矩陣(由 CountVectorizer
或 TfidfVectorizer
返回)時,這種轉換被稱爲 latent
semantic analysis (LSA), 因爲它將這樣的矩陣轉換爲低緯度的 “semantic(語義)” 空間。 特別地是 LSA 能夠抵抗同義詞和多義詞的影響(兩者大致意味着每個單詞有多重含義),這導致 term-document 矩陣過度稀疏,並且在諸如餘弦相似性的度量下表現出差的相似性。
Note
LSA 也被稱爲隱語義索引 LSI,儘管嚴格地說它是指在持久索引(persistent indexes)中用於信息檢索的目的。
數學表示中, 訓練樣本 用截斷的SVD產生一個低秩的( low-rank)近似值 :
在這個操作之後, 是轉換後的訓練集,其中包括 個特徵(在
API 中被稱爲 n_components
)。
還需要轉換一個測試集 , 我們乘以 :
Note
自然語言處理(NLP) 和信息檢索(IR) 文獻中的 LSA 的大多數處理方式是交換矩陣 的座標軸,使其具有 n_features
× n_samples
的形狀。
我們以 scikit-learn API 相匹配的不同方式呈現 LSA, 但是找到的奇異值是相同的。
TruncatedSVD
非常類似於 PCA
,
但不同之處在於它工作在樣本矩陣 而不是它們的協方差矩陣。 當從特徵值中減去 的每列(每個特徵per-feature)的均值時,在得到的矩陣上應用
truncated SVD 相當於 PCA 。 實際上,這意味着 TruncatedSVD
轉換器(transformer)接受 scipy.sparse
矩陣,而不需要對它們進行密集(density),因爲即使對於中型大小文檔的集合,密集化
(densifying)也可能填滿內存。
雖然 TruncatedSVD
轉換器(transformer)可以在任何(稀疏的)特徵矩陣上工作,但還是建議在
LSA/document 處理設置中,在 tf–idf 矩陣上的原始頻率計數使用它。 特別地,應該打開子線性縮放(sublinear scaling)和逆文檔頻率(inverse document frequency) (sublinear_tf=True, use_idf=True
)
以使特徵值更接近於高斯分佈,補償 LSA 對文本數據的錯誤假設。
參考文獻:
- Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze (2008), Introduction to Information Retrieval, Cambridge University Press, chapter 18: Matrix decompositions & latent semantic indexing
2.5.3. 詞典學習
2.5.3.1. 帶有預計算詞典的稀疏編碼
SparseCoder
對象是一個估計器
(estimator),可以用來將信號轉換成一個固定的預計算的詞典內原子(atoms)的稀疏線性組合(sparse linear combination),如離散小波基( discrete wavelet basis ) 。 因此,該對象不實現 fit
方法。該轉換相當於一個稀疏編碼問題:
將數據的表示爲儘可能少的詞典原子的線性組合。 詞典學習的所有變體實現以下變換方法,可以通過 transform_method
初始化參數進行控制:
- Orthogonal matching pursuit(追求正交匹配) (正交匹配追蹤法(OMP))
- Least-angle regression (最小角度迴歸)(最小角迴歸)
- Lasso computed by least-angle regression(最小角度迴歸的Lasso 計算)
- Lasso using coordinate descent ( 使用座標下降的Lasso)(Lasso)
- Thresholding(閾值)
閾值方法速度非常快,但是不能產生精確的重建。 它們在分類任務的文獻中已被證明是有用的。對於圖像重建任務,追求正交匹配可以產生最精確、無偏的重建。
詞典學習對象通過 split_code
參數提供稀疏編碼結果中的正值和負值分離的可能性。當使用詞典學習來提取將用於監督學習的特徵時,這是有用的,因爲它允許學習算法將不同的權重從正加載(loading)分配給相應的負加載的特定原子。
單個樣本的分割編碼具有長度 2 * n_components
,並使用以下規則構造:
首先,計算長度爲 n_components
的常規編碼。然後, split_code
的第一個 n_components
條目將用正常編碼向量的正部分填充。分割編碼的第二部分用編碼向量的負部分填充,只有一個正號。因此,
split_code 是非負的。
2.5.3.2. 通用詞典學習
詞典學習( DictionaryLearning
)
是一個矩陣因式分解問題,相當於找到一個在擬合數據的稀疏編碼中表現良好的(通常是過完備的(overcomplete))詞典。
將數據表示爲來自過完備詞典的原子的稀疏組合被認爲是哺乳動物初級視覺皮層的工作方式。 因此,應用於圖像補丁的詞典學習已被證明在諸如圖像完成、修復和去噪,以及有監督的識別圖像處理任務中表現良好的結果。
詞典學習是通過交替更新稀疏編碼來解決的優化問題,作爲解決多個 Lasso 問題的一個解決方案,考慮到字典固定,然後更新字典以最好地適合稀疏編碼。
在使用這樣一個過程來擬合詞典之後,變換隻是一個稀疏的編碼步驟,與所有的詞典學習對象共享相同的實現。(參見 帶有預計算詞典的稀疏編碼)。
以下圖像顯示了字典學習是如何從浣熊臉部的部分圖像中提取的4x4像素圖像補丁中進行詞典學習的。
參考文獻:
- “Online dictionary learning for sparse coding” J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009
2.5.3.3. 小批量字典學習
MiniBatchDictionaryLearning
實現了更快、更適合大型數據集的字典學習算法,其運行速度更快,但準確度有所降低。
默認情況下,MiniBatchDictionaryLearning
將數據分成小批量,並通過在指定次數的迭代中循環使用小批量,以在線方式進行優化。但是,目前它沒有實現停止條件。
估計器還實現了 partial_fit
, 它通過在一個小批處理中僅迭代一次來更新字典。 當在線學習的數據從一開始就不容易獲得,或者數據超出內存時,可以使用這種迭代方法。
字典學習聚類
注意,當使用字典學習來提取表示(例如,用於稀疏編碼)時,聚類可以是學習字典的良好中間方法。 例如,MiniBatchKMeans
估計器能高效計算並使用 partial_fit
方法實現在線學習。
示例: 在線學習面部部分的字典 Online learning of a dictionary of parts of faces
2.5.4. 因子分析
在無監督的學習中,我們只有一個數據集 . 這個數據集如何在數學上描述? 的一個非常簡單的連續隱變量模型
矢量 被稱爲 “隱性的”,因爲它是不可觀察的。 被認爲是符合高斯分佈的噪聲項,平均值爲 0,協方差爲 (即 ), 是偏移向量。 這樣一個模型被稱爲 “生成的”,因爲它描述瞭如何從 生成 。 如果我們使用所有的 作爲列來形成一個矩陣 ,並將所有的 作爲矩陣 的列, 那麼我們可以寫(適當定義的 和 ):
換句話說,我們 分解 矩陣 . 如果給出 ,上述方程自動地表示以下概率解釋:
對於一個完整的概率模型,我們還需要隱變量 的先驗分佈。 最直接的假設(基於高斯分佈的良好性質)是 . 這產生一個高斯分佈作爲 的邊際分佈:
現在,在沒有任何進一步假設的前提下,隱變量 是多餘的 – 完全可以用均值和協方差來建模。 我們需要對這兩個參數之一進行更具體的構造。 一個簡單的附加假設是將誤差協方差 構造成如下:
- :
這個假設能推導出
PCA
的概率模型。 - :
這個模型稱爲
FactorAnalysis
, 一個經典的統計模型。 矩陣W有時稱爲 “因子加載矩陣”。
兩個模型基都基於高斯分佈是低階協方差矩陣的假設。 因爲這兩個模型都是概率性的,所以它們可以集成到更復雜的模型中, 例如因子分析器的混合。如果隱變量基於非高斯分佈,則得到完全不同的模型(例如, FastICA
)。
因子分析 可以 產生與 :class:`PCA`類似的成分(例如其加載矩陣的列)。 然而,這些成分沒有通用的性質(例如它們是否是正交的):
因子分析( PCA
)
的主要優點是可以獨立地對輸入空間的每個方向(異方差噪聲)的方差建模:
在異方差噪聲存在的情況下,這可以比概率 PCA 作出更好的模型選擇:
2.5.5. 獨立成分分析(ICA)
獨立分量分析將多變量信號分解爲獨立性最強的加性子組件。 它通過 Fast ICA
算法在
scikit-learn 中實現。 ICA 通常不用於降低維度,而是用於分離疊加信號。 由於 ICA 模型不包括噪聲項,因此要使模型正確,必須使用白化。 這可以在內部調節白化參數或手動使用 PCA 的一種變體。
ICA 通常用於分離混合信號(稱爲 盲源分離 的問題),如下例所示:
ICA 也可以用於具有稀疏子成分的非線性分解:
2.5.6. 非負矩陣分解(NMF 或 NNMF)
2.5.6.1. NMF 與 Frobenius 範數
NMF
[1] 是在數據和分量是非負情況下的另一種降維方法。
在數據矩陣不包含負值的情況下,可以插入 NMF
而不是 PCA
或其變體。
通過優化 與矩陣乘積 之間的距離 ,可以將樣本 分解爲兩個非負矩陣 和 。
最廣泛使用的距離函數是 Frobenius 平方範數,它是歐幾里德範數到矩陣的推廣:
與 PCA
不同,通過疊加分量而不減去,以加法方式獲得向量的表示。這種加性模型對於表示圖像和文本是有效的。
[Hoyer, 2004] [2] 研究表明,當處於一定約束時,NMF
可以產生數據集基於某子部分的表示,從而獲得可解釋的模型。
以下示例展示了與 PCA 特徵面相比, NMF
從
Olivetti 面部數據集中的圖像中發現的16個稀疏組件。
Unlike PCA
,
the representation of a vector is obtained in an additive fashion, by superimposing the components, without subtracting. Such additive models are efficient for representing images and text.
init
屬性確定了應用的初始化方法,這對方法的性能有很大的影響。 NMF
實現了非負雙奇異值分解方法。NNDSVD [4] 基於兩個
SVD 過程,一個近似數據矩陣, 使用單位秩矩陣的代數性質,得到的部分SVD因子的其他近似正部分。 基本的 NNDSVD 算法更適合稀疏分解。其變體 NNDSVDa(全部零值替換爲所有元素的平均值)和 NNDSVDar(零值替換爲比數據平均值除以100小的隨機擾動)在稠密情況時推薦使用。
請注意,乘法更新 (‘mu’) 求解器無法更新初始化中存在的零,因此當與引入大量零的基本 NNDSVD 算法聯合使用時, 會導致較差的結果; 在這種情況下,應優先使用 NNDSVDa 或 NNDSVDar。
也可以通過設置 init="random"
,使用正確縮放的隨機非負矩陣初始化 NMF
。
整數種子或 RandomState
也可以傳遞給 random_state
以控制重現性。
在 NMF
中,L1
和 L2 先驗可以被添加到損失函數中以使模型正規化。 L2 先驗使用 Frobenius 範數,而L1 先驗使用 L1 範數。與 ElasticNet
一樣,
我們通過 l1_ratio
()
參數和正則化強度參數 alpha
()
來控制 L1 和 L2 的組合。那麼先驗項是:
正則化目標函數爲:
NMF
正則化
W 和 H . 公共函數 non_negative_factorization
允許通過 regularization
屬性進行更精細的控制,將
僅W ,僅H 或兩者正規化。
2.5.6.2. 具有 beta-divergence 的 NMF
如前所述,最廣泛使用的距離函數是平方 Frobenius 範數,這是歐幾里得範數到矩陣的推廣:
其他距離函數可用於 NMF,例如(廣義) Kullback-Leibler(KL) 散度,也稱爲 I-divergence:
或者, Itakura-Saito(IS) divergence:
這三個距離函數是 beta-divergence 函數族的特殊情況,其參數分別爲 [6] 。 beta-divergence 定義如下:
請注意,在 上定義無效,僅僅在 和 的上可以分別連續擴展。
NMF
使用
Coordinate Descent (‘cd’) [5] 和乘法更新 (‘mu’) [6] 來實現兩個求解器。
‘mu’ 求解器可以優化每個 beta-divergence,包括 Frobenius 範數 ()
, (廣義) Kullback-Leibler divergence ()
和Itakura-Saito divergence(beta = 0) )。 請注意,對於 ,’mu’
求解器明顯快於 的其他值。 還要注意,使用負數(或0,即 ‘itakura-saito’
) ,輸入矩陣不能包含零值。
‘cd’ 求解器只能優化 Frobenius 範數。由於 NMF 的潛在非凸性,即使優化相同的距離函數, 不同的求解器也可能會收斂到不同的最小值。
NMF最適用於 fit_transform
方法,該方法返回矩陣W.矩陣 H 被 components_
屬性中存儲到擬合模型中;
方法 transform
將基於這些存儲的組件分解新的矩陣 X_new:
示例:
參考文獻:
[1] | “Learning the parts of objects by non-negative matrix factorization” D. Lee, S. Seung, 1999 |
[2] | “Non-negative Matrix Factorization with Sparseness Constraints” P. Hoyer, 2004 |
[4] | “SVD based initialization: A head start for nonnegative matrix factorization” C. Boutsidis, E. Gallopoulos, 2008 |
[5] | “Fast local algorithms for large scale nonnegative matrix and tensor factorizations.” A. Cichocki, P. Anh-Huy, 2009 |
[6] | (1, 2) “Algorithms for nonnegative matrix factorization with the beta-divergence” C. Fevotte, J. Idier, 2011 |
2.5.7. 隱 Dirichlet 分配(LDA)
隱 Dirichlet 分配是離散數據集(如文本語料庫)的集合的生成概率模型。 它也是一個主題模型,用於從文檔集合中發現抽象主題。
LDA 的圖形模型是一個三層貝葉斯模型:
當建模文本語料庫時,該模型假設具有 文檔和 主題的語料庫的以下生成過程:
- 對於每個主題 ,繪製
- 對於每個文檔 ,繪製
- 對於文檔 中的每個單詞 :
- 繪製主題索引
- 繪製觀察詞
對於參數估計,後驗分佈爲:
由於後驗分佈難以處理,變體貝葉斯方法使用更簡單的分佈 近似, 並且優化了這些變體參數 , , 最大化Evidence Lower Bound (ELBO):
最大化 ELBO 相當於最小化 和後驗 之間的 Kullback-Leibler(KL) 散度。
LatentDirichletAllocation
實現在線變體貝葉斯算法,支持在線和批量更新方法。
批處理方法在每次完全傳遞數據後更新變分變量,在線方法從小批量數據點中更新變體變量。
Note
雖然在線方法保證收斂到局部最優點,最優點的質量和收斂速度可能取決於與小批量大小和學習率相關的屬性。
當 LatentDirichletAllocation
應用於
“document-term” 矩陣時,矩陣將被分解爲 “topic-term” 矩陣和 “document-topic” 矩陣。 雖然 “topic-term” 矩陣在模型中被存儲爲 components_
,但是可以通過 transform
方法計算
“document-topic” 矩陣。
LatentDirichletAllocation
還實現了 partial_fit
方法。這可用於當數據被順序提取時.
參考:
- “Latent Dirichlet Allocation” D. Blei, A. Ng, M. Jordan, 2003
- “Online Learning for Latent Dirichlet Allocation” M. Hoffman, D. Blei, F. Bach, 2010
- “Stochastic Variational Inference” M. Hoffman, D. Blei, C. Wang, J. Paisley, 2013
中文文檔: http://sklearn.apachecn.org/cn/stable/modules/decomposition.html
英文文檔: http://sklearn.apachecn.org/en/stable/modules/decomposition.html
官方文檔: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)
貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者
關於我們: http://www.apachecn.org/organization/209.html
有興趣的們也可以和我們一起來維護,持續更新中 。。。
機器學習交流羣: 629470233