在python中通过最小生成树进行聚类

问题描述

我有一个数组 (X),包含 10 个用户的分数值及其分数。我使用最小生成树聚类 (MST) 根据用户的值对用户进行聚类。 MST 没有对数据进行聚类,而是返回 0 个聚类!!!!

以下代码

import warnings
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn_extra.cluster import KMedoids
from tabulate import tabulate
from termcolor import colored,cprint 
from prettytable import prettytable
from mst_clustering import MSTClustering
%matplotlib inline
warnings.filterwarnings('ignore')

X = np.array([0.85142858,0.85566274,0.85364912,0.81536489,0.84929932,0.85042336,0.84899714,0.82019115,0.86112067,0.8312496 ])
X=X.reshape(-1,1)

MST = MSTClustering(cutoff_scale=2,approximate=False)
labels = MST.fit_predict(X)

dfMST= pd.DataFrame(zip(labels,X))
dfMST = dfMST.rename({0: 'cluster',1: 'values'},axis=1)
dfMST['user'] = dfMST.index
dfMST = dfMST[['cluster','user','values']]
print ('clustering the data using MST')
print(tabulate(dfMST,headers='keys',tablefmt='psql')) 

产生如下输出

clustering the data using MST
+----+-----------+--------+----------+
|    |   cluster |   user |   values |
|----+-----------+--------+----------|
|  0 |         0 |      0 | 0.851429 |
|  1 |         0 |      1 | 0.855663 |
|  2 |         0 |      2 | 0.853649 |
|  3 |         0 |      3 | 0.815365 |
|  4 |         0 |      4 | 0.849299 |
|  5 |         0 |      5 | 0.850423 |
|  6 |         0 |      6 | 0.848997 |
|  7 |         0 |      7 | 0.820191 |
|  8 |         0 |      8 | 0.861121 |
|  9 |         0 |      9 | 0.83125  |
+----+-----------+--------+----------+

如何以正确的方式通过 MST 对用户进行聚类? 我应该指定其他截止比例参数吗?

解决方法

MSTClustering 生成具有自动 k 确定的聚类解决方案,使用两个邻近图:递归相交的最小生成树 (MST) 和 k-最近邻 (kNN) .

另一方面,KMedoids 最小化标记为集群中的点与指定为该集群中心的点之间的距离,您可以在其中手动指定集群数量形成以及要生成的中心点数量。

因此,您不应该期望获得相同数量的集群(即来自两者的相同解决方案),在第一种情况下,您手动将集群数量指定为 5,因此,您有 5 个集群,在第二种情况下,您让算法找到了最佳集群数,它发现所有用户都属于同一个集群(尤其是您的数据集非常小)。因此,您得到的是一个非常有效的结果。

如果您真的相信(并且有证据)用户应该被分成 5 个集群,那么直觉上,您应该使用第一个算法 KMedoids