机器学习实验四之贝叶斯公式

一:导入数据

       解压data4.zip文件,将其中的train_data.txt和test_data.txt放入对应的文件夹。

  二:根据给的train_data来训练自己的模型,建立贝叶斯分类器。

 

1.根据朴素贝叶斯公式,pY=yX=x=p(X=x|Y=y)p(Y=y)p(X=x)机器学习实验四之贝叶斯公式     ,而我们的目标即是求给定X的条件下的y的概率,选出概率最大的y即是我们对此数据的预测值。

      2. 因为在比较时对于模型中p(X=x)机器学习实验四之贝叶斯公式 的值都是相同的,所以可以不计算,只需计算p(X=x|Y=y)p(Y=y)机器学习实验四之贝叶斯公式

      3.所以我们只需分别求解p(X=x|Y=y)机器学习实验四之贝叶斯公式p(Y=y)机器学习实验四之贝叶斯公式 就好了,而对于X向量的每一个分量,我们认为他们之间是相对独立的,所以可将之公式变为:

           pX=x|Y=y=pX1=x1|Y=ypX2=x2|Y=y⋯p(Xi=xi|Y=y)机器学习实验四之贝叶斯公式

                         =i=1np(X=xi|Y=y)机器学习实验四之贝叶斯公式

      4.上面的公式及最大似然函数,当然我们可以转换为log的表示,在用MATLAB时,可以直接连乘,而不用转换为加。

      5.例如px1=0y=0=count(x1=0,y=0)count(y=0)机器学习实验四之贝叶斯公式 ,因此pxi=jy=k=count(xi=j,y=k)count(y=k)机器学习实验四之贝叶斯公式 ,这个可以在train_data里求出来。下面是分别在y=i的时候对应的xi=j的概率。(在MATLAB里的使用时为p(k,i,j),跟这里的显示有些不一样)。

val(:,:,1) =

  0.3315    0.2028    0.2537    0.2519    0.3345    0.5013    0.3300         0

  1.0000    1.0000    1.0000    1.0000    1.0000    1.0000    1.0000    1.0000

  0.6000    0.3882    0.3608    0.4471    0.6314    0.6667    0.4941    1.0000

  0.4474    0.3233    0.2699    0.2833    0.3773    0.5211    0.3585    0.5611

  0.1850    0.0631    0.2281    0.1943    0.2529    0.4579    0.2960    0.3916

val(:,:,2) =

  0.3369    0.2004    0.2567    0.2453    0.3357    0.4987    0.3402         0

       0         0         0         0         0         0         0         0

  0.4000    0.3961    0.2980    0.3098    0.3059    0.3333    0.5059         0

  0.3546    0.3130    0.2624    0.2569    0.3261    0.4789    0.3537    0.4389

  0.3069    0.0656    0.2391    0.2429    0.3414    0.5421    0.3021    0.6084

val(:,:,3) =

  0.3315    0.1989    0.2435    0.2492    0.3297         0    0.3297    1.0000

       0         0         0         0         0         0         0         0

       0    0.2157    0.2353    0.1255    0.0627         0         0         0

  0.1981    0.2117    0.2433    0.2287    0.2966         0    0.2878         0

  0.5080    0.1921    0.2593    0.2886    0.4057         0    0.4019         0

val(:,:,4) =

       0    0.1980    0.2462    0.2537         0         0         0         0

       0         0         0         0         0         0         0         0

       0         0    0.1059    0.1176         0         0         0         0

       0    0.1049    0.2244    0.2311         0         0         0         0

       0    0.3073    0.2735    0.2741         0         0         0         0

val(:,:,5) =

       0    0.2001         0         0         0         0         0         0

       0         0         0         0         0         0         0         0

       0         0         0         0         0         0         0         0

       0    0.0470         0         0         0         0         0         0

       0    0.3719         0         0         0         0         0         0

      6.而p(Y=y)机器学习实验四之贝叶斯公式 也比较好求,py=i=count(y=i)count(train_data)机器学习实验四之贝叶斯公式  ,根据train_data的数据就可以求出来了。

