我有一个遵循对数正态分布的数据集。如果在半对数x轴上将y值与x值作图,则分布将显示为高斯分布。类似地,如果我对数据集中每个值的对数进行排序,并针对log(x)的域进行绘制,则分布将显示为高斯分布(但由于域上log(x)值的线性间距更宽,因此分布更好)。我的代码尝试通过优化参数mu和sigma(由于对数正态分布的平均值不等于正态分布的平均值)来最小化上述三种表示形式中数据集的卡方。我的问题不是卡方最小化(适用于这些表示的2/3),而是我代码的特定部分中的语法。
为了简化代码,我使用函数参数pickdist
表示要处理的分发。在下面的代码中,2
表示y vs semilog(x)表示形式,3
表示y vs loglog(x)表示形式,optpar2
和optpar3
是先前从代码(未显示)中计算出的参数,它们表示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/