我有一个矩阵,其中行是品牌,列是每个品牌的特征。
首先,我用 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)
答案 0 :(得分: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以验证您的结果。
参考文献:
更新:我最近遇到了这个Self Tuning Spectral Clustering。你可以尝试一下。