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

使用cvxopt触发ArithmeticError及Rank(A)<p报错的排查方案

PU学习调用cvxopt求解器触发秩不足报错的排查与修复

问题背景

我是Python初学者,将网上公开的现成Positive-unlabeled(正例-无标记,简称PU)学习工具包应用到自有数据集上,此前代码运行一直正常,近期首次出现报错。

核心报错信息

报错最先在cvxopt的Cholesky分解环节触发算术错误,最终抛出秩不足的取值错误:

ArithmeticError: 1090
ArithmeticError: 26
ValueError: Rank(A) < p or Rank([P; A; G]) < n

从调用栈看,报错触发路径为:rolling_window_collection() → train_and_val() → wrapper_ramaswamy()(Ramaswamy方法做PU类先验c估计)→ get_distance_curve() → find_nearest_valid_distribution() → cvxopt.solvers.coneqp()(锥规划求解)。

可能诱因

代码此前能正常运行、突发报错,常见诱因有以下几类:

  • 数据集切分结果退化:滚动窗口切分后某一批次训练数据存在常量特征列、大量重复样本、正例样本量过少(<3个)、正例与无标记样本特征完全重合等问题,导致计算得到的RBF核矩阵奇异、不满秩。
  • 依赖版本变动:近期更新过cvxopt、numpy、scipy等底层数值计算库,新版本LAPACK求解器对矩阵奇异性的容忍阈值收紧,此前版本可正常求解的病态矩阵现在直接判定分解失败。
  • 核宽计算异常:compute_best_rbf_kernel_width输出的最优核宽为0或无穷大,导致生成的核矩阵所有元素取值完全一致,矩阵秩为1,无法满足求解要求。
  • 数值稳定性不足:原代码未给核矩阵加对角正则项,浮点计算误差累积会导致本应满秩的矩阵变成奇异矩阵。

排查与修复方案

按排查成本从低到高排序,依次操作即可:

  1. 优先校验输入数据
    • 定位触发报错的训练批次,统计该批次正例样本量,若正例数少于3,直接调整滚动窗口步长、扩大窗口范围,保证单批次正例样本量不低于5。
    • 剔除该批次内取值完全恒定的特征列、删除完全重复的样本,对取值量级差异过大的特征提前做标准化/归一化处理。
  2. 给核矩阵加对角正则提升数值稳定性
    打开Kernel_MPE_grad_threshold.py,找到find_nearest_valid_distribution函数,构造二次型矩阵P时添加极小的对角正则项,修改示例:
    # 找到原有构造P的代码,替换为以下逻辑
    n = kernel.shape[0]
    reg = 1e-6  # 极小正则项,不影响求解精度,仅保证矩阵正定
    P = matrix(2 * (kernel + reg * np.eye(n)))
    
  3. 校验核宽计算结果
    在compute_best_rbf_kernel_width返回结果后增加判断逻辑,若输出核宽小于1e-6或大于1e6,直接手动指定核宽(可取该批次样本两两欧氏距离的中位数),避免核矩阵退化。
  4. 回退依赖版本
    若报错出现在更新Python包之后,直接回退cvxopt到此前正常运行的版本,示例命令:
    pip install cvxopt==1.2.7 --force-reinstall
    
  5. 调整求解器容错参数
    在调用solvers.coneqp前设置求解器容忍参数,适当降低精度要求:
    solvers.options['show_progress'] = False
    solvers.options['feastol'] = 1e-5
    solvers.options['abstol'] = 1e-5
    solvers.options['reltol'] = 1e-5
    

注:这类突发报错90%以上由单批次数据退化导致,优先排查数据问题,无需一开始就修改求解器逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:21:27