gpt4 book ai didi

python - 如何在 python Scikit-learn 中获得凝聚聚类 "Centroid"

转载 作者:行者123 更新时间:2023-12-03 15:50:52 25 4
gpt4 key购买 nike

此代码是我用于 silhouette_score 的代码.
在这里我使用凝聚聚类,链接作为病房。
我想获得凝聚聚类的“质心”,从凝聚聚类中可以获得吗?我只能得到 K 均值的质心和模糊 c 均值。

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_

此代码仅适用于 Agglomerative Clustering 方法
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

谢谢

最佳答案

我相信你可以使用凝聚聚类,你可以使用 NearestCentroid 获得质心。 ,您只需要对代码进行一些调整,这对我有用:

y_predict = clusterer.fit_predict(X)
#...
from sklearn.neighbors.nearest_centroid import NearestCentroid
clf = NearestCentroid()
clf.fit(X, y_predict)
print(clf.centroids_)

我认为您的代码中唯一缺少的是您没有从 fit_predict() 取回返回的值。 ,您也可以试试 dendrogram为了更好的可视化,可以找到完整的代码 here .

希望这可以帮助。

关于python - 如何在 python Scikit-learn 中获得凝聚聚类 "Centroid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com