如何在 python Scikit-learn 中获得凝聚聚类“质心”
Posted
技术标签:
【中文标题】如何在 python Scikit-learn 中获得凝聚聚类“质心”【英文标题】:How to get Agglomerative Clustering "Centroid" in python Scikit-learn 【发布时间】:2019-10-20 17:35:25 【问题描述】:此代码是我用于silhouette_score
的代码。
在这里,我使用凝聚聚类,链接作为 Ward。
我想获得凝聚聚类的“质心”,是否可以从凝聚聚类中获得?我只能得到 K-mean 的质心和 Fuzzy c-mean。
df1
Height time_of_day resolution
272 1.567925 1.375000 0.594089
562 1.807508 1.458333 0.594089
585 2.693542 0.416667 0.594089
610 1.036305 1.458333 0.594089
633 1.117111 0.416667 0.594089
658 1.542407 1.458333 0.594089
681 1.930844 0.416667 0.594089
802 1.505548 1.458333 0.594089
808 1.009369 1.708333 0.594089
def clustering(df1):
X = df1.iloc[:].values
range_n_clusters = [2,3,4]
for n_clusters in range_n_clusters:
# Create a subplot with 1 row and 2 columns
clusterer = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
clusterer.fit_predict(X)
cluster_labels = clusterer.labels_
silhouette_avg = silhouette_score(X, cluster_labels)
if silhouette_avg > 0.4:
print("For n_clusters =", n_clusters,
"The average silhouette_score is :", silhouette_avg)
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(15, 5)
ax1.set_xlim([-0.1, 1])
ax1.set_ylim([0, len(X) + (n_clusters + 1) * 10])
sample_silhouette_values = silhouette_samples(X, cluster_labels)
y_lower = 10
for i in range(n_clusters):
ith_cluster_silhouette_values = \
sample_silhouette_values[cluster_labels == i]
ith_cluster_silhouette_values.sort()
size_cluster_i = ith_cluster_silhouette_values.shape[0]
y_upper = y_lower + size_cluster_i
color = cm.nipy_spectral(float(i) / n_clusters)
ax1.fill_betweenx(np.arange(y_lower, y_upper),
0, ith_cluster_silhouette_values,
facecolor=color, edgecolor=color, alpha=0.7)
ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
y_lower = y_upper + 10 # 10 for the 0 samples
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel("Cluster label")
ax1.axvline(x=silhouette_avg, color="red", linestyle="--")
ax1.set_yticks([]) # Clear the yaxis labels / ticks
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
ax = Axes3D(fig)
colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
ax.scatter(X[:, 1], X[:, 2], X[:, 0],marker='o', s=20, lw=0, alpha=0.7,
c=colors, edgecolor='k')
plt.suptitle(("Silhouette analysis for HAC-ward clustering on sample data "
"with n_clusters = %d" % n_clusters),
fontsize=14, fontweight='bold')
plt.show()
return
clusterer = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
clusterer.fit_predict(X)
cluster_labels = clusterer.labels_
此代码仅适用于聚合聚类方法
from scipy.cluster.hierarchy import centroid, fcluster
from scipy.spatial.distance import pdist
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
y = pdist(df1)
y
我也试过这段代码,但我不确定“y”是正确的质心。
from sklearn.neighbors.nearest_centroid import NearestCentroid
clf = NearestCentroid()
clf.fit(df1["Height"],df1["time_of_day"])
print(clf.centroids_)
为此,我尝试对 X、Y 质心使用另一种方法。它显示错误...
请建议我是否可以从凝聚聚类中获得质心,或者我应该坚持使用模糊 cmean
谢谢
【问题讨论】:
【参考方案1】:我相信您可以使用聚合聚类,并且可以使用NearestCentroid
获得质心,您只需要对代码进行一些调整,这对我有用:
from sklearn.neighbors import NearestCentroid
y_predict = clusterer.fit_predict(X)
#...
clf = NearestCentroid()
clf.fit(X, y_predict)
print(clf.centroids_)
我认为您的代码中唯一缺少的是您没有从fit_predict()
取回返回值,您也可以尝试dendrogram
以获得更好的可视化效果,完整代码可以在here 找到。
【讨论】:
以上是关于如何在 python Scikit-learn 中获得凝聚聚类“质心”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 虚拟环境中导入 scikit-learn?
如何在 Python 中使用带有 Keras 的 scikit-learn 评估指标函数?
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?
python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?