You need to enable JavaScript to run this app. Python层次聚类报ValueError: condensed distance matrix仅可含有限值如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Python层次聚类报ValueError: condensed distance matrix仅可含有限值如何解决

问题原因

错误触发的核心是提取的特征矩阵X中存在NaN缺失值,scipy的聚类算法要求输入的特征必须全部是有限数值,不允许存在空值、无穷值,因此抛出该异常。
你代码中存在两处逻辑错误导致缺失值未被正确处理:

  • 调用dataset.dropna(how='all')时没有接收返回值,pandas的dropna方法默认不修改原DataFrame,你写的这行代码实际没有生效;且how='all'仅会删除整行所有字段全为空的行,你选取的第3、4列存在单独的空值,这种情况不会被该规则删除。
  • 读取CSV时已经通过na_values=["?"]把所有?标记为NaN了,后续遍历对象列替换?的逻辑完全冗余,可以直接删除。
修复方案
  • 调整缺失值处理规则:将how='all'改为how='any'删除所有包含空值的行,或使用均值/中位数填充指定列的空值,同时要将处理后的结果赋值回dataset。
  • 提取特征后先校验是否存在空值,确认无异常再运行聚类代码。
修复后的完整代码
# 导入依赖库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 导入数据集
dataset = pd.read_csv("https://raw.githubusercontent.com/akbarhusnoo/Chronic-Kidney-Disease-Prediction/main/chronic_kidney_disease.csv", na_values=["?"])

# 处理缺失值:删除所有包含空值的行,也可根据需求改为填充逻辑
dataset = dataset.dropna(how='any')
# 提取第3、4列作为特征
X = dataset.iloc[:, [3,4]].values

# 可选的填充缺失值方案,替代删除操作
# dataset.iloc[:,3] = dataset.iloc[:,3].fillna(dataset.iloc[:,3].mean())
# dataset.iloc[:,4] = dataset.iloc[:,4].fillna(dataset.iloc[:,4].mean())

# 绘制树状图找最优聚类数
import scipy.cluster.hierarchy as sch
dendrogram = sch.dendrogram(sch.linkage(X, method='ward' ))
plt.title('Dendrogram')
plt.xlabel('C')
plt.ylabel('Euclidean distances')
plt.show()

# 训练层次聚类模型
from sklearn.cluster import AgglomerativeClustering
hc = AgglomerativeClustering(n_clusters=5, affinity = 'euclidean', linkage = 'ward')
Y_hc = hc.fit_predict(X)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 08:54:07