1. 程式人生 > >樸素貝葉斯分類MATLAB實現

樸素貝葉斯分類MATLAB實現

原理:

首先將資料分成訓練集和測試集,計算測試集中每個類的先驗概率(就是每個類在訓練集中佔的比例),然後為樣本的每個屬性估計條件概率(就是屬性值相同的樣本在每一類中佔的比例)為了方便理解請看下面的例子:(直接用的周志華機器學習那本書上的資料)
這裡寫圖片描述
現在有一個西瓜,它的屬性值如下,讓判斷它是好瓜還是壞瓜
這裡寫圖片描述
首先我們要求每個類的先驗概率,就是好瓜和壞瓜的比例
P(好瓜) = 8/17 = 0.471
P(壞瓜) = 9/17 = 0.529
然後為每個屬性值估計概率
這裡寫圖片描述
這裡寫圖片描述
然後就可以計算出它是好瓜和壞瓜的概率了,那個概率大就認為它是那種瓜
這裡寫圖片描述
源資料鏈接:https://github.com/softwinds/Course_PR_17/edit/master/experiment1/data/synthetic_data/mix.txt

MATLAB實現:

[b] = xlsread('mix.xlsx',1,'A1:D1628');
x = b(:,1);
y = b(:,2);
c = b(:,3);
data = [x,y];
NUM = 500;%樣本數量
Test = sortrows([x(1:NUM,1),y(1:NUM,1),c(1:NUM,1)],3);%為方便處理按類對樣本排序
temp = zeros(23,5);%用來儲存樣本中各個屬性的均值、方差和每個類的概率
%計算出樣本中各個屬性的均值、方差和每個類的概率
for i = 1:23
    X = [];
    Y = [];
    count = 0;
    for j = 1:NUM
        if Test(j,3)==i
            X = [X;Test(j,1)];
            Y = [Y;Test(j,2)];
            count = count + 1;
        end
    end
    temp(i,1) = mean(X);
    temp(i,2) = std(X);
    temp(i,3) = mean(Y);
    temp(i,4) = std(Y);
    temp(i,5) = count/NUM;
end
%計算預測結果
result = [];
for m = 1:1628
    pre = [];
    for n = 1:23
        PX = 1/temp(n,2)*exp(((data(m,1)-temp(n,1))^2)/-2/(temp(n,2)^2));
        PY = 1/temp(n,4)*exp(((data(m,2)-temp(n,3))^2)/-2/(temp(n,4)^2));
        pre = [pre;PX*PY*temp(n,5)*10^8];
    end
    [da,index]=max(pre);
    result = [result;index];
end
xlswrite('mix.xlsx',result,'E1:E1628');
%畫圖
for i = 1:1628
    rand('seed',result(i,1));
    color = rand(1,3);
    plot(x(i,1),y(i,1),'*','color',color);
    hold on;
end  
%檢視正確率
num = 0;
for i = 1:1628
    if result(i)==c(i)
        num = num+1;%正確的個數
    end
end

其實MATLAB有現成的封裝好的分類方法,這裡只不過是把過程寫了一下而已。