【问题标题】:scipy minimization of a (2,2) array(2,2)数组的scipy最小化
【发布时间】:2014-02-25 19:45:16
【问题描述】:

给定矩阵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)

【问题讨论】:

    标签: arrays optimization numpy matrix


    【解决方案1】:

    您的问题是最小化函数希望将参数作为一维列表。你给它一个 2x2 矩阵,并期望它给你一个回报。 添加简单的reshape() 调用来解压参数可以解决问题:

    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})
    

    【讨论】:

    • 感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2016-05-27
    • 2018-01-30
    • 2015-02-18
    • 1970-01-01
    • 2013-12-03
    • 2017-04-11
    相关资源
    最近更新 更多