【发布时间】: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),有没有其他方法可以用来选择聚类/度量聚类的数量?
-
或者,有什么我可以修复的建议修改吗?
标签: python-2.7 pandas scikit-learn cluster-analysis spectral