轮廓值增加而聚类数量增加

Posted

技术标签:

【中文标题】轮廓值增加而聚类数量增加【英文标题】:silhouette value increasing while the number of clusters increasing 【发布时间】:2018-02-18 08:42:30 【问题描述】:

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

首先,我用 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)

【问题讨论】:

Silhouette 可能需要一个 distance 矩阵。因此,据说增加值是不好的。但他们真的好吗? NaN 可能是除以零。 是的,正如你所说,当集群增加时,剪影函数应该会减少,但我的结果恰恰相反,这让我很困惑 你的输入也反了。当距离增加时,亲和力会降低。所以我不会感到惊讶......剪影需要距离,而不是相似性。 感谢您的回复,我阅读了 scikit-learn 的文档,它说 Silhouette X 的输入可以是原始矩阵(n-samples,n-features)或相似矩阵(n-样本,n-samples),有没有其他方法可以用来选择聚类/度量聚类的数量? 或者,有什么我可以修复的建议修改吗? 【参考方案1】:

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

您可以在 中看到,“K”的最佳值为 4。 图片来源:Wikipedia.

您可以用来验证您的集群的另一个衡量标准是V-measure Score。它是一种对称度量,如果经常在基本事实未知时使用。它被定义为Homogenity 和Completeness 的谐波平均值。这是一个example in scikit-learn 供您参考。

编辑:V-measure 基本上用于比较两个不同的集群分配。

最后,如果您有兴趣,也可以查看Normalized Mutual Information Score 以验证您的结果。

参考文献:

Biclustering Scikit-Learn Elbow Method : Coursera Research Paper on V-Measure Choosing the right number of clusters

更新:我最近遇到了这个Self Tuning Spectral Clustering。你可以试试看。

【讨论】:

感谢您的精彩解释。我有一个疑问,现在我没有任何 ground truth,正如你所说,我可以应用 V-measure,但是当我来到 sklearn doc 时,它说我需要提供真相标签。 @TurboCC 它主要用于在两个不同的集群分配之间寻找一致性。对此感到抱歉,我将在我的回答中包含这一点。如果没有基本事实,我认为肘部方法应该最适合您的情况。

以上是关于轮廓值增加而聚类数量增加的主要内容,如果未能解决你的问题,请参考以下文章

用于在 KMeans 聚类中选择适当数量的聚类的轮廓索引

数据分析 第六篇:聚类的评估(簇数确定和轮廓系数)和可视化

聚类算法的评价指标——轮廓系数

增加输入框的宽度?删除单击按钮或输入框时出现的黑色轮廓?

R语言Kmeans聚类抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值并与层次聚类的最优K值进行比较

在R中绘制轮廓,每个群集具有不同的纹理