建立简单的关系:
A * X + X0 = B,
其中X,X0和B是2 * 1向量,A是2 * 2矩阵,我想根据给定的一组点(X,B)来找到最佳(A,X0)。
我无法直接在scipy.optimize
库中找到适合该问题的任何内容。
答案 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求解方程:
其中(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]])