您的位置:首页 > 编程语言 > MATLAB

贝叶斯分类——matlab

2018-03-28 16:41 148 查看
数据集:https://download.csdn.net/download/qq_38784454/10313864clear;
clc;
ex=importdata('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
data = [Y,X]; %将类的标签转换成数字1,2,3并保存到data里面

%朴素贝叶斯算法实现分类问题(三类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); %取出序号末尾是1的样本
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=p
4000
2/(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: