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

