Python scipy.optimize.minimize indexer与[0,0]一起使用,但不与.item()一起使用
我发现scipy.optimize.minimize在我使用.item()从目标函数中的numpy数组中检索值时起作用,但在通过索引[0,0]检索时失败:Python scipy.optimize.minimize indexer与[0,0]一起使用,但不与.item()一起使用,python,numpy,numpy-ndarray,scipy-optimize,scipy-optimize-minimize,Python,Numpy,Numpy Ndarray,Scipy Optimize,Scipy Optimize Minimize,我发现scipy.optimize.minimize在我使用.item()从目标函数中的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)
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\u log
函数中使用[0,0]
索引而不是.item()
,则函数本身的工作原理与以前完全相同,但会最小化索引器中的结果。错误:数组的索引太多。我想了解为什么会发生这种情况,以及在使用minimize时在目标函数中应该注意什么。由于您没有提供X
或Y
,我将不看:
(Y.T @ -np.log(hyp) + (1-Y).T @ -np.log(1-hyp))
但是:
(theta[1:].T @ theta[1:]).item()
如果θ为(n,1):
但是,如果你把theta
赋给minimize
,它会把它折成一个(n,)形状:
最初编写的Iitem
可以与单个item数组一起使用,而不考虑维度[0,0]
仅适用于2d(或更高)数组。arr[0,0]
要求arr
为2ditem()
如果有一个元素,它就可以工作。如果数组为0d,且形状为()
,则它特别有用。您应该随时知道所有数组的形状,并在出现和问题(或错误)时进行测试。@hpaulj所有对应数组的形状都是(1,1),因此[0,0]和item()都在目标函数中起作用。后者在最小化过程中不起作用。什么是θ?初始值和通过minimize
传递时,minimize
文档明确说明传递给函数的x/theta
变量为shape(n,)。即使初始θ为(1,1),这也是正确的。如果您将打印(theta.shape)
添加到cost\u log
作为调试的一部分,您会看到这一点。@hpaulj theta是(n,1)。我确实知道θ应该是(n),但我想在形状上保持一致,并开始好奇它为什么与.item()一起正确工作。我只会坚持(n,)
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
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.