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
相关产品推荐
相关产品推荐

