import numpy as np
from scipy import optimize as opt
import time
def grad_d():
weight = [0, 0]
learnrate = 0.01
tol = 1.e-5
itmax = 1000
for i in range(itmax):
deltaweight = - learnrate * opt.rosen_der(weight)
weight = weight + deltaweight
if abs(deltaweight) < learnrate:
break
return weight, i
print('Weight: ', weight)
print('Iterations: ', i)
运行代码后,我收到错误消息:
“文件“ c:/ Users / Desfios 5 / Desktop / Python / gradientdescent.py”,第19行 print('Weight:',weight) NameError:名称“ weight”未定义
我是Python的新手,我不明白为什么说变量“ weight”显然是在grad_d()下定义的,所以未定义。
答案 0 :(得分:3)
您只是忘了调用函数 试试:
weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)
答案 1 :(得分:0)
weight
在函数grad_d()
的范围内定义。它以外的任何代码都看不到它。请研究范围的工作原理。
答案 2 :(得分:0)
这是因为'weight'变量不在全局范围内,并且仅在函数内部起作用。
您可以在全局级别上定义它来解决。
将weight = [0, 0]
移到def grad_d()
之外应该可以解决问题
答案 3 :(得分:0)
首先,您没有调用该方法。这样做:
weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)
第二,deltaweight
是形状为(2,)
的数字数组。因此,您需要确定要比较的两个元素中的哪个。如果要比较两个元素,则可以使用deltaweight.any()
或deltaweight.all()
。
您的整个代码将是这样(假设您正在比较deltaweight
数组的第一个元素)
import numpy as np
from scipy import optimize as opt
import time
def grad_d():
weight = [0, 0]
learnrate = 0.01
tol = 1.e-5
itmax = 1000
for i in range(itmax):
deltaweight = - learnrate * opt.rosen_der(weight)
weight = weight + deltaweight
if abs(deltaweight[0]) < learnrate:
break
return weight, i
weight, i = grad_d()
print('Weight: ', weight)
print('Iterations: ', i)