說明:
1. 此處是臺大林軒田老師主頁上的hw7,對應coursera上“機器學習技法”作業三;
2. 本文給出大作業(19-20題)的代碼;
3. Matlab代碼;
4. 非職業碼農,代碼質量不高,變量命名也不規範,湊合着看吧,不好意思;
5. 對結果沒把握。如有問題,歡迎指教,QQ:50834。
相比於題目13-18,題目19-20需要修改主程序和一個函數。
主程序:
clear all;
close all;
data_trn = csvread('hw7_train.dat');
data_tst = csvread('hw7_test.dat');
xtrn = data_trn(:,1:end-1);
ytrn = data_trn(:,end);
[N,k] = size(xtrn);
xtst = data_tst(:,1:end-1);
ytst = data_tst(:,end);
[Ntst,k] = size(xtst);
clear data_trn
clear data_tst
T = 1000;
node0 = [1,0,0,0,0,0,0];
Ein = zeros(T,1);
Eout = zeros(T,1);
EinG = zeros(T,1);
EoutG = zeros(T,1);
ypred_sum_trn = zeros(N,1);
ypred_sum_tst = zeros(Ntst,1);
for t = 1:T,
global dtree_node;
dtree_node = [];
idx_RF = randi(N,N,1);
hw7_CART_train_1branch(xtrn(idx_RF),ytrn(idx_RF), node0);
ypred_trn = hw7_CART_pred(dtree_node, xtrn);
Ein(t) = sum(ypred_trn ~= ytrn)/N;
ypred_sum_trn = ypred_sum_trn+ypred_trn;
EinG(t) = sum(sign(ypred_sum_trn) ~= ytrn)/N;
ypred_tst = hw7_CART_pred(dtree_node, xtst);
Eout(t) = sum(ypred_tst ~= ytst)/Ntst;
ypred_sum_tst = ypred_sum_tst+ypred_tst;
EoutG(t) = sum(sign(ypred_sum_tst) ~= ytst)/Ntst;
clear dtree_node;
end;
figure;
hold on;
plot(EinG,'r');
plot(EoutG,'b');
title('Q19-20: t versus E(Gt)');
xlabel('t');
ylabel('E(Gt)');
legend('Ein(Gt)', 'Eout(Gt)');
函數
function hw7_CART_train_1branch(x,y,node0)
global dtree_node;
dtree_node = [dtree_node;node0];
fn_num = node0(1);
[s, dim, thresh] = hw7_deci_stump_impurity(x, y);
dtree_node(fn_num,3)=s;
dtree_node(fn_num,4)=dim;
dtree_node(fn_num,5)=thresh;
dtree_size = size(dtree_node);
nodep = [dtree_size(1)+1,fn_num,s,0,0,0,0];
dtree_node = [dtree_node;nodep];
dtree_node(fn_num,6)=dtree_size(1)+1;
dtree_size = size(dtree_node);
nodem = [dtree_size(1)+1,fn_num,-s,0,0,0,0];
dtree_node = [dtree_node;nodem];
dtree_node(fn_num,7)=dtree_size(1)+1;
end