數據源採集吳恩達教授第6課的練習數據(ex6data3.mat):
1、在Ocatve中導入數據;
L1=load(‘ex6data3.mat’);
2、構建相關的記錄集,並使用Plot觀察數據:
x=ones(size(L1.X)(1),3);
x(:[2,3])=L1.X;
y=L1.y
y0=find(y0);
y1=find(y1);
plot(x1(y1,2),x1(y1,3),’+’);
hold on
plot(x1(y0,2),x1(y0,3),‘o’,‘MarkerFaceColor’,‘r’);
根據以上模型分析還是比較線性的,暫定使用模型:
y=theta0+theta1X1+theta2X2
3、使用邏輯迴歸進行訓練(邏輯迴歸的代碼參見:《【邏輯迴歸】邏輯迴歸函數在Octave中的實現》)
這一步比較意外:
[T1,bRst,Thsl1]=LogisticRegression(0.15,0.01,20,x,y,theta)
使用以上參數進行訓練,但是沒有想到第一步就訓練出結果了,簡直不可意義,一度以爲是代碼有問題,反覆把吳恩達的課件拿出來看了幾次,在確認實現代碼沒有問題的情況下,對數據進行分析:
3.1、設置的誤差太大,因爲我們的X參數都是0後面五六位的;
3.2、將誤差設置小,重現進行訓練:
[T1,bRst,Thsl1]=LogisticRegression(0.15,0.001,2000,x,y,theta)
在61次迴歸的時候得出結論:
T1 =
0.27017
0.48933
1.53755
OK,將y=theta0+theta1X1+theta2X2的曲線畫出來,看看是否能夠滿足我們題目中的要求:
回憶一下課程中判斷最終有多少機率是0還是1,應該是這樣一條曲線。橫軸是:theta’X’(使用f(x)來表達),也就是theta0+theta1X1+theta2X2。縱軸是機率,也就是G(f(x))=1/(1+e^(-f(x))。也就是說如果f(x)>0,則最終的結果y=1;
所以我們畫出的線也應該是theta0+theta1X1+theta2*X2=0,在這條線之上的,我認爲預測結果應該是爲1的,而在這個線之下的,我們認爲預測結果應該是爲0的。
畫線:我們在上面的(X1,X2)點線圖上取兩點
XPlot=[1,-0.8;1,0.5]
然後需要計算這兩點的X1座標對應於X2的座標,代入上面點線即可:
theta0+theta1X1+theta2X2=0
X2=-(theta0/theta2+theta1X1/theta2)
這裏將-theta0/theta2,-theta1/theta2看成兩個參數,也就是P0,P1。我們可以把X2表達式重寫:X2=P0+P1X1
TPlot(1,1)=-T1(1,1)/T1(3,1);
TPlot(2,1)=-T1(2,1)/T1(3,1);
所以代碼如下:
plot(XPlot(:,2),TPlot’*XPlot’);
結果如下:
可見上圖也不是一個合適的結果集,繼續縮小誤差試試從0.001調到到0.0001
這就看上去比較接近我們的結果集了,當然我們也可以進一步降低誤差,看看是否有更好的表現。