1. 程式人生 > >【機器學習演算法實現】logistic迴歸__基於Python和Numpy函式庫

【機器學習演算法實現】logistic迴歸__基於Python和Numpy函式庫

1、演算法簡介

本文的重點放在演算法的工程實現上,關於演算法的原理不具體展開,logistic迴歸演算法很簡單,可以看看Andrew Ng的視訊:https://class.coursera.org/ml-007,也可以看看一些寫得比較好的博文:洞庭之子的博文。下面我只列出一些個人認為重要的點。

迴歸的概念:假設有一些資料點,我們用一條直線對這些點進行擬合,這個擬合過程就稱作迴歸。

logistic迴歸演算法之所以稱作“logistic”,是因為它運用了logistic函式,即sigmoid函式

logistic迴歸演算法一般用於二分類問題(當然也可以多類別,後面會講)。

logistic迴歸的演算法思想:


用上面的圖來分析,每個O或X代表一個特徵向量,這裡是二維的,可以寫成x=(x1,x2)。

用logistic迴歸進行分類的主要思想就是根據現有資料集,對分類邊界建立迴歸公式,拿上面這個圖來說,就是根據這些OOXX,找出那條直線的公式:Θ0*x0+Θ1*x1+Θ2*x2=Θ0+Θ1*x1+Θ2*x2=0  (x0=1)。

因為上圖是二維的,所以引數Θ=(Θ0,Θ1, Θ2),分類邊界就由這個(Θ0,Θ1, Θ2)確定,對於更高維的情況也是一樣的,所以無論二維三維更高維,分類邊界可以統一表示成f(x)=ΘT*x  (ΘT表示Θ的轉置)。

對於分類邊界上的點,代入分類邊界函式就得到f(x)=0,同樣地,對於分類邊界之上的點,代入得到f(x)>0,對於分類邊界之下的點,代入得到f(x)f(x)大於0或者小於0來分類了。

logistic迴歸的最後一步就是將f(x)作為輸入,代入Sigmoid函式,當f(x)>0時,sigmoid函式的輸出就大0.5,且隨著f(x)趨於正無窮,sigmoid函式的輸出趨於1。當f(x)0時,sigmoid函式的輸出就小於0.5,且隨著f(x)趨於負無窮,sigmoid函式的輸出趨於0。

所以我們要尋找出最佳引數Θ,使得對於1類別的點x,f(x)趨於正無窮,對於0類別的點x,f(x)趨於負無窮(實際程式設計中不可能正/負無窮,只要足夠大/小即可)。

總結一下思緒,logistic迴歸的任務就是要找到最佳的擬合引數。下圖的g(z)即sigmoid函式,跟我上面講的一樣,將f(x)=ΘT*x

作為g(z)的輸入。

以上就是logistic迴歸的思想,重點在於怎麼根據訓練資料求得最佳擬合引數Θ?這可以用最優化演算法來求解,比如常用的梯度上升演算法,關於梯度上升演算法這裡也不展開,同樣可以參考上面推薦的博文。

所謂的梯度,就是函式變化最快的方向,我們一開始先將引數Θ設為全1,然後在演算法迭代的每一步裡計算梯度,沿著梯度的方向移動,以此來改變引數Θ,直到Θ的擬合效果達到要求值或者迭代步數達到設定值。Θ的更新公式:

alpha是步長,一系列推導後:

這個公式也是下面寫程式碼所用到的。

後話:理解logistic迴歸之後可以發現,其實它的本質是線性迴歸,得到ΘT*x的過程跟線性迴歸是一樣的,只不過後面又將ΘT*x作為logistic函式的輸入,然後再判斷類別。

2、工程例項

 logistic迴歸一般用於二分類問題,比如判斷一封郵件是否為垃圾郵件,判斷照片中的人是男是女,預測一場比賽輸還是贏……當然也可以用於多分類問題,比如k類別,就進行k次logistic迴歸。

我的前一篇文章:kNN演算法__手寫識別 講到用kNN演算法識別數字0~9,這是個十類別問題,如果要用logistic迴歸,

得做10次logistic迴歸,第一次將0作為一個類別,1~9作為另外一個類別,這樣就可以識別出0或非0。同樣地可以將1作為一個類別,0、2~9作為一個類別,這樣就可以識別出1或非1……..

本文的例項同樣是識別數字,但為了簡化,我只選出0和1的樣本,這是個二分類問題。下面開始介紹實現過程:

(1)工程檔案說明

在我的工程檔案目錄下,有訓練樣本集train和測試樣本集test,原始碼檔案命名為logistic regression.py

訓練樣本集train和測試樣本集test裡面只有0和1樣本:

 logistic regression.py實現的功能:從train裡面讀取訓練資料,然後用梯度上升演算法訓練出引數Θ,接著用引數Θ來預測test裡面的測試樣本,同時計算錯誤率。

(2)原始碼解釋

 loadData(direction)函式

實現的功能就是從資料夾裡面讀取所有訓練樣本,每個樣本(比如0_175.txt)裡有32*32的資料,程式將32*32的資料整理成1*1024的向量,這樣從每個txt檔案可以得到一個1*1024的特徵向量X,而其類別可以從檔名“0_175.txt”裡擷取0出來。因此,從train資料夾我們可以獲得一個訓練矩陣m*1024和一個類別向量m*1,m是樣本個數。

12345678910111213141516171819 def loadData(direction):trainfileList=listdir(direction)m=len(trainfileList)dataArray=zeros((m,1024))labelArray=zeros((m,1))foriinrange(m):returnArray=zeros((1,1024))#每個txt檔案形成的特徵向量filename=trainfileList[i]fr=open('%s/%s'%(direction,filename))forjinrange(32):lineStr=fr.readline()forkinrange(32):returnArray[0,32*j+k]=int(lineStr[k])dataArray[i,:]=returnArray#儲存特徵向量filename0=filename.split('.')[0]label=filename0.split('_')[0]labelArray[i]=int(label)#儲存類別returndataArray,labelArray
程式碼裡面用到python os模組裡的listdir(),用於從資料夾裡讀取所有檔案,返回的是列表。 python裡的open()函式用於開啟檔案,之後用readline()一行行讀取
  • sigmoid(inX)函式
12 def sigmoid(inX):return1.0/(1+exp(-inX))
  • gradAscent(dataArray,labelArray,alpha,maxCycles)函式

用梯度下降法計算得到迴歸係數,alpha是步長,maxCycles是迭代步數。

12345678910 def gradAscent(dataArray,labelArray,alpha,maxCycles):dataMat=mat(dataArray)#size:m*nlabelMat=mat(labelArray)#size:m*1m,n=shape(dataMat)weigh=ones((n,1))foriinrange(maxCycles):h=sigmoid(dataMat*weigh)error=labelMat-h#size:m*1weigh=weigh+alpha*dataMat.transpose()*errorreturnweigh

用到numpy裡面的mat,矩陣型別。shape()用於獲取矩陣的大小。

這個函式返回引數向量Θ,即權重weigh

  • classfy(testdir,weigh)函式

分類函式,根據引數weigh對測試樣本進行預測,同時計算錯誤率

12345678910111213141516171819 def classfy(testdir,weigh):dataArray,labelArray=loadData(testdir)dataMat=mat(dataArray)labelMat=mat(labelArray)h=sigmoid(dataMat*weigh)#size:m*1m=len(h)error=0.0foriinrange(m):ifint(h[i])>0.5:print int(labelMat[i]),'is classfied as: 1'ifint(labelMat[i])!=1:error+=1print'error'else:print int(labelMat[i]),'is classfied as: 0'ifint(labelMat[i])!=0:error+=1print'error'print'error rate is:','%.4f'%(error/m)
  • digitRecognition(trainDir,testDir,alpha=0.07,maxCycles=10)函式

整合上面的所有函式,呼叫這個函式進行數字識別,alpha和maxCycles有預設形參,這個可以根據實際情況更改。

1234 def digitRecognition(trainDir,testDir,alpha=0.07,maxCycles=10):data,label=loadData(trainDir)weigh=gradAscent(data,label,alpha,maxCycles)classfy(testDir,weigh)
用loadData函式從train裡面讀取訓練資料,接著根據這些資料,用gradAscent函式得出引數weigh,最後就可以用擬合引數weigh來分類了。

3、試驗結果

工程檔案可以到這裡下載:github地址

執行logistic regression.py,採用預設形參:alpha=0.07,maxCycles=10,看下效果,錯誤率0.0118

1 >>>digitRecognition('train','test')

改變形參,alpah=0.01,maxCycles=50,看下效果,錯誤率0.0471

1 >>>digitRecognition('train','test',0.01,50)

這兩個引數可以根據實際情況調整

相關推薦

機器學習演算法實現logistic迴歸__基於PythonNumpy函式

1、演算法簡介 本文的重點放在演算法的工程實現上,關於演算法的原理不具體展開,logistic迴歸演算法很簡單,可以看看Andrew Ng的視訊:https://class.coursera.org/ml-007,也可以看看一些寫得比較好的博文:洞庭之子的博文。下面我只列出一些個人認為重要的點。 迴歸的概

機器學習演算法實現logistic迴歸 基於PythonNumpy函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習演算法實現主成分分析 PCA ——基於python+numpy

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習演算法實現kNN演算法 手寫識別——基於PythonNumPy函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習演算法總結線性迴歸

文章目錄 1 機器學習概念 2 線性迴歸 3 代價函式 4 代價函式求解 4.1 正規方程求解 4.2 梯度下降法 4.2.1 批量梯度下降(BGD) 4.2.2 隨機梯

機器學習演算法推導邏輯迴歸

邏輯迴歸(logistic regression)是分類演算法的一種,通過形成決策邊界,達到對資料進行分類的效果。 演算法思想 邏輯迴歸中,以二分類為例,最終預測得到的是一個分類,也就是0或者1。若目標函式

機器學習筆記1Logistic迴歸總結

 Logistic迴歸總結 作者:洞庭之子 (2013年11月) 1.引言 看了Stanford的Andrew Ng老師的機器學習公開課中關於Logistic Regression的講解,然後又看了《機器學習實戰》中的LogisticRegression部分,

