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

Python聚类函数的TypeError与PCA断言错误排查求助

文档聚类函数的两类错误排查与修复建议

问题背景

实现文档聚类Python函数cluster_articles时,遇到两类测试错误:

  1. TypeError: 'int' object is not iterable,触发于test_number_of_observations_kmeans10等测试用例
  2. 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 修复

可能原因

  1. 字段格式不匹配:测试可能预期返回所有10个主成分的解释方差比例,而非仅第一个值
  2. 数据一致性问题:测试用subset_documents.p数据与你本地使用的数据不一致,导致PCA结果差异
  3. 精度阈值过严:测试用例的断言为精确匹配,而PCA计算因数据精度、内部实现有微小误差

修复方案

  1. 调整返回格式:若测试需要所有主成分的解释方差,修改字段为完整数组:
    'pca_explained': pca.explained_variance_ratio_,  # 返回全部10个比例值
    
  2. 验证数据一致性:若能获取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))
    
  3. 处理精度差异:对返回值做四舍五入,匹配测试的精度要求:
    'pca_explained': round(pca.explained_variance_ratio_[0], 4),
    
  4. 确认随机状态:已设置random_state=2,确保测试环境的PCA使用相同参数,排除随机性影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:26:22