基于Scipy的矩阵乘法与2D仿射映射正确实现问询
问题背景
有两组2D数据A和B,假设存在2×2矩阵M和2×1列向量c,满足:
$B = M*A + c + e$
其中e为高斯误差(均值0,方差$\sigma^2$)。目标是估计使B与预测值的平方距离和最小的M和c。
当前实现代码如下:
import numpy as np from scipy.optimize import minimize import matplotlib.pyplot as plt A = np.array([ [0, -6], [0, 6], [-6, 0], [6, 0], [-3, -3], [-3, 3], [0,0], [2, -2], [2, 4], [-3, 0], [-5, -3], [2, 5] ]) B = np.array([ [0.45070423, 0.52288732], [0.125, 0.5625], [0.1754386, 0.15789474], [0.200489, 0.55012225], [0.30769231, 0.32451923], [0.1375, 0.45], [0.19935691, 0.46302251], [0.32142857, 0.53571429], [0.12765957, 0.53191489], [0.15246637, 0.30269058], [0.2247191, 0.20224719], [0.14379085, 0.55882353], ]) # MAPPING : getting M and c def error_function(params): # Unpack M and c from the flat parameter array M = params[:4].reshape(2, 2) c = params[4:] predicted_B = (A @ M) + c # Calculate the sum of squared distances return np.sum(np.sum((predicted_B - B) ** 2, axis=1)) # Perform the optimization initial_guess = np.zeros(6) result = minimize(error_function, initial_guess) M = result.x[:4].reshape(2, 2) c = result.x[4:] # Getting predictions predicted_B = (A @ M) + c print(predicted_B)
疑问解答
疑问1:矩阵乘法顺序的问题
二者完全不一致,核心原因:
- 矩阵乘法不满足交换律,
A@M和M@A的计算结果(维度合法时)完全不同; - 直接执行
M @ A会报错:代码中A是12×2矩阵,M是2×2矩阵,矩阵乘法要求左操作数列数等于右操作数行数,M@A的维度不匹配,无法计算。
- 矩阵乘法不满足交换律,
符合数学表达式的修改方法:
数学表达式中,A的每个样本是2×1列向量,$M*A$是对每个列向量做矩阵乘法。对应到代码中A的行向量形式,可修改预测公式为:
predicted_B = (M @ A.T).T + c
或者保持原结构,调整M的转置:
M = params[:4].reshape(2, 2).T # 对M做转置 predicted_B = (A @ M) + c
两种方式都能完全匹配数学表达式$B = M*A + c + e$的计算逻辑。
疑问2:高斯误差的处理
不需要额外处理,scipy.optimize.minimize通过最小化平方距离和,已经隐式处理了高斯误差:
当误差e是均值为0的高斯分布时,最小化平方距离和等价于最大化似然估计(MLE)。高斯分布的对数似然函数与$-\sum (B - \hat{B})2$成正比($\sigma2$是常数,不影响最小值的位置),因此最小化平方和的过程就是在求解高斯误差假设下的最优参数M和c。
内容的提问来源于stack exchange,提问作者yuxy
相关产品推荐
相关产品推荐

