目錄
實(shí)驗(yàn)一? 離散型數(shù)據(jù)的樸素貝葉斯分類
?實(shí)驗(yàn)步驟:
?NBtrain.m
?NBtest.m
?main.m
實(shí)驗(yàn)二? 連續(xù)型數(shù)據(jù)的樸素貝葉斯分類
實(shí)驗(yàn)步驟:
?naiveBayestrain.m
navieBayestest.m
main.m
實(shí)驗(yàn)一? 離散型數(shù)據(jù)的樸素貝葉斯分類
???????data數(shù)據(jù)集中含有625個(gè)樣本,每個(gè)樣本第1列為類別;2~5列為各樣本的屬性。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?實(shí)驗(yàn)步驟:
① 準(zhǔn)備階段。
? ????????將數(shù)據(jù)集進(jìn)行劃分:訓(xùn)練集和測(cè)試集。
② 構(gòu)建分類器,進(jìn)行數(shù)據(jù)訓(xùn)練。
????????? 將數(shù)據(jù)集進(jìn)行劃分:訓(xùn)練集和測(cè)試集。
????????? 計(jì)算條件概率:根據(jù)每類中各屬性取值的概率
③ 數(shù)據(jù)測(cè)試。
????????計(jì)算每個(gè)測(cè)試樣本在其各屬性下的條件概率;
????????計(jì)算測(cè)試樣本對(duì)于各類別的判別概率;
?NBtrain.m
function [y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1)
% returen:
% y1 y2 y3 先驗(yàn)概率
% y_1,y_2,y_3 在第 ? 類的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
%三類樣本數(shù)量分別記為count1,count2,count3
count1=0;
count2=0;
count3=0;
% 數(shù)據(jù)總共 3 個(gè)類別,4 個(gè)屬性, 5 個(gè)取值。
%count_1(i,j)表示在第一類(y=1)的情況下,第i個(gè)屬性是j的樣本個(gè)數(shù)
count_1=zeros(4,5);
%count_2(i,j)表示在第二類(y=2)的情況下,第i個(gè)屬性是j的樣本個(gè)數(shù)
count_2=zeros(4,5);
%count_3(i,j)表示在第三類(y=3)的情況下,第i個(gè)屬性是j的樣本個(gè)數(shù)
count_3=zeros(4,5);
%訓(xùn)練集樣本數(shù)量 m1 = 562
for i=1:m1
x=train_data(i,:);
if train_label(i)==1
count1=count1+1;
for j=1:4 %指示第j個(gè)屬性
for k=1:5 %第j個(gè)屬性為哪個(gè)值
if x(j)==k
%===========填空:對(duì)當(dāng)前類別中第j個(gè)屬性第k個(gè)值得個(gè)數(shù)進(jìn)行統(tǒng)計(jì)=============
count_1(j,k)=count_1(j,k)+1 ;
%====================================================================
break;
end
end
end
elseif train_label(i)==2
count2=count2+1;
for j=1:4 %指示第j個(gè)屬性
for k=1:5 %第j個(gè)屬性為哪個(gè)值
if x(j)==k
%===========填空:對(duì)當(dāng)前類別中第j個(gè)屬性第k個(gè)值得個(gè)數(shù)進(jìn)行統(tǒng)計(jì)=============
count_2(j,k)=count_2(j,k)+1 ;
%====================================================================
break;
end
end
end
else count3=count3+1;
for j=1:4 %指示第j個(gè)屬性
for k=1:5 %第j個(gè)屬性為哪個(gè)值
if x(j)==k
%===========填空:對(duì)當(dāng)前類別中第j個(gè)屬性第k個(gè)值得個(gè)數(shù)進(jìn)行統(tǒng)計(jì)=============
count_3(j,k)=count_3(j,k)+1 ;
%====================================================================
break;
end
end
end
end
end
%分別計(jì)算三類概率y1=p(y=1)、y2=p(y=2)、y3=p(y=3)的估計(jì)值
%=========填空:計(jì)算每類的先驗(yàn)概率================
y1=count1/m1 ;
y2=count2/m1 ;
y3=count3/m1 ;
%===============================================
%y_1(i,j)表示在第一類(y=1)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
%y_2(i,j)表示在第二類(y=2)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
%y_3(i,j)表示在第三類(y=3)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
for i=1:4
for j=1:5
%=========填空:計(jì)算每類中每個(gè)屬性的取值概率,即在第C類中第i個(gè)屬性為k的條件概率=============
y_1(i,j)= count_1(i,j)/count1 ;
y_2(i,j)= count_2(i,j)/count2 ;
y_3(i,j)= count_3(i,j)/count3;
%====================================================================================
end
end
NBtest.m
function class_label = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2)
% y1 y2 y3 [1 1] 先驗(yàn)概率
% y_1,y_2,y_3 [4 5] 在第 ? 類的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
class_label = [];
for i=1:m2
xx=test_data(i,:);
%==========填空:計(jì)算樣本對(duì)于每類而言的后驗(yàn)概率=====================
p1= y1 * y_1(1,xx(1)) * y_1(2,xx(2))*y_1(3,xx(3)) * y_1(4,xx(4));
p2= y2 * y_2(1,xx(1)) * y_2(2,xx(2))*y_2(3,xx(3)) * y_2(4,xx(4));
p3= y3 * y_3(1,xx(1)) * y_3(2,xx(2))*y_3(3,xx(3)) * y_3(4,xx(4));
%============================================================
if p1>p2&&p1>p3
class_label(i) = 1;
end
if p2>p1&&p2>p3
class_label(i) = 2;
end
if p3>p1&&p3>p2
class_label(i) = 3;
end
end
main.m
clear;
clc;
ex=importdata('data.txt'); %讀入文件
X=ex.data;
Y = ex.rowheaders;
Y = grp2idx(Y); %將類別B,R,L化為1,2,3
m=size(X); %數(shù)據(jù)大小
%訓(xùn)練集,測(cè)試集劃分
ii=1;%用來標(biāo)識(shí)測(cè)試集的序號(hào)
jj=1;%用來標(biāo)識(shí)訓(xùn)練集的序號(hào)
%我們把所有數(shù)字序號(hào)末尾為1的留作測(cè)試集,其他未訓(xùn)練集
for i = 1:m
if mod(i,10)==1
%%將數(shù)字序號(hào)末尾為1的留作測(cè)試集,其他未訓(xùn)練集
test_data(ii,:)=X(i,:);
test_label(ii)=Y(i);
ii=ii+1;
else
train_data(jj,:)=X(i,:);
train_label(jj)=Y(i);
jj=jj+1;
end
end
m1=jj-1; %訓(xùn)練集樣本數(shù)量562
m2=ii-1; %測(cè)試集樣本數(shù)量63
%y1、y2、y3表示每類的先驗(yàn)概率
%y_1(i,j)表示在第一類(y=1)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
%y_2(i,j)表示在第二類(y=2)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
%y_3(i,j)表示在第三類(y=3)的情況下,第i個(gè)屬性取值為j的概率估計(jì)值
[y1,y_1,y2,y_2,y3,y_3] = NBtrain(train_data,train_label,m1); %完善訓(xùn)練函數(shù)
test_class = NBtest(test_data,y1,y_1,y2,y_2,y3,y_3,m2); %完善測(cè)試函數(shù)
accuracy =length(find(test_label==test_class))/length(test_label)
cMat2 = confusionmat(test_label,test_class )
實(shí)驗(yàn)二? 連續(xù)型數(shù)據(jù)的樸素貝葉斯分類
fisheriris數(shù)據(jù)集中有150朵花的數(shù)據(jù):
?meas給出了每朵花的4個(gè)屬性:花萼長(zhǎng)度,花萼寬度,花瓣長(zhǎng)度,花瓣寬度。
?species說明了每朵花的種類:山鳶尾Setosa,雜色鳶尾Versicolour、弗吉尼亞鳶尾Virginica。
實(shí)驗(yàn)步驟:
??數(shù)據(jù)訓(xùn)練
????????1. 計(jì)算先驗(yàn)概率:每類樣本占總樣本數(shù)的比例;
????????2. 根據(jù)概率密度函數(shù),計(jì)算各類樣本中各屬性取值的均值和方差。
?數(shù)據(jù)測(cè)試
????????1. 計(jì)算條件概率:根據(jù)訓(xùn)練集的均值與方差,計(jì)算訓(xùn)練樣本的條件概率;文章來源:http://www.zghlxwxcb.cn/news/detail-494503.html
????????2. 計(jì)算測(cè)試樣本對(duì)于類別的判別概率。文章來源地址http://www.zghlxwxcb.cn/news/detail-494503.html
?naiveBayestrain.m
function [label_priorP,mu,sigma] = navieBayestrain(meas,specise)
% means = 150 * 4
% specise = 150 * 1
trainData = meas'; %訓(xùn)練數(shù)據(jù)集 4 *150
trainLabel = specise'; %訓(xùn)練類別集 1 * 150
classNum = length(unique(trainLabel)); %類別數(shù) 3
label_priorP = zeros(1,classNum); %類別的先驗(yàn)概率 1*3
%將trainSet按類別分組,然后分別對(duì)每類的數(shù)據(jù)求出每個(gè)屬性的均值mu(Ak,Ci)和樣本標(biāo)準(zhǔn)差sigma(Ak,Ci)
%mu(Ak,Ci),sigma(Ak,Ci)表示第Ci類數(shù)據(jù)集的屬性Ak對(duì)應(yīng)的均值和樣本標(biāo)準(zhǔn)差
groupedSet = cell(1,classNum); %空的分組數(shù)據(jù)集矩陣 1*3 3個(gè)塊
% eg
% C = {1,2,3;
% 'text',rand(5,10,2),{11; 22; 33}}
% C=2×3 cell array
% {[ 1]} {[ 2]} {[ 3]}
% {'text'} {5x10x2 double} {3x1 cell}
%mu、sigma中每列為對(duì)應(yīng)類的均值列向量和標(biāo)準(zhǔn)差向量,size(trainSet,1)-1表示樣本的屬性數(shù)att_number
%mu(attNum,classNum),sigma(attnum,classNum)分別是第classNum類的第attNum個(gè)屬性的均值和標(biāo)準(zhǔn)差
mu = zeros(size(trainData,1),classNum); % 4*3
sigma = zeros(size(trainData,1),classNum); % 4*3
trainLabel = grp2idx(trainLabel);
% 分類過程,返回所有的分類索引
trainLabel =trainLabel';
for sampleNum = 1:size(trainLabel,2) %size(trainLabel,2)為訓(xùn)練樣本數(shù)
label = trainLabel(1,sampleNum);
%=====================================================================%
%填空,計(jì)算每類樣本的個(gè)數(shù)
label_priorP(1,label) = label_priorP(1,label)+1;
%=====================================================================%
groupedSet{1,label} = [groupedSet{1,label} trainData(:,sampleNum)];
end
%=====================================================================%
%填空,計(jì)算每類的先驗(yàn)概率
label_priorP =label_priorP ./sampleNum;
%=====================================================================%
%對(duì)于每一類 計(jì)算某類每個(gè)屬性的均值和樣本標(biāo)準(zhǔn)差
for label = 1:classNum % 迭代每一類
b = groupedSet{label}; % 4*50
%=====================================================================%
%填空,計(jì)算每類中每個(gè)屬性的均值和標(biāo)準(zhǔn)差
%第label個(gè)均值列向量;計(jì)算每類中每個(gè)屬性的均值
mu(:,label) = mean(b,2);
%第label個(gè)標(biāo)準(zhǔn)差列向量;計(jì)算每類中每個(gè)屬性的標(biāo)準(zhǔn)差;按行求標(biāo)準(zhǔn)差
sigma(:,label) = std(b,0,2);
%=====================================================================%
end
navieBayestest.m
function testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum)
% mu sigma 4*3 行屬性 * 列類別
testClass = [];
testData = meas' ; %測(cè)試數(shù)據(jù)集;testData每列代表一個(gè)樣本 4 * 150
test_number = size(testData,2);%測(cè)試集樣本數(shù)
attr_number = size(testData,1);%測(cè)試集維數(shù);每個(gè)樣本的屬性個(gè)數(shù)
for testNum = 1:test_number % 循環(huán)測(cè)試樣本
X = testData(:,testNum); %當(dāng)前測(cè)試樣本 4 * 1
% prob = label_priorP;%先驗(yàn)概率
% for label = 1:classNum % 3類
% for k = 1:attr_number % 4屬性
% %填空:計(jì)算每類的條件概率與后驗(yàn)概率
%
% %計(jì)算條件概率
% %此時(shí)prob已為后驗(yàn)概率
% Pxk = 1/ (sigma(k,label)*sqrt(2 * pi) )* exp(-((X(k,1)-mu(k,label))^2 )/(2*sigma(k,label)^2));
% prob(1,label) =prob(1,label) * Pxk;
% end
% %Pxk=1;
% end
%% 考核:請(qǐng)?jiān)趯?duì)數(shù)條件下實(shí)現(xiàn)方案一
%=====================================================================%
prob = label_priorP;%先驗(yàn)概率
%%計(jì)算測(cè)試樣本對(duì)于每類的后驗(yàn)概率
for label = 1:classNum % 3類
for k = 1:attr_number % 4屬性
%=====================================================================%
%填空:計(jì)算每類的條件概率與后驗(yàn)概率
%計(jì)算條件概率
%此時(shí)prob已為后驗(yàn)概率
Pxk = -log(sigma(k,label))-((X(k,1)-mu(k,label))^2 /(2 * sigma(k,label)^2));
prob(1,label) =prob(1,label)+Pxk;
%=====================================================================%
end
end
%=====================================================================%
[value index] = max(prob);
testClass = [testClass index];
end
main.m
clc;
clear all;
tic
load fisheriris
% plotmatrix(meas)
% meas 給出了每朵花的4個(gè)屬性
% species 說明了每朵花的種類
[label_priorP,mu,sigma] = navieBayestrain(meas,species);%需完成函數(shù) navieBayestrain()內(nèi)的填空
classNum = length(unique(species)); %類別數(shù)
testLabel = grp2idx(species);
testLabel =testLabel';
testClass = navieBayestest(meas,label_priorP,mu,sigma,classNum);%需完成函數(shù) navieBayestest()內(nèi)的填空
%識(shí)別率
accuracy=length(find(testLabel==testClass))/length(testLabel)
cMat2 = confusionmat(testLabel,testClass )
toc
到了這里,關(guān)于實(shí)驗(yàn)五 貝葉斯分類器(模式識(shí)別與機(jī)器學(xué)習(xí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!