实验2 朴素贝叶斯分类器
一、实验目的
(1)理解朴素贝叶斯分类器的工作原理。
(2)编程实现朴素贝叶斯分类器。
二、实验内容
1、(难度1)编程实现朴素贝叶斯分类器的训练。假设数据只涉及连续属性。
测试代码如下:
load('trainingData.mat');
load('testingData.mat');
[Params,prior,AllLabels] = NaiveBayesTrain(trAttr, trLabels);
(将执行正确的代码粘贴在此处,核心代码要求有注释)
function [params,prior,allLabels] = NaiveBayesTrain(trAttr,trLabels)
allLabels = unique(trLabels);
numClass = length(allLabels);
trAttr = trAttr(1:10,1:3);
trLabels = trLabels(1:10);
for i=1:numClass
ind= find(trLabels==allLabels(i));
indexClass{i,1} = ind;
prior(i) = length(ind)/length(trLabels);
end
numAttr = size(trAttr,2);
params{numClass,numAttr}=[];
for attrIndex = 1:numAttr
attrVals = trAttr(:,attrIndex);
for i=1:numClass
params{i,attrIndex}=getParamsContiAttr(attrVals,indexClass{i,1});
end
end
end
function params1 = getParamsContiAttr(attrVals,index)
attrValsThisClass = attrVals(index);
params1(1)=mean(attrValsThisClass); %Çó¾ùÖµ
params1(1)=var(attrValsThisClass); %Çó•½²î
end
2、(难度2)编程实现朴素贝叶斯分类器的训练。假设数据既涉及连续属性,也涉及分类属性。
测试代码如下:
refund=[1 2 2 1 2 2 1 2 2 2]';
mar=[1 2 1 2 3 2 3 1 2 1]';
inc=[125,100,70,120,95,60,220,85,75,90]';
trAttr =[refund,mar,inc];
trLabels=[1 1 1 1 2 1 1 2 1 2]';
tstAttr=[2,2,120];
[type,Params,prior,AllLabels] = NaiveBayesTrain2(trAttr, trLabels);
(将执行正确的代码粘贴在此处,核心代码要求有注释)
function [type,Params,prior,AllLabels] = NaiveBayesTrain2(trAttr, trLabels)
allLabels = unique(trLabels);
numClass = length(allLabels);
trAttr = trAttr(1:10,1:3);
trLabels = trLabels(1:10);
for i=1:numClass
ind= find(trLabels==allLabels(i));
indexClass{i,1} = ind;
prior(i) = length(ind)/length(trLabels);
end
numAttr = size(trAttr,2);
Params{numClass,numAttr}=[];
for attrIndex = 1:numAttr
attrVals = trAttr(:,attrIndex);
numAttrValsClass=length(unique(attrVals));
maxAttrvals=max(unique(attrVals));
if(isempty(find(rem(attrVals,1)~=0)))&&numAttrValsClass<10&&maxAttrvals==numAttr
type(attrIndex)=0;
for i=1:numClass
Params{i,attrIndex}=getParamsCategoricalAttr(attrVals,indexClass{i,1});
end
else
type(attrIndex)=1;
for i=1:numClass
Params{i,attrIndex}=getParamsContiAttr(attrVals,indexClass{i,1});
end
end
end
end
function Params1 = getParamsContiAttr(attrVals,index)
attrValsThisClass = attrVals(index);
Params1(1)=mean(attrValsThisClass); %?¨®?¨´??
Params1(1)=var(attrValsThisClass); %?¨®????
end
function Params1 = getParamsCategoricalAttr(attrVals,index)
Params1=[];
AllattrVals=unique(attrVals);
numAttrValsClass=length(AllattrVals);
AllattrVals4ThisClass=attrVals(index);
nj=length(index);
for i=1:numAttrValsClass
nij=length(find(AllattrVals4ThisClass==AllattrVals(i)));
Params1(i)=nij/nj;
end
end
3、(难度3)编程实现朴素贝叶斯分类器的训练和分类。
(将执行正确的代码粘贴在此处,核心代码要求有注释)