機器學習演算法實現kNN演算法__手寫識別——基於PythonNumPy函式

【機器學習演算法實現】系列文章將記錄個人閱讀機器學習論文、書籍過程中所碰到的演算法,每篇文章描述一個具體的演算法、演算法的程式設計實現、演算法的具體應用例項。爭取每個演算法都用多種語言程式設計實現。所

kNN演算法__手寫識別——基於PythonNumPy函式

(3)測試樣本中有10*5個圖片,我們要讓程式自動判斷每個圖片所表示的數字。同樣的,對於測試圖片,將其轉化為1*1024的向量,然後計算它與訓練樣本中各個圖片的“距離”(這裡兩個向量的距離採用歐式距離),然後對距離排序,選出較小的前k個,因為這k個樣本來自訓練集,是已知其代表的數字的,所以被測試圖片所代表的數

機器學習演算法推導簡單線性迴歸與多元線性迴歸

線性迴歸,主要用於從資料中擬合出一條直線(或更高維的平面),這條直線能夠很好地體現資料的特徵,比如,它能夠使得平面上的點都均勻地分佈在這條直線上。 演算法思想 對於簡單線性迴歸和多元線性迴歸,其演算法過程是相同的,不同之處在於簡單線性迴歸只有一個特徵需要擬合,多元線

機器學習演算法推導K均值(K-means)

非監督演算法是機器學習研究的一大領域,它適用於不帶標籤的樣本資料,採取一定的演算法,將樣本分成自動分類成不同的簇。 K均值(K-meas)   K均值演算法接收兩個輸入,一個是K,表示簇的數量,另一個是不帶標籤的訓練集{

機器學習演算法推導支援向量機

線性可分   在二維平面中,正樣本和負樣本可以由一條直線完全隔開。假設存在直線 y =

機器學習演算法推導BP神經網路

非線性問題 對於一張汽車圖片,如何將其識別為汽車呢?我們人可能看一眼就能識別出來,但是如何讓計算機也擁有同樣的技能呢?我們知道,一張圖片在計算機中都是以畫素矩陣的形式儲存的,無論是一輛汽車,還是一輛飛機,在計算機中都是一個個矩陣,並無法直觀地感受到這個矩陣代表是汽車還是飛機。用邏輯迴

機器學習實戰-python3線性迴歸

本篇將介紹機器學習中的迴歸演算法(主要是線性迴歸)。分類輸出的結果是標稱型的數值(類別值),而回歸預測是結果是一組連續值。簡而言之,迴歸與分類的不同在於其目標變數是連續數值型。 本篇的資料和程式碼參見:https://github.com/stonycat/M

機器學習詳解線性迴歸、梯度下降、最小二乘的幾何概率解釋

線性迴歸 即線性擬合,給定N個樣本資料(x1,y1),(x2,y2)....(xN,yN)其中xi為輸入向量,yi表示目標值,即想要預測的值。採用曲線擬合方式,找到最佳的函式曲線來逼近原始資料。通過使得代價函式最小來決定函式引數值。 採用斯坦福大學公開課的

機器學習演算法線性迴歸以及手推logistic迴歸

一,基本形式: 在樣本集D中有n個樣本,即。其中每個樣本x有d個屬性描述, x = (x1;x2;...;xd),其中xi表示的是第i個屬性上的取值,線性模型試圖學得一個通過屬性的線性組合來進行預測的函式,即: 其中w,b是要訓練的引數, w = (w1;w2;...;w

機器學習演算法-python實現邏輯迴歸實現(LogicalRegression)

1.背景知識在剛剛結束的天貓大資料s1比賽中,邏輯迴歸是大家都普遍使用且效果不錯的一種演算法。(1)迴歸         先來說說什麼是迴歸,比如說我們有兩類資料,各有50十個點組成,當我門把這些點畫出

機器學習筆記27CART演算法-迴歸分類樹

基本概念 分類和迴歸樹(classification and regression tree, CART) 是應用廣泛的決策樹學習方法,由特徵選擇、樹的生成和剪枝組成,既可以用做分類也可以用作迴歸。 迴歸樹 迴歸樹的定義 假設X和Y分別作為輸入和輸出變數,那麼

機器學習演算法基於R語言的多元線性迴歸分析

多元線性迴歸的適用條件: (1)自變數對應變數的變化具有顯著影響 (2)自變數與應變數間的線性相關必須是真實的,而非形式上的 (3)自變數之間需有一定的互斥性 (4)應具有完整的統計資料 訓練資料:csv格式,含有19維特徵 資料下載地址:http://pan.baidu

機器學習實戰之一:C++實現K-近鄰演算法KNN

本文不對KNN演算法做過多的理論上的解釋,主要是針對問題,進行演算法的設計和程式碼的註解。 KNN演算法: 優點:精度高、對異常值不敏感、無資料輸入假定。 缺點:計算複雜度高、空間複雜度高。 適用資料範圍:數值型和標稱性。 工作原理:存在一個樣本資料集合,也稱作訓練樣本集,