使用 scipy 正确的矩阵乘法和 2D 仿射映射

问题描述 投票:0回答:1

我有两组二维数据AB。我必须假设有一个 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 scipy mapping matrix-multiplication affinetransform
1个回答
0
投票

不管怎样,结果是一样的吗?我如何修改我的 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 不会对回归的残差做任何事情。它只知道您定义的损失函数。

© www.soinside.com 2019 - 2024. All rights reserved.