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

PyTorch中协方差矩阵奇异致求逆失败,添加扰动仍无效求助

解决PyTorch中协方差矩阵奇异求逆失败的问题

问题核心

你碰到的是协方差矩阵奇异(某对角线元素为0)导致求逆失败的情况,加1e-12的扰动没用,大概率是因为扰动太小被浮点数精度抵消,或是数据本身存在完全无方差的特征维度。

具体解决办法

  • 先定位问题维度:先排查协方差矩阵的秩和对角线元素,找到导致奇异的根源:

    # 查看协方差矩阵的秩
    rank = torch.linalg.matrix_rank(cov[k])
    # 查看对角线元素
    diag_vals = torch.diag(cov[k])
    print("矩阵秩:", rank)
    print("对角线元素:", diag_vals)
    

    如果发现某维度对角线为0,说明该维度所有样本取值完全一致、无方差,直接从数据中删除这个维度即可,它不提供任何有效信息。

  • 增大扰动量级并匹配设备/类型:1e-12太小,试试更大的扰动(比如1e-6或1e-3,根据数据尺度调整),同时保证扰动矩阵和协方差矩阵同设备、同数据类型:

    # 生成和协方差矩阵同设备、同类型的单位矩阵扰动
    cov_eps = torch.eye(mean.shape[1], device=cov.device, dtype=cov.dtype) * 1e-6
    inv_cov = torch.linalg.inv(cov[k] + cov_eps)
    
  • 用伪逆替代直接求逆:如果上述方法无效,直接用伪逆处理奇异矩阵,协方差矩阵是半正定矩阵,加hermitian=True能优化计算效率:

    inv_cov = torch.linalg.pinv(cov[k], hermitian=True)
    
  • 预处理数据从根源避免问题:对输入数据做标准化,先筛选掉标准差为0的特征,再计算均值和协方差:

    # 假设data是输入批量数据,形状为[batch_size, feature_dim]
    stds = torch.std(data, dim=0)
    # 筛选出标准差不为0的特征
    valid_mask = stds > 1e-8
    filtered_data = data[:, valid_mask]
    # 再计算均值和协方差
    mean = torch.mean(filtered_data, dim=0)
    cov = torch.cov(filtered_data.T)
    # 此时求逆大概率不会报错
    inv_cov = torch.linalg.inv(cov)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:42:14