如何用Python(Scikit-learn)提取K-means聚类的19簇中心与边界数据?
嘿,我来帮你搞定这个需求!你已经用Scikit-learn的K-means把数据分成19个簇了,接下来提取簇中心和边界数据,还要做可视化,咱们一步步来:
提取K-means簇中心与边界数据并可视化的Python实现
1. 先提取簇中心(超简单!)
Scikit-learn的K-means模型自带了cluster_centers_属性,训练完模型后直接调用就能拿到所有19个簇的中心坐标,不用额外计算:
from sklearn.cluster import KMeans import numpy as np # 假设你已经完成了聚类训练,比如: # kmeans = KMeans(n_clusters=19, random_state=42).fit(your_data) # 一键提取簇中心 cluster_centers = kmeans.cluster_centers_ print(f"19个簇的中心形状: {cluster_centers.shape}") # 输出应该是 (19, 特征数)
2. 提取簇边界数据
这里的“边界”有两种常见定义,你可以根据自己的需求选:
方式一:每个簇里离自身中心最远的样本(簇内边缘点)
这种是找每个簇的“最远点”,能直观体现簇的范围边界:
# 把原始数据和聚类标签合并,方便按簇筛选 data_with_labels = np.hstack((your_data, kmeans.labels_.reshape(-1, 1))) # 用来存储每个簇的边界样本 boundary_samples = [] for cluster_id in range(19): # 筛选当前簇的所有样本 cluster_data = data_with_labels[data_with_labels[:, -1] == cluster_id][:, :-1] # 计算当前簇中心 center = cluster_centers[cluster_id] # 计算每个样本到中心的欧氏距离 distances = np.linalg.norm(cluster_data - center, axis=1) # 找到距离最远的那个样本(如果想要多个边界点,可以取前N个最大值) farthest_idx = np.argmax(distances) boundary_samples.append(cluster_data[farthest_idx]) # 转成numpy数组方便后续处理 boundary_samples = np.array(boundary_samples)
方式二:紧邻其他簇的样本(簇间边界点)
这种是找那些距离自己簇中心的距离,和距离最近的其他簇中心距离很接近的样本,更贴近“簇与簇之间的边界”:
# 计算每个样本到所有19个簇中心的距离 all_center_distances = kmeans.transform(your_data) # 形状: (样本数, 19) # 筛选边界样本的掩码 is_boundary = [] for i in range(len(your_data)): current_cluster = kmeans.labels_[i] # 当前样本到自身簇中心的距离 dist_to_self = all_center_distances[i, current_cluster] # 当前样本到其他簇中心的最小距离 dist_to_other = np.min(all_center_distances[i, np.arange(19) != current_cluster]) # 设定阈值(比如距离比值<=1.1,可根据数据调整),满足则视为边界点 if dist_to_other / dist_to_self <= 1.1: is_boundary.append(True) else: is_boundary.append(False) # 提取所有边界样本 inter_cluster_boundary = your_data[np.array(is_boundary)]
3. 聚类结果可视化(包含中心和边界)
如果你的数据是二维的,直接用Matplotlib画就行;如果是高维数据,建议先降维(比如用PCA)再可视化:
二维数据直接绘图
import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) # 绘制所有样本,按簇着色 all_samples = plt.scatter(your_data[:, 0], your_data[:, 1], c=kmeans.labels_, cmap='viridis', alpha=0.5, s=30, label='All Samples') # 绘制簇中心,用醒目的黑色星号 plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], marker='*', s=250, c='black', edgecolor='white', label='Cluster Centers') # 绘制边界样本(以方式一为例,换成inter_cluster_boundary就是方式二的结果) plt.scatter(boundary_samples[:, 0], boundary_samples[:, 1], marker='s', s=120, c='red', edgecolor='white', label='Boundary Samples') # 添加图例和标签 plt.legend() plt.title('K-means Clustering (19 Clusters) with Centers & Boundary Samples') plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.colorbar(all_samples, label='Cluster ID') plt.show()
高维数据降维后绘图
用PCA把数据降到二维再画,代码如下:
from sklearn.decomposition import PCA # 初始化PCA,降到2维 pca = PCA(n_components=2, random_state=42) # 对原始数据、簇中心、边界样本做降维 data_pca = pca.fit_transform(your_data) centers_pca = pca.transform(cluster_centers) boundary_pca = pca.transform(boundary_samples) # 绘图逻辑和上面一致,只是把所有变量换成降维后的版本 plt.figure(figsize=(12, 8)) plt.scatter(data_pca[:, 0], data_pca[:, 1], c=kmeans.labels_, cmap='viridis', alpha=0.5, s=30) plt.scatter(centers_pca[:, 0], centers_pca[:, 1], marker='*', s=250, c='black', edgecolor='white') plt.scatter(boundary_pca[:, 0], boundary_pca[:, 1], marker='s', s=120, c='red', edgecolor='white') plt.title('K-means 19 Clusters (PCA降维可视化)') plt.xlabel('PCA Component 1') plt.ylabel('PCA Component 2') plt.colorbar(label='Cluster ID') plt.legend(['All Samples', 'Cluster Centers', 'Boundary Samples']) plt.show()
内容的提问来源于stack exchange,提问作者IS2057
相关产品推荐
相关产品推荐

