Python聚类函数的TypeError与PCA断言错误排查求助
文档聚类函数的两类错误排查与修复建议
问题背景
实现文档聚类Python函数cluster_articles时,遇到两类测试错误:
TypeError: 'int' object is not iterable,触发于test_number_of_observations_kmeans10等测试用例AssertionError: Assertion error at PCA explained value,触发于test_pca_explained测试用例
函数代码如下:
import pickle from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.metrics import completeness_score, v_measure_score def cluster_articles(data): # K-Means on original data kmeans_100 = KMeans(n_clusters=10, random_state=2, tol=0.05, max_iter=50) kmeans_100.fit(data['vectors']) labels_100 = kmeans_100.labels_ # PCA Dimensionality Reduction pca = PCA(n_components=10, random_state=2) reduced_data = pca.fit_transform(data['vectors']) # K-Means on reduced data kmeans_10 = KMeans(n_clusters=10, random_state=2, tol=0.05, max_iter=50) kmeans_10.fit(reduced_data) labels_10 = kmeans_10.labels_ print(type(kmeans_10.n_iter_)) # Debugging output # Results Dictionary (Potential issue here) result = { 'nobs_100': kmeans_100.n_iter_, 'nobs_10': kmeans_10.n_iter_, 'pca_explained': pca.explained_variance_ratio_[0], # ... rest of the results } return result
任务要求:通过K-Means(含/不含PCA降维)完成文档聚类,计算完整性得分、V-measure、PCA解释方差等指标。输入数据为包含id、vectors(100维Doc2Vec向量)、groups(0-9真实标签)的字典。使用包版本:scikit-learn 0.24.1、NumPy 1.20.1、SciPy 1.6.1、pandas 1.2.3。
已确认kmeans_10.n_iter_为整数,但仍不明TypeError原因;同时疑惑PCA解释方差断言失败是否由随机性或测试数据差异导致,无法访问测试代码,可能涉及subset_documents.p文件。
一、TypeError: 'int' object is not iterable 修复
核心原因
测试用例预期nobs_100或nobs_10为可迭代对象(如列表、数组),但你返回的是KMeans的n_iter_属性——这是一个整数(表示K-Means收敛所用的迭代次数),与测试预期的字段含义不匹配。
修复方案
nobs通常指代观测样本数量(number of observations),而非迭代次数,修改结果字典对应字段:
result = { # 替换为样本数量,即data['vectors']的行数 'nobs_100': data['vectors'].shape[0], 'nobs_10': data['vectors'].shape[0], 'pca_explained': pca.explained_variance_ratio_[0], # ... 其他结果字段 }
如果测试确实需要迭代次数,但要求可迭代格式,可将整数转为单元素列表:
'nobs_100': [kmeans_100.n_iter_], 'nobs_10': [kmeans_10.n_iter_],
二、AssertionError: Assertion error at PCA explained value 修复
可能原因
- 字段格式不匹配:测试可能预期返回所有10个主成分的解释方差比例,而非仅第一个值
- 数据一致性问题:测试用
subset_documents.p数据与你本地使用的数据不一致,导致PCA结果差异 - 精度阈值过严:测试用例的断言为精确匹配,而PCA计算因数据精度、内部实现有微小误差
修复方案
- 调整返回格式:若测试需要所有主成分的解释方差,修改字段为完整数组:
'pca_explained': pca.explained_variance_ratio_, # 返回全部10个比例值 - 验证数据一致性:若能获取
subset_documents.p,加载后检查数据特征:with open('subset_documents.p', 'rb') as f: test_data = pickle.load(f) print(test_data['vectors'].shape) print(test_data['vectors'].mean(axis=0)) - 处理精度差异:对返回值做四舍五入,匹配测试的精度要求:
'pca_explained': round(pca.explained_variance_ratio_[0], 4), - 确认随机状态:已设置
random_state=2,确保测试环境的PCA使用相同参数,排除随机性影响
内容的提问来源于stack exchange,提问作者Sushant Patekar
相关产品推荐
相关产品推荐