P(y=0)=0.333900000000000

  P(y=1)=0.000100000000000000

P(y=2)=0.0255000000000000

P(y=3)=0.329700000000000

P(y=4)=0.310800000000000

      6.再根据给定的train_data求出每一个label下的Xi的概率就能算出找出最大的概率了。

 

      7.因为一个y=1的概率很小,所以用拉普拉斯平滑吃力一下,减少误差,公式如下:

                         Py=i=1m1yi=y+1m+k机器学习实验四之贝叶斯公式

                         pjxy=i=1m1yi=y∧xji=x+1i=1m1yi=y+vj机器学习实验四之贝叶斯公式

 

      8.根据求出的test的预测值与给定的结果进行对比,就能求出准确率了。

      9.后面用随机函数选出指定的个数的点,再用上面的步骤求能求出制定训练集下的对test的准确率了。

结论:

一:用了完整的train_data的结果为:90.34%.

  二:从100开始取,步长为20,一直取到10000的随机训练样本的准确率如下:

机器学习实验四之贝叶斯公式

代码:

clear,clc;
train=load('training_data.txt');
test=load('test_data.txt');
x=train(:,1:8);
y=train(:,9);
m1=length(y);
%求y的概率:
for i=1:5
    py(i)=length(find(y==i-1))/m1;
end
xlength=[3,5,4,4,3,2,3,3];
%y=i下xj=k的概率
for i=1:5
     for j=1:8
        for k=1:xlength(j)
            p(i,j,k)=length(find(train(:,j)==k-1&train(:,9)==i-1))/length(find(y==i-1));
        end
     end
end
%初始化pp矩阵为全1矩阵
pp=ones(2960,5);
%计算每个x向量下的p(x,y)
for k=1:2960
 for i=1:5
     for j=1:8
        pp(k,i)=pp(k,i)*p(i,j,test(k,j)+1);
     end
     pp(k,i)=pp(k,i)*py(i);
 end
end
count=0;
%找出每个x下的最可能的y值,并对预测值和真实值相等的计数
for i=1:2960
    for j=1:5
        if(pp(i,j)==max(pp(i,:)))
       result(i)=j-1;
        end
    end
    if(result(i)==test(i,9))
        count=count+1;
    end
end
%求解准确率
res=count/2960;

 

二:
clear,clc;
trains=load('training_data.txt');
test=load('test_data.txt');
x=trains(:,1:8);
y=trains(:,9);
m1=length(y);
%求y的概率:
number=0;
for h=100:20:m1
    terms=randperm(10000,h);
    temp=ones(h,9);
    for hh=1:h
        temp(hh,:)=trains(terms(hh),:);
    end
       train=temp;
for i=1:5
    l(i)=length(find(y==i-1));
    py(i)=l(i)/m1;
end
xlength=[3,5,4,4,3,2,3,3];
%y=i下xj=k的概率
for i=1:5
     for j=1:8
        for k=1:xlength(j)
            p(i,j,k)=length(find(train(:,j)==k-1&train(:,9)==i-1))/l(i);
        end
     end
end
%初始化pp矩阵为全1矩阵
pp=ones(2960,5);
%计算每个x向量下的p(x,y)
for k=1:2960
 for i=1:5
     for j=1:8
        pp(k,i)=pp(k,i)*p(i,j,test(k,j)+1);
     end
     pp(k,i)=pp(k,i)*py(i);
 end
end
count=0;
%找出每个x下的最可能的y值,并对预测值和真实值相等的计数
for i=1:2960
    for j=1:5
        if(pp(i,j)==max(pp(i,:)))
       result(i)=j-1;
        end
    end
    if(result(i)==test(i,9))
        count=count+1;
    end
end
number=number+1;
%求解准确率
res(number)=count/2960;
end
plot(100:20:m1,res,'-');