23.md 12.7 KB
Newer Older
L
loopyme 已提交
1
# 2.4. 双聚类
W
init  
wizardforcel 已提交
2 3 4

校验者:
        [@udy](https://github.com/apachecn/scikit-learn-doc-zh)
B
barrycg 已提交
5
        [@barrycg](https://github.com/barrycg)
W
init  
wizardforcel 已提交
6 7 8
翻译者:
        [@程威](https://github.com/apachecn/scikit-learn-doc-zh)

B
barrycg 已提交
9
Biclustering(双向聚类) 的实现模块是 [`sklearn.cluster.bicluster`](classes.html#module-sklearn.cluster.bicluster "sklearn.cluster.bicluster")。 双向聚类算法对数据矩阵的行列同时进行聚类。而这些行列的聚类称之为 双向簇(biclusters)。每一次聚类都会基于原始数据矩阵确定一个子矩阵, 并且这些子矩阵具有一些需要的属性。
W
init  
wizardforcel 已提交
10

B
barrycg 已提交
11
例如, 给定一个矩阵 `(10, 10)` , 如果对其中三行二列进行双向聚类,就可以获得一个子矩阵 `(3, 2)`
W
init  
wizardforcel 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24

```py
>>> 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]])

```

B
barrycg 已提交
25
为了可视化,给定一个双向簇,数据矩阵的行列可以重新分配,使得该双向簇是连续的。
W
init  
wizardforcel 已提交
26

B
barrycg 已提交
27 28
不同的双向聚类算法在如何定义双向簇方面有所不同,但其中通用类型包括:
*   常量, 常量行或常量列。
W
init  
wizardforcel 已提交
29 30
*   异常高的或者低的值。
*   低方差的子矩阵。
B
barrycg 已提交
31
*   相互关联的行列。
W
init  
wizardforcel 已提交
32

B
barrycg 已提交
33
算法在给双向簇分配行列的方式不同, 会导致不同的双向聚类结构。当行和列分成区块时,会出现块对角或者棋盘结构。
W
init  
wizardforcel 已提交
34

片刻小哥哥's avatar
片刻小哥哥 已提交
35
如果每一行和每一列仅属于一个双向簇,重新排列数据矩阵的行和列,会使得双向簇出现在对角线上。下面是一个示例,此结构的双向簇具有比其他行列更高的平均值:
W
init  
wizardforcel 已提交
36

37
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_coclustering_0031.png](img/9812effbd6ddac1053fd0b63ebe8c2fb.jpg)](https://scikit-learn.org/stable/auto_examples/bicluster/images/sphx_glr_plot_spectral_coclustering_003.png)
W
init  
wizardforcel 已提交
38

片刻小哥哥's avatar
片刻小哥哥 已提交
39
在棋盘结构的示例中, 每一行属于所有的列簇, 每一列属于所有的行簇。下面是一个示例,每个双向簇内的值差异较小:
W
init  
wizardforcel 已提交
40

41
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_biclustering_0031.png](img/4e0d8935ff82f26fc3a46a3202bd1fa3.jpg)](https://scikit-learn.org/stable/auto_examples/bicluster/images/sphx_glr_plot_spectral_biclustering_003.png)
W
init  
wizardforcel 已提交
42

B
barrycg 已提交
43
在拟合模型之后, 可以在 `rows_``columns_` 属性中找到行簇和列簇的归属信息(membership)。`rows_[i]` 是一个二元向量, 其中非零元素表示属于双向簇`i` 的行。 同样的, `columns_[i]` 就表示属于双向簇 `i` 的列。
W
init  
wizardforcel 已提交
44

B
barrycg 已提交
45
一些模块也有 `row_labels_``column_labels_` 属性。 这些模块可以对行列进行分区, 例如在块对角或者棋盘双向簇结构。
W
init  
wizardforcel 已提交
46

L
loopyme 已提交
47
>**注意**
B
barrycg 已提交
48
>双向聚类在不同的领域有很多其他名称,包括 co-clustering, two-mode clustering, two-way clustering, block clustering, coupled two-way clustering 等.有一些算法的名称,比如 Spectral Co-Clustering algorithm, 反应了这些备用名称。
W
init  
wizardforcel 已提交
49

L
loopyme 已提交
50
## 2.4.1. Spectral Co-Clustering
W
init  
wizardforcel 已提交
51

B
barrycg 已提交
52
 [`SpectralCoclustering(联合谱聚类)`](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.bicluster.SpectralCoclustering.html#sklearn.cluster.bicluster.SpectralCoclustering "sklearn.cluster.bicluster.SpectralCoclustering") 算法找到的双向簇的值比其它的行和列更高。每一个行和列都只属于一个双向簇, 所以重新分配行和列,使得分区连续显示对角线上的高值:
W
init  
wizardforcel 已提交
53

L
loopyme 已提交
54 55
>**注意**
>算法将输入的数据矩阵看做成二分图:该矩阵的行和列对应于两组顶点,每个条目对应于行和列之间的边,该算法近似的进行归一化,对图进行切割,找到更重的子图。
W
init  
wizardforcel 已提交
56

L
loopyme 已提交
57
### 2.4.1.1. 数学公式
W
init  
wizardforcel 已提交
58

B
barrycg 已提交
59 60
找到最优归一化剪切的近似解,可以通过图形的 Laplacian 的广义特征值分解。 通常这意味着直接使用 Laplacian 矩阵. 如果原始数据矩阵 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) 的形状 ![m
\times n](img/20d6857e752f6ffdfdd20a88c32f837c.jpg), 则对应的二分图(bipartite graph)的 Laplacian 矩阵具有形状 ![(m + n) \times (m + n)](img/94f627411c005fe4911552b1dd5b6ff1.jpg)。 但是, 在这种情况下, 直接使用 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) , 因为它更小,更有效率。
W
init  
wizardforcel 已提交
61 62 63 64 65

输入矩阵 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) 被预处理如下:

