今天的文章看一下《機器學習實戰》中提到的logistic回歸演算法。雖然是名稱是回歸,但logistic演算法並不用來進行擬合,主要用來處理分類問題。
對於二分類問題,我們假設正類的標籤值為1,反類的標籤值為0,我們可以尋找乙個函式,在給定輸入(樣本特徵值)下,可以輸出0或者1。最好的函式應該是單位階躍函式,如圖所示:
但是,單位階躍函式存在乙個問題,在0處,函式不連續,這會給我們的後續的數**算帶來很多問題。所以,我們可以找到乙個替代的函式,那就是sigmoid函式:
函式的影象為
可以看出,0.5是我們正類和反類的分界值。結合我們的分類問題:
其中,x是一條樣本資料的特徵值向量,w是每乙個特徵值的權重向量。所以,現在問題就轉化為,我們如何確定一組最合適的特徵值權重,使得我們訓練集的樣本資料能夠很好地滿足sigmoid函式,基於這樣的一組權重,當有新的資料需要分類時,我們就可以按照上式,求取z值並代入sigmoid函式,從而完成分類。
那麼如何確定權重呢?這裡我們使用極大似然估計,可以從網上看看相關的文章,簡單來說,根據極大似然估計,我們需要求下面式子的最大值:
其中yi代表第i條樣本資料的標籤,xi代表第i條樣本資料中的特徵值組成的向量。為求取l(w)的最大值,我們使用梯度上公升法:
這裡wj代表第j個特徵對應的權重值。而上式中l(w)的相對於w的偏導數為:
其中xji代表第j個特徵在第i條樣本資料中的值,ei代表第i條訓練樣本資料的真實標籤值和估計標籤值之間的誤差。上面就是基本的理論介紹,下面看看**實現,可能就會更加直觀。
首先是sigmoid函式:
def sigmoid(in_x, scale=0.01):
return 1.0 / (1 + np.exp(-in_x * scale))
梯度上公升法:
def grad_ascent(data_in_mat, class_labels):
data_matrix = np.mat(data_in_mat)
label_mat = np.mat(class_labels).t
m, n = np.shape(data_matrix)
alpha = 0.001
max_cycle = 500
weights = np.ones((n, 1))
for k in range(max_cycle):
h = sigmoid(data_matrix * weights)
error = label_mat - h
weights = weights + alpha * data_matrix.t * error
return weights
輸入引數為訓練樣本資料以及對應的標籤。程式中迴圈500次,初始的weights全為1,呼叫sigmoid函式計算預估值,之後與標籤計算誤差,最後根據梯度上公升法更新weights。
我們需要乙個函式來進行分類:
def classify_vector(in_x, weights):
prob = sigmoid(sum(in_x * weights))
if prob > 0.5:
return 1.0
else:
return 0.0
將待測資料和梯度上公升獲得的weights傳入該函式,該函式會呼叫sigmoid函式,之後按照值是否大於0.5對其進行分類。
下面寫乙個例子,使用上面的三個函式:
def classify_test(in_x):
data_mat = np.mat([[1, 2, 7], [1, 4, 5], [6, 2, 2],
[3, 1, 6], [2, 2, 6], [1, 7, 2]])
labels_mat = np.mat([0.0, 1.0, 1.0, 0.0, 0.0, 1.0])
weights = grad_ascent(data_mat, labels_mat)
return classify_vector(in_x, weights)
if __name__ == '__main__':
test_mat = [[2, 7, 1], [5, 2, 3], [2, 2, 6], [1, 1, 8]]
test_result =
for i in test_mat:
print(test_result)
我們人為構造了一些資料,三個數均大於0,和不會超過10,前兩個數的和大於等於5時,標籤為1,否則為0。然後我們測試了四條樣本資料,這四條樣本資料,按照我們的規則,標籤應為[1.0, 1.0,0.0,.0.0]。
我們執行一下程式,看看輸出結果:
[1.0, 1.0, 0.0, 0.0]
和我們的完全吻合,當然,畢竟我們的訓練樣本資料偏少,因此存在欠擬合的問題,嘗試修改測試資料,會出現**失敗的情況。
logistic回歸 logistic回歸
logistic回歸 logistic回歸分析可用於估計某個事件發生的可能性,這是乙個分類模型而不是乙個回歸模型!它的基本思想是利用一條直線將平面上的點分為兩個部分,即兩個類別,要解決的問題就是如何擬合出這條直線,這個擬合的過程就稱之為 回歸 logistic模型 假設你有乙個需要 的內容,要通過三...
logistic分類(logistic回歸 LR)
幾乎所有的教材都是從logistic分類開始的,因為logistic分類實在太經典,而且是神經網路的基本組成部分,每個神經元 cell 都可以看做是進行了一次logistic分類。所謂logistic分類,顧名思義,邏輯分類,是一種二分類法,能將資料分成0和1兩類。logistic分類的流程比較簡單...
logistic回歸 梯度下降演算法
假設現在有一些資料點,我們利用一條直線對這些點進行擬合 該線稱為最佳擬合直線 這個擬合過程就稱作為回歸。我們希望接收所有的輸出,然後 出類別。在兩個類別的情況下,輸出0,1來代表,這種函式是單位階躍函式。sigmoid函式具有該性質 sigmoid函式公式是 si gmoi d z 11 exp z...