function - 为什么我收到此错误消息 “UnboundLocalError: local variable ' sigma_opt在分配前被引用”

标签 function python-3.x error-handling functional-programming

我有一个遵循对数正态分布的数据集。如果在半对数x轴上将y值与x值作图,则分布将显示为高斯分布。类似地,如果我对数据集中每个值的对数进行排序,并针对log(x)的域进行绘制,则分布将显示为高斯分布(但由于域上log(x)值的线性间距更宽,因此分布更好)。我的代码尝试通过优化参数mu和sigma(由于对数正态分布的平均值不等于正态分布的平均值)来最小化上述三种表示形式中数据集的卡方。我的问题不是卡方最小化(适用于这些表示的2/3),而是我代码的特定部分中的语法。

为了简化代码,我使用函数参数pickdist表示要处理的分发。在下面的代码中,2表示y vs semilog(x)表示形式,3表示y vs loglog(x)表示形式,optpar2optpar3是先前从代码(未显示)中计算出的参数,它们表示mu和sigma的优化值用于发行。

def distribGS(pickdist, x):
    if pickdist == 2:
        mu_opt, sigma_opt = optpar2
    elif pickdist == 3:
        mu_opt, sigma_opt = optpar3
    cnorm = 1/ ( sigma_opt * (2 * pi)**(1/2) )
    return [(( cnorm * exp( (-1) * (x[index] - mu_opt)**2 / ( 2 * (sigma_opt **2) ) ) )) for index in range(len(x))]

尝试进行代码的原因是针对实际数据的(标准化)直方图绘制此数据拟合度。但是,运行以下代码时出现错误:
UnboundLocalError: local variable 'sigma_opt' referenced before assignment

我觉得这很奇怪,因为sigma_opt仅在一些函数中定义,但未全局定义。我已经阅读了其他有关此错误消息的文章,但均不适用于我的情况。为什么会收到此错误消息? (我会发布整个代码,但有350多行)

最佳答案

之所以会出现此错误,是因为如果您调用的'distribGS'函数的'pickdist'属性不同于2或3'sigma_opt'变量,则无需先分配即可使用它。

您可以做的是在函数的开头将'sigma_opt'变量分配给某个默认值,或者使用'else'语句为其分配默认值。
例如

def distribGS(pickdist, x):
    mu_opt, sigma_opt = 0
    if pickdist == 2:
        mu_opt, sigma_opt = optpar2
    elif pickdist == 3:
        mu_opt, sigma_opt = optpar3
    cnorm = 1/ ( sigma_opt * (2 * pi)**(1/2) )
    return [(( cnorm * exp( (-1) * (x[index] - mu_opt)**2 / ( 2 * (sigma_opt **2) ) ) )) for index in range(len(x))

关于function - 为什么我收到此错误消息 “UnboundLocalError: local variable ' sigma_opt在分配前被引用”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42854029/

相关文章:

具有查询优化功能的 php 函数

c++ - C 或 C++ 返回状态

python-3.x - 上个月最后一天

ruby-on-rails - 如何在Rails开发环境中关闭红色/灰色错误帮助页面工具?

r - 如何强制函数传递某个对象(例如值),而不是失败并传递错误消息

javascript - 如何从函数返回灯箱错误消息

C - 自定义 qsort 不工作

php - 当 mySQL 字段等于某个值时发送电子邮件警报

python - 需要多少个数字才能使返回值等于整数 N?

Python3 导入问题