1

我有一個數據集遵循對數正態分佈。如果我將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中被賦值,所以當沒有條件滿足時,它不會被賦值**。 –

回答

1

你得到這個錯誤的原因是因爲如果你用不同於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)) 
相關問題