日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

朴素贝叶斯算法实现分类以及Matlab实现

發布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 朴素贝叶斯算法实现分类以及Matlab实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 開始

其實在學習機器學習的一些算法,最近也一直在看這方面的東西,并且嘗試著使用Matlab進行一些算法的實現。這幾天一直在看得就是貝葉斯算法實現一個分類問題。大概經過了一下這個過程:

看書算法公式推演網上查詢資料進一步理解搜集數據集開始嘗試寫代碼調試代碼整理與優化自編代碼結果與Matlab自帶函數fitcnb結果對比驗證樸素貝葉斯算法優缺點總結

經過這幾天的努力,總算是把這個算法徹底弄明白了,也發現,很多算法只有自己去親自寫一寫才會發現自己的不足,還是需要多努力。

  • 貝葉斯分類

    • 分類問題理解
      貝葉斯分類是一類分類算法的總稱,這類算法以貝葉斯定理為基礎,因此稱之為貝葉斯分類。
      而對于分類問題,其實誰都不會陌生,說我們每個人每天都在執行分類操作一點都不夸張,只是我們沒有意識到罷了。例如,當你看到一個陌生人,你的腦子下意識判斷TA是男是女;你可能經常會走在路上對身旁的朋友說“這個人一看就很有錢、那邊有個非主流”之類的話,其實這就是一種分類操作。
      從數學角度來說,分類問題可做如下定義:
      已知集合,C={y1,y2,,yn}I={x1,x2,,xm,}確定映射規則y=f(x),使得任意的xI有且僅有一個yiC使得yi=f(xi)成立。
      其中C叫做類別集合,其中每一個元素是一個類別,而I叫做項集合,其中每一個元素是一個待分類項,f叫做分類器。分類算法的任務就是構造分類器f
      這里要著重強調,分類問題往往采用經驗性方法構造映射規則,即一般情況下的分類問題缺少足夠的信息來構造100%正確的映射規則,而是通過對經驗數據的學習從而實現一定概率意義上正確的分類,因此所訓練出的分類器并不是一定能將每個待分類項準確映射到其分類,分類器的質量與分類器構造方法、待分類數據的特性以及訓練樣本數量等諸多因素有關。

    • 貝葉斯定理
      該定理最早Thomas Bayes發明,顯然這個定理可能就是為了紀念他而已他的名字命名的吧。這個定理是概率論中的一個結論,大學學習概率論的時候學習過的。它是跟隨機變量的條件概率以及邊緣概率分布有關的。該定理可以讓人們知道如何用新的信息進行以后看法或者結論的修改。一般來說,事件A在事件B已經發生的條件下發生的概率與事件B在事件A已經發生的條件下發生的概率是不一樣的。但是這個兩者是有一定的聯系的。下面就開始搬出這個偉大的定理:

      P(X,Y)=P(Y|X)P(X)=P(X|Y)P(Y)

      那么對這個公式進行變形有:

      P(Y|X)=P(X|Y)P(Y)P(X)

      由上面可以看出來,這個定理允許使用先驗概率P(Y)、條件概率P(X|Y)和證據P(X)來表示后驗概率

    • 樸素貝葉斯分類原理
      樸素貝葉斯分類是一種十分簡單的分類算法,叫它樸素貝葉斯分類是因為這種方法的思想真的很樸素。
      樸素貝葉斯的思想基礎是這樣的:對于給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬于哪個類別。
      通俗來說,就好比這么個道理,你在街上看到一個黑人,我問你你猜這哥們哪里來的,你十有八九猜非洲。為什么呢?因為黑人中非洲人的比率最高,當然人家也可能是美洲人或亞洲人,但在沒有其它可用信息下,我們會選擇條件概率最大的類別,這就是樸素貝葉斯的思想基礎。
      樸素貝葉斯分類器建立在一個類條件獨立性假設(樸素假設)的基礎之上,給定類變量后,各個變量之間相互獨立。根據樸素貝葉斯獨立性假設,有:

      P(X|Ci)=mk=1P(XK|Ci)

      其中,當給定訓練數據集的時候,條件概率P(X1|Ci)P(X2|Ci),P(X3|Ci),...,P(Xn|Ci)可以算出來,因此,根據這個方法,對一個未知類別的樣本X,可以先分別計算X屬于每個類別Ci的概率P(X|Ci)P(Ci),然后選擇其中概率最大的類別作為其類別。

    • 算法流程
      樸素貝葉斯分類的一個基本算法流程為:
      (1)設x={x1,x2,,xm}為一個待分類的項,而每一個xix的一個屬性,每一個屬性有k個取值xi={a1,a2,,ak}
      (2)有一個類別集合C={y1,y2,,yn}
      (3)計算P(y1|x),P(y2|x),...,P(yn|x)
      (4)如果P(yk|x)=max{P(y1|x),P(y2|x),...,P(yn|x)},則xyk
      因此,從上面我們可以看出來,該算法的關鍵步驟就是第(3)中的各個條件概率的計算,基于獨立性假設,可以這樣計算:
      1、找到一個已知分類的待分類項集合,這個集合叫做訓練樣本集。
      2、統計得到在各個類別下各個特征屬性的條件概率估計值,即:
      P(a1|y1),P(a2|y1),...,P(am|y1)
      P(a1|y2),P(a2|y2),...,P(am|y2)
      ?
      P(a1|y1),P(a2|y1),...,P(am|y1)
      3、如果各個特征屬性是條件獨立的,則根據貝葉斯定理有如下推導:
      P(yi|x)=P(x|yi)P(yi)P(x)
      因為分母對于所有類別來說都是常數,因此,該算法就是求解分子最大化問題。因為各個特征屬性之間是條件獨立的,所以有:
      依據上面的分析,可以得到樸素貝葉斯分類的一個基本流程圖如下:
  • Matlab程序實現

    • 程序
      使用Matlab實現樸素貝葉斯算法的數據來源:http://archive.ics.uci.edu/ml/machine-learning-databases/balance-scale/balance-scale.data。
      不多說先開始上程序吧
