Matlab實(shí)現(xiàn)LogisticRegression_第1頁(yè)
Matlab實(shí)現(xiàn)LogisticRegression_第2頁(yè)
Matlab實(shí)現(xiàn)LogisticRegression_第3頁(yè)
Matlab實(shí)現(xiàn)LogisticRegression_第4頁(yè)
Matlab實(shí)現(xiàn)LogisticRegression_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余19頁(yè)可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、算法 -Matlab 實(shí)現(xiàn) Logistic Regression什么叫做回歸呢?舉個(gè)例子,我們現(xiàn)在有一些數(shù)據(jù)點(diǎn),然后我們打算用一條直線來對(duì)這些點(diǎn)進(jìn)行擬合(該曲線稱為最佳擬合曲線), 這個(gè)擬合過程就被稱為回歸。利用 Logistic 回歸進(jìn)行分類的主要思想是:根據(jù)現(xiàn)有數(shù)據(jù)對(duì)分類邊界線建立回歸公式,以此進(jìn)行分類。這里的”回歸“一詞源于最佳擬合,表示要找到最佳擬合參數(shù)集。訓(xùn)練分類器時(shí)的嘴閥就是尋找最佳擬合曲線,使用的是最優(yōu)化算法?;?Logistic 回歸和 Sigmoid 函數(shù)的分類優(yōu)點(diǎn):計(jì)算代價(jià)不高,易于理解和實(shí)現(xiàn)缺點(diǎn):容易欠擬合,分類精度可能不高使用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型數(shù)據(jù)Sigmoi

2、d 函數(shù):波形如下:當(dāng) z為 0 時(shí),值為0.5,當(dāng)z 增大時(shí),g(z)逼近 1,當(dāng) z減小時(shí),g(z)逼近 0Logistic 回歸分類器:對(duì)每一個(gè)特征都乘以一個(gè)回歸系數(shù),然后把所有結(jié)果都相加,再講這個(gè)總和代入 Sigmoid 函數(shù)中, 從而得到一個(gè)范圍在0-1 之間的數(shù)值。任何大于0.5的數(shù)據(jù)被分為1 , 小于 0.5 的數(shù)據(jù)被分為0.因此 Logistic 回歸也被看成是一種概率分布。分類器的函數(shù)形式確定之后,現(xiàn)在的問題就是,如何確定回歸系數(shù)?基于最優(yōu)化方法的最佳回歸系數(shù)確定Sigmoid 函數(shù)的輸入記為z,由下面公式得出:如果采用向量的寫法,則上述公式可以寫成:其中向量X 就是分類器的

3、輸入數(shù)據(jù),向量W 也就是我們要找到的最佳參數(shù),從而使分類器盡可能更加地精確。接下來將介紹幾種需找最佳參數(shù)的方法。梯度上升法梯度上升法的基本思想:要找到某函數(shù)的最大值 ,最好的方法是沿著該函數(shù)的梯度方向?qū)ふ疫@里提一下梯度下降法,這個(gè)我們應(yīng)該會(huì)更加熟悉,因?yàn)槲覀冊(cè)诤芏啻鷥r(jià)函數(shù)J的優(yōu)化的時(shí)候經(jīng)常用到它,其基本思想是:要找到某函數(shù)的最小值 , 最好的方法是沿著該函數(shù)的梯度方向的反方向 尋找函數(shù)的梯度表示方法如下:移動(dòng)方向確定了,移動(dòng)的大小我們稱之為步長(zhǎng),用表示,用向量來表示的話,梯度下降算法的迭代公式如下:該公式已知被迭代執(zhí)行,直到某個(gè)停止條件位置,比如迭代次數(shù)達(dá)到某個(gè)指定值或者算法的誤差小到某個(gè)允許

4、的誤差范圍內(nèi)。注:梯度下降算法中的迭代公式如下:Matlab 實(shí)現(xiàn)function weight = gradAscent %clcclose allclear %data = load( 'testSet.txt' );row , col = size (data);dataMat=data(:, 1 :col- 1 );dataMat=ones(row, 1 ) dataMat;labelMat=data(:,col);alpha = 0.001 ;maxCycle = 500 ;weight = ones (col, 1 ); for i = 1 :maxCycleh =

5、 sigmoid(dataMat* weight) ');error = (labelMat - h' );weight = weight + alpha * dataMat' * error; endfigurescatter(dataMat( find (labelMat(:) = 0 ), 2 ),dataMat( find (labelMat(:) = 0 ), 3 ), 3);hold onscatter(dataMat( find (labelMat(:) = 1 ), 2 ),dataMat( find (labelMat(:) = 1 ), 3 ), 5

6、);hold onx = - 3:0.1 :3 ;y = (-weight( 1 )-weight( 2 )*x)/weight( 3 );plot(x,y)hold offendfunction returnVals = sigmoid (inX)% 注意這里的sigmoid 函數(shù)要用點(diǎn)除1.0 ./( 1.0 +exp (-inX); endreturnVals效圖如下:由上圖可以看到,回歸效果還是挺不錯(cuò)的,只有2-4 個(gè)點(diǎn)分類錯(cuò)誤。其實(shí)這是的梯度上升算法是批量梯度上升算法, 每一次更新參數(shù)的時(shí)候都要講所有的數(shù)據(jù)集都代入訓(xùn)練,效果并不好,下面我們將介紹改進(jìn)版本:隨機(jī)梯度上升算法隨機(jī)梯度上升

7、梯度上升算法在每次更新回歸系數(shù)時(shí)都要遍歷整個(gè)數(shù)據(jù)集,該方法在處理100個(gè)左右的數(shù)據(jù)集時(shí)尚可,但如果有數(shù)十億樣本和成千上萬的特征,那么該方法的復(fù)雜度就太高了。一種改進(jìn)方法是一次僅用一個(gè)樣本點(diǎn)來更新回歸系數(shù),該方法就稱為隨機(jī)梯度上升法。由于可以在新樣本到來之前對(duì)分類器進(jìn)行增量式更新,因此隨機(jī)梯度算法是一個(gè)在線學(xué)習(xí)算法。與”在線學(xué)習(xí)“相對(duì)應(yīng),一次處理所有 數(shù)據(jù)被稱作是”批處理“所有回歸系數(shù)初始化為1對(duì)數(shù)據(jù)集中的每個(gè)樣本計(jì)算該樣本的梯度使用 alpha x gradient 更新回歸系數(shù)值返回回歸系數(shù)值Matlab 代碼實(shí)現(xiàn)function stocGradAscent % Description :

8、 LogisticRegression using stoc GradAsscent% Author : Liulongpo% Time : 2015-4-1810:57:25%clc clear close all % data = load( 'testSet.txt' );row , col = size (data);dataMat = ones(row, 1 ) data(:, 1 :col- 1 );alpha = 0.01 ;labelMat = data(:,col);weight = ones (col, 1 ); for i = 1 :row h = sig

9、moid(dataMat( i ,:)*weight); error = labelMat( i) - h; dataMat( i,:) weightweight = weight + alphaerrordataMat( i,:)end figurescatter(dataMat(find(labelMat(:)=0),2),dataMat(find(labelMat(:)=0),3),5); hold onscatter(dataMat(find(labelMat(:)= 1),2),dataMat(find(labelMat(:)= 1),3),5); hold on x = -3:0.

10、1:3;y = -(weight(1)+weight(2)*x)/weight(3); plot(x,y)hold offendfunction returnVals = sigmoid(inX)% 注意這里的sigmoid 函數(shù)要用點(diǎn)除returnVals = 1.0./(1.0+exp(-inX);end效果如下:由上圖可以看出,隨機(jī)梯度上升算法分類效果并沒有上面的的梯度上升算法分類效果好。但是直接比較梯度上升算法和隨機(jī)梯度上升算法是不公平的,前者是在整個(gè)數(shù)據(jù)集上迭代500 次得到的結(jié)果,后者只是迭代了100 次。一個(gè)判斷算法優(yōu)劣的可靠方法是看它是否收斂,也就是說求解的參數(shù)是否達(dá)到了穩(wěn)定值

11、,是否還會(huì)不斷變化。200 次,迭代過程中3 個(gè)參數(shù)的我們讓隨機(jī)梯度上升算法在整個(gè)數(shù)據(jù)集上運(yùn)行 變化如下圖:則還需要更weight1 最先達(dá)到穩(wěn)定,而 weight0 和 weight2多的迭代次數(shù)來達(dá)到穩(wěn)定。此時(shí)的分類器跟之前的梯度上升算法的分類效果差不多,如下:但同時(shí)我們也可以看到,三個(gè)參數(shù)都有不同程度的波動(dòng)。產(chǎn)生這種現(xiàn)象的原因是存在一些不能被正確分類的樣本點(diǎn)(數(shù)據(jù)集并非線性可分), 在每次迭代的時(shí)候都會(huì)引起參數(shù)的劇烈變化。我們期望算法能避免來回波動(dòng),從而收斂到某個(gè)值。另外,算法收斂速度也要加快。改進(jìn)的隨機(jī)梯度上升算法的主要兩個(gè)改進(jìn)點(diǎn)如下:1,每一步調(diào)整alpha 的值,也就是alpha

12、的值是不嚴(yán)格下降的2. 隨機(jī)采取樣本來更新回歸參數(shù)matlab 代碼如下:function ImproveStocGradAscent % Description : LogisticRegression using stocGradAsscent%Author : Liulongpo%Time : 2015-4-1810:57:25%clcclearclose all %data = load( 'testSet.txt' );row , col = size (data);dataMat = ones(row, 1 ) data(:, 1 :col- 1 ); %alpha

13、 = 0.01;numIter= 20 ;labelMat= data(:,col);weightVal = zeros ( 3 ,numIter*row);weightones (col, 1 );j = 0 ;for k1 :numIterplot(i,weightVal(1,:),title('weight0') %,axis(0 numIter*row0.8 7) j = 1 :nurandIndex = randperm(row);for i = 1 :row% 改進(jìn)點(diǎn) 1alpha = 4/( 1.0 +i+k)+ 0.01 ;j = j+1 ;% 改進(jìn)點(diǎn) 2h =

14、 sigmoid(dataMat(randIndex( i),:)*weight);% 改進(jìn)點(diǎn) 2error = labelMat(randIndex( i) - h;% 改進(jìn)點(diǎn) 2weight = weight + alpha * error * dataMat(randIndex( i ),:) 'weightVal(1,j)=weight(1);weightVal(2,j)=weight(2);weightVal(3,j)=weight(3);endendfigurei = 1:numIter*row;subplot(3,1,1)mIter*row;subplot( 3,1 ,2

15、 )plot( j ,weightVal( 2 ,:),title( 'weight1' )%,axis(0 numIter*row 0.3 1.2)k = 1 :numIter*row;subplot( 3,1 ,3 )plot(k,weightVal( 3 ,:),title( 'weight2' )%,axis(0 numIter*row -1.2-0.1) figurescatter(dataMat(find (labelMat(:)= 0 ), 2 ),dataMat( find (labelMat(:)=0 ), 3 ), 5 );hold onsc

16、atter(dataMat(find (labelMat(:)= 1 ), 2 ),dataMat( find (labelMat(:) = 1 ), 3 ),5);hold onx = - 3:0.1 :3 ;y = -(weight( 1 )+weight( 2 )*x)/weight( 3 );plot(x,y, 'r' )hold off endfunction returnVals = sigmoid (inX)% 注意這里的sigmoid 函數(shù)要用點(diǎn)除returnVals1.0 ./( 1.0 +exp (-inX); end改進(jìn)點(diǎn) 1 中的 alpha 會(huì)隨著迭代

17、次數(shù)的增加不斷減小,但由于代碼中常數(shù)0.01的存在, alpha 不會(huì)減少到0。這樣做是為了保證在多次迭代之后新數(shù)據(jù)對(duì)于參數(shù)的更新還有一定的影響。另一點(diǎn)值得注意的就是,alpha 每次減少1/(k+i) , k 是迭代次數(shù),i 是樣本的下標(biāo)。所以alpha 不是嚴(yán)格下降的。避免參數(shù)的嚴(yán)格下降也常見于模擬退火算法等其他優(yōu)化算法中。第二個(gè)改進(jìn)的地方如代碼注釋中標(biāo)記的,這里通過隨機(jī)采取樣本來更新回歸參數(shù),這樣能夠減少參數(shù)的周期性的波動(dòng)。由于alpha 的動(dòng)態(tài)變化,我們可以在開始的時(shí)候設(shè)置比較大的值,代碼中設(shè)置0.01 , alpha 也就是每一次迭代的步長(zhǎng),步長(zhǎng)越大,越能夠加快參數(shù)的收斂速度。然后a

18、hpha 會(huì)不嚴(yán)格下降,這樣就避免了過擬合現(xiàn)象的發(fā)生。至于什么是過擬合已經(jīng) alpha 的選取問題將在下面描述。迭代20 次后效果如下:由上圖可知,步長(zhǎng)alpha 動(dòng)態(tài)變化之后,參數(shù)的收斂速度加快了很多,這里只是對(duì)所有樣本數(shù)據(jù)集迭代20 次, weight0 和 weight2 很早就收斂。證明了該算法的優(yōu)異性。學(xué)習(xí)率 alpha 的選取首先我們看一下梯度上升算法的核心代碼,如下:h = sigmoid(dataMat( i ,:)* weight);error = labelMat( i) - h;weight = weight + alpha * error * dataMat( i,:) '第一行做的就是估計(jì)分類,第二行計(jì)算當(dāng)前估計(jì)與正確分類之間的差error ,第三行根據(jù)這個(gè)error 來更新參數(shù)weight 。我們?cè)诘臅r(shí)候,要做的目標(biāo)就是最小化error ,我們令J 代表 error ,令向量 代表 weight ,則很顯然,J 是 的函數(shù)。這里盜用Standfor 機(jī)器學(xué)習(xí)教程的圖,如下:上圖中的每個(gè)箭頭就是每一次迭代的更新步長(zhǎng),第一幅圖我們看到,在最小化J( ) 的時(shí)候迭代了很多次,這說明什么?說明我們要走很多步才能到達(dá)全局最優(yōu)點(diǎn),原因就是我們每一步走的距離太短,走得太慢,也就是我們的alph

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論