将集群结果数据帧转换为共识数据帧

问题描述

我正在开展一个共识聚类项目,在该项目中,我在我的数据的随机子集上运行多个版本的聚类算法,并跟踪哪些项目分配给了哪些集群。 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 (将#修改为@)