我有两组二维数据A和B。我必须假设有一个 2×2 矩阵 M 和一个 2x1 列向量 c,这样:
B = M*A + c + e
其中 e 为高斯误差(平均值为 0,方差为 sigma^2)。
我的目标是估计矩阵 M 和向量 c,其中 B 与预测之间的平方距离之和最小化。
到目前为止,这就是我所做的:
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
# Plotting
plt.scatter(B[:,0], B[:,1], color='red', s=5)
plt.scatter(predicted_B[:,0], predicted_B[:,1], color='blue', s=5)
plt.show()
即使在优化过程结束时我确实得到了较低的平方距离总和 (0.07),但如果我在图表上绘制实际点/预测对,结果也不是很好。
我实施得正确吗?我不能 100% 确定距离平方和的最小化。
我还猜想,我得到的低平方距离总和并没有那么低,因为我的目标数据很小(0 到 0.7 之间)。
我该如何改进?我必须严格遵守最初的假设。
您可以将优化问题简化为两个变量 (
c
),因为 (A-c) @ M = B
的最小二乘解可以使用 scipy.linalg.leastsq
进行解析求解。
导入并定义
A
、B
之后:
def error_function(c):
M = linalg.lstsq(A, B-c)[0]
predicted_B = (A @ M) + c
return np.sum((predicted_B - B) ** 2)
# Perform the optimization
initial_guess = np.ones(2)
result = minimize(error_function, initial_guess)
c = result.x
M = linalg.lstsq(A, B-c)[0]
现在您可以对
c
的值进行详尽的搜索,以确认您之前获得的 c
(和 M
)与您所能获得的一样好。