Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 为什么我会收到此错误消息;UnboundLocalError:局部变量';sigma#u opt';作业前参考“;_Function_Python 3.x_Error Handling_Functional Programming - Fatal编程技术网

Function 为什么我会收到此错误消息;UnboundLocalError:局部变量';sigma#u opt';作业前参考“;

Function 为什么我会收到此错误消息;UnboundLocalError:局部变量';sigma#u opt';作业前参考“;,function,python-3.x,error-handling,functional-programming,Function,Python 3.x,Error Handling,Functional Programming,我有一个遵循对数正态分布的数据集。如果将y值与x值绘制在半对数x轴上,则分布将显示为高斯分布。类似地,如果我对数据集中每个值的对数进行排序,并将它们与log(x)域相对照,则分布将呈现高斯分布(但由于域上log(x)值的线性间隔更宽,因此分布会更好)。我的代码试图通过优化参数mu和sigma(因为对数正态分布的平均值不等于正态分布的平均值)来最小化上述三种表示中数据集的卡方。我的问题不是卡方最小化(适用于这些表示的2/3),而是代码中某个特定部分的语法 为了简化代码,我使用一个函数参数pickd

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

为了简化代码,我使用一个函数参数
pickdist
来表示正在处理哪个分布。在下面的代码中,
2
表示y与半对数(x)表示,
3
表示y与对数(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\u opt
只是在几个函数中定义的,而不是全局定义的。我已经阅读了其他关于处理此错误消息的帖子,但没有一篇适用于我的案例。为什么我会收到这个错误消息?(我会发布整个代码,但它有350多行)

之所以会出现此错误,是因为如果调用具有'pickdist'属性的'distribGS'函数而不是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))

pickdist
既不是2也不是3时会发生什么?我还没有写一个提升值错误语句。我可以先调试主要部件后再做。我看你没有明白我的意思。当您将不同于2或3的内容传递给此函数时,您将得到一个
UnboundLocalError
<代码>sigma_opt仅在if/elif中分配,因此在不满足任何条件时不分配。应正确分配。我可以在一个小时左右的时间内查看它,并进行相应的更新。别误会我的意思,但我不在乎它是否应该被正确分配-从代码中可以清楚地看出,有可能的路径没有被分配。就这么简单,没有主观性。