使用 Python 的 KMeans 聚类

KMeans Clustering using Python

我有一个数据集

Name    System
A       AZ
A       NaN
B       AZ
B       NaN
B       NaN
C       AY
C       AY
D       AZ
E       AY
E       AY
E       NaN
F       AZ
F       AZ
F       NaN

使用此数据集,我需要根据针对特定“名称”重复“系统”的次数对数据集进行聚类。

在上面的例子中,名称A、B和D有一个“AZ”“子集”,而C、E有两个“AY”子集,F有两个AZ,所以它是一个不同的集群。

输出示例:

Cluster     Names
AZ          A,B
AY,AY       C,E
AZ,AZ       F 

PS。实际数据集的行数和列数可能有所不同 我如何使用基于 ML 的聚类算法(如 KNN、朴素贝叶斯等)来做到这一点? 我需要两种方法,一种不忽略 NaN,一种忽略 NaN。

IIUC,这看起来像双 groupby。您首先需要按 Name 和 System 分组并聚合 System 以形成集群。那么这是一个简单的groupby,聚合为字符串。

(df.groupby(['Name', 'System'])
   ['System'].agg(Cluster=','.join)          # clusters of repeats
   .droplevel('System').reset_index()
   .groupby('Cluster')['Name'].agg(','.join) # aggregate by cluster
   .reset_index()
)

输出:

  Cluster   Name
0   AY,AY    C,E
1      AZ  A,B,D
2   AZ,AZ      F

注意。我在这里使用 ','.join 聚合,但您也可以使用 tuple 或自定义函数(第一个 groupby)和 frozenset(第二个 groupby)来保持对个别元素

(df.groupby(['Name', 'System'], dropna=False)
   ['System'].agg(Cluster=lambda x: (x.iloc[0], len(x)))
   .droplevel('System').reset_index()
   .groupby('Cluster')['Name'].agg(frozenset)
   .reset_index()
)

输出:

    Cluster       Name
0   (AY, 2)     (E, C)
1   (AZ, 1)  (B, A, D)
2   (AZ, 2)        (F)
3  (nan, 1)  (E, F, A)
4  (nan, 2)        (B)