機器學習(周志華) 參考答案 第三章 線性模型 3.4

4.選擇兩個UCI數據集,比較10折交叉驗證法和留一法所估計出的對率迴歸的錯誤率。

選取了UCI上iris數據集,內部共150個數據,3種類別,每類50個樣本。
每次選擇兩類做二分類計算,做3輪計算。每輪選取100個樣本,10折法選45正45反,剩下10個作爲驗證,一共10組,共驗證100例;留一法每次留1個做驗證,一共100組,也是100例。每個方法最終驗證300例,直接比較錯誤分類的個數就能評價兩種方法在該數據集上的適用程度。

一:Excel表處理iris數據集
iris數據集

二:10折交差驗證

%對率迴歸 iris數據集
%數據集3類數據 A-AX AY-CV CW-ET   各50組
%爲了程序讀取方便對數據集做了處理1-6  1,2類數據 7-12 1,3類數據 13-18 2,3類數據   A-CV  

x = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'A52:E151'); %訓練數據每次取兩類100個
y = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'F52:F151');
%數據集分類用了1,2,3來表示  使用不同的類別對y的處理也不同(總之保證y的取值爲{0,1})
y = y-1;
k=100;

%10折交差與留1法主體部分一樣,只是在過濾用來驗證樣本的地方有區別 爲了簡單複製了大部分代碼

%10折交差驗證
err0=0;%記錄錯誤分類的次數
for tn=0:9
   old_l=0;    %記錄上次計算的l
   b=[0;0;0;0;1];  %初始參數 (自定義)
  while(1)
     cur_l=0;
     bx=zeros(k,1);
     %計算當前參數下的l
     for i=1:k
         if fix(mod(i-1,50)/5) == tn      %跳過用來檢驗的樣本
             continue;
         end

          bx(i) = b.'*(x(i,:))';
          if bx(i)>30 %防止exp函數的參數過大導致無窮大 手動計算
              tlog=bx(i);
          else
              tlog=log(1+exp(bx(i)));
          end
          cur_l = cur_l - y(i)*bx(i) +tlog;
     end

     %迭代終止條件
     if abs(cur_l-old_l)<0.0001  
         break;
     end
     %更新參數(牛頓迭代法)以及保存當前l
     old_l = cur_l;
     p1=zeros(k,1);
     dl=0;
     d2l=0;

     for i=1:k
         if fix(mod(i-1,50)/5) == tn     %跳過用來檢驗的樣本
             continue;
         end
          p1(i) = 1 - 1/(1+exp(bx(i)));
          dl = dl - x(i,:)'*(y(i)-p1(i));
          d2l = d2l + x(i,:)' * (x(i,:)').'*p1(i)*(1-p1(i));
     end
     b = b - d2l\dl;
  end

  for i=0:1   %用來檢驗的樣本 如果出錯則計數+1 每組5個1類5個2類
      for j=1:5
          tmp = 1/(1+exp(-b.'*x(i*50+5*tn+j,:)'));
          tmp = (tmp>=0.5);
          err0 = err0 + (tmp ~= y(i*50+5*tn+j));
      end
  end
err0
end    

三:結果
這裏寫圖片描述
出錯的共有三次

四:留1法

%對率迴歸 iris數據集
%數據集3類數據 A-AX AY-CV CW-ET   各50組
%爲了程序讀取方便對數據集做了處理1-6  1,2類數據 7-12 1,3類數據 13-18 2,3類數據   A-CV  

x = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'A52:E151'); %訓練數據每次取兩類100個
y = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'F52:F151');
%數據集分類用了1,2,3來表示  使用不同的類別對y的處理也不同(總之保證y的取值爲{0,1})
y = y-1;
k=100;

%留1法
err1=0;%記錄錯誤分類的次數
for tn=1:k
    n=0;
   old_l=0;    %記錄上次計算的l
   b=[0;0;0;0;1];  %初始參數 (自定義)
while(1)
   cur_l=0;
   bx=zeros(k,1);
   %計算當前參數下的l
   for i=1:k
       if i == tn     %跳過用來檢驗的樣本
           continue;
       end
        bx(i) = b.'*(x(i,:))'; %防止exp函數的參數過大導致無窮大 手動計算
        if bx(i)>30
            tlog=bx(i);
        else
            tlog=log(1+exp(bx(i)));
        end
        cur_l = cur_l - y(i)*bx(i) +tlog;
   end

   %迭代終止條件
   if abs(cur_l-old_l)<0.001  
       break;
   end
   n=n+1;
   %更新參數(牛頓迭代法)以及保存當前l
   old_l = cur_l;
   p1=zeros(k,1);
   dl=0;
   d2l=0;

   for i=1:k
        if i == tn     %跳過用來檢驗的樣本
           continue;
        end
        p1(i) = 1 - 1/(1+exp(bx(i)));
        dl = dl - x(i,:)'*(y(i)-p1(i));
        d2l = d2l + x(i,:)' * (x(i,:)').'*p1(i)*(1-p1(i));
   end
   b = b - d2l\dl;
end
    %用來檢驗的樣本 如果出錯則計數+1 每組1個
   tmp = 1/(1+exp(-b.'*(x(tn,:))'));
   tmp = (tmp>=0.5);
   err1 = err1 + (tmp ~= y(tn));
   err1
end

五:運行結果
這裏寫圖片描述
出錯的共有三次

來自

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章