2016-11-06 134 views
0

考慮以下幾點:Sigmoid總是返回1?

def sigmoid(inSig): 
    return 1.0/(1.0+np.exp(-inSig)) 

def classifyVector(inX, weights): 
    prob = sigmoid(sum(inX*weights)) 
    if prob > 0.5: return 1.0 
    else: return 0.0 

我的理解是乙狀結腸結果範圍從0到1。根據此信息(http://clear-lines.com/blog/post/Logistic-Regression.aspx):

「正值將返回一個值大於0.5 ,輸入值越大,越接近1.可以認爲函數返回概率:對於x的非常高或低的值,有很高的確定性,它屬於兩組中的一組,並且對於值接近零,每組的概率是50%/ 50%。「

但是,如果Sigmoid(0),sigmoid似乎只產生0.5(即,零分類)。除非inX或權重爲零(或零向量),否則classifyVector總是返回1?

例如,請考慮以下數據:

trainset = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]]) 
trainlbl = np.array([1,12,11,40]) 

這裏,INX將永遠是零。如果算出數學,權重也不會爲零。那麼,乙狀結腸怎麼能提供一個公平的分析呢?

+0

可能取代l中的1。 2用1.0嗎?據我記得Python,這可能會改變整個類型的devision。 [這是神經網絡嗎?] – Unknown

+1

param爲什麼叫inSig和var inX? – Unknown

+0

我編輯它。這是爲了邏輯迴歸。 – swabygw

回答

0

但是,如果Sigmoid(0),sigmoid似乎只產生0.5(即,零分類)。除非inX或權重爲零(或零向量),否則classifyVector總是返回1?

0.5是一個閾值,而不是人們必須達到的。 classifyVector將返回1 iff sigmoid生成超過 0.5。還有很多剩餘值 - 一切在0和0.5之間。您正確地獲得0.5的確實非常罕見,但這不是問題,因爲每個小於0.5的值都會導致分類「0」。基本上(如果你計算數學),你將得到分類1 iff inSig是正數(如果是負數則爲0)。由於通過S形擠壓使得正值變得大於0.5並且負值小於0.5(同時,如你所述 - 零變換爲0.5)。