邏輯迴歸二分類
今天嘗試寫了一下邏輯迴歸分類,把代碼分享給你們,至於原理的的話請戳這裏 http://www.javashuo.com/article/p-mdcbjprf-bv.html (在這片博客的基礎上我加了一丟丟東西)。html
用到的預測函數爲算法
其中,h爲預測函數(大於0.5爲一類,小於等於0.5爲另外一類)。θ爲各個特徵的參數。θ=[θ1,θ2,θ3...]T函數
損失函數J(θ)爲學習
利用梯度降低算法進行參數的更新公式以下:測試
其中,α是學習率參數,λ是正則項參數,須要本身輸入。spa
用上述三個公式便可寫出通常狀況下的邏輯迴歸分類,經試驗,其分類效果在個人測試數據下有90%以上準確度。.net
如下代碼爲了演示方面,只提供了兩個特徵值,而後加了一個常數項(通過實驗,常數項是不可缺乏的)。你們在使用本身的數據集的話只須要進行一點小改動便可。code
matlab代碼以下:htm
clear clc %% 數據準備 %X = xlsread('C:\Users\user01\Desktop\test.xlsx'); %二分類 隨機生成數據。 200個數據 每一個數據2個特徵 data=1*rand(300,2); label=zeros(300,1); %label(sqrt(data(:,1).^2+data(:,2).^2)<8)=1; label((data(:,2)+data(:,1)>1))=1; %在data上加常數特徵項; data=[data,ones(size(data,1),1)]; %打亂循序 randIndex = randperm(size(data,1)); data_new=data(randIndex,:); label_new=label(randIndex,:); %80%訓練 20%測試 k=0.8*size(data,1); X1=data_new(1:k,:); Y1=label_new(1:k,:); X2=data_new(k+1:end,:); Y2=label_new(k+1:end,:); [m1,n1] = size(X1); [m2,n2] = size(X2); Features=size(data,2); %特徵個數 %% 開始訓練 %設定學習率爲0.01 delta=1; lamda=0.2; %正則項係數 theta1=rand(1,Features); %theta1=[.5,.5]; %%訓練模型 %梯度降低算法求解theta(每次都是對所有的數據進行訓練) num = 300; %最大迭代次數 L=[]; while(num) dt=zeros(1,Features); loss=0; for i=1:m1 xx=X1(i,1:Features); yy=Y1(i,1); h=1/(1+exp(-(theta1 * xx'))); dt=dt+(h-yy) * xx; loss=loss+ yy*log(h)+(1-yy)*log(1-h); end loss=-loss/m1; L=[L,loss]; theta2=theta1 - delta*dt/m1 - lamda*theta1/m1; theta1=theta2; num = num - 1; if loss<0.01 break; end end figure subplot(1,2,1) plot(L) title('loss') subplot(1,2,2) x=0:0.1:10; y=(-theta1(1)*x-theta1(3))/theta1(2); plot(x,y,'linewidth',2) hold on plot(data(label==1,1),data(label==1,2),'ro') hold on plot(data(label==0,1),data(label==0,2),'go') axis([0 1 0 1]) %測試數據 acc=0; for i=1:m2 xx=X2(i,1:Features)'; yy=Y2(i); finil=1/(1+exp(-theta2 * xx)); if finil>0.5 && yy==1 acc=acc+1; end if finil<=0.5 && yy==0 acc=acc+1; end end acc/m2 %測試結果: 測試準確率爲95%。
獲得的loss曲線爲:blog
分類圖像爲:
原文出處:https://www.cnblogs.com/hyb965149985/p/10601418.html