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

时间:2019-07-12 11:58:33

标签: python scipy scipy-optimize

建立简单的关系:

A * X + X0 = B,

其中X,X0和B是2 * 1向量,A是2 * 2矩阵,我想根据给定的一组点(X,B)来找到最佳(A,X0)。

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

2 个答案:

答案 0 :(得分:0)

您可以将优化问题重写为

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]]

答案 1 :(得分:0)

可以使用linear least square求解方程:

equation

其中(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]])