如何在Python中使用K-Means聚类找到最优聚类数

问题描述

我是集群算法的新手。我有一个包含200多部电影和100多个用户的电影数据集。所有用户都对至少一部电影进行了评分。值1表示好,0表示坏,如果批注器没有选择,则为空。

我想根据相似用户的评论对其进行聚类,因为将类似电影评为好的用户也可能会将未被同一群集中的任何用户评为好的电影评为好电影。我使用余弦相似性度量和k-均值聚类。CSV文件如下所示:

  UserID         M1     M2       M3  ...............  M200                          
  user1          1      0                               0     
  user2          0      1        1                                      
  user3          1      1                               1                                                                         
    .
    .
    .
    .
 user100         1      0        1                                       

我面临的问题是,我不知道如何准确地找到此数据集的最优聚类数,然后绘制这些聚类的图形。我正在使用k-Means对它们进行聚类,这没有问题,但我想知道此数据集的最稳定或最佳聚类数。

感谢您的帮助..


解决方案

聚类是无监督机器学习方法的一部分。与有监督的方法相反,在无监督的方法中,没有一种直接的方法来确定在特定数据集上训练的一组模型中的&q;最佳&q;模型。

尽管如此,还是有一些量化措施。它们中的大多数都是基于&q;某个簇中的点之间的相似度比与不同簇中的点的相似度高多少?&我建议您查看clustering evaluation上的SCRICKIT-学习文档。看看所有不需要labels_true的技术(即所有无监督的技术)。 一旦您对某个群集的&Quot;Good&Quot;有了一个定量的度量,您通常会在更改群集数量时观察该数量是如何演变的;此方法称为Elbow Method。

以下代码使用K-Means算法,所有可能的K值从2到30,计算每个K值的各种分数,并将所有分数存储在DataFrame中。

seed_random = 1

fitted_kmeans = {}
labels_kmeans = {}
df_scores = []
k_values_to_try = np.arange(2, 31)
for n_clusters in k_values_to_try:
    
    #Perform clustering.
    kmeans = KMeans(n_clusters=n_clusters,
                    random_state=seed_random,
                    )
    labels_clusters = kmeans.fit_predict(X)
    
    #Insert fitted model and calculated cluster labels in dictionaries,
    #for further reference.
    fitted_kmeans[n_clusters] = kmeans
    labels_kmeans[n_clusters] = labels_clusters
    
    #Calculate various scores, and save them for further reference.
    silhouette = silhouette_score(X, labels_clusters)
    ch = calinski_harabasz_score(X, labels_clusters)
    db = davies_bouldin_score(X, labels_clusters)
    tmp_scores = {"n_clusters": n_clusters,
                  "silhouette_score": silhouette,
                  "calinski_harabasz_score": ch,
                  "davies_bouldin_score": db,
                  }
    df_scores.append(tmp_scores)

#Create a DataFrame of clustering scores, using `n_clusters` as index, for easier plotting.
df_scores = pd.DataFrame(df_scores)
df_scores.set_index("n_clusters", inplace=True)

此代码假设您的所有数字特征都在DataFrameX中。 所有群集性能指标都存储在df_scoresDataFrame中。 您可以通过绘制df_scores中的列来轻松地使用肘部方法;例如,如果您想要查看侧影得分的肘部图,可以使用df_scores["silhouette_score"].plot()

相关文章