朴素贝叶斯分类,是一基于统计概率的分类器。它是机器学习、模式识别等学科的基本方法。可用于文件、网页等文本类目标的分类。实现的思想非常简单,就是将n维的特征看成n个相互统计独立的随机变量。下面简单的讲解下:
朴素贝叶斯分类器
(1)前提假设:
·X为样本容量为N的特征矩阵,x是属于X的一个特征向量;
·x为L维的数据向量,每个维度上为bool值(取值为【0或1】);
·X中的所有样本可分为J类(W);
·x的每一维的值视作统计独立的随机变量;
(2)符号定义:
·表示第k个样本的第i维变量;
·表示第j类。
(3)原理推导:
·因为将视作统计独立的随机变量,所以属于类的概率为
,(1)
似然值为
, (2)
其中样本被分为第j类的概率。这样我们就能明确通过训练(学习)所要得到参数:和。
·训练过程:
, (3)
, (4)
其中,表示属于第j类,[X]表示bool型函数,当X为真是返回1,否则返回0。
对所有训练数据分别运用(1)、(2)式进行处理,应该等到一个J*L的矩阵和1*J的向量。
·预测过程:
对于目标数据,分别计算1,2,3,...,J类的
, (5)
求出最大的,则就是预测的类标。
小试牛刀
MATLAB代码如下
·朴素贝叶斯训练函数:
function [ pxj,pj ] = nbc_train( data,label )
[N,l]=size(data);
wn=length(unique(label));
wm(1:wn)=0;
pxj=zeros(wn,l);
for j=1:wn
idx=(label==(j-1));
wm(j)=sum(idx);
pxj(j,:)=(sum(data(idx,:)>0)+1)/(wm(j)+wn);
end
pj=wm/N;
end
·朴素贝叶斯预测函数:
function [test_label,predict_prob]=nbv_predict(data,pxj,pj)
N=size(data,1);
wn=length(pj);
predict_prob(1:N,1:wn)=0;
for k=1:N
for j=1:wn
idx=(data(k,:)>0);
predict_prob(k,j)=mul(pxj(j,idx))*pj(j);
end
end
[~,test_label]=max(predict_prob');
end
function value=mul(vector)
m=length(vector);
value=1;
for i=1:m
value=value*vector(i);
end
end
·测试函数,随机生成10000个100维的数据样本,同时随机创建他们的类标(分为2类),测试100次取平均准确率。因为数据和类标都是随机生成的,所以当样本容量足够大时,朴素贝叶斯预测结果的准确率应该趋向于0.5。
clear all;
clc;
N=10000;
L=100;
time=100;
map=0;
for i=1:time
data=rand(N,L);
data=data-0.5;
label=(rand(N,1)>0.5);
train_data=data(1:50,:);
train_label(1:50)=label(1:50);
[pxj,pj]=nbc_train(train_data,train_label);
test_data=data(51:100,:);
test_label=label(51:100);
[predict_label,p]=nbv_predict(test_data,pxj,pj);
predict_label=(predict_label-1)';
ap=sum((predict_label-test_label)==0)/length(test_label);
map=map+ap;
i
disp(' Classfication completed ');
end
map=map/time;
经测试 map=0.5024,证明程序有效。