1. 程式人生 > >寫程式學ML:Logistic迴歸演算法原理及實現(一)

寫程式學ML:Logistic迴歸演算法原理及實現(一)

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。

1、Logistic迴歸演算法的原理

假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個擬合過程就稱作迴歸。

利用logistic迴歸進行分類的主要思想是:根據現有資料對分類邊界線建立迴歸公式,以此進行分類。這裡的“迴歸”一詞源於最佳擬合,表示要找到最佳擬合引數集。此處的迴歸公式例如sigmoid函式、reLU函式等。找到最佳的分類迴歸係數,建立這些函式後,然後利用函式對新的樣本資料進行分類。

Logistic迴歸的一般過程:

1>    收集資料:採用任意方法收集資料。

2>    準備資料:由於需要進行距離計算,因此要求資料型別為數值型。另外,結構化資料格式則最佳。

3>    分析資料:採用任意方法對資料進行分析。

4>    訓練演算法:大部分時間將用於訓練,訓練的目的是為了找到最佳的分類迴歸係數。

5>    測試演算法:一旦訓練步驟完成,分類將會很快。

6>    使用演算法:首先,我們需要輸入一些資料,並將其轉換成對應的結構化數值;接著,基於訓練好的迴歸係數就可以對這些數值進行簡單的迴歸計算,判定它們屬於哪個類別;在這之後,我們就可以在輸出的類別上做一些其他分析工作。

Logistic迴歸的優缺點

優點:計算代價不高,易於理解和實現。

缺點:容易欠擬合,分類精度可能不高。

適用資料型別:數值型和標稱型資料。

Sigmoid函式公式

Sigmoid函式具體的計算公式如下:


圖5-1給出了Sigmoid函式在不同座標尺度下的兩條曲線圖。當x為0時,Sigmoid函式值為0.5.隨著x的增大,對應的Sigmoid值將逼近於1;而隨著x的減小,Sigmoid值將逼近於0。如果橫座標刻度足夠大,Sigmoid函式看起來很像一個階躍函式。

實際上,Sigmoid函式是一種階躍函式(stepfunction)。在數學中,如果實數域上的某個函式可以用半開區間上的指示函式的有限次線性組合來表示,那麼這個函式就是階躍函式。而數學中指示函式(indicator function)是定義在某集合X上的函式,表示其中有哪些元素屬於某一子集A。



為了實現Logistic迴歸分類器,可以在每個特徵上都乘以一個迴歸係數,然後把所有的結果值相加,將這個總和帶入Sigmoid函式中,進而得到一個範圍在0~1之間的數值。任何大於0.5的資料被分入1類,小於0.5即被歸入0類。所以,Logistic迴歸也可以被看成是一種概率估計。

Sigmoid函式的輸入記為z,由下面公式得出:

z=w0*x0+w1*x1+w2*x2+…+wn*xn

如果採用向量的寫法,上述公式可以寫成z=wTx,它表示將這兩個數值向量對應元素相乘然後全部加起來即得到z值。其中的向量x是分類器的輸入資料,向量w也就是我們要找到的最佳引數(係數),從而使得分類器儘可能地精確。

為了尋找最佳引數,需要用到最優化理論的一些知識。本文中使用梯度上升法作為最優化方法。

梯度上升法的基本思想是:要找到某函式的最大值,最好的方法是沿著該函式的梯度方向探尋。函式f(x,y)的梯度由下式表示:


這個梯度意味著要沿x的方向移動:


沿y的方向移動:


其中,函式f(x,y)必須要在待計算的點上有定義並且可微。一個具體的函式例子見圖5-2。圖中梯度上升演算法沿梯度方向移動了一步。可以看到,梯度運算元總是指向函式值增長最快的方向。這裡所說的是移動方向,而未提到移動量的大小。該量值稱為步長,記作a。用向量來表示的話,梯度演算法的迭代公式如下:


該公式將一直被迭代執行,直至達到某個停止條件為止,比如迭代次數達到某個指定值或演算法達到某個可以允許的誤差範圍。

梯度下降演算法與梯度上升演算法類似,只是公式中的加號變為減號即可。梯度上升演算法用來求函式的最大值,而梯度下降演算法用來求函式的最小值。


(未完待續)

相關推薦

程式MLLogistic迴歸演算法原理實現

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、Logistic迴歸演算法的原理 假設現在有一些資料點,我們用一條直線對這些點進行擬合(該線稱為最佳擬合直線),這個

程式MLLogistic迴歸演算法原理實現

2.2   利用Logistic演算法預測病馬死亡率 由於採集資料是諸多原因,採集的資料有可能不完整。但有時候資料相當昂貴,扔掉和重新獲取都是不可取的,所以必須採用一些方法來解決這個問題。 處理資料中缺失值的做法: 1>    使用可用特徵的均值來填補缺失值; 2&g

程式MLLogistic迴歸演算法原理實現

2、Logistic迴歸演算法的實現 2.1   Logistic演算法的實現 首先,我們實現梯度上升演算法。 Sigmoid函式的定義如下: #sigmoid函式的實現 def sigmoid(inX): return 1.0 / (1 + exp(-inX))

程式ML決策樹演算法原理實現

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2.3   決策樹的測試 書中使用隱形眼鏡資料集對決策樹進行了測試。 建立測試檔案contactLenses4Deci

程式ML樸素貝葉斯演算法原理實現

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 1、樸素貝葉斯演算法的原理 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。 和決策樹模型相比,樸素貝葉斯

程式ML樸素貝葉斯演算法原理實現

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新機器學習、OpenCL+OpenCV以及影象處理方面的文章。 2、樸素貝葉斯演算法的實現 2.1   樸素貝葉斯演算法的實現 按照樸素貝葉斯演算法的原理,我們需要實現一個樸素貝葉

機器學習系列2logistic迴歸,貝葉斯bayes方法

前言:這章主要介紹logistic迴歸和bayes法。兩者都屬分類,前者引入了logistic函式,後者引入了貝葉斯定理,都是比較基礎的數學知識。             但是logistic無需先驗的訓練樣本,後者需要。              貝葉斯法很強大,很多郵件

logistic迴歸演算法原理python實現

1 logistic迴歸與sigmoid函式 考慮如下線性函式: y=wwTxx+b(1) 輸出y為連續的實值,如何讓輸出成為二值來完成二分類任務?即y∈{0,1},最理想的是單位階躍函式即: y=⎧⎩⎨⎪⎪0,z<00.5,z=01,z>0

Java常用的八種排序演算法與程式碼實現氣泡排序法、插入排序法、選擇排序法

這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

logistic regression演算法原理實現

邏輯迴歸所要學習的函式模型為y(x),由x->y,x為樣本,y為目標類別,即總體思想是任意給出一個樣本輸入,模型均能將其正確分類。實際運用中比如有郵箱郵件分類,對於任意一封郵件,經過模型後可將其判別為是否是垃圾郵件。 假如我們知道某類資料的條件概率分佈函

氣泡排序演算法原理實現超詳細

氣泡排序(Bubble Sort)是排序演算法裡面比較簡單的一個排序。它重複地走訪要排序的數列,一次比較兩個資料元素,如果順序不對則進行交換,並一直重複這樣的走訪操作,直到沒有要交換的資料元素為止。 氣泡排序的原理 為了更深入地理解氣泡排序的操作步驟,我們現在看一下氣泡排序的原理。 首先我們肯定有一個數組

快速排序演算法原理實現單軸快速排序、三向切分快速排序、雙軸快速排序

歡迎探討,如有錯誤敬請指正 1. 單軸快速排序的基本原理 快速排序的基本思想就是從一個數組中任意挑選一個元素(通常來說會選擇最左邊的元素)作為中軸元素,將剩下的元素以中軸元素作為比較的標準,將小於等於中軸元素的放到中軸元素的左邊,將大於中軸元素的放到中軸元素的右邊,然後以當前中軸元素的位置為界,將左半部分子

K近鄰演算法理解實現python

KNN的工作原理:給定一個已知標籤類別的訓練資料集,輸入沒有標籤的新資料後,在訓練資料集中找到與新資料最鄰 近的k個例項,如果這k個例項的多數屬於某個類別,那麼新資料就屬於這個類別。可以簡單理解為:由那些離X最 近的k個點來投票決定X歸為哪一類。 在二維平面下:   

粒子群演算法的matlab實現

clc;clear;close all; %% 初始化種群 f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函式表示式 figure(1);ezplot(f,[0,0.01,20]); N = 50;

knn演算法原理實現1

一、演算法原理與模型 knn演算法即最近鄰演算法,其原理非常簡單即根據給定的資料集,計算資料集中點的特徵到待分類資料的歐氏距離,然後選擇距離最近的k個作為判斷依據,這k個數據中出現類別最多的作為新輸入資料的label。模型用公式表示如下: 二、python程式碼實現

K-近鄰演算法的Python實現

1.Python的語言環境和參考的書籍 下面給出的程式碼是基於Python2.7.9編寫的(編譯器推薦使用pycharm),Python到了3.0以後的版本語言有所改變,但是大體上沒有太大的變化。我所給出的程式碼是引用《機器學習實戰》中的程式碼,帶

Apriori演算法簡介實現python

Apriori這個詞的意思是“先驗的”,從priori這個詞根可以猜出來~;) 。該演算法用於從資料中挖掘頻繁項資料集以及關聯規則。其核心原理是基於這樣一類“先驗知識”:  如果一個數據項在資料庫中是頻繁出現的,那麼該資料項的子集在資料庫中也應該是頻繁出現的(命題1)

機器學習之logistic迴歸演算法與程式碼實現

                                       Logistic迴歸演算法與程式

機器學習演算法的Python實現 (1)logistics迴歸 與 線性判別分析LDA

本文為筆者在學習周志華老師的機器學習教材後,寫的課後習題的的程式設計題。之前放在答案的博文中,現在重新進行整理,將需要實現程式碼的部分單獨拿出來,慢慢積累。希望能寫一個機器學習演算法實現的系列。 本文主要包括: 1、logistics迴歸 2、線性判別分析(LDA) 使

Java常用的八種排序演算法與程式碼實現桶排序、計數排序、基數排序

三種線性排序演算法:桶排序、計數排序、基數排序 線性排序演算法(Linear Sort):這些排序演算法的時間複雜度是線性的O(n),是非比較的排序演算法 桶排序(Bucket Sort)   將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序,桶內排完序之後,再把桶裡的