【发布时间】:2017-08-08 19:19:16
【问题描述】:
我有一个遵循对数正态分布的数据集。如果我在半对数 x 轴上绘制 y 值与 x 值,分布将呈现高斯分布。同样,如果我对数据集中每个值的对数进行排序,并将它们与 log(x) 的域进行对比,则分布将呈现为高斯分布(但由于域上 log(x) 值的线性间距更宽而更好)。我的代码试图通过优化参数 mu 和 sigma 来最小化上述三种表示中数据集的卡方(因为对数正态分布的平均值不等于正态分布的平均值)。我的问题不是卡方最小化(适用于这些表示的 2/3),而是我的代码的一个特定部分的语法。
为了简化代码,我使用函数参数pickdist 来表示正在处理的分布。在下面的代码中,2 表示 y vs semilog(x) 表示,3 表示 y vs log(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 仅在少数函数内部定义,但并未在全局范围内定义。 我已经阅读了关于 SO 的其他关于此错误消息的帖子,但没有一个适用于我的案例。 为什么我会收到此错误消息? (我会发布整个代码,但它有 350 多行)
【问题讨论】:
-
pickdist既不是 2 也不是 3 会发生什么? -
我还没有写出升值错误语句。我可以先调试主要部分后这样做。
-
我明白你没有明白我的意思。当你向这个函数传递不同于 2 或 3 的东西时,你会得到一个
UnboundLocalError。sigma_opt只在 if/elif 内赋值,所以不满足条件时不赋值。 -
应该正确分配。我可以在一个小时左右看到它,并相应地更新。
-
不要误会我的意思,但我不在乎 它应该被正确分配 - 从代码中可以清楚地看到有未分配的可能路径。就这么简单——没有主观性。
标签: function python-3.x error-handling functional-programming