版权声明:本文为博主原创文章,未经博主允许不得转载。可联系邮箱[email protected] https://blog.csdn.net/Justin_bibo/article/details/83929767
朴素贝叶斯原理
贝叶斯决策以概率决策为基础。在假设错分代价相同的情况下,最小化错误率可以等价的看作最大化后验概率,
即是 max P(c|x)=P(c )P(x|c)/P(x).
朴素贝叶斯假设属性之间都是互相独立的,则判别准则可以看作:
Hnb(x)=argmax P(c )*(P(x|c))
P(**x|**c)=P(x1|c)P(x2|c)*P(x1|c)…P(xi|c)
【周志华 .机器学习.清华大学出版社】
代码解释
matlab版本R2017a
对于每个数据集,自动记录类别的个数,十折交叉划分训练集和测试集,然后计算每个测试集、数据的精度acc。
对一些常见的数据集进行预测,数据来源)林智仁
结果展示
数据名称 | 精度 |
---|---|
australian | 0.8261 |
bupa | 0.7429 |
appendicitis | 0.9091 |
bands | 0.6389 |
haberman | 0.7097 |
heart | 0.8519 |
代码
function naivebayes() %可自动适应多分类问题
clear all;
clc;
M=load("D:\毕业设计\数据集1\australian.txt"); %装载数据集,这个数据集是个二分类问题
[m,n]=size(M);
indices=crossvalind('Kfold',M(1:m,n),10); %十折交叉,划分训练集和测试集
testindices=(indices==1); %测试集索引
trainindices=~testindices;%训练集索引
trainset=M(trainindices,:); %获取训练集
testset=M(testindices,:);%获取测试集
[testm,~]=size(testset);
[trainm,trainn]=size(trainset);
nbayeslabel=zeros(testm,1); %朴素贝叶斯的测试标签
c=[]; %用来存储类别标签
c=[c;trainset(1,end)]; %存储训练集第一个数据的类别标签
for i=1:trainm
if ismember(trainset(i,end),c)==0
c=[c;trainset(i,end)]; %将新的类别标签放入c
end
end
pc=c; %先验概率
for i=1:size(c,1)
pc(i)=size(trainset(trainset(:,end)==c(i),end),1)/trainm; %计算c先验概率
end
u=zeros(trainn-1,size(c,1));%每个属性的在训练集每个类别的均值和方差
dx=zeros(trainn-1,size(c,1));
for i=1:size(c,1)
u(:,i)=(mean(trainset(trainset(:,end)==c(i),1:trainn-1)))';%每个属性的在训练集每个类别的均值和方差
dx(:,i)=(var(trainset(trainset(:,end)==c(i),1:trainn-1)))';
end
for i=1:testm
px=zeros(trainn-1,size(c,1));%每个属性的类条件概率
pcx=zeros(size(c,1),1);%每个点x的后验概率
for j=1:trainn-1
for k=1:size(c,1)
px(j,k)=(1/(sqrt(2*pi)*sqrt(dx(j,k))))*exp(-(testset(i,j)-u(j,k))^2/(2*dx(j,k)));%每个属性的类条件概率
end
end
for k=1:size(c,1)
pcx(k)=pc(k)*prod(px(:,k));%每个点x的后验概率
end
[~,m]=max(pcx);
nbayeslabel(i)=c(m);%选择最大后验概率的作为预测标签
end
acc=0;%精度
for i=1:testm
if nbayeslabel(i)==testset(i,end)
acc=acc+1;
end
end
acc=acc/testm%最终精度
end