Python 3.x 跨不同时间段跟踪群集

Python 3.x 跨不同时间段跟踪群集,python-3.x,pandas,pivot-table,cluster-analysis,Python 3.x,Pandas,Pivot Table,Cluster Analysis,我对Python比较陌生,我遇到了以下问题:我试图跨两个时间段(两个不同的数据集)对客户进行集群。k-均值聚类结果存储在熊猫数据框中,列为“name”、“clustering_period_1”和“clustering_period_2”。由于集群标签在集群期间没有任何意义,因此我想在“集群\时段\ 2中”重新分配标签 方法:我想计算周期1和周期2的每个聚类输出,组合发生的频率,例如,周期1中的聚类1和周期2中的聚类5分配观察的频率。我使用pivot_table函数执行此操作: df.p

我对Python比较陌生,我遇到了以下问题:我试图跨两个时间段(两个不同的数据集)对客户进行集群。k-均值聚类结果存储在熊猫数据框中,列为“name”、“clustering_period_1”和“clustering_period_2”。由于集群标签在集群期间没有任何意义,因此我想在“集群\时段\ 2中”重新分配标签

方法:我想计算周期1和周期2的每个聚类输出,组合发生的频率,例如,周期1中的聚类1和周期2中的聚类5分配观察的频率。我使用pivot_table函数执行此操作:

    df.pivot_table(index='cluster', columns='cluster_2', values='name', aggfunc='count')
然后我想在“透视表”中找到最大值:

    cluster_period_2   0   1   2   3   4   5   6
    cluster_period_1                              
    0                  51  43  50  49  32  36  33
    1                  26  28  17  34  25  28  30
    2                  34  47  35  33  37  36  34
    3                   7   6   2   5   7   5   6
    4                  30  19  24  26  20  18  20
    5                   3  11   5   6   4   6   3
    6                   4   2   1  13   2   4   3
在本例中,这将是51,这意味着cluster_0_period_1现在是cluster_0_In_period_2。然后,我想找到下一个最大值,它不在已经使用的列和行中,即不在第0行或第0列中。这是47,意味着cluster_2_period_1现在是cluster_1_period_2。我希望这样做,直到我得到一个完整的列表,例如(下面的示例不基于透视表值):

如何最好地实现这一点?或者,如果有完全不同的方法更有意义(例如字典或基于列表),请随时提出建议


非常感谢您的光临

我们正在进行
堆栈

df1=df.stack().to_frame('val').reset_index()
A=[]
B=[]
for x,y in df1.groupby('cluster_period_1'):
    y=y.loc[~y['cluster_period_2'].isin(A),:]
    A.append(y['cluster_period_2'].loc[y.val.idxmax()])
    B.append(y.val.idxmax())
    print(A)
    print(y)
然后


我们正在做
堆栈

df1=df.stack().to_frame('val').reset_index()
A=[]
B=[]
for x,y in df1.groupby('cluster_period_1'):
    y=y.loc[~y['cluster_period_2'].isin(A),:]
    A.append(y['cluster_period_2'].loc[y.val.idxmax()])
    B.append(y.val.idxmax())
    print(A)
    print(y)
然后


这种贪婪的方法可能找不到最好的解释

相反,使用

另外,你可以通过使用前一阶段的中心作为起始条件来增加你的稳定性

在上面的例子中,两个集群之间的相似性非常小,因此我拒绝了可以映射/跟踪集群中心的假设。k-means的不稳定并不罕见,这通常只是暗示它无论如何都不起作用


您可能还希望使用ARI和AMI来衡量两个集群分配的相似性。如果这些值很低,那么找到1对1映射是没有意义的。

这种greedy方法可能找不到最佳匹配

相反,使用

另外,你可以通过使用前一阶段的中心作为起始条件来增加你的稳定性

在上面的例子中,两个集群之间的相似性非常小,因此我拒绝了可以映射/跟踪集群中心的假设。k-means的不稳定并不罕见,这通常只是暗示它无论如何都不起作用


您可能还希望使用ARI和AMI来衡量两个集群分配的相似性。如果这些值很低,那么找到1对1映射是没有意义的。

“我们在做
堆栈
”我喜欢你这样说。xD@cᴏʟᴅsᴘᴇᴇᴅ 哈哈:-)需要时间来提高我的沟通技巧:-)“我们在做
堆栈
”我喜欢你这样说。xD@cᴏʟᴅsᴘᴇᴇᴅ 哈哈:-)需要时间来提高我的沟通技巧:-)谢谢你的帖子!在这种情况下,AMI和ARI代表什么?调整后的兰德指数,调整后的相互信息。聚类评估的标准方法。谢谢你的帖子!在这种情况下,AMI和ARI代表什么?调整后的兰德指数,调整后的相互信息。集群评估的标准措施。
df1.loc[B]
Out[472]: 
    cluster_period_1 cluster_period_2  val
0                  0                0   51
10                 1                3   34
15                 2                1   47
25                 3                4    7
30                 4                2   24
40                 5                5    6
48                 6                6    3