我有两组二维数据A和B。我必须假设有一个 2×2 矩阵 M 和一个 2x1 列向量 c,这样:
B = M*A + c + e
其中 e 为高斯误差(平均值为 0,方差为 sigma^2)。
我的目标是估计矩阵 M 和向量 c,其中 B 与预测之间的平方距离之和最小化。
我不是编程/Python 专家,我不知道如何以正确的方式做到这一点。到目前为止,这就是我所做的:
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)
在此实现中,我并没有严格遵守代码之前介绍的数学知识。我正在做 (A @ M) + c 而不是 (M @ A) + c。原因是我不确定如何用列向量而不是行向量来实现它。无论如何,结果是一样的吗?我如何修改我的 python 代码才能准确实现我想要实现的内容并与我之前介绍的数学 100% 一致?
其次,我没有处理代码中的高斯误差,因为我不确定是否必须这样做。它是在 scipy 的最小化函数中隐式完成的吗?
不管怎样,结果是一样的吗?我如何修改我的 python 代码才能准确实现我想要实现的内容并与我之前介绍的数学 100% 一致?
这种方法的问题是你得到的矩阵的大小。当您将 m x n 矩阵乘以 n x p 矩阵时,您将得到 m x p 矩阵。
如果 A 位于乘法的左侧,则将 12x2 矩阵乘以 2x2 矩阵得到 12x2 矩阵。这是B的尺寸,这样就可以了
另一方面,如果 A 位于乘法的右侧,那么就有问题了。乘法的结果必须是 12x2。这意味着 M 的第一个维度必须为 12。M 的第二个维度必须与 A 的第一个维度匹配。因此 M 的维度必须为 12x12。
这意味着您正在估计很多参数。当您估计大量参数时,您对任何单个参数都不太确定,因为有很多方法可以获得相同的答案。
我认为你现在的方式很好,是描述线性回归的正常方式。通常,您尝试在矩阵乘法的右侧估计参数。
其次,我没有处理代码中的高斯误差,因为我不确定是否必须这样做。是在scipy的minimum函数中隐式完成的吗?
不,SciPy 不会对回归的残差做任何事情。它只知道您定义的损失函数。