# 2.4. 雙聚類
校驗者:
[@udy](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@程威](https://github.com/apachecn/scikit-learn-doc-zh)
Biclustering 可以使用 [`sklearn.cluster.bicluster`](classes.html#module-sklearn.cluster.bicluster "sklearn.cluster.bicluster") 模塊。 Biclustering 算法對數據矩陣的行列同時進行聚類。 同時對行列進行聚類稱之為 biclusters。 每一次聚類都會通過原始數據矩陣的一些屬性確定一個子矩陣。
例如, 一個矩陣 `(10, 10)` , 一個 bicluster 聚類,有三列二行,就是一個子矩陣 `(3, 2)`
```
>>> import numpy as np
>>> data = np.arange(100).reshape(10, 10)
>>> rows = np.array([0, 2, 3])[:, np.newaxis]
>>> columns = np.array([1, 2])
>>> data[rows, columns]
array([[ 1, 2],
[21, 22],
[31, 32]])
```
為了可視化, 給定一個 bicluster 聚類,數據矩陣的行列可以重新分配,使得 bi-cluster 是連續的。
算法在如何定義 bicluster 方面有一些不同,常見類型包括:
- 不變的 values , 不變的 rows, 或者不變的 columns。
- 異常高的或者低的值。
- 低方差的子矩陣。
- 相關的 rows 或者 columns。
算法在分配給 bicluster 行列的方式不同, 會導致不同的 bicluster 結構。 當行和列分成分區時,會發生對角線或者棋盤結構。
如果每一行和每一列同屬于一種 bicluster ,就重新排列數據矩陣的行和列,會使得 bicluster 呈現對角線。 下面是一個例子,此結構的biclusters 具有比其他行列更高的平均值:
[](../auto_examples/bicluster/images/sphx_glr_plot_spectral_coclustering_003.png)
在棋盤結構的例子中, 每一行屬于所有的列類別, 每一列屬于所有的行類別。 下面是一個例子,每個 bicluster 中的值差異較小:
[](../auto_examples/bicluster/images/sphx_glr_plot_spectral_biclustering_003.png)
在擬合模型之后, 可以在 `rows_` 和 `columns_` 屬性中找到行列 cluster membership 。 `rows_[i]` 是一個二進制的向量, 就是屬于 bicluster `i` 的一行。 同樣的, `columns_[i]` 就表示屬于 bicluster `i` 的列。
一些模塊也有 `row_labels_` 何 `column_labels_` 屬性。 這些模塊對行列進行分區, 例如對角線或者棋盤 bicluster 結構。
Note
Biclustering 在不同的領域有很多其他名稱,包括 co-clustering, two-mode clustering, two-way clustering, block clustering, coupled two-way clustering 等.有一些算法的名稱,比如 Spectral Co-Clustering algorithm, 反應了這些備用名稱。
## 2.4.1. Spectral Co-Clustering
> [`SpectralCoclustering`](generated/sklearn.cluster.bicluster.SpectralCoclustering.html#sklearn.cluster.bicluster.SpectralCoclustering "sklearn.cluster.bicluster.SpectralCoclustering") 算法找到的 bicluster 的值比相應的其他行和列更高。
每一個行和列都只屬于一個 bicluster, 所以重新分配行和列,使得分區連續顯示對角線上的 high value:
Note
算法將輸入的數據矩陣看做成二分圖:該矩陣的行和列對應于兩組頂點,每個條目對應于行和列之間的邊,該算法近似的進行歸一化,對圖進行切割,找到更重的子圖。
### 2.4.1.1. 數學公式
找到最優歸一化剪切的近似解,可以通過圖形的 Laplacian 的廣義特征值分解。 通常這意味著直接使用 Laplacian 矩陣. 如果原始數據矩陣  有形狀 , 則對應的 bipartite 圖的 Laplacian 矩陣具有形狀 。 但是, 在這種情況直接使用  , 因為它更小,更有作用。
輸入矩陣  被預處理如下:

 是  對角線矩陣,和  相同,  是  的對角吸納矩陣,等同于 。
奇異值分解,  , 提供了  行列的分區. 左邊的奇異值向量給予行分區,右邊的奇異值向量給予列分區。
 奇異值向量從第二個開始, 提供所需的分區信息。 這些用于形成矩陣 :Z:

 的列是 , 和  相似 。
然后  的 rows 通過使用 [k-means](clustering.html#k-means) 進行聚類. `n_rows` 標簽提供行分區, 剩下的 `n_columns` 標簽 提供 列分區。
例子:
- [A demo of the Spectral Co-Clustering algorithm](../auto_examples/bicluster/plot_spectral_coclustering.html#sphx-glr-auto-examples-bicluster-plot-spectral-coclustering-py): 如何用 bicluster 數據矩陣并應用。
- [Biclustering documents with the Spectral Co-clustering algorithm](../auto_examples/bicluster/plot_bicluster_newsgroups.html#sphx-glr-auto-examples-bicluster-plot-bicluster-newsgroups-py):一個在 20 個新聞組數據集中發現 biclusters 的例子
參考文獻:
- Dhillon, Inderjit S, 2001. [Co-clustering documents and words using bipartite spectral graph partitioning](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.140.3011).
## 2.4.2. Spectral Biclustering
> [`SpectralBiclustering`](generated/sklearn.cluster.bicluster.SpectralBiclustering.html#sklearn.cluster.bicluster.SpectralBiclustering "sklearn.cluster.bicluster.SpectralBiclustering") 算法假設輸入的數據矩陣具有隱藏的棋盤結構。 具有這種結構的矩陣的行列 可能被分區,使得在笛卡爾積中的 大部分 biclusters 的 row clusters 和 column cluster 是近似恒定的。
例如,如果有兩個row 分區和三個列分區,每一行屬于三個 bicluster ,每一列屬于兩個 bicluster。
這個算法劃分矩陣的行和列,以至于提供一個相應的塊狀不變的棋盤矩陣,近似于原始矩陣。
### 2.4.2.1. 數學表示
輸入矩陣  先歸一化,使得棋盤模式更明顯。有三種方法:
1. *獨立的行和列歸一化*, as in Spectral Co-Clustering. 這個方法使得行和一個常數相加,列和變量相加。
2. **Bistochastization**: 重復行和列歸一化直到收斂。該方法使得行和列都相加
相同的常數。
1. **Log 歸一化**: 計算數據矩陣的對數 . 列就是 , 行就是 , 總體上來看  of  被計算的. 最后矩陣通過下面的公式計算

歸一化后,首先少量的奇異值向量被計算,只是在 Spectral Co-Clustering 算法中。
如果使用 log 歸一化,則所有的奇異向量都是有意義的。但是, 如果是獨立的歸一化或雙曲線化 被使用,第一個奇異矢量,  和 。 會被丟棄。 從現在開始, “first” 奇異值向量與  和  相關,除了日志歸一化的情況。
給定這些奇異值向量, 將他們排序,通過分段常數向量保證最佳近似。 使用一維 k-means 找到每個向量的近似值 并使用歐幾里得距離得分。 Some subset of 最好的左右奇異值向量的子集被選擇。 下一步, 數據預計到這個最佳子集的奇異向量和聚類。
例如,如果  奇異值向量被計算,最好按照描述找到  , 其中 。  列為,the  最佳左奇異向量的矩陣, 并且  對于右邊是類似的. 要劃分行, 將  的 投影到  維空間: 。  行 矩陣的行作為采樣和使用 k-means 的聚類處理產生行標簽。 類似地,將列投影到  ,并且對  矩陣進行聚類得到列標簽。
示例:
- [A demo of the Spectral Biclustering algorithm](../auto_examples/bicluster/plot_spectral_biclustering.html#sphx-glr-auto-examples-bicluster-plot-spectral-biclustering-py): 一個簡單的例子 顯示如何生成棋盤矩陣和 bicluster
.
參考文獻:
- Kluger, Yuval, et. al., 2003. [Spectral biclustering of microarray data: coclustering genes and conditions](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.135.1608).
## 2.4.3. Biclustering 評測
有兩種評估雙組分結果的方法:內部和外部。 諸如群集穩定性等內部措施只依賴于數據和結果本身。 目前在scikit-learn中沒有內部的二集群措施。外部措施是指外部信息來源,例如真正的解決方案。 當使用真實數據時,真正的解決方案通常是未知的,但是,由于真正的解決方案是已知的,因此人造數據的雙重分析可能對于評估算法非常有用。
為了將一組已發現的雙組分與一組真正的雙組分進行比較, 需要兩個相似性度量:單個雙色團體的相似性度量,以及將這些個體相似度結合到總分中的方法。
為了比較單個雙核,已經采用了幾種措施。現在,只有Jaccard索引被實現:

 和  是 biclusters,  是交叉點的元素的數量。Jaccard 索引 達到最小值0,當 biclusters 不重疊的時候,并且當他們相同干的時候,最大值為1。有些方法已經開發出來,用來比較兩個 biclusters 的數據集。 從現在開始 之后 [`consensus_score`](generated/sklearn.metrics.consensus_score.html#sklearn.metrics.consensus_score "sklearn.metrics.consensus_score") (Hochreiter et. al., 2010) 是可以用:
1. 使用 Jaccard 索引或類似措施,計算 biclusters 的 bicluster 相似性。
2. 以一對一的方式將 bicluster 分從一組分配給另一組,以最大化其相似性的總和。該步驟使用匈牙利算法執行。
3. 相似性的最終總和除以較大集合的大小。
最小共識得分為0,發生在所有 biclusters 完全不相似時。當兩組 biclusters 相同時,最大分數為1。
參考文獻:
- Hochreiter, Bodenhofer, et. al., 2010. [FABIA: factor analysis for bicluster acquisition](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2881408/).
- 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)
- 外部資源,視頻和談話