将基矩阵的变化拟合到数据

Fitting change of basis matrix to data

取简单关系:

A*X + X0 = B,

其中 X、X0 和 B 是 2*1 向量,A 是 2*2 矩阵,我想在给定一组点 (X, B) 的情况下找到最佳点 (A, X0)。

我无法直接在 scipy.optimize 库中找到适合这个问题的任何内容。

您可以将优化问题重写为

A*X + X0 - B = 0

通过 scipy.optimize.minimize() 将其最小化。 optimize() 需要一个标量值作为结果,因为您有一个向量,例如取它的norm()

在开始优化之前,您需要先将矩阵 A 和向量 X0 解包到单独的参数中:

A11, A12, A21, A22, X01, X02 = params

完整示例:

import numpy as np
import scipy.optimize as optimize
from numpy import linalg as LA

def f(params):
    A11, A12, A21, A22, X01, X02 = params
    A = np.array([[A11,A12],[A21,A22]])
    X0 = np.array([[X01],[X02]])
    B = np.array([[3],[4]]) #Your Data
    X = np.array([[5],[6]]) #Your data
    return LA.norm(np.dot(A,X) + X0 - B)

initial_guess = [1, 1, 1, 1, 1, 1]
result = optimize.minimize(f, initial_guess, method='Nelder-Mead')

if result.success:
    params = result.x
    A = np.array([[params[0],params[1]],[params[2],params[3]]])
    X0 = np.array([[params[4]],[params[5]]])
    print('A:\n', A)
    print('\nX0:\n', X0)
else:
    raise ValueError(result.message)
A:
 [[ 0.6154153  -0.37465204]
 [ 1.08401302 -0.40455254]]

X0:
 [[2.17092406]
 [1.00727269]]

方程可以用linear least square求解:

其中(Ax, Ay)是第一个基地的点坐标,(Bx, By)是第二个基地的点坐标。 [[a, b], [c, d]] 是仿射变换矩阵(缩放和旋转),[tx, ty] 是平移。

import numpy as np
A = np.array([[1, 3], [1, 2], [1, 1], [2, 1]])
B = np.array([[4, -2], [4, -4], [4, -6], [2, -6]])

R, residuals, rank, s = np.linalg.lstsq(np.hstack([A, np.ones((A.shape[0], 1))]), B, rcond=None)

R
#array([[-2.00000000e+00, -1.07062737e-15],
#       [ 4.44089210e-16,  2.00000000e+00],
#       [ 6.00000000e+00, -8.00000000e+00]])