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
五:運行結果
出錯的共有三次