- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题概要:当尝试使用 scipy.optimize.fmin_bfgs 最小化(优化)函数时,该函数会抛出
derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned
错误。根据我的错误检查,这发生在 fmin_bfgs 第一次迭代的最后——就在返回任何值或调用任何回调之前。
配置: window VistaPython 3.2.2SciPy 0.10IDE = Eclipse 与 PyDev
详细说明:我使用 scipy.optimize.fmin_bfgs 来最小化简单逻辑回归实现的成本(从 Octave 转换为 Python/SciPy)。基本上,成本函数被命名为cost_arr函数,梯度下降在gradient_descent_arr函数中。
我已手动测试并完全验证 *cost_arr* 和 *gradient_descent_arr* 是否正常工作并正确返回所有值。我还进行了测试以验证是否将正确的参数传递给 *fmin_bfgs* 函数。然而,运行时,我得到 ValueError: 矩阵未对齐。根据源码审查,确切的错误发生在
def line_search_wolfe1 function in # Minpack's Wolfe line and scalar searches as supplied by the scipy packages.
值得注意的是,如果我使用 scipy.optimize.fmin 代替,fmin 函数将运行完成。
确切错误:
File "D:\Users\Shannon\Programming\Eclipse\workspace\SBML\sbml\LogisticRegression.py", line 395, in fminunc_opt
optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, callback=self.callback_fmin_bfgs, retall=True)
File "C:\Python32x32\lib\site-packages\scipy\optimize\optimize.py", line 533, in fmin_bfgs old_fval,old_old_fval)
File "C:\Python32x32\lib\site-packages\scipy\optimize\linesearch.py", line 76, in line_search_wolfe1 derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned
我使用以下方式调用优化函数:optcost = scipy.optimize.fmin_bfgs(self.cost_arr,initialtheta,fprime = self.gradient_descent_arr,args = myargs,maxiter = maxnumit,callback = self.callback_fmin_bfgs,retall = True)
我花了几天时间试图解决这个问题,但似乎无法确定是什么导致了矩阵未对齐错误。
附录:2012-01-08我对此进行了更多的研究,似乎已经缩小了问题的范围(但对如何解决它们感到困惑)。首先,fmin(仅使用 fmin)使用这些函数来工作——成本、梯度。其次,在手动实现的单次迭代中进行测试时,成本函数和梯度函数都准确返回预期值(不使用 fmin_bfgs)。第三,我向optimize.linsearch添加了错误代码,并且该错误似乎是在def line_search_wolfe1处抛出的:derphi0 = np.dot(gfk, pk)。在这里,根据我的测试, scipy.optimize.optimize pk = [[ 12.00921659] [11.26284221]]pk类型=和scipy.optimize.optimizegfk=[[-12.00921659][-11.26284221]]gfk类型=注意:根据我的测试,错误是在 fmin_bfgs 的第一次迭代时抛出的(即 fmin_bfgs 甚至从未完成一次迭代或更新)。
我感谢任何指导或见解。
我的代码如下(日志记录,文档已删除):假设 theta = 2x1 ndarray (实际:theta Info Size=(2, 1) Type = )假设 X = 100x2 ndarray (实际:X Info Size=(2, 100) Type = )假设 y = 100x1 ndarray (实际:y Info Size=(100, 1) Type = )
def cost_arr(self, theta, X, y):
theta = scipy.resize(theta,(2,1))
m = scipy.shape(X)
m = 1 / m[1] # Use m[1] because this is the length of X
logging.info(__name__ + "cost_arr reports m = " + str(m))
z = scipy.dot(theta.T, X) # Must transpose the vector theta
hypthetax = self.sigmoid(z)
yones = scipy.ones(scipy.shape(y))
hypthetaxones = scipy.ones(scipy.shape(hypthetax))
costright = scipy.dot((yones - y).T, ((scipy.log(hypthetaxones - hypthetax)).T))
costleft = scipy.dot((-1 * y).T, ((scipy.log(hypthetax)).T))
def gradient_descent_arr(self, theta, X, y):
theta = scipy.resize(theta,(2,1))
m = scipy.shape(X)
m = 1 / m[1] # Use m[1] because this is the length of X
x = scipy.dot(theta.T, X) # Must transpose the vector theta
sig = self.sigmoid(x)
sig = sig.T - y
grad = scipy.dot(X,sig)
grad = m * grad
return grad
def fminunc_opt_bfgs(self, initialtheta, X, y, maxnumit):
myargs= (X,y)
optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, retall=True, full_output=True)
return optcost
最佳答案
如果其他人遇到这个问题......
1) 错误 1:如注释中所述,我错误地将渐变值作为多维数组 (m,n) 或 (m,1) 返回。 fmin_bfgs 似乎需要从梯度输出一个一维数组(也就是说,您必须返回一个 (m,) 数组而不是 (m,1) 数组。如果您不确定,请使用 scipy.shape(myarray) 检查尺寸返回值。
修复涉及添加:
grad = numpy.ndarray.flatten(grad)
就在从梯度函数返回梯度之前。这将数组从 (m,1)“展平”到 (m,)。 fmin_bfgs 可以将此作为输入。
2) 错误 2:请记住,fmin_bfgs 似乎适用于非线性函数。就我而言,我最初使用的示例是线性函数。这似乎可以解释即使在上述扁平化修复之后仍会出现一些异常结果。对于线性函数,fmin(而不是 fmin_bfgs)可能效果更好。
QED
关于python-3.x - 矩阵未对齐错误: Python SciPy fmin_bfgs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752169/
我正在使用下一个 cost() 和 gradient() 正则化函数: def cost(theta, x, y, lam): theta = theta.reshape(1, len(the
我正在玩弄 Python 中的逻辑回归。我已经实现了一个版本,其中成本函数的最小化是通过梯度下降完成的,现在我想使用 scipy (scipy.optimize.fmin_bfgs) 的 BFGS 算
我正在尝试实现逻辑回归,并使用 Scipy 的 Optimize 模块来查找优化的 theta 值。使用 fmin 函数时我能够获得正确的值。但我想在使用需要梯度的 fmin_bfgs 函数时这样做。
问题概要:当尝试使用 scipy.optimize.fmin_bfgs 最小化(优化)函数时,该函数会抛出 derphi0 = np.dot(gfk, pk) ValueError: matrices
我正在学习 scipy 中的优化函数。我想使用可以提供函数梯度的 BFGS 算法。作为一个基本示例,我想最小化以下函数: f(x) = x^T A x ,其中 x 是向量。 当我在 python 中实
我习惯于在 R 和 python 中对所有外围任务进行所有统计。只是为了好玩,我尝试了 BFGS 优化,将其与普通的 LS 结果进行比较——两者都是在 python 中使用 scipy/numpy。但
我正在使用 scipy.optimize.fmin_bfgs(f, init_theta, fprime) 来最小化 f,它具有梯度 fprime。我在单个函数中计算 f 和 fprime,因为大部分
我使用逻辑回归和scipy.optimize.fmin_bfgs来最小化成本函数。对于我的特定数据集,成本函数保持不变,并且 BFGS 不收敛,因此我想应用 lasso+ridge 正则化。 现在,我
我正在尝试使用 scipy.optimize.fmin_bfgs() 函数计算六驼峰驼峰函数的最小值。这是我的代码: import numpy as np import matplotlib.pypl
我是一名优秀的程序员,十分优秀!