繁体   English   中英

具有两个非线性等式约束的最小二乘优化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM