# 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 具有比其他行列更高的平均值:
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_coclustering_0031.png](https://box.kancloud.cn/f4ead1b809dedbd970168effd3f437e6_480x480.jpg)](../auto_examples/bicluster/images/sphx_glr_plot_spectral_coclustering_003.png)
在棋盘结构的例子中, 每一行属于所有的列类别, 每一列属于所有的行类别。 下面是一个例子,每个 bicluster 中的值差异较小:
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_spectral_biclustering_0031.png](https://box.kancloud.cn/bad9a5145d38edb640b94c96343887fe_480x480.jpg)](../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 矩阵. 如果原始数据矩阵 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 有形状 ![m \times n](https://box.kancloud.cn/0c80155baa7aea744f143dbf151c93db_49x9.jpg), 则对应的 bipartite 图的 Laplacian 矩阵具有形状 ![(m + n) \times (m + n)](https://box.kancloud.cn/c2d3d37bb6a88795d1720b129f6fc585_145x18.jpg)。 但是, 在这种情况直接使用 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) , 因为它更小,更有作用。
输入矩阵 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 被预处理如下:
![A_n = R^{-1/2} A C^{-1/2}](https://box.kancloud.cn/01f2ac428f754f7794be392bc5cd1612_146x22.jpg)
![R](https://box.kancloud.cn/e852b8eff445e0cd8df4a9fc694e49f5_14x12.jpg) 是 ![i](https://box.kancloud.cn/9f004454a20e19932b2a071a380ff8ff_6x13.jpg) 对角线矩阵,和 ![\sum_{j} A_{ij}](https://box.kancloud.cn/544e2c236ab2e42a492fbac89e641960_51x22.jpg) 相同, ![C](https://box.kancloud.cn/95378f1036b3ba9a15a5f33f8521b6f2_14x12.jpg) 是 ![j](https://box.kancloud.cn/7c1f52c4cc615183dbd16304bc8c1e94_9x16.jpg) 的对角吸纳矩阵,等同于 ![\sum_{i} A_{ij}](https://box.kancloud.cn/7170bdb6d38166827ea11dab298ab5d5_50x19.jpg)。
奇异值分解, ![A_n = U \Sigma V^\top](https://box.kancloud.cn/60f776dbd292c36db0471ab654c886b4_98x18.jpg) , 提供了 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 行列的分区. 左边的奇异值向量给予行分区,右边的奇异值向量给予列分区。
![\ell = \lceil \log_2 k \rceil](https://box.kancloud.cn/ba11c1a5cd5514f43cfa0a4e4c4ecc93_88x19.jpg) 奇异值向量从第二个开始, 提供所需的分区信息。 这些用于形成矩阵 :Z:
![Z = \begin{bmatrix} R^{-1/2} U \\\\ C^{-1/2} V \end{bmatrix}](https://box.kancloud.cn/fe2b9859362e924315f89f845eb5e868_114x69.jpg)
![U](https://box.kancloud.cn/be9c9d987358e2b606c5f29749b66b55_13x12.jpg) 的列是 ![u_2, \dots, u_{\ell +1}](https://box.kancloud.cn/22ddd58a64a30a4353a6c85995db3430_89x13.jpg), 和 ![V](https://box.kancloud.cn/e7065953228a039d8bbaf097ff72097a_14x12.jpg) 相似 。
然后 ![Z](https://box.kancloud.cn/15dbc83465b1b0e0ca48c121420925ce_12x12.jpg) 的 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. 数学表示
输入矩阵 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 先归一化,使得棋盘模式更明显。有三种方法:
1. *独立的行和列归一化*, as in Spectral Co-Clustering. 这个方法使得行和一个常数相加,列和变量相加。
2. **Bistochastization**: 重复行和列归一化直到收敛。该方法使得行和列都相加
相同的常数。
1. **Log 归一化**: 计算数据矩阵的对数 ![L = \log A](https://box.kancloud.cn/715c85e0b22b154868a92d443254f969_76x16.jpg). 列就是 ![\overline{L_{i \cdot}}](https://box.kancloud.cn/928a32cfc1b1299fdd612b1bf1740bfb_21x18.jpg), 行就是 ![\overline{L_{\cdot j}}](https://box.kancloud.cn/b71752efa0e010e1d1c94b8da131f3eb_23x21.jpg), 总体上来看 ![\overline{L_{\cdot \cdot}}](https://box.kancloud.cn/e1f57362a29b1f5c3ddd84b4143db34c_21x16.jpg) of ![L](https://box.kancloud.cn/932e52dfeb15d15287c07f0b899113b1_12x12.jpg) 被计算的. 最后矩阵通过下面的公式计算
![K_{ij} = L_{ij} - \overline{L_{i \cdot}} - \overline{L_{\cdot j}} + \overline{L_{\cdot \cdot}}](https://box.kancloud.cn/ea687b8f2059bfd350217af2af1fcf47_205x21.jpg)
归一化后,首先少量的奇异值向量被计算,只是在 Spectral Co-Clustering 算法中。
如果使用 log 归一化,则所有的奇异向量都是有意义的。但是, 如果是独立的归一化或双曲线化 被使用,第一个奇异矢量, ![u_1](https://box.kancloud.cn/e6da4ee74dc266afe477fc690a96b724_16x12.jpg) 和 ![v_1](https://box.kancloud.cn/64ad3965540e4ee2a1763454da48562c_15x12.jpg)。 会被丢弃。 从现在开始, “first” 奇异值向量与 ![u_2 \dots u_{p+1}](https://box.kancloud.cn/c8282f140c51129a30274543dfbfef4e_78x14.jpg) 和 ![v_2 \dots v_{p+1}](https://box.kancloud.cn/1492df1344e329f91113b37d20167360_75x14.jpg) 相关,除了日志归一化的情况。
给定这些奇异值向量, 将他们排序,通过分段常数向量保证最佳近似。 使用一维 k-means 找到每个向量的近似值 并使用欧几里得距离得分。 Some subset of 最好的左右奇异值向量的子集被选择。 下一步, 数据预计到这个最佳子集的奇异向量和聚类。
例如,如果 ![p](https://box.kancloud.cn/251fcba434769c07a22131f9d8b84b32_10x12.jpg) 奇异值向量被计算,最好按照描述找到 ![q](https://box.kancloud.cn/ea1b9c81670ab99b7f8d866ad163a2af_9x12.jpg) , 其中 ![q<p](https://box.kancloud.cn/19300021877f872b33397f5042e2fd7e_42x14.jpg)。 ![U](https://box.kancloud.cn/be9c9d987358e2b606c5f29749b66b55_13x12.jpg) 列为,the ![q](https://box.kancloud.cn/ea1b9c81670ab99b7f8d866ad163a2af_9x12.jpg) 最佳左奇异向量的矩阵, 并且 ![V](https://box.kancloud.cn/e7065953228a039d8bbaf097ff72097a_14x12.jpg) 对于右边是类似的. 要划分行, 将 ![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 的 投影到 ![q](https://box.kancloud.cn/ea1b9c81670ab99b7f8d866ad163a2af_9x12.jpg) 维空间: ![A * V](https://box.kancloud.cn/c69cae49b12b28bbf3687b17ed915f1e_45x12.jpg)。 ![m](https://box.kancloud.cn/4d74e1a3833de6bf63d34767d6dbbc91_16x8.jpg) 行 ![m \times q](https://box.kancloud.cn/ecfe5fd6a10e76f8f91952d03a7bbbea_47x13.jpg)矩阵的行作为采样和使用 k-means 的聚类处理产生行标签。 类似地,将列投影到 ![A^{\top} * U](https://box.kancloud.cn/32fa0b7d30ace1f29c6ce35ca58760f0_56x15.jpg) ,并且对 ![n \times q](https://box.kancloud.cn/610639f3c273117f834e8bf2f64ff3b3_42x13.jpg) 矩阵进行聚类得到列标签。
示例:
- [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索引被实现:
![J(A, B) = \frac{|A \cap B|}{|A| + |B| - |A \cap B|}](https://box.kancloud.cn/4ac883782604f102f15f3c155b58bb34_237x44.jpg)
![A](https://box.kancloud.cn/3bbe3fcb07275cb8959a845aebfa63fa_13x12.jpg) 和 ![B](https://box.kancloud.cn/577b9cc5fd0224be358cf847a88d6c06_14x12.jpg) 是 biclusters, ![|A \cap B|](https://box.kancloud.cn/cd51a8c5030bbb7cd9b69c492ede8a1b_54x19.jpg) 是交叉点的元素的数量。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)
- 外部资源,视频和谈话