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

一:导入数据

       解压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,'-');

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值