随着聚类数量的增加,轮廓值也随之增加

问题描述 投票:0回答:1

我有一个矩阵,行是品牌,列是每个品牌的特征。

首先,我使用 scikit learn 计算亲和力矩阵,然后在亲和力矩阵上应用谱聚类来进行聚类。

当我计算每个簇数的轮廓值时,只要簇数增加,轮廓值也在增加。 最后当簇数越来越大时,计算轮廓值,就会得到

NaN
结果

#coding utf-8
import pandas as pd

import sklearn.cluster as sk
from sklearn.cluster import SpectralClustering
from sklearn.metrics import silhouette_score


data_event = pd.DataFrame.from_csv('\Data\data_of_events.csv', header=0,index_col=0, parse_dates=True, encoding=None, tupleize_cols=False, infer_datetime_format=False)

data_event_matrix = data_event.as_matrix(columns = ['Furniture','Food & Drinks','Technology','Architecture','Show','Fashion','Travel','Art','Graphics','Product Design'])

#compute the affinity matrix

data_event_affinitymatrix = SpectralClustering().fit(data_event_matrix).affinity_matrix_

#clustering
for n_clusters in range(2,100,2):
    print n_clusters
    labels = sk.spectral_clustering(data_event_affinitymatrix, n_clusters=n_clusters, n_components=None,
                        eigen_solver=None, random_state=None, n_init=10, eigen_tol=0.0, assign_labels='kmeans')

    silhouette_avg = silhouette_score(data_event_affinitymatrix, labels)
    print("For n_clusters =", n_clusters, "The average silhouette_score of event clustering is :", silhouette_avg)
pandas python-2.7 scikit-learn cluster-analysis spectral-clustering
1个回答
0
投票

如果您的目的是找到最佳簇数,那么您可以尝试使用 Elbow 方法。此方法存在多种变体,但主要思想是,对于不同的 K 值(簇数),您可以找到最适合您的应用程序的成本函数(例如,簇中所有点的距离平方和它是 K 的所有值(例如 1 到 8)或任何其他误差/成本/方差函数的质心。在您的情况下,如果它是距离函数,那么在一定点数的簇之后,您会注意到值的差异沿 y 轴的值变得可以忽略不计。根据沿 x 轴绘制的簇数和沿 y 轴的度量,您可以选择 x 轴上的值“k”,此时 y 的值轴突然改变。

您可以在这个中看到,“K”的最佳值为4。
图片来源:维基百科.

可用于验证集群的另一个衡量标准是 V-measure Score。它是一种对称测量,并且在基本事实未知时经常使用。它被定义为同质性完整性的调和平均值。这里有一个 scikit-learn 中的示例供您参考。

编辑

:V-measure 基本上用于比较两个不同的聚类分配。 最后,如果您有兴趣,您也可以查看

标准化互信息得分

来验证您的结果。 参考资料:

    双聚类 Scikit-Learn
  • 肘法:Coursera
  • V-Measure 研究论文
  • 选择正确的簇数量
更新:

我最近遇到了这个自调整谱聚类。你可以尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.