![A_n = R^{-1/2} A C^{-1/2}](img/def4737951f9990642e65b2403941350.jpg)

B
barrycg 已提交
66
![R](img/0fccbdc535b0a4d8003725e8ad606561.jpg) 是对角线矩阵, 其中元素 ![i](img/43e13b580daefe5ba754b790dfbd216c.jpg) 等于 ![\sum_{j} A_{ij}](img/f9e7fc3940e2875bf542aeda657d0718.jpg) , ![C](img/4b6d782a67ac392e97215c46b7590bf7.jpg) 是 对角矩阵,其中元素 ![j](img/7b215f2882ce8aaa33a97e43ad626314.jpg) 等于 ![\sum_{i} A_{ij}](img/38437ee82743c886e2ebfbb5bd5e0c89.jpg)
W
init  
wizardforcel 已提交
67

B
barrycg 已提交
68
奇异值分解, ![A_n = U \Sigma V^\top](img/93074566222e67121a8ab55e90d8e1af.jpg) , 产生了 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) 行列的分区. 左边奇异向量的子集给予行分区,右边的奇异向量的子集给予列分区。
W
init  
wizardforcel 已提交
69

B
barrycg 已提交
70
奇异向量![\ell = \lceil \log_2 k \rceil](img/5e45807b4775fcfaca64f6363102dc5e.jpg) 从第二个开始, 提供所需的分区信息。这些用于形成矩阵 *Z*:
W
init  
wizardforcel 已提交
71 72 73 74 75 76 77


![Z = \begin{bmatrix} R^{-1/2} U \\\\
                    C^{-1/2} V
      \end{bmatrix}](img/33d1bf322bf0f6046a1145dbc264803b.jpg)


B
barrycg 已提交
78
![U](img/11c00539ec3e5944afd76511830591db.jpg) 的列是 ![u_2, \dots, u_{\ell +1}](img/1fc7cc5cbdba693962c7708456165810.jpg), 和 ![V](img/5303ecbc70bf5189b8785555c03c54ee.jpg) 的列也具有相似特性。
W
init  
wizardforcel 已提交
79

