山東大学機械学習(実験四解読)——素朴ベイズ
26577 ワード
実験で与えられたconvData.mは12960の大きさのnurseryである.data.txtデータセットは10000サイズのトレーニングセットtraining_に分割されるdata.txtとサイズ2960のテストセットtest_data.txt.
label_preは最終的に私たちが予測したテストセットのカテゴリを記録しています.sucess_rateは,単純ベイズ法を用いて結果の正確率,sum,すなわち正確なカテゴリ総数を予測することを表す.
研究の便宜上convDataにいます.mの最後に以下のコードを加える、すべてのデータをdataにインポートする.txtでは,後でデータセットを分割する準備をし,問題の研究を行う.
最初のトレーニングセットの大きさここで私は1000に設定して、最大は12000で、つまり私は素朴なベイズモデルを12回繰り返し訓練して、この12回の結果の相対比を通じて
結果
トレーニングセットのサイズ
せいかくりつ
1000
0.891722
2000
0.881569
3000
0.902410
4000
0.896987
5000
0.900126
6000
0.903161
7000
0.902013
8000
0.900202
9000
0.905556
10000
0.905405
11000
0.908673
12000
0.902083
以上の結果から,訓練セットの大きさにかかわらず,モデルの出力結果の正解率は0.9に近いことが分かった.
問題1
%--------------------------------LogMLE.m--------------------------------
function [label_pre,sum,sucess_rate] = LogMLE(test,train)
[train_row,train_col] = size(train);
test_num = size(test,1);
% , 1
label_for_MLE = zeros(test_num,5);
label_pre = zeros(test_num,1); %
label_num = max(train(:,end)); %
for i = 1:test_num
for y = 0:label_num
count_y = length(find(train(:,train_col)==y));
p_y = count_y/(train_row+label_num);
log_count_xy = 0;
for j = 1:train_col-1
count_xy = length(find(train(:,train_col)==y & train(:,j)==test(i,j)));
%
if j==1
p_xy = (count_xy+1)/(count_y+3);
elseif j==2
p_xy = (count_xy+1)/(count_y+5);
elseif j==3
p_xy = (count_xy+1)/(count_y+4);
elseif j==4
p_xy = (count_xy+1)/(count_y+4);
elseif j==5
p_xy = (count_xy+1)/(count_y+3);
elseif j==6
p_xy = (count_xy+1)/(count_y+2);
elseif j==7
p_xy = (count_xy+1)/(count_y+3);
elseif j==8
p_xy = (count_xy+1)/(count_y+3);
end
log_count_xy = log_count_xy + log(p_xy);
end
label_for_MLE(i,y+1) = log(p_y) + log_count_xy;
end
[~,b2] = find(label_for_MLE(i,:)==max(max(label_for_MLE(i,:))));
label_pre(i,1) = b2-1;
sum = length(find(label_pre(:,1)==test(:,end)));
sucess_rate = sum/test_num;
end
end
%--------------------------------problem.m--------------------------------
train_data = load('training_data.txt');
test_data = load('test_data.txt');
[label_pre,sum,sucess_rate] = LogMLE(test_data,train_data);
label_preは最終的に私たちが予測したテストセットのカテゴリを記録しています.sucess_rateは,単純ベイズ法を用いて結果の正確率,sum,すなわち正確なカテゴリ総数を予測することを表す.
問題2
研究の便宜上convDataにいます.mの最後に以下のコードを加える、すべてのデータをdataにインポートする.txtでは,後でデータセットを分割する準備をし,問題の研究を行う.
fid = fopen('data.txt','wt');
for i=1:1:data_num
fprintf(fid,'%d %d %d %d %d %d %d %d %d
',data(i,1), data(i,2), data(i,3), data(i,4), data(i,5), data(i,6), data(i,7), data(i,8), data(i,9));
end
fclose(fid);
最初のトレーニングセットの大きさここで私は1000に設定して、最大は12000で、つまり私は素朴なベイズモデルを12回繰り返し訓練して、この12回の結果の相対比を通じて
data = load('data.txt');
data_num = size(data,1);
% 1000,
for num = 1000:1000:12000
% The number of training data
training_num = num;
% The number of test data
test_num = data_num - training_num;
%randperm datanum , test_num
test_data_index = randperm(data_num, test_num);
test_data = zeros(test_num, 9);
training_data = zeros(training_num, 9);
test_it = 0;
training_it = 0;
for i=1:1:data_num
flag = 0;
% data_num i test_data_index
for j=1:1:test_num
if(test_data_index(j)==i)
flag = 1;
end
end
% test_data ,
if(flag==1)
test_it = test_it+1;
test_data(test_it,:) = data(i,:);
% traning_data ,
else
training_it = training_it+1;
training_data(training_it,:) = data(i,:);
end
end
[label_pre,sum,sucess_rate] = LogMLE(test_data,training_data);
fprintf('training_num = %d, success_rate = %f, success_num%d
',num,sucess_rate,sum);
end
結果
トレーニングセットのサイズ
せいかくりつ
1000
0.891722
2000
0.881569
3000
0.902410
4000
0.896987
5000
0.900126
6000
0.903161
7000
0.902013
8000
0.900202
9000
0.905556
10000
0.905405
11000
0.908673
12000
0.902083
以上の結果から,訓練セットの大きさにかかわらず,モデルの出力結果の正解率は0.9に近いことが分かった.