gpt4 book ai didi

python - scipy中fmin_cg的梯度函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:17 24 4
gpt4 key购买 nike

我正在尝试使用 scipy 中的共轭梯度算法 (fmin_cg) 来找到在线性模型中最适合的参数 theta。

数据文件HouseData.csv(如房屋面积、房价):

120, 250
200, 467
250, 500
1200, 2598
1500, 3000

代码是:

from scipy import optimize
import numpy as np

data=np.genfromtxt('HouseData.csv',delimiter=',')
X=np.c_[np.ones(len(data)),data[:,:-1]]
Y=data[:,[-1]]

def cost_Function(theta):
theta1=theta[np.newaxis].T
#print('theta: ',theta1)
cost = Y-np.dot(X, theta1)
return (cost*cost).sum()

# Gradient Function
def gradf(theta):
theta1 = theta[np.newaxis].T
cost = Y - np.dot(X, theta1)
#print('cost*X.sum(0) is', np.sum(cost*X,axis=0))
return np.sum(cost*X,axis=0)


x0 = np.asarray((0,1)) #initial guess
result = optimize.fmin_cg(cost_Function,x0,fprime=gradf)
print(result)

如果没有 fprime=gradf,代码会返回正确的结果,但是梯度函数有什么问题?如上所述包含它时,算法会准确返回 theta 的输入。您是否还有其他不同的实现方式来提高性能?这只是一个简单的示例,但算法也应该在具有许多列和行的 X 上运行。

(python 3.5.1,scipy 和 numpy 最新版本)

最佳答案

你的梯度显然是错误的。

因为你的成本函数是二次函数,我们可以用以下公式很好地近似梯度:gradf(x) = (f(x + eps) - f(x - eps))/(2 eps)。让我们试试看:

e0 = np.array([1, 0])
e1 = np.array([0, 1])
eps = 1e-5

x0 = np.array([1, 1])

df_yours = gradf(x0)
# array([ 3.54000000e+03, 4.05583000e+06])

df_approx = np.array([
cost_Function(x0 + eps*e0) - cost_Function(x0 - eps*e0),
cost_Function(x0 + eps*e1) - cost_Function(x0 - eps*e1)
]) / (2 * eps)
# array([ -7.07999999e+03, -8.11166000e+06])

如果不进行数学分析(顺便说一句,您绝对应该做而不是猜测),您的梯度函数将偏离-0.5。这种否定非常重要。

关于python - scipy中fmin_cg的梯度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com