【问题标题】:Scipy Newton Krylov Expects Square MatrixScipy Newton Krylov 期望方阵
【发布时间】:2017-11-08 22:21:29
【问题描述】:

我正在尝试使用 scipy.optimize.newton_krylov() 来解决最小二乘优化问题,即找到 x 使得 (Ax - b)**2 = 0。我的理解是 A 必须是 mxn m>n,b 必须是 mx1,x 是 nx1。当我尝试运行优化时,出现错误:

ValueError: expected square matrix, but got shape=(40, 6)

大概这个错误与雅可比矩阵的计算有关,而不是我的输入矩阵 A?但如果是这样,我该如何更改我为函数提供的值来解决这个问题?任何建议将不胜感激。

以下代码重现了错误:

import numpy as np
from scipy.optimize import newton_krylov

A = np.random.uniform(0, 1, (40,6))
b = np.arange(40)
x0 = np.ones(6)

def F(x):
    return (A.dot(x) - b)**2

x = newton_krylov(F, np.ones(6))

【问题讨论】:

  • 该错误表明它需要一个方阵并表明您提供了一个 40x6 的,这与您的矩阵 A 相同。首先测试一个方阵 A。

标签: python numpy optimization scipy


【解决方案1】:

正如docstring of newton_krylov 解释的那样,它找到了函数F(x) 的根。函数F 必须接受一维数组,并返回与输入大小相同的一维数组。例如,如果x 的长度为 3,F(x) 必须返回一个长度为 3 的数组。在这种情况下,newton_krylov 会尝试求解 F(x) = [0, 0, 0]

您得到的错误是newton_krylov 尝试将F 的数值计算Jacobian matrix 与期望矩阵为正方形的函数一起使用的结果。您的函数F 有一个形状为 (40, 6) 的雅可比矩阵,因为输入的长度为 6,输出的长度为 40。

就其本身而言,newton_krylov 不是用于解决最小二乘问题的正确函数。最小二乘问题是最小化问题,而不是求根问题。 (newton_krylov 之类的求解器可能用于实现最小化算法,但我假设您有兴趣使用现有解决方案而不是编写自己的解决方案。)

您说您想解决最小二乘问题,但随后您说“即找到满足 (Ax - b)**2 = 0 的 x”。我认为您的描述有点草率,因为这不是最小二乘问题。最小二乘问题是找到x 使得sum((Ax - b)**2) 最小化。 (一般情况下,不会有使平方和等于为零的x。)

所以,假设你真的想找到x 使得sum((Ax - b)**2) 最小化,你可以使用scipy.linalg.lstsq

例如:

In [54]: from scipy.linalg import lstsq

In [55]: A = np.random.uniform(0, 1, (40,6))

In [56]: b = np.arange(40)

In [57]: x, res, rank, s = lstsq(A, b)

In [58]: x
Out[58]: 
array([  5.07513787,   1.83858547,  18.07818853,   9.28805475,
         6.13019155,  -0.7045539 ])

【讨论】:

    【解决方案2】:

    Krylov 方法要求第一个参数(在您的情况下为函数 F(x))是方阵。

    这似乎是一个家庭作业问题,但答案将是调整矩阵 A 使其成为正方形。示例:https://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/optimize.html#kk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-14
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多