我有一個數據集遵循對數正態分佈。如果我將y值與semilog-x軸上的x值進行比較,則分佈將顯示爲高斯。同樣,如果我將數據集中每個值的對數進行排序,並將它們繪製到log(x)域,則分佈將顯示爲高斯(但由於該域上log(x)值的線性間隔較寬而更好)。我的代碼試圖通過優化參數mu和sigma(因爲對數正態分佈的平均值不等於正態分佈的平均值)來最小化上述三個表示中的數據集的卡方。我的問題不是卡方最小化(適用於這些表示的2/3),而是我的代碼的一個特定部分的語法。爲什麼我收到此錯誤消息「UnboundLocalError:局部變量'sigma_opt'在賦值之前引用了」
爲了簡化代碼,我使用函數參數pickdist
來表示正在處理哪個分佈。在下面的代碼中,2
表示y與semilog(x)的表示,3
表示y對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
只是內部定義的一些功能,但沒有全局定義:然而,當我運行讀取的代碼我得到一個錯誤。 我已經閱讀過關於這個錯誤信息的其他文章,但沒有一篇適用於我的案例。爲什麼我收到此錯誤消息? (我會發布整個代碼,但它是350+行)
當'pickdist'既不是2又不是3時會發生什麼? –
我還沒有寫出一個升值錯誤聲明。我可以先調試主要部件後做到這一點。 – mikey
我看到你沒有明白我的觀點。當你將不同的2或3傳遞給這個函數時,你會得到一個'UnboundLocalError'。 'sigma_opt'只在if/elif中被賦值,所以當沒有條件滿足時,它不會被賦值**。 –