问题描述
我一直在尝试编写Newton Raphson的代码,但是我遇到了一个可能是微不足道的问题,但是我似乎无法解决这个问题。我的代码如下:
# base packages
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from sympy import *
'''
logL_Vec: empty vector to plot the log-l. function
dervL_vec: to plot the first derv of the log-l. function
x_vec: data points we're summing over'
n: summing over n
'''
logL_vec = []
dervL_vec = []
x_vec = [0.72,5.50,-2.21,-0.35,-0.67,0.16,23.64,1.00,1.06,-495.81,-1.98,37.72]
n= len(x_vec)
def logL(x,n,θ):
sum_vec = [np.log(1 + (x[i]- θ)**2) for i in range(n)]
return -n*np.log(np.pi) - np.sum(sum_vec)
def dervL(x,θ):
sum_vec = [2*(x[i] - θ)/ (1+(x[i] - θ)**2) for i in range(n)]
return np.sum(sum_vec)
def raphson(df,df2,θ1,tol,maxiter):
θ_new = θ1
for i in range(maxiter):
θ_new = θ1 + df/df2
if abs(θ_new - θ1) < tol: break
θ1 = θ_new
return θ_new,i
我认为代码中的主要问题是如何以thess作为来自raphson函数的输入的方式对df函数进行编码。我正在这样做
raphson(logL(x_vec,θ1),dervL(x_vec,x_vec,-0.6,0.0001,100)
Traceback (most recent call last):
File "<ipython-input-2-49b17ffc14c6>",line 1,in <module>
raphson(logL(x_vec,100)
NameError: name 'θ1' is not defined
我尝试了其他方法,但是我迷失了如何像raphson方法所建议的那样让两个df函数在新的theta上迭代。
当我做这样的事情时:
maxiter = 10000
θ1 = -0.5
tol = 0.0001
for i in range(maxiter):
θ_new = θ1 + 0.01*dervL(x_vec,θ1)
if abs(θ_new - θ1) < tol:
break
else:
θ1 = θ_new
它可以工作,但是如果我可以将其归纳为一个函数,那就太好了。 (请注意,我正在执行梯度上升,但主要思路是我想对此进行概括) / Y
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)