【问题标题】:ValueError: object too deep for desired arrayValueError:对象对于所需数组来说太深
【发布时间】:2012-10-28 22:13:56
【问题描述】:
""" ___ """
from scipy.optimize import root
import numpy as np


LENGTH = 3


def process(x):
    return x[0, 0] + x[0, 1] * 5


def draw(process, length):
    """ """
    X = np.matrix(np.random.normal(0, 10, (length, 2)))
    y = np.matrix([process(x) for x in X])
    y += np.random.normal(3, 1, len(y))
    return y.T, X.T


def maximum_likelyhood(y, X):
    def objective(b):
        return (X.T * (y - X * b.T))
    x0 = np.matrix([0, 0])
    res = root(objective, x0=x0)
    return res.x

y, X = draw(process, LENGTH)
X = X.transpose()
b = np.matrix([[0], [1]])
print maximum_likelyhood(y, X)

产生一个

  Traceback (most recent call last):
File "ml.py", line 33, in <module>
  maximum_likelyhood(y, X)
File "ml.py", line 26, in maximum_likelyhood
  res = root(objective, x0=x0)
File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/_root.py", line 168, in root
  sol = _root_hybr(fun, x0, args=args, jac=jac, **options)
File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 193, in    _root_hybr
ml, mu, epsfcn, factor, diag)

ValueError: object too deep for desired array 

我什至喘不过气来,问题是它在目标中的 b 功能?还是在它的输出中?

【问题讨论】:

  • 在我的盒子上,这会产生NameError: global name 'tp' is not defined
  • 另外,您可能希望包含完整的堆栈跟踪,而不仅仅是错误消息。
  • 总在黑暗中拍摄,但您可以尝试将x0 = np.matrix([0, 0]) 替换为x0 = np.array([0, 0])
  • @larsmans,它转置了,我修好了。

标签: python numpy scipy


【解决方案1】:

问题在于 fsolve 和 root 不接受矩阵作为目标函数的返回值。

例如这是上述问题的解决方案:

def maximum_likelyhood(y, X):
    def objective(b):
        b = np.matrix(b).T
        return np.transpose(np.array((X.T * (y - X * b))))[0]
    x0 = (1, 1)
    res = root(objective, x0=x0)
    return res.x

【讨论】:

  • 请不要投反对票,因为我回答了我自己的问题。 (a) 它按照规则 (b) 我花了将近半天的时间。 (c) 它与下一个遇到这个常见问题的人真正相关。
  • @tiago,请不要通过更改一个重要的词来编辑绝对破坏答案的回复!
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2018-07-17
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多