[英]How to solve a least square problem with LMFIT with non-linear constraints?
[英]Least square optimisation with two non-linear equal constraints
我正在寻找一种解决带有两个非线性相等约束的优化问题的方法。
我的成本函数是
E = 0
for n in range(1, N):
E += (np.linalg.norm((x[:, i] - o - np.dot(x[:, i], a) * a)) - r) ** 2
我的两个非线性相等约束是
np.dot(a, o) = 0
np.linalg.norm(a) = 1
我可以使用scipy.leastsq解决此问题吗? 如何编写代码?
谢谢
更新:我发现最小化可以解决此问题,因为这里状态。 但是我遇到了另一个问题。
我有以下代码
(result, ier) = optimize.minimize(Step1CostFun, P, args=(S),
method='Nelder-Mead',
bounds=bnds, constraints=cons)
其中P包含将要优化的参数,P.shape =(1,7)。 S包含观察数据S.shape =(3,51)。
至于约束,我有
def DotConstraint(P):
(r, a1, a2, a3, o1, o2, o3) = P
return np.dot([a1, a2, a3], [o1, o2, o3])
def NormConstraint(P):
(r, a1, a2, a3, o1, o2, o3) = P
return np.linalg.norm([a1, a2, a3]) - 1
cons = ({'type': 'eq', 'fun': DotConstraint},
{'type': 'eq', 'fun': NormConstraint})
但是,我得到一个错误
ValueError: operands could not be broadcast together with shapes (1,7) (3,51)
有人可以帮忙看看吗? 谢谢
很难确切地指出问题出在哪里,但是请注意,您不需要将额外的args传递给目标函数,只需将目标函数覆盖x
。 另外,我收到错误消息说Nelder-Mead不能使用约束。 似乎唯一适用于相等约束的方法是SLSQP。 这是对我有用的代码:
import numpy as np
from scipy import optimize
def DotConstraint(P):
(r, a1, a2, a3, o1, o2, o3) = P
return np.dot([a1, a2, a3], [o1, o2, o3])
def NormConstraint(P):
(r, a1, a2, a3, o1, o2, o3) = P
return np.linalg.norm([a1, a2, a3]) - 1
cons = ({'type': 'eq', 'fun': DotConstraint}, {'type': 'eq', 'fun': NormConstraint})
P = (1,0,0,1,2,0,0)
x = [np.array([3,0,1]), np.array([2,1,2]), np.array([1,0,3]), np.array([2, -1, 4]), np.array([2.6, 0.8, 5])]
def CostFunction(P):
(r, a1, a2, a3, o1, o2, o3) = P
a = np.array([a1, a2, a3])
o = np.array([o1, o2, o3])
return reduce(lambda i,j: i+j, map(lambda arr: (np.linalg.norm(arr - o - np.dot(arr,a)*a) - r)**2, x))
res = optimize.minimize(CostFunction, P, method='SLSQP', constraints=cons)
print res
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.