m0_55087877
一心一意只想搞钱
2021-06-06 16:16
采纳率: 0%
浏览 53

python中定义的全局变量,在函数调用的时候显示未定义

​​​​​​​

# 梯度下降算法,找到合适的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)

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • technologist_10
    CSDN专家-ProfSnail 2021-06-06 16:22

    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函数中使用的全局变量了。

     

    点赞 3 评论
  • technologist_41

    需要把29行的w定义成全局变量,global w=0.1,  global a=0.01

    点赞 评论
  • m0_55087877
    一心一意只想搞钱 2021-06-06 16:27

    大佬您好,我前面的forward()函数也有调用w,为什么forward()没有报错,main()就报错了,是因为我在main()中修改了他的值吗

    点赞 评论
  • QA_Assistant
    有问必答小助手 2021-06-07 18:34

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