使用 scipy 进行二维仿射映射

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

我有两组二维数据AB。我必须假设有一个 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 之间)。

我该如何改进?我必须严格遵守最初的假设。

scipy mapping affinetransform
1个回答
0
投票

您可以将优化问题简化为两个变量 (

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
)与您所能获得的一样好。

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