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

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条回答 默认 最新

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

     

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog