如何解决将集群结果数据帧转换为共识数据帧
我正在开展一个共识聚类项目,在该项目中,我在我的数据的随机子集上运行多个版本的聚类算法,并跟踪哪些项目分配给了哪些集群。 This 文章与我正在做的非常相似。想象一下这个过程会产生下面的数据。
iter1 iter2 iter3 iter4
Alice 2 0 2 1
Brian 1 1 1 1
Sally 1 2 0 2
James 0 2 1 0
此表中的值是该项目在该特定聚类迭代中已分配到的聚类编号,当它从该迭代的聚类中排除时为 0(包含的机会为 80%)。从这个 DataFrame 中,我想计算共识矩阵,该矩阵说明两个项目在同一集群中的次数,以及它们都包含在其中的迭代。所以例如Brian 和 Sally 被一起子采样了 3 次(iter1、iter2、iter4),但被聚集在一起了两次。因此,Brian ~ Sally 的条目是 0.67,大约是 2/3。完整的共识矩阵见下表。
Alice Brian Sally James
Alice 1.0 0.00 0.00 0.0
Brian 0.0 1.00 0.67 0.5
Sally 0.0 0.67 1.00 1.0
James 0.0 0.50 1.00 1.0
我的问题是:如何从第一个 DataFrame 转到第二个?我想可以先通过获取所有唯一项然后组合长度为 2(Alice~Brian、Alice~Sally、Alice~James 等)并初始化空数据帧来使项目对首先出现在行和行中列。然后根据计算配对共识的函数填充每个单元格,就像我们对 Brian ~ Sally (0.67) 所做的那样。然而,这已经感觉有点麻烦,我相当确定有一种更好的方法来做到这一点。任何帮助表示赞赏!
编辑:我用以下代码解决了这个问题。我不确定是否有更好的方法(可能有),但这里供将来参考:
# Make the square matrix for N x N
c_matrix = np.zeros(shape=(len(i_table),len(i_table)))
c_matrix[:] = np.NaN # Replace with NaN to keep the diagonal NaN
iteration_table = i_table.to_numpy()
# Find all i,j combinations of patients that need a consensus index value
comb = list(combinations(list(range(0,iteration_table.shape[0])),2))
for c in tqdm(comb):
both_clustered = 0
same_cluster = 0
for i,j in zip(iteration_table[c[0]],iteration_table[c[1]]):
if i >= 0 and j >= 0:
both_clustered += 1
if i == j:
same_cluster += 1
res = same_cluster/both_clustered if both_clustered != 0 else 0
c_matrix[c[0]][c[1]] = res
c_matrix[c[1]][c[0]] = res
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。