# 梯度下降算法,找到合适的w
# 链接API
import numpy as np
import matplotlib as plt
# 数据集
x_data=[1.0,2.0,3.0,4.0]
y_data=[2.0,4.0,6.0,8.0]
# 预测函数模型:f(X)=w*x
def forward(x):
"""前馈函数"""
return w*x
# 损失函数
def cost(xs,ys):
"""损失函数"""
cost=0
for x,y in zip(xs,ys):
y_pred=forward(x)
loss=(y-y_pred)**2
cost+=loss
return cost/len(xs)
# 梯度下降,寻找合适的w
def gradient(xs,ys):
"""输入数据集,返回一个关于变量w的梯度函数,此处w需要不断更新,所以w定义为全局变量"""
grad=0
for x,y in zip(xs,ys):
grad+=2*(x*w-y)*x
return grad/len(xs)
# 预测一个w的起始值并选取一个合适大小的学习率a(注意:a的取值影响性能和学习效率,所以要选取合适大小)
w=0.1
a=0.01
#开始学习(历元epoch,遍历100次)
def main():
for epoch in range(100):
cost_val=cost(x_data,y_data)
w-=a*gradient(x_data,y_data)
print("epoch=",epoch,"w=",w,cost_val)
w没定义,是因为这是在main函数里进行调用的。
解决方案,在main函数里的第一行(截图里的33行)加上一句global w即可:
def main():
global w
global a
for epoch in range(100):
cost_val=cost(x_data,y_data)
w-=a*gradient(x_data,y_data)
print("epoch=",epoch,"w=",w,cost_val)
就可以声明w是在main函数中使用的全局变量了。
需要把29行的w定义成全局变量,global w=0.1, global a=0.01
大佬您好,我前面的forward()函数也有调用w,为什么forward()没有报错,main()就报错了,是因为我在main()中修改了他的值吗
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632