山東大学機械学習(実験四解読)——素朴ベイズ

26577 ワード

実験で与えられたconvData.mは12960の大きさのnurseryである.data.txtデータセットは10000サイズのトレーニングセットtraining_に分割されるdata.txtとサイズ2960のテストセットtest_data.txt.

問題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);
% 1000for 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に近いことが分かった.