# 2.5. 分解成分中的信號(矩陣分解問題)
校驗者:
[@武器大師一個挑倆](https://github.com/apachecn/scikit-learn-doc-zh)
[@png](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@檸檬](https://github.com/apachecn/scikit-learn-doc-zh)
[@片刻](https://github.com/apachecn/scikit-learn-doc-zh)
## 2.5.1. 主成分分析(PCA)
### 2.5.1.1. 準確的PCA和概率解釋(Exact PCA and probabilistic interpretation)
PCA 用于對一組連續正交分量中的多變量數據集進行方差最大方向的分解。 在 scikit-learn 中, [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 被實現為一個變換對象, 通過 `fit` 方法可以降維成 n 個成分, 并且可以將新的數據投影(project, 亦可理解為分解)到這些成分中。
可選參數 `whiten=True` 使得可以將數據投影到奇異(singular)空間上,同時將每個成分縮放到單位方差。 如果下游模型對信號的各向同性作出強烈的假設,這通常是有用的,例如,使用RBF內核的 SVM 算法和 K-Means 聚類算法。
以下是iris數據集的一個示例,該數據集包含4個特征, 通過PCA降維后投影到方差最大的二維空間上:
[`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 對象還提供了 PCA 的概率解釋, 其可以基于其解釋的方差量給出數據的可能性。
可以通過在交叉驗證(cross-validation)中使用 score 方法來實現:
[](../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html)
例子:
- [Comparison of LDA and PCA 2D projection of Iris dataset](../auto_examples/decomposition/plot_pca_vs_lda.html#sphx-glr-auto-examples-decomposition-plot-pca-vs-lda-py)
- [Model selection with Probabilistic PCA and Factor Analysis (FA)](../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html#sphx-glr-auto-examples-decomposition-plot-pca-vs-fa-model-selection-py)
### 2.5.1.2. 增量PCA (Incremental PCA)
[`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 對象非常有用, 但對大型數據集有一定的限制。 最大的限制是 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 僅支持批處理,這意味著所有要處理的數據必須適合主內存。 [`IncrementalPCA`](generated/sklearn.decomposition.IncrementalPCA.html#sklearn.decomposition.IncrementalPCA "sklearn.decomposition.IncrementalPCA") 對象使用不同的處理形式使之允許部分計算, 這一形式幾乎和 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 以小型批處理方式處理數據的方法完全匹配。 [`IncrementalPCA`](generated/sklearn.decomposition.IncrementalPCA.html#sklearn.decomposition.IncrementalPCA "sklearn.decomposition.IncrementalPCA") 可以通過以下方式實現核外(out-of-core)主成分分析:
> - 使用 `partial_fit` 方法從本地硬盤或網絡數據庫中以此獲取數據塊。
> - 通過 `numpy.memmap` 在一個 memory mapped file 上使用 fit 方法。
>
> [`IncrementalPCA`](generated/sklearn.decomposition.IncrementalPCA.html#sklearn.decomposition.IncrementalPCA "sklearn.decomposition.IncrementalPCA") 僅存儲成分和噪聲方差的估計值,并按順序遞增地更新解釋方差比([explained\_variance\_ratio\_](#id28))。
這就是為什么內存使用取決于每個批次的樣本數,而不是數據集中要處理的樣本數。
[](../auto_examples/decomposition/plot_incremental_pca.html)
[](../auto_examples/decomposition/plot_incremental_pca.html)
Examples:
- [Incremental PCA](../auto_examples/decomposition/plot_incremental_pca.html#sphx-glr-auto-examples-decomposition-plot-incremental-pca-py)
### 2.5.1.3. PCA 使用隨機SVD
通過丟棄具有較低奇異值的奇異向量成分,將數據降維到低維空間并保留大部分方差是非常有意義的。
例如,如果我們使用64x64像素的灰度級圖像進行人臉識別,數據的維數為4096, 在這樣大的數據上訓練含RBF內核的支持向量機是很慢的。 此外我們知道數據本質上的維度遠低于4096,因為人臉的所有照片都看起來有點相似。 樣本位于許多的很低維度(例如約200維)。PCA算法可以用于線性變換數據,同時降低維數并同時保留大部分方差。
在這種情況下,使用可選參數 `svd_solver='randomized'` 的 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 是非常有用的。 因為我們將要丟棄大部分奇異值,所以對我們將保留并實際執行變換的奇異向量進行近似估計的有限的計算更有效。
例如:以下顯示了來自 Olivetti 數據集的 16 個樣本肖像(以 0.0 為中心)。 右側是前 16 個奇異向量重畫為肖像。因為我們只需要使用大小為 和  的數據集的前 16 個奇異向量, 使得計算時間小于 1 秒。
**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
注意:使用可選參數 `svd_solver='randomized'` ,在 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 中我們還需要給出輸入低維空間大小 `n_components` 。
如果我們注意到:  且 , 對于PCA中實施的確切方式,隨機 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 的時間復雜度是: , 而不是  。
對于確切的方式,隨機 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 的內存占用量正比于  , 而不是 
注意:選擇參數 `svd_solver='randomized'` 的 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA"),在執行 `inverse_transform` 時, 并不是 `transform` 的確切的逆變換操作(即使 參數設置為默認的 `whiten=False`)
例子:
- [Faces recognition example using eigenfaces and SVMs](../auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py)
- [Faces dataset decompositions](../auto_examples/decomposition/plot_faces_decomposition.html#sphx-glr-auto-examples-decomposition-plot-faces-decomposition-py)
參考文獻:
- [“Finding structure with randomness: Stochastic algorithms for constructing approximate matrix decompositions”](http://arxiv.org/abs/0909.4061)Halko, et al., 2009
### 2.5.1.4. 核 PCA
[`KernelPCA`](generated/sklearn.decomposition.KernelPCA.html#sklearn.decomposition.KernelPCA "sklearn.decomposition.KernelPCA") 是 PCA 的擴展,通過使用核方法實現非線性降維(dimensionality reduction) (參閱 [成對的矩陣, 類別和核函數](metrics.html#metrics))。 它具有許多應用,包括去噪, 壓縮和結構化預測( structured prediction ) (kernel dependency estimation(內核依賴估計))。
> [`KernelPCA`](generated/sklearn.decomposition.KernelPCA.html#sklearn.decomposition.KernelPCA "sklearn.decomposition.KernelPCA") 支持 `transform` 和 `inverse_transform` 。
[](../auto_examples/decomposition/plot_kernel_pca.html)
示例:
- [Kernel PCA](../auto_examples/decomposition/plot_kernel_pca.html#sphx-glr-auto-examples-decomposition-plot-kernel-pca-py)
### 2.5.1.5. 稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )
[`SparsePCA`](generated/sklearn.decomposition.SparsePCA.html#sklearn.decomposition.SparsePCA "sklearn.decomposition.SparsePCA") 是 PCA 的一個變體,目的是提取能最好地重建數據的稀疏組分集合。
小批量稀疏 PCA ( [`MiniBatchSparsePCA`](generated/sklearn.decomposition.MiniBatchSparsePCA.html#sklearn.decomposition.MiniBatchSparsePCA "sklearn.decomposition.MiniBatchSparsePCA") ) 是一個 [`SparsePCA`](generated/sklearn.decomposition.SparsePCA.html#sklearn.decomposition.SparsePCA "sklearn.decomposition.SparsePCA") 的變種,它速度更快但準確度有所降低。對于給定的迭代次數,通過迭代該組特征的小塊來達到速度的增加。
Principal component analysis(主成分分析) ([`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA")) 的缺點在于,通過該方法提取的成分具有唯一的密度表達式,即當表示為原始變量的線性組合時,它們具有非零系數,使之難以解釋。在許多情況下,真正的基礎組件可以更自然地想象為稀疏向量; 例如在面部識別中,每個組件可能自然地映射到面部的某個部分。
稀疏的主成分產生更簡潔、可解釋的表達式,明確強調了樣本之間的差異性來自哪些原始特征。
以下示例說明了使用稀疏 PCA 提取 Olivetti 人臉數據集中的 16 個組分。可以看出正則化項產生了許多零。此外,數據的自然結構導致了非零系數垂直相鄰 (vertically adjacent)。該模型不會在數學上強制執行: 每個組分都是一個向量 ,除非人性化地的可視化為 64x64 像素的圖像,否則沒有垂直相鄰性的概念。 下面顯示的組分看起來局部化(appear local)是數據的內在結構的影響,這種局部模式使重建誤差最小化。有一種考慮到鄰接性和不同結構類型的導致稀疏的規范(sparsity-inducing norms),參見 [\[Jen09\]](#jen09) 對這種方法進行了解。 有關如何使用稀疏 PCA 的更多詳細信息,請參閱下面的示例部分。 更多關于 Sparse PCA 使用的內容,參見示例部分,如下:
**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
請注意,有多種不同的計算稀疏PCA 問題的公式。 這里使用的方法基于 [\[Mrl09\]](#mrl09) 。優化問題的解決是一個帶有懲罰項(L1范數的)  的一個 PCA 問題(dictionary learning(字典學習)):

導致稀疏(sparsity-inducing)的  規范也可以避免當訓練樣本很少時從噪聲中學習成分。可以通過超參數 `alpha` 來調整懲罰程度(從而減少稀疏度)。值較小會導致溫和的正則化因式分解,而較大的值將許多系數縮小到零。
Note
雖然本著在線算法的精神, [`MiniBatchSparsePCA`](generated/sklearn.decomposition.MiniBatchSparsePCA.html#sklearn.decomposition.MiniBatchSparsePCA "sklearn.decomposition.MiniBatchSparsePCA") 類不實現 `partial_fit` , 因為在線算法沿特征方向,而不是樣本方向。
示例:
- [Faces dataset decompositions](../auto_examples/decomposition/plot_faces_decomposition.html#sphx-glr-auto-examples-decomposition-plot-faces-decomposition-py)
參考文獻:
[\[Mrl09\]](#id5)[“Online Dictionary Learning for Sparse Coding”](http://www.di.ens.fr/sierra/pdfs/icml09.pdf)J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009[\[Jen09\]](#id4)[“Structured Sparse Principal Component Analysis”](www.di.ens.fr/~fbach/sspca_AISTATS2010.pdf)R. Jenatton, G. Obozinski, F. Bach, 2009
## 2.5.2. 截斷奇異值分解和隱語義分析
[`TruncatedSVD`](generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD "sklearn.decomposition.TruncatedSVD") 實現了一個奇異值分解(SVD)的變體,它只計算  個最大的奇異值,其中  是用戶指定的參數。
當截斷的 SVD被應用于 term-document矩陣(由 `CountVectorizer` 或 `TfidfVectorizer` 返回)時,這種轉換被稱為 [latent semantic analysis](http://nlp.stanford.edu/IR-book/pdf/18lsi.pdf) (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`](generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD "sklearn.decomposition.TruncatedSVD") 非常類似于 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA"), 但不同之處在于它工作在樣本矩陣  而不是它們的協方差矩陣。 當從特征值中減去  的每列(每個特征per-feature)的均值時,在得到的矩陣上應用 truncated SVD 相當于 PCA 。 實際上,這意味著 [`TruncatedSVD`](generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD "sklearn.decomposition.TruncatedSVD") 轉換器(transformer)接受 `scipy.sparse` 矩陣,而不需要對它們進行密集(density),因為即使對于中型大小文檔的集合,密集化 (densifying)也可能填滿內存。
雖然 [`TruncatedSVD`](generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD "sklearn.decomposition.TruncatedSVD") 轉換器(transformer)可以在任何(稀疏的)特征矩陣上工作,但還是建議在 LSA/document 處理設置中,在 tf–idf 矩陣上的原始頻率計數使用它。 特別地,應該打開子線性縮放(sublinear scaling)和逆文檔頻率(inverse document frequency) (`sublinear_tf=True, use_idf=True`) 以使特征值更接近于高斯分布,補償 LSA 對文本數據的錯誤假設。
示例:
- [Clustering text documents using k-means](../auto_examples/text/document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py)
參考文獻:
- Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze (2008), *Introduction to Information Retrieval*, Cambridge University Press, chapter 18: [Matrix decompositions & latent semantic indexing](http://nlp.stanford.edu/IR-book/pdf/18lsi.pdf)
## 2.5.3. 詞典學習
### 2.5.3.1. 帶有預計算詞典的稀疏編碼
[`SparseCoder`](generated/sklearn.decomposition.SparseCoder.html#sklearn.decomposition.SparseCoder "sklearn.decomposition.SparseCoder") 對象是一個估計器 (estimator),可以用來將信號轉換成一個固定的預計算的詞典內原子(atoms)的稀疏線性組合(sparse linear combination),如離散小波基( discrete wavelet basis ) 。 因此,該對象不實現 `fit` 方法。該轉換相當于一個稀疏編碼問題: 將數據的表示為盡可能少的詞典原子的線性組合。 詞典學習的所有變體實現以下變換方法,可以通過 `transform_method` 初始化參數進行控制:
- Orthogonal matching pursuit(追求正交匹配) ([正交匹配追蹤法(OMP)](linear_model.html#omp))
- Least-angle regression (最小角度回歸)([最小角回歸](linear_model.html#least-angle-regression))
- Lasso computed by least-angle regression(最小角度回歸的Lasso 計算)
- Lasso using coordinate descent ( 使用坐標下降的Lasso)([Lasso](linear_model.html#lasso))
- Thresholding(閾值)
閾值方法速度非常快,但是不能產生精確的重建。 它們在分類任務的文獻中已被證明是有用的。對于圖像重建任務,追求正交匹配可以產生最精確、無偏的重建。
詞典學習對象通過 `split_code` 參數提供稀疏編碼結果中的正值和負值分離的可能性。當使用詞典學習來提取將用于監督學習的特征時,這是有用的,因為它允許學習算法將不同的權重從正加載(loading)分配給相應的負加載的特定原子。
單個樣本的分割編碼具有長度 `2 * n_components` ,并使用以下規則構造: 首先,計算長度為 `n_components` 的常規編碼。然后, `split_code` 的第一個 `n_components` 條目將用正常編碼向量的正部分填充。分割編碼的第二部分用編碼向量的負部分填充,只有一個正號。因此, split\_code 是非負的。
示例:
- [Sparse coding with a precomputed dictionary](../auto_examples/decomposition/plot_sparse_coding.html#sphx-glr-auto-examples-decomposition-plot-sparse-coding-py)
### 2.5.3.2. 通用詞典學習
詞典學習( [`DictionaryLearning`](generated/sklearn.decomposition.DictionaryLearning.html#sklearn.decomposition.DictionaryLearning "sklearn.decomposition.DictionaryLearning") ) 是一個矩陣因式分解問題,相當于找到一個在擬合數據的稀疏編碼中表現良好的(通常是過完備的(overcomplete))詞典。
將數據表示為來自過完備詞典的原子的稀疏組合被認為是哺乳動物初級視覺皮層的工作方式。 因此,應用于圖像補丁的詞典學習已被證明在諸如圖像完成、修復和去噪,以及有監督的識別圖像處理任務中表現良好的結果。
詞典學習是通過交替更新稀疏編碼來解決的優化問題,作為解決多個 Lasso 問題的一個解決方案,考慮到字典固定,然后更新字典以最好地適合稀疏編碼。

**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
在使用這樣一個過程來擬合詞典之后,變換只是一個稀疏的編碼步驟,與所有的詞典學習對象共享相同的實現。(參見 [帶有預計算詞典的稀疏編碼](#sparsecoder))。
以下圖像顯示了字典學習是如何從浣熊臉部的部分圖像中提取的4x4像素圖像補丁中進行詞典學習的。
[](../auto_examples/decomposition/plot_image_denoising.html)
示例:
- [Image denoising using dictionary learning](../auto_examples/decomposition/plot_image_denoising.html#sphx-glr-auto-examples-decomposition-plot-image-denoising-py)
參考文獻:
- [“Online dictionary learning for sparse coding”](http://www.di.ens.fr/sierra/pdfs/icml09.pdf)J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009
### 2.5.3.3. 小批量字典學習
[`MiniBatchDictionaryLearning`](generated/sklearn.decomposition.MiniBatchDictionaryLearning.html#sklearn.decomposition.MiniBatchDictionaryLearning "sklearn.decomposition.MiniBatchDictionaryLearning") 實現了更快、更適合大型數據集的字典學習算法,其運行速度更快,但準確度有所降低。
默認情況下,[`MiniBatchDictionaryLearning`](generated/sklearn.decomposition.MiniBatchDictionaryLearning.html#sklearn.decomposition.MiniBatchDictionaryLearning "sklearn.decomposition.MiniBatchDictionaryLearning") 將數據分成小批量,并通過在指定次數的迭代中循環使用小批量,以在線方式進行優化。但是,目前它沒有實現停止條件。
估計器還實現了 `partial_fit`, 它通過在一個小批處理中僅迭代一次來更新字典。 當在線學習的數據從一開始就不容易獲得,或者數據超出內存時,可以使用這種迭代方法。
[](../auto_examples/cluster/plot_dict_face_patches.html)**字典學習聚類**
注意,當使用字典學習來提取表示(例如,用于稀疏編碼)時,聚類可以是學習字典的良好中間方法。 例如,[`MiniBatchKMeans`](generated/sklearn.cluster.MiniBatchKMeans.html#sklearn.cluster.MiniBatchKMeans "sklearn.cluster.MiniBatchKMeans") 估計器能高效計算并使用 `partial_fit` 方法實現在線學習。
示例: 在線學習面部部分的字典 [Online learning of a dictionary of parts of faces](../auto_examples/cluster/plot_dict_face_patches.html#sphx-glr-auto-examples-cluster-plot-dict-face-patches-py)
## 2.5.4. 因子分析
在無監督的學習中,我們只有一個數據集 . 這個數據集如何在數學上描述?  的一個非常簡單的連續隱變量模型

矢量  被稱為 “隱性的”,因為它是不可觀察的。  被認為是符合高斯分布的噪聲項,平均值為 0,協方差為  (即 ),  是偏移向量。 這樣一個模型被稱為 “生成的”,因為它描述了如何從  生成  。 如果我們使用所有的  作為列來形成一個矩陣  ,并將所有的  作為矩陣  的列, 那么我們可以寫(適當定義的  和  ):

換句話說,我們 *分解* 矩陣 . 如果給出 ,上述方程自動地表示以下概率解釋:

對于一個完整的概率模型,我們還需要隱變量  的先驗分布。 最直接的假設(基于高斯分布的良好性質)是 . 這產生一個高斯分布作為  的邊際分布:

現在,在沒有任何進一步假設的前提下,隱變量  是多余的 –  完全可以用均值和協方差來建模。 我們需要對這兩個參數之一進行更具體的構造。 一個簡單的附加假設是將誤差協方差  構造成如下:
- : 這個假設能推導出 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 的概率模型。
- : 這個模型稱為 [`FactorAnalysis`](generated/sklearn.decomposition.FactorAnalysis.html#sklearn.decomposition.FactorAnalysis "sklearn.decomposition.FactorAnalysis"), 一個經典的統計模型。 矩陣W有時稱為 “因子加載矩陣”。
兩個模型基都基于高斯分布是低階協方差矩陣的假設。 因為這兩個模型都是概率性的,所以它們可以集成到更復雜的模型中, 例如因子分析器的混合。如果隱變量基于非高斯分布,則得到完全不同的模型(例如, [`FastICA`](generated/sklearn.decomposition.FastICA.html#sklearn.decomposition.FastICA "sklearn.decomposition.FastICA") )。
因子分析 *可以* 產生與 :class:[`](#id13)PCA`類似的成分(例如其加載矩陣的列)。 然而,這些成分沒有通用的性質(例如它們是否是正交的):
**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
因子分析( [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") ) 的主要優點是可以獨立地對輸入空間的每個方向(異方差噪聲)的方差建模:
[](../auto_examples/decomposition/plot_faces_decomposition.html)
在異方差噪聲存在的情況下,這可以比概率 PCA 作出更好的模型選擇:
[](../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html)
示例:
- [Model selection with Probabilistic PCA and Factor Analysis (FA)](../auto_examples/decomposition/plot_pca_vs_fa_model_selection.html#sphx-glr-auto-examples-decomposition-plot-pca-vs-fa-model-selection-py)
## 2.5.5. 獨立成分分析(ICA)
獨立分量分析將多變量信號分解為獨立性最強的加性子組件。 它通過 [`Fast ICA`](generated/sklearn.decomposition.FastICA.html#sklearn.decomposition.FastICA "sklearn.decomposition.FastICA") 算法在 scikit-learn 中實現。 ICA 通常不用于降低維度,而是用于分離疊加信號。 由于 ICA 模型不包括噪聲項,因此要使模型正確,必須使用白化。 這可以在內部調節白化參數或手動使用 PCA 的一種變體。
ICA 通常用于分離混合信號(稱為 *盲源分離* 的問題),如下例所示:
[](../auto_examples/decomposition/plot_ica_blind_source_separation.html)
ICA 也可以用于具有稀疏子成分的非線性分解:
**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
示例:
- [Blind source separation using FastICA](../auto_examples/decomposition/plot_ica_blind_source_separation.html#sphx-glr-auto-examples-decomposition-plot-ica-blind-source-separation-py)
- [FastICA on 2D point clouds](../auto_examples/decomposition/plot_ica_vs_pca.html#sphx-glr-auto-examples-decomposition-plot-ica-vs-pca-py)
- [Faces dataset decompositions](../auto_examples/decomposition/plot_faces_decomposition.html#sphx-glr-auto-examples-decomposition-plot-faces-decomposition-py)
## 2.5.6. 非負矩陣分解(NMF 或 NNMF)
### 2.5.6.1. NMF 與 Frobenius 范數
[`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") [\[1\]](#id22) 是在數據和分量是非負情況下的另一種降維方法。 在數據矩陣不包含負值的情況下,可以插入 [`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 而不是 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 或其變體。 通過優化  與矩陣乘積  之間的距離  ,可以將樣本  分解為兩個非負矩陣  和 。 最廣泛使用的距離函數是 Frobenius 平方范數,它是歐幾里德范數到矩陣的推廣:

與 [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.PCA") 不同,通過疊加分量而不減去,以加法方式獲得向量的表示。這種加性模型對于表示圖像和文本是有效的。
> \[Hoyer, 2004\] [\[2\]](#id23) 研究表明,當處于一定約束時,[`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 可以產生數據集基于某子部分的表示,從而獲得可解釋的模型。
以下示例展示了與 PCA 特征面相比, [`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 從 Olivetti 面部數據集中的圖像中發現的16個稀疏組件。
Unlike [`PCA`](generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA "sklearn.decomposition.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.
**[](../auto_examples/decomposition/plot_faces_decomposition.html) [](../auto_examples/decomposition/plot_faces_decomposition.html)**
`init` 屬性確定了應用的初始化方法,這對方法的性能有很大的影響。 [`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 實現了非負雙奇異值分解方法。NNDSVD [\[4\]](#id24) 基于兩個 SVD 過程,一個近似數據矩陣, 使用單位秩矩陣的代數性質,得到的部分SVD因子的其他近似正部分。 基本的 NNDSVD 算法更適合稀疏分解。其變體 NNDSVDa(全部零值替換為所有元素的平均值)和 NNDSVDar(零值替換為比數據平均值除以100小的隨機擾動)在稠密情況時推薦使用。
請注意,乘法更新 (‘mu’) 求解器無法更新初始化中存在的零,因此當與引入大量零的基本 NNDSVD 算法聯合使用時, 會導致較差的結果; 在這種情況下,應優先使用 NNDSVDa 或 NNDSVDar。
也可以通過設置 `init="random"`,使用正確縮放的隨機非負矩陣初始化 [`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 。 整數種子或 `RandomState` 也可以傳遞給 `random_state` 以控制重現性。
在 [`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 中,L1 和 L2 先驗可以被添加到損失函數中以使模型正規化。 L2 先驗使用 Frobenius 范數,而L1 先驗使用 L1 范數。與 `ElasticNet` 一樣, 我們通過 `l1_ratio` () 參數和正則化強度參數 `alpha` () 來控制 L1 和 L2 的組合。那么先驗項是:

正則化目標函數為:

[`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.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\]](#id26) 。 beta-divergence 定義如下:

[](../auto_examples/decomposition/plot_beta_divergence.html)
請注意,在  上定義無效,僅僅在 和  的上可以分別連續擴展。
[`NMF`](generated/sklearn.decomposition.NMF.html#sklearn.decomposition.NMF "sklearn.decomposition.NMF") 使用 Coordinate Descent (‘cd’) [\[5\]](#id25) 和乘法更新 (‘mu’) [\[6\]](#id26) 來實現兩個求解器。 ‘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:
```
>>> import numpy as np
>>> X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
>>> from sklearn.decomposition import NMF
>>> model = NMF(n_components=2, init='random', random_state=0)
>>> W = model.fit_transform(X)
>>> H = model.components_
>>> X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
>>> W_new = model.transform(X_new)
```
示例:
- [Faces dataset decompositions](../auto_examples/decomposition/plot_faces_decomposition.html#sphx-glr-auto-examples-decomposition-plot-faces-decomposition-py)
- [Topic extraction with Non-negative Matrix Factorization and Latent Dirichlet Allocation](../auto_examples/applications/plot_topics_extraction_with_nmf_lda.html#sphx-glr-auto-examples-applications-plot-topics-extraction-with-nmf-lda-py)
- [Beta-divergence loss functions](../auto_examples/decomposition/plot_beta_divergence.html#sphx-glr-auto-examples-decomposition-plot-beta-divergence-py)
參考文獻:
[\[1\]](#id16)[“Learning the parts of objects by non-negative matrix factorization”](http://www.columbia.edu/~jwp2128/Teaching/W4721/papers/nmf_nature.pdf)D. Lee, S. Seung, 1999[\[2\]](#id17)[“Non-negative Matrix Factorization with Sparseness Constraints”](http://www.jmlr.org/papers/volume5/hoyer04a/hoyer04a.pdf)P. Hoyer, 2004[\[4\]](#id18)[“SVD based initialization: A head start for nonnegative matrix factorization”](http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/HPCLAB020107.pdf)C. Boutsidis, E. Gallopoulos, 2008[\[5\]](#id20)[“Fast local algorithms for large scale nonnegative matrix and tensor factorizations.”](http://www.bsp.brain.riken.jp/publications/2009/Cichocki-Phan-IEICE_col.pdf)A. Cichocki, P. Anh-Huy, 2009\[6\]*([1](#id19), [2](#id21))* [“Algorithms for nonnegative matrix factorization with the beta-divergence”](http://http://arxiv.org/pdf/1010.1763v3.pdf)C. Fevotte, J. Idier, 2011
## 2.5.7. 隱 Dirichlet 分配(LDA)
隱 Dirichlet 分配是離散數據集(如文本語料庫)的集合的生成概率模型。 它也是一個主題模型,用于從文檔集合中發現抽象主題。
LDA 的圖形模型是一個三層貝葉斯模型:
當建模文本語料庫時,該模型假設具有  文檔和  主題的語料庫的以下生成過程:
> 1. 對于每個主題 ,繪制 
> 2. 對于每個文檔 ,繪制 
> 3. 對于文檔  中的每個單詞 :
>
> > 1. 繪制主題索引 
> > 2. 繪制觀察詞 
對于參數估計,后驗分布為:

由于后驗分布難以處理,變體貝葉斯方法使用更簡單的分布  近似, 并且優化了這些變體參數 , ,  最大化Evidence Lower Bound (ELBO):
![\log\: P(w | \alpha, \eta) \geq L(w,\phi,\gamma,\lambda) \overset{\triangle}{=} E_{q}[\log\:p(w,z,\theta,\beta|\alpha,\eta)] - E_{q}[\log\:q(z, \theta, \beta)]](https://box.kancloud.cn/c54e53d84191751a410ea0f4dfc9652f_566x25.jpg)
最大化 ELBO 相當于最小化  和后驗  之間的 Kullback-Leibler(KL) 散度。
[`LatentDirichletAllocation`](generated/sklearn.decomposition.LatentDirichletAllocation.html#sklearn.decomposition.LatentDirichletAllocation "sklearn.decomposition.LatentDirichletAllocation") 實現在線變體貝葉斯算法,支持在線和批量更新方法。 批處理方法在每次完全傳遞數據后更新變分變量,在線方法從小批量數據點中更新變體變量。
Note
雖然在線方法保證收斂到局部最優點,最優點的質量和收斂速度可能取決于與小批量大小和學習率相關的屬性。
當 [`LatentDirichletAllocation`](generated/sklearn.decomposition.LatentDirichletAllocation.html#sklearn.decomposition.LatentDirichletAllocation "sklearn.decomposition.LatentDirichletAllocation") 應用于 “document-term” 矩陣時,矩陣將被分解為 “topic-term” 矩陣和 “document-topic” 矩陣。 雖然 “topic-term” 矩陣在模型中被存儲為 `components_` ,但是可以通過 `transform` 方法計算 “document-topic” 矩陣。
[`LatentDirichletAllocation`](generated/sklearn.decomposition.LatentDirichletAllocation.html#sklearn.decomposition.LatentDirichletAllocation "sklearn.decomposition.LatentDirichletAllocation") 還實現了 `partial_fit` 方法。這可用于當數據被順序提取時.
示例:
- [Topic extraction with Non-negative Matrix Factorization and Latent Dirichlet Allocation](../auto_examples/applications/plot_topics_extraction_with_nmf_lda.html#sphx-glr-auto-examples-applications-plot-topics-extraction-with-nmf-lda-py)
參考:
- [“Latent Dirichlet Allocation”](https://www.cs.princeton.edu/~blei/papers/BleiNgJordan2003.pdf)D. Blei, A. Ng, M. Jordan, 2003
- [“Online Learning for Latent Dirichlet Allocation”](https://www.cs.princeton.edu/~blei/papers/HoffmanBleiBach2010b.pdf)M. Hoffman, D. Blei, F. Bach, 2010
- [“Stochastic Variational Inference”](http://www.columbia.edu/~jwp2128/Papers/HoffmanBleiWangPaisley2013.pdf)M. Hoffman, D. Blei, C. Wang, J. Paisley, 2013
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話