Python scipy.optimize.minimize IndexError [0,0] 但不是 .item()
Python scipy.optimize.minimize IndexError with [0,0] but not with .item()
我发现 scipy.optimize.minimize 在我使用 .item() 从 objective 函数中的 numpy 数组中检索值时有效,但是当我通过索引 [0,0 检索时它失败了]:
def sigmoid(Z):
return 1 / (1 + np.exp(-Z))
def hyp_log(X, theta):
return sigmoid(X @ theta)
def cost_log(theta, X, Y, reg_const=0):
hyp = hyp_log(X, theta)
return (Y.T @ -np.log(hyp) + (1-Y).T @ -np.log(1-hyp)).item() / len(X) + reg_const * (theta[1:].T @ theta[1:]).item() / (2 * len(X))
result = minimize(cost_log, theta, args=(X,Y,reg_const), method='TNC')
如果我在 cost_log
函数中使用 [0,0]
索引而不是 .item()
,函数本身的工作方式与以前完全相同,但会最小化 IndexError: too many indices for array
中的结果。我想了解为什么会出现这种情况,以及在 objective 函数中使用 minimize.
时应注意的事项
既然你没有提供X
或Y
,我就不看了:
(Y.T @ -np.log(hyp) + (1-Y).T @ -np.log(1-hyp))
但有:
(theta[1:].T @ theta[1:]).item()
如果 theta
是 (n,1):
In [15]: theta = np.arange(5)[:,None]
In [16]: theta.shape
Out[16]: (5, 1)
In [17]: (theta[1:].T @ theta[1:])
Out[17]: array([[30]])
In [18]: (theta[1:].T @ theta[1:])[0,0]
Out[18]: 30
In [19]: (theta[1:].T @ theta[1:]).item()
Out[19]: 30
但是如果你把那个 theta
给 minimize
,它会把它分解成一个 (n,) 形状:
In [20]: theta=theta.ravel()
In [21]: (theta[1:].T @ theta[1:])
Out[21]: 30
In [22]: (theta[1:].T @ theta[1:]).shape
Out[22]: ()
In [23]: (theta[1:].T @ theta[1:]).item()
Out[23]: 30
In [24]: (theta[1:].T @ theta[1:])[0,0]
...
IndexError: invalid index to scalar variable.
我最初写的 item
可以与单个项目数组一起使用,而不管尺寸。 [0,0]
仅适用于二维(或更高)数组。
我发现 scipy.optimize.minimize 在我使用 .item() 从 objective 函数中的 numpy 数组中检索值时有效,但是当我通过索引 [0,0 检索时它失败了]:
def sigmoid(Z):
return 1 / (1 + np.exp(-Z))
def hyp_log(X, theta):
return sigmoid(X @ theta)
def cost_log(theta, X, Y, reg_const=0):
hyp = hyp_log(X, theta)
return (Y.T @ -np.log(hyp) + (1-Y).T @ -np.log(1-hyp)).item() / len(X) + reg_const * (theta[1:].T @ theta[1:]).item() / (2 * len(X))
result = minimize(cost_log, theta, args=(X,Y,reg_const), method='TNC')
如果我在 cost_log
函数中使用 [0,0]
索引而不是 .item()
,函数本身的工作方式与以前完全相同,但会最小化 IndexError: too many indices for array
中的结果。我想了解为什么会出现这种情况,以及在 objective 函数中使用 minimize.
既然你没有提供X
或Y
,我就不看了:
(Y.T @ -np.log(hyp) + (1-Y).T @ -np.log(1-hyp))
但有:
(theta[1:].T @ theta[1:]).item()
如果 theta
是 (n,1):
In [15]: theta = np.arange(5)[:,None]
In [16]: theta.shape
Out[16]: (5, 1)
In [17]: (theta[1:].T @ theta[1:])
Out[17]: array([[30]])
In [18]: (theta[1:].T @ theta[1:])[0,0]
Out[18]: 30
In [19]: (theta[1:].T @ theta[1:]).item()
Out[19]: 30
但是如果你把那个 theta
给 minimize
,它会把它分解成一个 (n,) 形状:
In [20]: theta=theta.ravel()
In [21]: (theta[1:].T @ theta[1:])
Out[21]: 30
In [22]: (theta[1:].T @ theta[1:]).shape
Out[22]: ()
In [23]: (theta[1:].T @ theta[1:]).item()
Out[23]: 30
In [24]: (theta[1:].T @ theta[1:])[0,0]
...
IndexError: invalid index to scalar variable.
我最初写的 item
可以与单个项目数组一起使用,而不管尺寸。 [0,0]
仅适用于二维(或更高)数组。