朴素贝叶斯原理(naive bayes)及其matlab代码

朴素贝叶斯原理

贝叶斯决策以概率决策为基础。在假设错分代价相同的情况下,最小化错误率可以等价的看作最大化后验概率,
即是 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



你可能感兴趣的:(机器学习)