取简单的关系:
A*X + X0 = B,
其中 X、X0 和 B 是 2*1 向量,A 是 2*2 矩阵,我想在给定一组点 (X, B) 的情况下找到最好的 (A, X0)。
scipy.optimize
我在图书馆里找不到任何直接适合这个问题的东西。
取简单的关系:
A*X + X0 = B,
其中 X、X0 和 B 是 2*1 向量,A 是 2*2 矩阵,我想在给定一组点 (X, B) 的情况下找到最好的 (A, X0)。
scipy.optimize
我在图书馆里找不到任何直接适合这个问题的东西。
该方程可以使用线性最小二乘法求解:
其中(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]])
您可以将优化问题重写为
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]]