如何用fmin\u ncg计算成本和θ 我在CurSera上遵循安得烈NG教程,我想在Python上实现同样的逻辑。我试图计算成本和θ scipy.optimize.fmin_ncg

如何用fmin\u ncg计算成本和θ 我在CurSera上遵循安得烈NG教程,我想在Python上实现同样的逻辑。我试图计算成本和θ scipy.optimize.fmin_ncg,python,numpy,machine-learning,scipy,Python,Numpy,Machine Learning,Scipy,这是密码 import numpy as np from scipy.optimize import fmin_ncg def sigmoid(z): return (1 / (1 + np.exp(-z))).reshape(-1, 1) def compute_cost(theta, X, y): m = len(y) hypothesis = sigmoid(np.dot(X, theta)) cost = (1 / m) * np.sum(np.

这是密码

import numpy as np

from scipy.optimize import fmin_ncg


def sigmoid(z):
    return (1 / (1 + np.exp(-z))).reshape(-1, 1)


def compute_cost(theta, X, y):
    m = len(y)
    hypothesis = sigmoid(np.dot(X, theta))
    cost = (1 / m) * np.sum(np.dot(-y.T, (np.log(hypothesis))) - np.dot((1 - y.T), np.log(1 - hypothesis)))
    return cost


def compute_gradient(theta, X, y):
    m = len(y)
    hypothesis = sigmoid(np.dot(X, theta))
    gradient = (1 / m) * np.dot(X.T, (hypothesis - y))
    return gradient


def main():
    data = np.loadtxt("data/data1.txt", delimiter=",")  # 100, 3

    X = data[:, 0:2]
    y = data[:, 2:]
    m, n = X.shape

    initial_theta = np.zeros((n + 1, 1))
    X = np.column_stack((np.ones(m), X))
    mr = fmin_ncg(compute_cost, initial_theta, compute_gradient, args=(X, y), full_output=True)
    print(mr)

if __name__ == "__main__":
    main()
当我试着运行这个程序时,我得到如下错误/异常

Traceback (most recent call last):
  File "/file/path/without_regression.py", line 78, in <module>
    main()
  File "/file/path/without_regression.py", line 66, in main
    mr = fmin_ncg(compute_cost, initial_theta, compute_gradient, args=(X, y), full_output=True)
  File "/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/scipy/optimize/optimize.py", line 1400, in fmin_ncg
    callback=callback, **opts)
  File "/usr/local/anaconda3/envs/ml/lib/python3.6/site-packages/scipy/optimize/optimize.py", line 1497, in _minimize_newtoncg
    dri0 = numpy.dot(ri, ri)
ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0)
回溯(最近一次呼叫最后一次):
文件“/File/path/without_regression.py”,第78行,在
main()
文件“/File/path/without_regression.py”,第66行,主
mr=fmin\u ncg(计算成本、初始θ、计算梯度、参数=(X,y),全输出=真)
fmin_ncg中的文件“/usr/local/anaconda3/envs/ml/lib/python3.6/site packages/scipy/optimize/optimize.py”,第1400行
回调=回调,**选项)
文件“/usr/local/anaconda3/envs/ml/lib/python3.6/site packages/scipy/optimize/optimize.py”,第1497行,在newtoncg中
dri0=numpy.dot(ri,ri)
ValueError:形状(3,1)和(3,1)未对齐:1(尺寸1)!=3(尺寸0)
我不理解这个错误。可能是因为我是初学者,这对我来说不冗长


如何使用
scipy.optimize.fmin\ncg
或任何其他最小化技术,如
scipy.optimize.minimize(…)
来计算成本和θ?

如评论中所述:

如果现在没有对文档的引用,您应该始终使用一维数组

这适用于
x0
(如果不使用python列表)和渐变

一种快速的方法,如:

使代码运行:

Optimization terminated successfully.
         Current function value: 0.203498
         Iterations: 27
         Function evaluations: 71
         Gradient evaluations: 229
         Hessian evaluations: 0
(array([-25.13045417,   0.20598475,   0.2012217 ]), 0.2034978435366513, 71, 229, 0, 0)
额外:在调试期间,我还根据数值微分检查了梯度本身的计算(推荐!),使用x0:

from scipy.optimize import check_grad as cg
print(cg(compute_cost, compute_gradient, initial_theta, X, y))
# 1.24034933954e-05

好。。。显然,(3,1)*(3,1)没有定义点。对于(3,1)*(1,3)它将是(但这并不意味着它是你想要的)。我将从定义为
np.zeros(n+1)
(去掉额外的维度)的初始θ开始,并从那里进行调试(不是100%确定它会改变事情,但它更像API)。(很难寻求更多帮助,因为我们无法复制此代码!->外部数据)。是的,很明显,它不能做乘法,因为维数不匹配。我将尝试按照您的建议使用初始θnp.zero(n+1)实现。感谢
gradient=(1/m)*np.dot(X.T,(假设-y)).ravel()
将使其运行(3,1->(3)形状)。(如前所述,我还使用了我的单幅暗淡首字母θ)。编辑:我之前写的渐变是错误的,但我对scipy的check_渐变的检查是使用了破损的形状。看起来不错@AAMANTURADAR考虑使用更一般的SIPY.Opsisi.最小化如果你没有特殊的理由使用一个特定的求解器(你可以玩不同的优化器,那么)我也会尝试@ SasCha这是一个初始的开始。将探索更多的东西。。再次感谢
Optimization terminated successfully.
         Current function value: 0.203498
         Iterations: 27
         Function evaluations: 71
         Gradient evaluations: 229
         Hessian evaluations: 0
(array([-25.13045417,   0.20598475,   0.2012217 ]), 0.2034978435366513, 71, 229, 0, 0)
from scipy.optimize import check_grad as cg
print(cg(compute_cost, compute_gradient, initial_theta, X, y))
# 1.24034933954e-05