如何用PyTorch求解固定矩阵C时A=BC矩阵分解中的B矩阵?
用PyTorch求解矩阵分解中的B矩阵
问题分析
已知多个矩阵样本 (A_1, A_2, A_3, \dots) 和固定矩阵 (C),满足 (A_i = B_i C),需要求解每个对应的 (B_i)。这本质是求解线性方程组的最优解:当 (C) 列满秩时存在唯一精确解,非列满秩时可求最小二乘意义下的最优解。
核心解法
利用Moore-Penrose伪逆求解是最直接的方式:对每个 (A_i),(B_i = A_i \times C^+),其中 (C^+) 是 (C) 的伪逆。PyTorch内置的torch.pinverse()方法会自动处理列满秩/非满秩场景,输出最小二乘最优解。
代码实现示例
import torch # 定义已知的固定矩阵C(示例:3×2矩阵) C = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]) # 定义多个已知的A矩阵样本(示例:两个2×2矩阵) A1 = torch.tensor([[7.0, 8.0], [9.0, 10.0]]) A2 = torch.tensor([[11.0, 12.0], [13.0, 14.0]]) # 计算C的伪逆 C_pinv = torch.pinverse(C) # 求解每个B矩阵 B1 = A1 @ C_pinv B2 = A2 @ C_pinv # 验证结果:对比B_i@C与原A_i的误差 print("B1@C与A1的误差:", torch.norm(B1 @ C - A1)) print("B2@C与A2的误差:", torch.norm(B2 @ C - A2))
关键说明
- 若 (C) 是可逆方阵,伪逆等价于普通逆矩阵,此时解是精确的;
- 若 (C) 列数大于行数(列不满秩),伪逆会给出最小化Frobenius范数 (|A_i - B_i C|_F^2) 的最优解;
- 批量处理可提升效率:将多个A矩阵堆叠成张量,一次性计算所有B矩阵:
# 批量处理示例:堆叠A1、A2为(2,2,2)的张量 A_batch = torch.stack([A1, A2]) B_batch = A_batch @ C_pinv print(B_batch.shape) # 输出: torch.Size([2, 2, 3])
内容的提问来源于stack exchange,提问作者Manh Nguyen Tien
相关产品推荐
相关产品推荐

