如何在scikit-learn的K-Means中指定数组作为质心初始值?
如何在scikit-learn的K-Means中指定自定义初始质心?
scikit-learn的KMeans类完全支持传入自定义的初始质心数组,不需要局限于文档里提到的'k-means++'或'random'选项,具体操作如下:
核心操作步骤
- 准备自定义质心数组:
数组的形状必须是(n_clusters, n_features)——也就是聚类数量 × 你的特征嵌入维度。比如你要分2类,特征是128维,那数组就要是(2, 128)的结构,直接填入你已掌握的两类数据集均值即可。 - 初始化KMeans时配置参数:
- 将
init参数设置为你的自定义质心数组 - 必须把
n_init设为1(默认n_init=10会重复随机初始化多次,会忽略你传入的自定义质心)
- 将
代码示例
from sklearn.cluster import KMeans import numpy as np # 模拟你的图像特征嵌入(1000个样本,128维特征) embeddings = np.random.rand(1000, 128) # 用两类样本的均值作为自定义初始质心 custom_centers = np.array([ np.mean(embeddings[:500], axis=0), # 第一类样本的均值 np.mean(embeddings[500:], axis=0) # 第二类样本的均值 ]) # 初始化KMeans模型 kmeans = KMeans( n_clusters=2, init=custom_centers, n_init=1, # 强制只使用一次自定义初始值 random_state=42 # 可选,保证结果可复现 ) # 拟合特征嵌入数据 kmeans.fit(embeddings) # 查看最终聚类中心(会和初始质心接近,迭代后可能有微调) print(kmeans.cluster_centers_)
注意事项
- 自定义质心的特征维度必须和输入的特征嵌入完全匹配,否则会抛出维度不匹配的错误。
- 如果你确定自定义质心已经是稳定的聚类中心(比如已知的两类均值),可以适当减小
max_iter参数(默认300),加快收敛速度。 random_state参数可选,但设置后能保证每次运行的结果一致,方便调试。
内容的提问来源于stack exchange,提问作者Djanger
相关产品推荐
相关产品推荐

