You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:17:19