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

KMeans聚类触发OverflowError:无法将无穷大转为整数的解决求助

KMeans聚类OverflowError修复及潜在问题排查

问题详情

运行以下KMeans聚类代码时触发OverflowError:

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import quantstats as qs

data = pd.read_csv('worldometer_data.csv')
X = data.drop(columns=['Country/Region', 'Continent', 'Population', 'WHO Region'])

# replace NaN values with 0
for i in X:
  X[i] = X[i].fillna(0)
  
# getting rid of float infinity
X = X.replace([np.inf, -np.inf, -0], 0)

wcss = []

# getting Kmeans
for i in range(0, 51):
  kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
  kmeans.fit(X)
  wcss.append(kmeans.inertia_)

# visualizing the kmeans graph
plt.plot(range(0, 51), wcss)
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

错误核心信息:

OverflowError: cannot convert float infinity to integer

根源是循环从0开始,当n_clusters=0时,sklearn内部执行np.log(0)得到无穷大,无法转换为整数;且KMeans本身不允许聚类数为0,聚类数必须≥1。

修复方案

调整循环范围,从1开始遍历合理的聚类数区间,同时修正绘图的x轴范围:

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import quantstats as qs

data = pd.read_csv('worldometer_data.csv')
X = data.drop(columns=['Country/Region', 'Continent', 'Population', 'WHO Region'])

# 替换NaN值为0
for i in X:
  X[i] = X[i].fillna(0)
  
# 移除正负无穷和负0
X = X.replace([np.inf, -np.inf, -0], 0)

wcss = []

# KMeans聚类,聚类数从1到50
for i in range(1, 51):
  kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
  kmeans.fit(X)
  wcss.append(kmeans.inertia_)

# 绘制肘部法则图
plt.plot(range(1, 51), wcss)
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

其他潜在问题优化

  • 数据标准化:KMeans基于距离计算,不同特征量纲差异会严重影响聚类结果(比如疫情数据中总确诊数和死亡率数值范围差极大),建议先标准化:
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    # 后续用X_scaled替代X做KMeans拟合
    
  • 清理无效特征:检查X中是否存在全为0的特征(NaN替换后可能产生),这类特征对聚类无意义,可提前删除以减少计算量。
  • 初始化参数优化:sklearn版本≥1.2时,将n_init设为'auto',会根据聚类数自动调整初始化次数,效果更优且效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:35:15