clc clear close all data=importdata('data.txt'); wholeData=data.data; %交叉驗證選取訓練集和測試集 cv=cvpartition(size(wholeData,1),'holdout',0.04);%0.04表明測試數據集占總數據集的比例 trainData=wholeData(training(cv),:); testData=wholeData(test(cv),:); label=data.textdata; attributeNumber=size(trainData,2); attributeValueNumber=5; %% %將分類標簽轉化為數據 sampleNumber=size(label,1); labelData=zeros(sampleNumber,1); for i=1:sampleNumberif label{i,1}=='R'labelData(i,1)=1;elseif label{i,1}=='B'labelData(i,1)=2;else labelData(i,1)=3;end end trainLabel=labelData(training(cv),:); trainSampleNumber=size(trainLabel,1); testLabel=labelData(test(cv),:); %計算每個分類的樣本的概率 labelProbability=tabulate(trainLabel); %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值的數量統計 %統計每一個特征的每個取值的數量 for jj=1:3for j=1:trainSampleNumberfor ii=1:attributeNumberfor k=1:attributeValueNumberif jj==1if trainLabel(j,1)==1&&trainData(j,ii)==kcount_1(ii,k)=count_1(ii,k)+1;endelseif jj==2if trainLabel(j,1)==2&&trainData(j,ii)==kcount_2(ii,k)=count_2(ii,k)+1;endelseif trainLabel(j,1)==3&&trainData(j,ii)==kcount_3(ii,k)=count_3(ii,k)+1;endendendendend end %計算第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); for kk=1:size(testData,1)testDataTemp=testData(kk,:);Pxy1=1;Pxy2=1;Pxy3=1;%計算P(x|yi)for iii=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;if PxyPy1>PxyPy2&&PxyPy1>PxyPy3predictLabel(kk,1)=1;disp(['this item belongs to No.',num2str(1),' label or the R label'])labelPredictNumber(1,1)=labelPredictNumber(1,1)+1;elseif PxyPy2>PxyPy1&&PxyPy2>PxyPy3predictLabel(kk,1)=2;labelPredictNumber(2,1)=labelPredictNumber(2,1)+1;disp(['this item belongs to No.',num2str(2),' label or the B label'])elseif PxyPy3>PxyPy2&&PxyPy3>PxyPy1predictLabel(kk,1)=3;labelPredictNumber(3,1)=labelPredictNumber(3,1)+1;disp(['this item belongs to No.',num2str(3),' label or the L label'])end end testLabelCount=tabulate(testLabel); % 計算混淆矩陣 disp('the confusion matrix is : ') C_Bayes=confusionmat(testLabel,predictLabel)

以上部分就是針對于這個已有的數據集進行的算法的實現。

  • 結果與分析
    C_Bayes是計算出來的混淆矩陣。
    其結果為:
    C_Bayes=8300000014
    為了驗證該自編程序是否可靠,我再使用了Matlab自帶的貝葉斯算法的函數fitcnb進行該數據的分類測試
Nb=fitcnb(trainData,trainLabel); y_nb=Nb.predict(testData); C_nb=confusionmat(testLabel,y_nb)

其中C_nb是采用自帶函數得到的結果的混淆矩陣
其結果為:
C_nb=

8300000014
可以發現其結果是完全一樣的。
為了進一步驗證程序的可靠性,我改變了交叉驗證中訓練集和測試集的比例,設置為0.2,
此時采用自編程序得到的混淆矩陣為:
C_Bayes= 63400000552
而使用自帶函數fitcnb得到的結果為:
C_nb= 63400000552
可以發現再次得到了一致的結果。

  • 總結

  • 從上面的整個程序的實現,可以發現,整個樸素貝葉斯分類分為三個階段。
    ①. 準備階段。包括數據搜集,數據導入以及數據清洗階段。獲得可以進行分析的質量比較好的結果。然后將數據劃分為訓練集和測試集。
    ②. 構建分類器,進行數據訓練。要工作是計算每個類別在訓練樣本中的出現頻率及每個特征屬性劃分對每個類別的條件概率估計,并將結果記錄。其輸入是特征屬性和訓練樣本,輸出是分類器。這一階段是機械性階段,根據前面討論的公式可以由程序自動計算完成。
    ③. 第三階段——應用階段。這個階段的任務是使用分類器對待分類項進行分類,其輸入是分類器和待分類項,輸出是待分類項與類別的映射關系。這一階段也是機械性階段,由程序完成。

  • 樸素貝葉斯算法成立的前提是各個屬性之間是相互獨立的。當數據集滿足這個獨立性假設的時候,分類的準確率較高,否則就可能不是很好。

  • 樸素貝葉斯分類算法的特點
    ①. 這個算法比較的就簡單,但是卻很高效,在樸素貝葉斯的假設前提之下,分類結果準確率很高。
    ②. 同樣,如果屬性之間存在一個相關性聯系的話,這個分類的精度就會大大降低。因為此時的獨立性假設就會不成立,導致計算得到的條件概率均出現不同程度的偏差。

艾勇-上海交通大學
2017/7/19

總結

以上是生活随笔為你收集整理的朴素贝叶斯算法实现分类以及Matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。