Arrays (2,2)数组的scipy极小化
给定矩阵Arrays (2,2)数组的scipy极小化,arrays,optimization,numpy,matrix,Arrays,Optimization,Numpy,Matrix,给定矩阵a=[[1,2],[3,1]]我试图最小化函数平方范数 对于a*x,其中x应该是(2,2)数组——这只是一个玩具示例--- 通过使用下面的代码。但是,我从控制台获得以下信息 错误消息: " return np.linalg.norm(np.dot(a, x))**2 ValueError: matrices are not aligned " 我将非常感谢你的解释。谢谢 import numpy as np from scipy.optimize import minimize
a=[[1,2],[3,1]]
我试图最小化函数平方范数
对于a*x,其中x应该是(2,2)数组——这只是一个玩具示例---
通过使用下面的代码。但是,我从控制台获得以下信息
错误消息:
" return np.linalg.norm(np.dot(a, x))**2
ValueError: matrices are not aligned "
我将非常感谢你的解释。谢谢
import numpy as np
from scipy.optimize import minimize
a = np.array([[1, 2],[3, 1]])
def func_obj(x):
return np.linalg.norm(np.dot(a, x))**2
def func_deriv(x):
""" Derivative of objective function """
result = np.zeros([2, 2])
for i in range(2):
for j in range(2):
for k in range(2):
result[i,j] = result[i, j] + 2*(np.dot(a[k,:],x[:,j]))*a[k,i]
return result
res = minimize(func_obj, [[1, -1],[-1,1]], jac = func_deriv,
method = 'SLSQP', options = {'disp':True})
print (res.x)
您的问题是最小化函数希望参数作为1D列表。你给它一个2x2矩阵,并期望它给你一个回来。 添加简单的
reformate()
调用来解压参数可以解决以下问题:
def func_obj(x):
x = x.reshape(2,2)
return np.linalg.norm(np.dot(a, x))**2
def func_deriv(x):
""" Derivative of objective function """
x = x.reshape(2,2)
result = np.zeros([2, 2])
for i in range(2):
for j in range(2):
for k in range(2):
result[i,j] = result[i, j] + 2*(np.dot(a[k,:],x[:,j]))*a[k,i]
return result
x0 = np.array([[1, -1],[-1,1]]).reshape(-1)
res = minimize(func_obj, x0, jac = func_deriv,
method = 'SLSQP', options = {'disp':True})
谢谢你的回答