为什么我收到此错误消息“UnboundLocalError:局部变量'sigma_opt'在赋值之前引用了”

问题描述:

我有一个数据集遵循对数正态分布。如果我将y值与semilog-x轴上的x值进行比较,则分布将显示为高斯。同样,如果我将数据集中每个值的对数进行排序,并将它们绘制到log(x)域,则分布将显示为高斯(但由于该域上log(x)值的线性间隔较宽而更好)。我的代码试图通过优化参数mu和sigma(因为对数正态分布的平均值不等于正态分布的平均值)来最小化上述三个表示中的数据集的卡方。我的问题不是卡方最小化(适用于这些表示的2/3),而是我的代码的一个特定部分的语法。为什么我收到此错误消息“UnboundLocalError:局部变量'sigma_opt'在赋值之前引用了”

为了简化代码,我使用函数参数pickdist来表示正在处理哪个分布。在下面的代码中,2表示y与semilog(x)的表示,3表示y对log(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+行)

+1

当'pickdist'既不是2又不是3时会发生什么? –

+0

我还没有写出一个升值错误声明。我可以先调试主要部件后做到这一点。 – mikey

+0

我看到你没有明白我的观点。当你将不同的2或3传递给这个函数时,你会得到一个'UnboundLocalError'。 'sigma_opt'只在if/elif中被赋值,所以当没有条件满足时,它不会被赋值**。 –

你得到这个错误的原因是因为如果你用不同于2或3的'pickdist'属性调用'distribGS'函数'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))