Python 优化函数scipy.optimize

Python 优化函数scipy.optimize,python,numpy,scipy,Python,Numpy,Scipy,我不熟悉python和统计编程。对于类赋值,我们被要求实现python lasso L1回归。 这涉及到使用QP解算器来求解 0.5 *(x^t * H * x) + f^t * H st x > 0 (every element of x is greater than zero) 这些是块向量和矩阵。我用二维数组表示向量,用四维数组表示矩阵H def function(x): x = x.reshape(2, -1) return 0.5*np.tensordot(x

我不熟悉python和统计编程。对于类赋值,我们被要求实现python lasso L1回归。 这涉及到使用QP解算器来求解

0.5 *(x^t * H * x) + f^t * H
st x > 0 (every element of x is greater than zero)
这些是块向量和矩阵。我用二维数组表示向量,用四维数组表示矩阵H

def function(x):
    x = x.reshape(2, -1)
    return 0.5*np.tensordot(x,(np.tensordot(H,x,([1,3],[0,1]))),([0,1],[0,1])) + np.tensordot(f,x,([0,1],[0,1]))

initial_val = np.random.randn(2 * (k+1)).reshape((2,k+1))

bnds = (0,None)
theta = scipy.optimize.minimize(function, initial_val, method="SLSQP", bounds=bnds)

但我仍然在
theta.x
vector中得到负值。有人能告诉我哪里出了问题吗?

您需要为优化提供约束,如果您优化标量函数,就像这样:

scipy.optimize.minimize(
    function,
    initial_val,
    method="SLSQP",
    bounds=bnds,
    constraints = [{'type':'ineq', 'fun':lambda x: x}])
或对于向量函数:

constraints = [{'type':'ineq', 'fun':lambda x: x[i]} \
                   for i in range(len(initial_val))]
请注意,如果它是向量,则还需要为每个元素提供边界:

 bnds = [(0, None) for _ in range(len(initial_val))]

您可能还需要查看。

您需要为优化提供约束,如果您优化标量函数,则如下所示:

scipy.optimize.minimize(
    function,
    initial_val,
    method="SLSQP",
    bounds=bnds,
    constraints = [{'type':'ineq', 'fun':lambda x: x}])
或对于向量函数:

constraints = [{'type':'ineq', 'fun':lambda x: x[i]} \
                   for i in range(len(initial_val))]
请注意,如果它是向量,则还需要为每个元素提供边界:

 bnds = [(0, None) for _ in range(len(initial_val))]

您可能还需要查看。

您需要提供更多信息,即您所称的
函数
初始值
,错误可能在于这些。我认为x0(初始值)需要是向量,而不是矩阵。BND需要与初始值具有相同的长度。如果没有H、f和k的示例,很难再现错误。您需要提供更多信息,即您所称的
函数
初始值
,错误可能在于这些。我认为x0(初始值)需要是向量,而不是矩阵。bnds需要与初始值具有相同的长度。如果没有H、f和k的示例,很难再现您的错误。虽然我得到了我一直在寻找的结果,但经过优化后,在x向量中仍然得到负值。我使用约束=[{'type':'ineq','fun':lambda x:x[I]}表示范围内的I(len(initial))]。我不能理解why@AdaXu您是否已验证优化是否成功(
result.success
result.message
属性)?如果是,您得到了您想要的结果并且
x
有负面元素,这是什么意思?我认为负面因素不是你想要的结果。result.message-优化成功终止,回归曲线拟合良好。但是结果中有负值。我不知道该怎么解释this@AdaXu您能在这里粘贴带有
最小化
函数调用的行,以及
结果.x的实际值吗?或者是进垃圾桶?如果我不能马上帮上忙,我会提出另一个问题,但也许这是一件很快的事情。我想出来了。向量参数initial_val实际上是一个二维numpy数组,因为我的目标函数涉及4维块矩阵H和二维块向量。我把它们变成了普通的二维矩阵和一维向量,我得到了正确的答案。如果你可以修改你的答案为2维约束,我会标记它为正确的。谢谢你的帮助:)虽然我得到了我想要的结果,但在优化后,我仍然得到了x向量的负值。我使用约束=[{'type':'ineq','fun':lambda x:x[I]}表示范围内的I(len(initial))]。我不能理解why@AdaXu您是否已验证优化是否成功(
result.success
result.message
属性)?如果是,您得到了您想要的结果并且
x
有负面元素,这是什么意思?我认为负面因素不是你想要的结果。result.message-优化成功终止,回归曲线拟合良好。但是结果中有负值。我不知道该怎么解释this@AdaXu您能在这里粘贴带有
最小化
函数调用的行,以及
结果.x的实际值吗?或者是进垃圾桶?如果我不能马上帮上忙,我会提出另一个问题,但也许这是一件很快的事情。我想出来了。向量参数initial_val实际上是一个二维numpy数组,因为我的目标函数涉及4维块矩阵H和二维块向量。我把它们变成了普通的二维矩阵和一维向量,我得到了正确的答案。如果你可以修改你的答案为2维约束,我会标记它为正确的。谢谢你的帮助:)