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

设置random_state参数后KMeans仍输出不同inertia值的问题

问题根因

你遇到的inertia微小差异和随机种子失效无关,本质是浮点数计算的精度特性:

  • 两次输出的数值差仅为1.19e-7量级,属于双精度浮点数运算的正常舍入误差范围
  • KMeans计算inertia(样本到所属质心的距离平方和)、迭代更新质心时,底层依赖的BLAS矩阵运算库默认会用多线程并行计算,浮点数加法本身不满足严格结合律,并行时的累加顺序不固定,哪怕输入、初始质心完全一致,最后求和结果的最后几位二进制位也可能出现偏差
  • 你设置的random_state=42已经完全固定了KMeans的质心初始化、迭代采样所有随机环节,不存在随机因素导致的结果差异,聚类标签、质心位置在多次运行中是完全一致的,不属于结果不可复现。
验证方式

你可以直接对比10次运行输出的kmeans.labels_和kmeans.cluster_centers_,会发现二者完全相同,只有inertia求和的末尾精度存在可忽略的偏差。

强制输出完全一致的方案

如果要求inertia打印到20位小数时也完全无差,有两种可行方案:

  • 强制单线程运行:在脚本最开头(所有numpy、sklearn导入语句之前)添加线程数限制的环境变量,关闭BLAS多线程并行,固定浮点数计算顺序,修改后的代码如下:
import os
os.environ["OMP_NUM_THREADS"] = "1"
os.environ["OPENBLAS_NUM_THREADS"] = "1"
os.environ["MKL_NUM_THREADS"] = "1"

from sklearn.cluster import KMeans
import numpy as np

points = np.genfromtxt('page.txt')
for l in range(10):
    kmeans = KMeans(n_clusters=30, n_init=1, random_state=42)
    kmeans.fit(points)
    print('{0:.20f}'.format(kmeans.inertia_))
  • 调整打印精度:实际使用场景中inertia不需要保留20位小数,保留6位以内小数时这个精度差会完全消失,不影响对聚类效果的判断。

提示:这类浮点数末尾的舍入误差是数值计算的通用特性,不属于复现失败,只要聚类标签、质心、inertia的有效数值一致,就满足可复现要求。

内容的提问来源于stack exchange,提问作者pzsette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:09:26