无法实现Sklearn KMeans单聚类主导?求原因与解决方法
KMeans设置极端初始质心未达预期的原因与解决办法
问题原因
你遇到的情况是因为Sklearn的KMeans内置了空聚类处理机制:
- 当你设置的初始质心[-1000,1000]距离所有样本点极远时,第一次分配阶段所有点都会被归到[0,0]对应的聚类,导致另一个聚类无数据。
- 但KMeans的迭代过程中,一旦检测到空聚类,会自动重新初始化该聚类的质心(随机选取一个样本点作为新质心),然后继续执行质心更新和样本分配,最终两个聚类会均分数据。
解决办法
要实现所有点归到[0,0]对应的聚类、另一个聚类空的效果,只需限制KMeans只执行一次分配,不进入后续迭代和空聚类处理:
修改代码,添加max_iter=1和n_init=1参数:
import matplotlib.pyplot as plt from sklearn.datasets import make_circles from sklearn.cluster import KMeans X, y = make_circles((200,50), noise=.05, random_state=0, factor=0.2) # 仅执行一次分配,不进行质心更新和空聚类处理 means = KMeans(n_clusters=2, init=[[-1000,1000], [0,0]], max_iter=1, n_init=1).fit_predict(X) plt.scatter(X[:,0], X[:,1], c=means, s=50, cmap='viridis') plt.show()
补充说明
max_iter=1:让算法只完成一次样本到质心的分配,不执行后续的质心更新迭代,避免空聚类被重新初始化。n_init=1:确保仅使用你指定的初始质心运行一次,跳过默认的多次初始化验证。
如果使用Sklearn 1.2及以上版本,也可以通过empty_cluster_strategy="raise"参数让算法在出现空聚类时直接报错,但这种方式无法实现“保留空聚类”的需求,仅用于检测空聚类场景。
内容的提问来源于stack exchange,提问作者Liangtao Hu
相关产品推荐
相关产品推荐

