贝叶斯判别matlab,朴素贝叶斯算法实现分类问题(三类)matlab代码

数据简介

本训练数据共有625个训练样例,每个样例有4个属性x1,x2,x3,x4,每个属性值可以取值{1,2,3,4,5}。

数据集中的每个样例都有标签"L","B"或"R"。

我们在这里序号末尾为1的样本当作测试集,共有63个,其他的作为训练集,共有562个。

下面我们使用朴素贝叶斯算法来进行训练。

第一步,实现类的标签"L","B","R"转换成数字1,2,3

matlab代码如下:

clear;

clc;

ex=importdata('balance-scale.data.txt');  %读入文件

X=ex.data;

m=size(ex.textdata);  %数据大小

Y=zeros(m);

for i=1:m

if strcmp(ex.textdata(i),'L')==1

Y(i)=1;

elseif strcmp(ex.textdata(i),'B')==1

Y(i)=2;

else Y(i)=3;

end

end

第二步,参数估计,详情参见链接生成学习算法之朴素贝叶斯算法

matlab代码如下:(注意运行一下程序之前,先把上一步我们得到的X,Y数据load到内存里)

%朴素贝叶斯算法实现分类问题(三类y=1,y=2,y=3)

%我们把所有数字序号末尾为1的留作测试集,其他未训练集

m=625;   %样本总数

m1=562;  %训练集样本数量

m2=63;  %测试集样本数量

%三类样本数量分别记为count1,count2,count3

count1=0;

count2=0;

count3=0;

%count_1(i,j)表示在第一类(y=1)的情况下,第i个属性是j的样本个数

count_1=zeros(4,5);

%count_2(i,j)表示在第二类(y=2)的情况下,第i个属性是j的样本个数

count_2=zeros(4,5);

%count_3(i,j)表示在第三类(y=3)的情况下,第i个属性是j的样本个数

count_3=zeros(4,5);

ii=1;%用来标识测试集的序号

for i=1:m

if mod(i,10)==1

XX(ii,:)=X(i,:);

YY(ii)=Y(i);

ii=ii+1;

else

x=X(i,:);

if Y(i)==1

count1=count1+1;

for j=1:4    %指示第j个属性

for k=1:5    %第j个属性为哪个值

if x(j)==k

count_1(j,k)=count_1(j,k)+1;

break;

end

end

end

elseif Y(i)==2

count2=count2+1;

for j=1:4    %指示第j个属性

for k=1:5    %第j个属性为哪个值

if x(j)==k

count_2(j,k)=count_2(j,k)+1;

break;

end

end

end

else count3=count3+1;

for j=1:4    %指示第j个属性

for k=1:5    %第j个属性为哪个值

if x(j)==k

count_3(j,k)=count_3(j,k)+1;

break;

end

end

end

end

end

%分别计算三类概率y1=p(y=1)、y2=p(y=2)、y3=p(y=3)的估计值

y1=count1/m1;

y2=count2/m1;

y3=count3/m1;

%y_1(i,j)表示在第一类(y=1)的情况下,第i个属性取值为j的概率估计值

%y_2(i,j)表示在第二类(y=2)的情况下,第i个属性取值为j的概率估计值

%y_3(i,j)表示在第三类(y=3)的情况下,第i个属性取值为j的概率估计值

for i=1:4

for j=1:5

y_1(i,j)=count_1(i,j)/count1;

y_2(i,j)=count_2(i,j)/count2;

y_3(i,j)=count_3(i,j)/count3;

end

end

end

%做预测,p1,p2,p3分别表示输入值xx为第1,2,3类的概率

cc=0;   %用cc表示正确分类的样本

for i=1:m2

xx=XX(i,:);

yy=YY(i);

p1=y1*y_1(1,xx(1))*y_1(2,xx(2))*y_1(3,xx(3))*y_1(4,xx(4));

p2=y2*y_2(1,xx(1))*y_2(2,xx(2))*y_2(3,xx(3))*y_2(4,xx(4));

p3=y3*y_3(1,xx(1))*y_3(2,xx(2))*y_3(3,xx(3))*y_3(4,xx(4));

%下面分别输出三类的概率

%ans1=p1/(p1+p2+p3)

%ans2=p2/(p1+p2+p3)

%ans3=p3/(p1+p2+p3)

if p1>p2&&p1>p3

if yy==1 cc=cc+1;

end

end

if p2>p1&&p2>p3

if yy==2 cc=cc+1;

end

end

if p3>p1&&p3>p2

if yy==3 cc=cc+1;

end

end

end

%拿训练集做测试集,得到的正确率

cc/m2

转载自https://blog.csdn.net/zhulf0804/article/details/52424809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值