R语言biclust包运行谱双聚类每次结果不一致的原因及解决方法
谱双聚类每次运行结果不一致的原因
该现象属于算法实现的正常表现,不是代码操作错误。
biclust包中spectral()函数实现的谱双聚类流程,在对特征向量投影后的行列子集做k-means划分时,默认采用随机初始化的类中心,在未固定随机数生成状态的前提下,每次运行的初始类中心选取存在随机性,最终输出的双聚类行列归属、聚类规模都会出现差异,观察到的两次运行1号聚类包含的蛋白质、性状数量不一致,就是这个随机初始化步骤导致的。
可复现结果的修复方案
- 调用
spectral()函数前,先通过set.seed()固定R环境的随机数种子,让所有随机计算环节的输出可复现。只要种子值、输入矩阵、参数保持一致,每次运行得到的双聚类结果会完全相同,参考代码如下:
# 种子值可任意设置,同一分析任务保持数值固定即可 set.seed(12345) SpectralBiclusters = spectral( transpose_res2, numberOfEigenvalues = 6, minr = 2, minc = 2, withinVar = 1, n_clusters = NULL, n_best = 3 )
- 提前检查输入矩阵
transpose_res2的完整性,必须保证矩阵中无缺失值、非数值元素,缺失值会导致算法计算异常,额外引入结果波动。 - 如果需要验证聚类结论的稳健性,可以更换多个不同的种子值重复运行双聚类,统计多次运行中始终被划分到同一聚类的蛋白质、性状,剔除归属随随机初始化波动的不稳定元素,提升最终分析结果的可靠性。
内容的提问来源于stack exchange,提问作者JOSHUA MANICKAM
相关产品推荐
相关产品推荐

