您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 朴素贝叶斯matlab实现
clcclearclosealldata=importdata('data.txt');wholeData=data.data;%交叉验证选取训练集和测试集cv=cvpartition(size(wholeData,1),'holdout',0.04);%0.04表明测试数据集占总数据集的比例cvpartition(n,'holdout',p)创建一个随机分区,用于在n个观测值上进行保持验证。该分区将观察分为训练集和测试(或保持)集。参数p必须是标量,当0p1时,cvpartition为测试集随机选择大约p*n个观测值。当p是整数时,cvpartition为测试集随机选择p个观测值。p的默认值是0.1trainData=wholeData(training(cv),:);testData=wholeData(test(cv),:);label=data.textdata;attributeNumber=size(trainData,2);size(A,2):获取矩阵A的列数。attributeValueNumber=5;%将分类标签转化为数据(因为在分类数据集中有3个类别,分别是R、B、L所以将类别转换为数字)sampleNumber=size(label,1);labelData=zeros(sampleNumber,1);fori=1:sampleNumber(测试集的行数)iflabel{i,1}=='R'labelData(i,1)=1;elseiflabel{i,1}=='B'labelData(i,1)=2;elselabelData(i,1)=3;endendtrainLabel=labelData(training(cv),:);trainSampleNumber=size(trainLabel,1);testLabel=labelData(test(cv),:);%计算每个分类的样本的概率labelProbability=tabulate(trainLabel);tabulate函数的功能是创建向量X信息数据频率表。其函数使用格式:tbl=tabulate(x)创建的TBL(数据频率表)的结构:第一列:x的唯一值第二列:每个值的实例数量第三列:每个值的百分比%P_yi,计算P(yi)P_y1=labelProbability(1,3)/100;(第一行,第三个元素)P_y2=labelProbability(2,3)/100;P_y3=labelProbability(3,3)/100;count_1=zeros(attributeNumber,attributeValueNumber);%count_1(i,j):y=1情况下,第i个属性取j值的数量统计count_2=zeros(attributeNumber,attributeValueNumber);%count_1(i,j):y=2情况下,第i个属性取j值的数量统计count_3=zeros(attributeNumber,attributeValueNumber);%count_1(i,j):y=3情况下,第i个属性取j值的数量统计%统计每一个特征的每个取值的数量forjj=1:3forj=1:trainSampleNumberforii=1:attributeNumberfork=1:attributeValueNumberifjj==1iftrainLabel(j,1)==1&&trainData(j,ii)==kcount_1(ii,k)=count_1(ii,k)+1;endelseifjj==2iftrainLabel(j,1)==2&&trainData(j,ii)==kcount_2(ii,k)=count_2(ii,k)+1;endelseiftrainLabel(j,1)==3&&trainData(j,ii)==kcount_3(ii,k)=count_3(ii,k)+1;endendendendendend%计算第i个属性取j值的概率,P_a_y1是分类为y=1前提下取值,其他依次类推。P_a_y1=count_1./labelProbability(1,2);P_a_y2=count_2./labelProbability(2,2);P_a_y3=count_3./labelProbability(3,2);%使用测试集进行数据测试labelPredictNumber=zeros(3,1);predictLabel=zeros(size(testData,1),1);forkk=1:size(testData,1)testDataTemp=testData(kk,:);Pxy1=1;Pxy2=1;Pxy3=1;%计算P(x|yi)foriii=1:attributeNumberPxy1=Pxy1*P_a_y1(iii,testDataTemp(iii));Pxy2=Pxy2*P_a_y2(iii,testDataTemp(iii));Pxy3=Pxy3*P_a_y3(iii,testDataTemp(iii));end%计算P(x|yi)*P(yi)PxyPy1=P_y1*Pxy1;PxyPy2=P_y2*Pxy2;PxyPy3=P_y3*Pxy3;ifPxyPy1PxyPy2&&PxyPy1PxyPy3predictLabel(kk,1)=1;disp(['thisitembelongstoNo.',num2str(1),'labelortheRlabel'])labelPredictNumber(1,1)=labelPredictNumber(1,1)+1;elseifPxyPy2PxyPy1&&PxyPy2PxyPy3predictLabel(kk,1)=2;labelPredictNumber(2,1)=labelPredictNumber(2,1)+1;disp(['thisitembelongstoNo.',num2str(2),'labelortheBlabel'])elseifPxyPy3PxyPy2&&PxyPy3PxyPy1predictLabel(kk,1)=3;labelPredictNumber(3,1)=labelPredictNumber(3,1)+1;disp(['thisitembelongstoNo.',num2str(3),'labelortheLlabel'])endendtestLabelCount=tabulate(testLabel);%计算混淆矩阵disp('theconfusionmatrixis:')C_Bayes=confusionmat(testLabel,predictLabel)89103以上部分就是针对于这个已有的数据集进行的算法的实现。结果与分析C_Bayes是计算出来的混淆矩阵。其结果为:C_Bayes=83000000148003000014为了验证该自编程序是否可靠,我再使用了Matlab自带的贝叶斯算法的函数fitcnb进行该数据的分类测试Nb=fitcnb(trainData,trainLabel);y_nb=Nb.predict(testData);C_nb=confusionmat(testLabel,y_nb)1234其中C_nb是采用自带函数得到的结果的混淆矩阵其结果为:C_nb=83000000148003000014可以发现其结果是完全一样的。为了进一步验证程序的可靠性,我改变了交叉验证中训练集和测试集的比例,设置为0.2,此时采用自编程序得到的混淆矩阵为:C_Bayes=6340000055263004050052而使用自带函数fitcnb得到的结果为:C_nb=6340000055263004050052可以发现再次得到了一致的结果。总结
本文标题:朴素贝叶斯matlab实现
链接地址:https://www.777doc.com/doc-5870562 .html