朴素貝葉斯方法(Naive Bayes Method)


    朴素貝葉斯是一種很簡單的分類方法,之所以稱之為朴素,是因為它有着非常強的前提條件-其所有特征都是相互獨立的,是一種典型的生成學習算法。所謂生成學習算法,是指由訓練數據學習聯合概率分布P(X,Y),然后求得后驗概率P(X|Y)。具體來說,利用訓練數據學習P(X|Y)和p(Y)的估計,得到聯合概率分布:

image

    概率估計可以是極大似然估計,或者貝葉斯估計。

    假設輸入 X 為n維的向量集合,輸出 Y 為類別,X 和 Y 都是隨機變量。P(X,Y)是X和Y的聯合概率分布,訓練數據集為:

        image

    首先,我們要明確我們求解的目標是:image,即給定某個輸入X,我們要判斷其所屬類別Ck。由概率論知識,我們有:

image

                            其中,image

    代入公式得:

image

    這是朴素貝葉斯分類的基本公式。於是,朴素貝葉斯分類器可以表示為

image

    由於,分母對所有的Ck都是相同的,所以

image

    那么如果給定一個輸入 X,我們只需要找到一個類別Ck,使得image最大。那么Ck,就是 X 的最佳類別了。

   

    下面我們來講講朴素貝葉斯法的參數估計,為什么要估計朴素貝葉斯的參數呢,這些參數是什么?首先,我們要明確。現實中,給定我們一批數據,我們就知道其分布,但是具體的數據分布的概率我們是不知道的。也就是說先驗概率和條件概率我們是不知道的,這就需要我們來利用其數據的分布估計其先驗概率和條件概率了。統計學習中最常用的參數估計就是極大似然估計了,這里我們也可以用貝葉斯估計,其實就是在極大似然估計基礎上添加了拉普拉斯平滑(Laplace smoothing)。

    由於極大似然估計之前已經講到過,這里公式我也沒有具體來推,所以先驗概率和條件概率直接給出來。

    先驗概率P(Y = Ck)和條件概率的極大似然估計如下:

image

 

image

    這樣,給定具體的數據,我們就可以估計其先驗概率和條件概率,進而計算出后驗概率得到所屬類別。

    同樣,貝葉斯估計和極大似然估計差不多,貝葉斯估計只是在極大似然估計上添加了一個拉普拉斯平滑。具體如下:

    條件概率的貝葉斯估計如下:

image

    先驗概率的貝葉斯估計如下:

    image

 

   下面來給出一個簡單的朴素貝葉斯實現代碼,代碼比較容易理解。只是課本上給出的特征是離散的,而code里面的特征是連續的。原理上其實是一樣一樣的~

   1: % NAIVE BAYES CLASSIFIER
   2:  
   3: clear
   4: tic
   5: disp('--- start ---')
   6:  
   7: distr='normal';
   8: distr='kernel';
   9:  
  10: % read data
  11: White_Wine = dataset('xlsfile', 'White_Wine.xlsx');
  12: X = double(White_Wine(:,1:11));
  13: Y = double(White_Wine(:,12));
  14:  
  15: % Create a cvpartition object that defined the folds
  16: c = cvpartition(Y,'holdout',.2);
  17:  
  18: % Create a training set
  19: x = X(training(c,1),:);
  20: y = Y(training(c,1));
  21: % test set
  22: u=X(test(c,1),:);
  23: v=Y(test(c,1),:);
  24:  
  25: yu=unique(y);
  26: nc=length(yu); % number of classes
  27: ni=size(x,2); % independent variables
  28: ns=length(v); % test set
  29:  
  30: % compute class probability
  31: for i=1:nc
  32:     fy(i)=sum(double(y==yu(i)))/length(y);
  33: end
  34:  
  35: switch distr
  36:     
  37:     case 'normal'
  38:         
  39:         % normal distribution
  40:         % parameters from training set
  41:         for i=1:nc
  42:             xi=x((y==yu(i)),:);
  43:             mu(i,:)=mean(xi,1);
  44:             sigma(i,:)=std(xi,1);
  45:         end
  46:         % probability for test set
  47:         for j=1:ns
  48:             fu=normcdf(ones(nc,1)*u(j,:),mu,sigma);
  49:             P(j,:)=fy.*prod(fu,2)';
  50:         end
  51:  
  52:     case 'kernel'
  53:  
  54:         % kernel distribution
  55:         % probability of test set estimated from training set
  56:         for i=1:nc
  57:             for k=1:ni
  58:                 xi=x(y==yu(i),k);%the feature of dimension-k with respect to label yu(i)
  59:                 ui=u(:,k);
  60:                 fuStruct(i,k).f=ksdensity(xi,ui);
  61:             end
  62:         end
  63:         % re-structure
  64:         for i=1:ns
  65:             for j=1:nc
  66:                 for k=1:ni
  67:                     fu(j,k)=fuStruct(j,k).f(i);
  68:                 end
  69:             end
  70:             P(i,:)=fy.*prod(fu,2)';
  71:         end
  72:  
  73:     otherwise
  74:         
  75:         disp('invalid distribution stated')
  76:         return
  77:  
  78: end
  79:  
  80: % get predicted output for test set
  81: [pv0,id]=max(P,[],2);
  82: for i=1:length(id)
  83:     pv(i,1)=yu(id(i));
  84: end
  85:  
  86: % compare predicted output with actual output from test data
  87: confMat=myconfusionmat(v,pv);
  88: disp('confusion matrix:')
  89: disp(confMat)
  90: conf=sum(pv==v)/length(pv);
  91: disp(['accuracy = ',num2str(conf*100),'%'])
  92:  
  93: toc
   1: function confMat=myconfusionmat(v,pv)
   2:  
   3: yu=unique(v);
   4: confMat=zeros(length(yu));
   5: for i=1:length(yu)
   6:     for j=1:length(yu)
   7:         confMat(i,j)=sum(v==yu(i) & pv==yu(j));
   8:     end
   9: end

    如果想要實驗數據的話,請在博客下面評論區域注明,我看到了會第一時間上傳。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM