- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 BFGS 方法,为其提供我的平方指数/RBF 内核的负对数似然,以及它的梯度(雅可比)。撇开渐变,使用一阶差分效果很好——但是
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
一旦我尝试使用 NLL 的梯度,就会出现错误。另请注意,虽然我在下面的 SE_der 函数(梯度/Jacobian)中的源代码没有在结果中使用 .any() 或 .all() ,但我也尝试了这两种方法,只是得到了完全相同的错误。
前面的轨迹是:
Traceback (most recent call last):
File "loaddata.py", line 107, in <module>
gp.fit(X, y)
File "/home/justinting/programming/bhm/ML/gp.py", line 33, in fit
res = minimize(self.SE_NLL, gp_hp_guess, method='bfgs', jac=True)
File "/usr/lib/python3.5/site-packages/scipy/optimize/_minimize.py", line 441, in minimize
return _minimize_bfgs(fun, x0, args, jac, callback, **options)
File "/usr/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 865, in _minimize_bfgs
old_fval, old_old_fval)
File "/usr/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 706, in _line_search_wolfe12
old_fval, old_old_fval)
File "/usr/lib/python3.5/site-packages/scipy/optimize/linesearch.py", line 282, in line_search_wolfe2
phi, derphi, old_fval, old_old_fval, derphi0, c1, c2, amax)
File "/usr/lib/python3.5/site-packages/scipy/optimize/linesearch.py", line 379, in scalar_search_wolfe2
if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \
相关代码如下:
gp_hp_guess = [1.0] * 3 # initial guess
res = minimize(self.SE_NLL, gp_hp_guess, method='bfgs', jac=self.SE_der)
# other stuff
def SE_der(self, args):
[f_err, l_scale, n_err] = args
L = self.L_create(f_err, l_scale, n_err)
alpha = linalg.solve(L.T, (linalg.solve(L, self.y))) # save for use with derivative func
aaT = alpha.dot(alpha.T)
K_inv = np.linalg.inv(L.T).dot(np.linalg.inv(L))
# self.K_inv = np.linalg.inv(self.L.T).dot(np.linalg.inv(self.L))
dK_dtheta = np.gradient(self.K_se(self.X, self.X, f_err, l_scale))[0]
der = 0.5 * np.matrix.trace((aaT - K_inv).dot(dK_dtheta))
return -der
def SE_NLL(self, args):
[f_err, l_scale, n_err] = args
L = self.L_create(f_err, l_scale, n_err)
alpha = linalg.solve(L.T, (linalg.solve(L, self.y))) # save for use with derivative func
nll = (
0.5 * self.y.T.dot(alpha) +
np.matrix.trace(L) + # sum of diagonal
L.shape[0]/2 * math.log(2*math.pi)
)
return nll
我省略了辅助函数的源代码,因为当不使用梯度函数时 NLL 工作正常,并且它们共享相同的辅助函数。
事后调用 SE_der 函数直接传入优化后的参数(而不是在优化中实际使用梯度)时,它会按预期输出单个数字(或者至少我认为这是预期的),所以我'未能发现问题。
这个错误是我对 scipy 对其雅可比函数的期望的误解,还是其他什么?我尝试挖掘 Python 源代码,但处理函数的实际函数调用隐藏在 Github 上的 Python 代码中似乎不存在的函数后面——我不确定它们是否在私有(private)/C++ 存储库中别处。
最佳答案
看侧边栏。查看关于相同 ValueError
的所有 SO 问题?
虽然情况各不相同,但在几乎所有情况下,都是在需要标量 bool 值的 Python 上下文中使用 bool 数组的结果。
一个简单的例子是
In [236]: if np.arange(10)>5:print('yes')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-236-633002262b65> in <module>()
----> 1 if np.arange(10)>5:print('yes')
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
np.arange(10)>5
产生一个 bool 数组,np.array([False, False, ...])
.
组合 bool 表达式也可以产生这个。 np.arange(10)>5 | np.arange(10)<2
产生这个,(np.arange(10)>5) | (np.arange(10)<2)
不会——因为逻辑运算符的存在。使用 and
而不是 |
在这种情况下是没有希望的。
我会更详细地查看您的代码,但与此同时,这可能会帮助您自己找到问题。
==================
来自错误堆栈:
if (phi_a1 > phi0 + c1 * alpha1 * derphi0) or \
此时的代码需要 (phi_a1 > phi0 + c1 * alpha1 * derphi0)
(以及 or
之后的任何内容)成为标量。大概这些变量之一是具有多个值的数组。不可否认,这是在调用堆栈的下方发生的,因此很难将这些值追溯到您的代码。
打印品,侧重于可变类型和形状,可能是最有用的。有时在这些迭代求解器上,代码在一个循环中运行良好,然后一些变量更改为数组,并在下一个循环中阻塞。
==================
为什么要使用 np.matrix.trace
?在我的测试中,生成一个 2d 单个元素 np.matrix
.它会产生这个 ValueError 并不明显,但它仍然很可疑。
关于python - scipy.optimize.minimize 雅可比函数导致 'Value Error: The truth value of an array with more than one element is ambiguous',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380022/
在遇到这个要点之后:https://gist.github.com/chemouna/00b10369eb1d5b00401b ,我注意到它正在使用 Google Truth 库:https://go
我正在尝试将 Google Truth 框架包含在我的测试项目中。我按照有关如何获取项目设置的文档进行操作。 这是来自我的应用程序的 build.gradle 文件: dependencies {
我想知道训练数据集、测试数据集和地面真相之间的关系。我分别知道每一个的含义,但我看不到它们之间的关系,特别是地面实况和训练数据。 最佳答案 您的训练数据是您训练分类器的数据。 然后,您可以在测试集上测
我正在编写一个测试,断言文档不包含特定字符串。当测试失败时,它会在表单中打印“实际”值 expected not to contain a match for: my_regex but was
我在 Pandas 数据框中有三列。 df = pd.DataFrame({'month':[1,2,3,4,5,6,7,8,9,10,11,12], 'day'
我有一个 Android 库(称为 api)gradle 模块作为一个更大项目的一部分。我刚刚将整个项目迁移到 AndroidX。我现在在 api lib 上运行仪器测试时出现此错误: Task :
我正在构建一个分析工具,但在基于时间序列的指标方面遇到了一些性能问题。我一直在试验 Redis + bitmapist,这让我可以在写入数据库时急切地准备指标,并且对性能非常满意。 但是,我对如何
我只想测试是否使用 google-truth 抛出了给定消息的异常。 使用 junit 使用 @Test(expected= 很容易做到这一点,但我不知道如何用 truth 做到这一点。Throwab
我已阅读 this article .在“Controlled Components”部分,有一句话: We can combine the two by making the React state
我正在尝试使用以下代码生成新列 list = ['LHR','-1','-3','LGW','MAD','SIN','KUL','JFK','HKG','PVG','IST','SDA','GLA']
正如标题所说—— (例如)之间有区别吗 expect(element).isDisplayed().toBeTruthy(); 和 expect(element).isDisplayed().to
我目前正在尝试将 json 文件(我已经可以处理)中的值与 csv 文件中的值(这可能是问题)进行比较。我当前的代码如下所示: for data in trades['timestamp']:
我正在尝试使用 for 循环迭代 DataFrame,但收到此错误: “ValueError:系列的真值不明确。” 我的数据框是: 我想迭代“Plataforma”和“Soporte”来替换“Sopo
我是 Google Truth 库的新手,我想知道是否有一种方法可以仅使用两个元素的一个属性来比较它们。我知道用 AssertJ 可以做到这一点,所以我想知道用 Truth 是否可以实现同样的效果。
此代码运行正确: import sympy as sp def xon (ton, t): return (t-ton)/5 xonInt = sp.integrate (xon(ton, t
我正在编写一个注释处理器,并希望使用 google-compile-testing 和 truth 为其编写一些单元测试: 所以我想写一个非常简单的单元测试。 import static com.go
我是数据库的新手,我来自前端世界,我非常感谢 SSOT。毕竟,我不想看到 UI 上出现“奇怪”的东西,因为它会影响用户的行为。 现在我使用 postgres 设计自己的后端,我真的很难决定如何处理 S
bool()和 operator.truth()两者都测试一个值是 truthy 还是 falsy 并且它们在文档中看起来非常相似,它甚至在 truth() 文档中说: This is equival
假设我有一个类似的东西 true && true #=> true 这是有道理的,所以我尝试这样的事情: true && "dsfdsf" #=> "dsfdsf" 这让我很惊讶,因为很多时候我会做类
从雅虎获取比特币(BTC-USD)的数据后,我尝试创建一个新列来显示收盘价是否高于每天的开盘价。 我想要做的是创建一个列,当收盘价高于开盘价时显示 1。当条件不成立时为 0。 当我尝试比较收盘价和开盘
我是一名优秀的程序员,十分优秀!