B
barrycg 已提交
80
然后 ![Z](img/8f4e82e4dfa89ac81c42992c603a953e.jpg) 的所有行通过使用 [k-means](clustering.html#k-means) 进行聚类. 第一个`n_rows` 标签提供行分区信息, 剩下的 `n_columns` 标签提供列分区信息。
W
init  
wizardforcel 已提交
81

L
loopyme 已提交
82
> **示例**:
B
barrycg 已提交
83
>*   [A demo of the Spectral Co-Clustering algorithm](https://scikit-learn.org/stable/auto_examples/bicluster/plot_spectral_coclustering.html#sphx-glr-auto-examples-bicluster-plot-spectral-coclustering-py): 如何用双向簇产生一个数据矩阵并应用。
片刻小哥哥's avatar
片刻小哥哥 已提交
84
>*   [Biclustering documents with the Spectral Co-clustering algorithm](https://scikit-learn.org/stable/auto_examples/bicluster/plot_bicluster_newsgroups.html#sphx-glr-auto-examples-bicluster-plot-bicluster-newsgroups-py):一个在 20 个新闻组数据集中发现双向簇的示例
W
init  
wizardforcel 已提交
85

L
loopyme 已提交
86 87
> **参考资料**:
>*   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).
W
init  
wizardforcel 已提交
88

L
loopyme 已提交
89
## 2.4.2. Spectral Biclustering
W
init  
wizardforcel 已提交
90

B
barrycg 已提交
91
 [`SpectralBiclustering(双向谱聚类)`](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.bicluster.SpectralBiclustering.html#sklearn.cluster.bicluster.SpectralBiclustering "sklearn.cluster.bicluster.SpectralBiclustering") 算法假设输入的数据矩阵具有隐藏的棋盘结构。具有这种结构的矩阵的行列可能被分区,使得在笛卡尔积中的大部分双向簇的列簇和行簇是近似恒定的。
W
init  
wizardforcel 已提交
92

B
barrycg 已提交
93
例如,如果有两个行分区和三个列分区,每一行属于三个双向簇,每一列属于两个双向簇。
W
init  
wizardforcel 已提交
94

B
barrycg 已提交
95
这个算法对矩阵的行和列进行分区,以至于提供一个相应的块状不变的棋盘矩阵,近似于原始矩阵。
W
init  
wizardforcel 已提交
96

L
loopyme 已提交
97
### 2.4.2.1. 数学表示
W
init  
wizardforcel 已提交
98

B
barrycg 已提交
99
输入矩阵 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) 先归一化,使得矩阵的棋盘模式更明显。这里有三种方法:
W
init  
wizardforcel 已提交
100

B
barrycg 已提交
101 102 103 104 105
1.  **独立的行列归一化**, 如联合谱聚类中所示. 这个方法使得所有行进行行内相加得到一个相同常量,所有列相加得到另一个相同常量。
2.  **Bistochastization**: 重复行和列归一化直到收敛。该方法使得行和列相加得到一个相同的常数。
3.  **对数归一化**: 数据矩阵的对数是 ![L =
    \log A](img/515ee7781876d7344cc383bb43cb30ea.jpg). 列对数就是 ![\overline{L_{i \cdot}}](img/7ba11d33e68a1e32f2d8d9387bbc1eba.jpg), 行 对数就是 ![\overline{L_{\cdot j}}](img/dc8f095e63b3defdb85fcf54d7d2d8c2.jpg), ![\overline{L_{\cdot
    \cdot}}](img/a0bb00db4979d538e9ca2f0a8b423286.jpg) 是 ![L](img/639e82f3829a0ad677110cc33a028c98.jpg) 的整体平均.  最终矩阵通过下面的公式计算![K_{ij} = L_{ij} - \overline{L_{i \cdot}} - \overline{L_{\cdot
W
init  
wizardforcel 已提交
106 107 108
j}} + \overline{L_{\cdot \cdot}}](img/d670eea3215462f64d74d9366622a490.jpg)


B
barrycg 已提交
109
归一化后,第一个的奇异向量被计算,就如同联合谱聚类算法一样。
W
init  
wizardforcel 已提交
110

B
barrycg 已提交
111
如果使用对数归一化,则所有的奇异向量都是有意义的。但是, 如果是独立归一化或Bistochastization 被使用, 第一个奇异向量, ![u_1](img/d35b85fc7ddd819b1fec30a6ef410fc9.jpg) 和 ![v_1](img/4b64f9acb85d7f2b6169e5a58f255e44.jpg)。 会被丢弃。 从现在开始, “第一个” 奇异向量指的是 ![u_2 \dots u_{p+1}](img/0d0c4e4a12f6e3bb90bf30161951dcc5.jpg) 和 ![v_2 \dots v_{p+1}](img/522bc8957a5d77edbdc533813dbef086.jpg) ,除了对数归一化的情况。
W
init  
wizardforcel 已提交
112

B
barrycg 已提交
113
给定这些奇异向量,按照分段常数向量的最佳近似程度,将他们排序。使用一维 k-means 找到每个向量的近似值并使用欧氏距离进行评分。最好的左右奇异向量的某个子集被选择。下一步, 数据将被投影到奇异向量的最佳子集并进行聚类。
W
init  
wizardforcel 已提交
114

B
barrycg 已提交
115
例如,如果已计算得到 ![p](img/e2f9b08680b30cfb80102f69264fdd5c.jpg) 个奇异向量,![q](img/dc074c105944810a277030dfab298376.jpg) 个 最佳得奇异向量可以被找出, 因为![q<p](img/cc9d324e8bc61a67cc1947f73bf5b618.jpg) 。让![U](img/11c00539ec3e5944afd76511830591db.jpg) 为列是 ![q](img/dc074c105944810a277030dfab298376.jpg) 个最佳左奇异向量的矩阵, 并且 ![V](img/5303ecbc70bf5189b8785555c03c54ee.jpg)  是用右奇异向量组成的矩阵. 为了划分行, 将 ![A](img/eeaf066f8cca5064b706ccfc4728323d.jpg) 投影到 ![q](img/dc074c105944810a277030dfab298376.jpg) 维空间: ![A * V](img/99988260d9d836d14b2569c2fc921e81.jpg)。把![m \times q](img/ccc8bedf9424617c5d6a61fbe9a1cc36.jpg) 矩阵的 ![m](img/94156b879a7455cb0d516efa9c9c0991.jpg) 行作为样本, 然后使用 k-means 的聚类处理产生行标签。类似地,将列投影到 ![A^{\top} * U](img/c57acf47ae694e71f55f0005d1e52c55.jpg) ,并且对 ![n \times q](img/cd58ff0ab17f3ead1d5179426f2dae50.jpg) 矩阵进行聚类得到列标签。
W
init  
wizardforcel 已提交
116

L
loopyme 已提交
117
> **示例**:
片刻小哥哥's avatar
片刻小哥哥 已提交
118
>*   [A demo of the Spectral Biclustering algorithm](https://scikit-learn.org/stable/auto_examples/bicluster/plot_spectral_biclustering.html#sphx-glr-auto-examples-bicluster-plot-spectral-biclustering-py): 一个简单的示例显示如何生成棋盘矩阵和对它进行双向聚类。
W
init  
wizardforcel 已提交
119

L
loopyme 已提交
120 121
> **参考资料**:
>*   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).
W
init  
wizardforcel 已提交
122

L
loopyme 已提交
123
## 2.4.3. Biclustering 评价
W
init  
wizardforcel 已提交
124

B
barrycg 已提交
125
有两种评估双聚类结果的方法:内部和外部。内部评估,如聚类稳定性, 依赖于数据和结果本身。目前在scikit-learn中没有内部的双向簇评估。外部评估是指外部信息来源,例如真实解。当处理真实数据时,真实解通常是未知的,但是,由于真实解是已知,因此人造数据的双向聚类可能对于评估算法非常有用。
W
init  
wizardforcel 已提交
126

B
barrycg 已提交
127
为了将一组已发现的双向簇与一组真实的双向簇行比较,需要两个相似性度量:单个双向簇的相似性度量以及将这些个体相似度结合到总分中的度量。
W
init  
wizardforcel 已提交
128

B
barrycg 已提交
129
为了比较单个双向簇,可以采用了几种措施。现在,只有Jaccard索引已被实现:
W
init  
wizardforcel 已提交
130 131 132

![J(A, B) = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}](img/287e15c4b3d9b3f227fdc8e364609382.jpg)

B
barrycg 已提交
133
其中A和B是双向簇, |A∩B| 是交叉点的元素的数量。
W
init  
wizardforcel 已提交
134

L
loopyme 已提交
135
Jaccard 索引 达到最小值0,当biclusters完全不同时,Jaccard指数最小值为0;当biclusters完全相同时,Jaccard指数最大值为1。
W
init  
wizardforcel 已提交
136

B
barrycg 已提交
137
一些方法已经开发出来,用来比较两个双向簇的集合(set)。从现在开始,  仅[`consensus_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.consensus_score.html#sklearn.metrics.consensus_score "sklearn.metrics.consensus_score") (Hochreiter et. al., 2010) 是可以用:
W
init  
wizardforcel 已提交
138

B
barrycg 已提交
139 140
1.  使用 Jaccard 索引或类似措施, 为每个集合中的一个双向簇对计算簇之间的相似性。
2.  以一对一的方式将双向簇从一个集合分配给另一个集合,以最大化其相似性的总和。该步骤使用匈牙利算法(Hungarian algorithm)执行。
W
init  
wizardforcel 已提交
141 142
3.  相似性的最终总和除以较大集合的大小。

B
barrycg 已提交
143
当所有双向簇对都完全不相似时,最小共识得分为0。当两个双向簇集合相同时,最大得分为1。
W
init  
wizardforcel 已提交
144

L
loopyme 已提交
145 146
> **参考资料**:
>*   Hochreiter, Bodenhofer, et. al., 2010. [FABIA: factor analysis for bicluster acquisition](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2881408/).