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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

贝叶斯分类器的matlab实现_贝叶斯实验

發布時間:2025/3/20 循环神经网络 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贝叶斯分类器的matlab实现_贝叶斯实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

貝葉斯實驗

Part 1.仿真實驗

隨機產生10000組正樣本和20000負樣本高斯分布的數據集合(維數設為二維),要求正樣本:均值為[1;3],方差為[2 0;0 2];負樣本:均值為[10;20],方差為[10 0;0 10]。先驗概率按樣本量設定為1/3和2/3.分別利用最小錯誤概率貝葉斯分類器和最小風險概率貝葉斯分類器對其分類。(假設風險程度正樣本分錯風險系數為0.6,負樣本分錯風險為0.4,該設定僅用于最小風險分析)2

Part 2. 實際應用—汽車評價分類

給定汽車評價數據集,下載鏈接:http://archive.ics.uci.edu/ml/datasets/Car+Evaluation,利用貝葉斯算法進行數據分類操作,并統計其預測正確率。 (1)數據描述 共1728個數據,每個數據特征為6維,分為4類,類別標記為unacc,acc,good,V-good 四個類別標記分別表示汽車性價比等級(由低到高) unacc:1210個 acc:384個 good:69個 V-good:65個 6個特征分別為:(6個屬性) 1、buying (取值:v-high、high、med、low) 表示購買價格 2、maint (取值: v-high、high、med、low) 表示維修價格 3、door (取值:2、3、4、5-more) 車門數量 4、Persons (取值:2、4、more) 可容納人數 5、Lug_boot (取值:small、med、big) 行李箱大小 6、Safety (取值:low、med、high) 安全系數 (2)實驗完成要求 1. 仔細閱讀實驗說明并了解數據集; 2. 使用任何一種熟悉的計算機語言(比如 C,Java或者MATLAB)實現樸素貝葉斯算法; 3. 利用10折交叉驗證,對所設計的貝葉斯分類器進行性能評估; 4. 提交代碼,統計并分析實驗結果,上交實驗報告;

實驗過程

  • 貝葉斯公式 $large P(omega{_i}|x)= large{ P(x|omega_i)P(w_i) over sum P(x|omega_i)P(w_i)}$
    因為分母是一定的,公式可以寫成 : $large P( omega{_i}|x) ∝ P(x|omega_i)P(w_i)$
    因為$P(x|omega_i)$在實際中無法從有限的樣本中估計而來,假設所有的特征相互獨立(即使在理想條件下效果也是非常好的)得到樸素貝葉斯。
    即:$large P( omega{_i}|x) ∝ P(x_1|omega_i)cdots P(x_n|omega_i)P(w_i)$
    樸素貝葉斯的模型概率圖表示(盤式記法)

  • 貝葉斯最優分類器
    考慮到樣本誤分類產生的損失,為其相應的分類加權。得到
    條件風險:$R(omega_i|x) = sum lambda_{ij}P(omega_j|x)$
    尋求一個判定準則最小化總體風險:$R(h)= E_x[ R(h(x)|x)]$
    貝葉斯最優分類器: $h^*(x) = underset{omega}{argmax} P(omega_i|x)$
    當目標是最小化分類錯誤率,其損失函數
    $$lambda_{ij} begin{cases} 0 & text{if i=j} 1 & text{if i!=j}end{cases}$$
    此時,條件風險為: $$R(omega|x) = 1-P(omega|x)$$
    $$h*(x) = underset{omega}{argmin} P(omega_i|x)$$
  • 判別式模型與生成式模型
    假設可觀察到的變量集合為 $X$ 需要預測的變量集合為 $Y$ 其它的變量集合為 $Z$ 。 生成式模型判別式模型是直接對聯合概率分布$P(X,Y,Z)進行建模在給定觀測集合的$X$ 的條件下通過計算邊緣概率分布進行推斷。而判別式模型是直接求條件概率進行推斷。 樸素貝葉斯是生成式模型。

貝葉斯方法封裝

  • 代碼
import numpy as npclass Naive_bayes:'''我們需要計算先驗概率,類條件密度概率,封裝參數為標簽和特征。'''num = 0feature_cat = 0label_cat= 0def __init__(self):passdef NaiveBayes(self,Py, Px_y, x):featrueNum = self.feature_catclassNum = self.label_cat# 建立存放所有標記的估計概率數組P = [0] * classNum# 對于每一個類別,單獨估計其概率for i in range(classNum):# 初始化sum為0,sum為求和項。# 在訓練過程中對概率進行了log處理,所以這里原先應當是連乘所有概率,最后比較哪個概率最大# 但是當使用log處理時,連乘變成了累加,所以使用sumsum = 0for j in range(featrueNum):if x[j] in Px_y[i][j]:sum += Px_y[i][j][x[j]]P[i] = sum + Py[i]return P.index(max(P))def cost_NaiveBayes(self, Py, Px_y, x,cost):featrueNum = self.feature_catclassNum = self.label_cat# 建立存放所有標記的估計概率數組P = [0] * classNumP_ = [0] * classNum# 對于每一個類別,單獨估計其概率for i in range(classNum):# 初始化sum為0,sum為求和項。# 在訓練過程中對概率進行了log處理,所以這里原先應當是連乘所有概率,最后比較哪個概率最大# 但是當使用log處理時,連乘變成了累加,所以使用sumsum = 0for j in range(featrueNum):if x[j] in Px_y[i][j]:sum += Px_y[i][j][x[j]]P[i] = sum + Py[i]for m in range(classNum):totall = 0for n in range(classNum):totall += P[n]*cost[m][n]P_[m] = totallreturn P_.index(min(P_))def Naive_test(self,Py, Px_y, test_data, test_label):# 錯誤值計數errorCnt = 0# 循環遍歷測試集中的每一個樣本for i in range(len(test_data)):# 獲取預測值presict = self.NaiveBayes(Py, Px_y, test_data[i])# 與答案進行比較if presict != test_label[i]:# 若錯誤 錯誤值計數加1errorCnt += 1# 返回準確率return 1 - (errorCnt / len(test_data))def cost_Naive_test(self,Py, Px_y, test_data, test_label,cost):# 錯誤值計數errorCnt = 0# 循環遍歷測試集中的每一個樣本for i in range(len(test_data)):# 獲取預測值presict = self.cost_NaiveBayes(Py, Px_y, test_data[i],cost)# 與答案進行比較if presict != test_label[i]:# 若錯誤 錯誤值計數加1errorCnt += 1# 返回準確率return 1 - (errorCnt / len(test_data))def fit(self,train_data, train_label):featureNum = train_data.shape[1]self.feature_cat = featureNumlabel = set(train_label)self.label_cat = len(label)classNum = len(label)Py = np.zeros((classNum, 1))# 計算先驗概率分布label_dic = {}for i in label:# 若訓練集中沒有某一類的數據則其預測概率為零。加一保證不為零,還要同時保證分母不為零 確保預測概率不為零label_dic[i]=((np.sum(train_label == i)) + 1)Py[int(i)] = (label_dic[i]) / (len(train_label) + classNum)# 轉換為log對數形式,防止數據下溢Py = np.log(Py)# 初始化為全0矩陣,用于存放所有情況下的條件概率Px_y = {}for i in range(classNum):Px_y[i] = {}for j in range(featureNum):Px_y[i][j] = {}for m in range(len(train_label)):label = train_label[m]x = train_data[m]for n in range(featureNum):# 這里還沒有計算條件概率,先把所有數累加,全加完以后,在后續步驟中再求對應的條件概率if x[n] not in Px_y[label][n]:Px_y[label][n][x[n]] = 1else:Px_y[label][n][x[n]] += 1for label in range(classNum):for z in range(featureNum):l =len(Px_y[label][z].keys())for key,item in Px_y[label][z].items():Px_y[label][z][key] = np.log((item + 1) / (label_dic[label]) + l)# 返回先驗概率分布和條件概率分布return Py, Px_y
  • 主要思路 根據已知樣本集訓練分類器,求得先驗概率和密度概率。
  • 實驗步驟
  • 從汽車的數據集上可以看出,樣本太少而其特征類別44433*3遠高于某一類別的數量,若測試集中出現了原來沒有出現過的特征,導致其Px_y的概率為0,比如good類別safety只有high和med。對實驗結果也有一定的影響,若某個屬性值在訓練過程中沒有與某個類同時出現過,則根據連乘式將會把其它屬性攜帶的信息抹去,這是不可靠的。
    使用上面通過這個例子折射處一個問題:訓練集上,很多樣本的取值可能并不在其中,但是這不并代表這種情況發生的概率為0,因為未被觀測到,并不代表出現的概率為0 。在概率估計時,通常解決這個問題的方法是要進行平滑處理,常用拉普拉斯修正。拉普拉斯修正的含義是,在訓練集中總共的分類數,用 N 表示;di 屬性可能的取值數用 Ni 表示,因此原來的先驗概率 P(c) 的計算公式由:
    先驗概率: $P(c) = large{c over C}$$P(c) = large{c+1 over C+N}$
    條件概率: $P(x|c) = large{c_x over C_x}$ $P(x|c) = large{c_x+1 over C_x+N_i}$
    該方法避免了因訓練集樣本的不充分而導致概率估計值為零的問題,在訓練集變大時,修正所帶來的影響可以忽略不計,使得估值趨近于實際概率值。
    • 貝葉斯估計
      我們計算樸素貝葉斯,使用的是極大似然估計法去估計相應的概率,這會導致上面出現的問題,我們就用拉普拉斯修正,這就成為了貝葉斯估計。在理想條件下得到的就是貝葉斯最優分類器,但是由于先驗概率和密度概率都是由樣本估計得到的,所以存在一定的誤差,也就是說樣本越接近全集,或者其分布近似全集的分布,則其可以看做貝葉斯最優分類器,但樣本是全集的話就沒有意義。深度學習是樣本集可以看做大到全集。
  • 計算先驗概率,后驗概率時計算過程中取log運算,因為對數值小的部分差異的敏感程度比數值大的部分的差異敏感程度更高,這是符合常識的,化累法為累加便于計算,同時防止由于數據下溢而導致計算結果無法比較。

Part1

  • 代碼
from means.naive_bys import Naive_bayes import numpy as npif __name__ == "__main__":mean1 = [1, 3]cov1 = [[2, 0], [0, 2]]X = np.around(np.random.multivariate_normal(mean1, cov1, 10000),3)mean2 = [10, 20]cov2 = [[10, 0], [0, 10]]Y = np.around(np.random.multivariate_normal(mean2, cov2, 20000),3)num = X.shape[0]num1 = Y.shape[0]train_data = np.vstack((X[:int(1/3*num)],Y[:int(1/3*num1)]))train_label = np.hstack((np.zeros(len(X[:int(1/3*num)])), np.zeros(len(Y[:int(1/3*num1)]))+1))test_data = np.vstack((X[int(1 / 3 * num):] , Y[int(1 / 3 * num1):]))test_label = np.hstack((np.zeros(len(X[int(1 / 3 * num):])), np.zeros(len(Y[int(1 / 3 * num1):])) + 1))naive_bys = Naive_bayes()Py, Px_y =naive_bys.fit(train_data, train_label)# 使用習得的先驗概率分布和條件概率分布對測試集進行測試accuracy = naive_bys.Naive_test(Py, Px_y, test_data, test_label)print('1/3the accuracy is:', accuracy)accuracy = naive_bys.cost_Naive_test(Py, Px_y, test_data, test_label,[[0,0.6],[0.4,0]])print('1/3 cost the accuracy is:', accuracy)train_data = np.vstack((X[:int(2 / 3 * num)], Y[:int(2 / 3 * num1)]))train_label = np.hstack((np.zeros(len(X[:int(2 / 3 * num)])), np.zeros(len(Y[:int(2 / 3 * num1)])) + 1))test_data = np.vstack((X[int(2 / 3 * num):], Y[int(2 / 3 * num1):]))test_label = np.hstack((np.zeros(len(X[int(2 / 3 * num):])), np.zeros(len(Y[int(2 / 3 * num1):])) + 1))naive_bys = Naive_bayes()Py, Px_y = naive_bys.fit(train_data, train_label)# 使用習得的先驗概率分布和條件概率分布對測試集進行測試accuracy = naive_bys.Naive_test(Py, Px_y, test_data, test_label)print('1/3the accuracy is:', accuracy)accuracy = naive_bys.cost_Naive_test(Py, Px_y, test_data, test_label,[[0,0.6],[0.4,0]])print('2/3t cost he accuracy is:', accuracy)
  • 實驗技巧

在生成數據時將數據取小數點后三位,否則的numpy生成的實驗數據的小數位數太多不僅處理起來比較麻煩,計算也比較復雜。 * 實驗結果

可以看到最小錯誤概率貝葉斯分類器準確率基本相等于最小風險概率貝葉斯分類器。

Part2

  • 代碼
from means.naive_bys.naive_bys import Naive_bayesfrom sklearn.model_selection import RepeatedKFold from sklearn import preprocessing import pandas as pd import numpy as np if __name__ == "__main__":df = pd.read_csv("data/car.csv")raw_set = df.valueslabel_encoder = []# 放置每一列的encoder encoded_set = np.empty(raw_set.shape)for i, _ in enumerate(raw_set[0]):# 擬合每一列上的數據encoder = preprocessing.LabelEncoder()encoded_set[:, i] = encoder.fit_transform(raw_set[:, i])label_encoder.append(encoder)dataset_X=encoded_set[:,:-1].astype(int)dataset_y=encoded_set[:,-1].astype(int)print(np.sum(dataset_y==2))# 將數據集拆分為train set 和test set start = time.time()naive_bys = Naive_bayes()# 使用習得的先驗概率分布和條件概率分布對測試集進行測試kf = RepeatedKFold(n_splits=10)accuracy = 0for train_index, test_index in kf.split(dataset_X):train_X, train_y = dataset_X[train_index], dataset_y[train_index]test_X, test_y = dataset_X[test_index], dataset_y[test_index]Py, Px_y = naive_bys.fit(train_X, train_y)accuracy+= naive_bys.Naive_test(Py, Px_y, test_X, test_y)print('the accuracy is : %f' % (accuracy/100))
  • 實驗思路 由于給出的是標注數據集,但是其特征未進行處理,我們先將數據進行預處理,進行數據類型轉換。最后用自己封裝的貝葉斯方法進行10折交叉驗證處理,得到實驗結果。
  • 交叉驗證

交叉驗證的基本思想是將數據集分為k等份,對于每一份數據集,其中k-1份用作訓練集,單獨的那一份用作測試集。在實際當中,進行一次k折交叉驗證還是不夠的,我們需要進行多次,比如我進行了10次10折交叉驗證。

  • 實驗結果

  • 實驗結果分析

實驗數據的結果比較低,我認為是如下原因,

|class | N | N[%]| |------|-----------|------------| |unacc |1210 | (70.023 %) | |acc |384 | (22.222 %) | |good |69 |( 3.993 %) | |v-good |65 |( 3.762 %) | 1. Class Distribution (number of instances per class)

可以看到其數據并不是均勻分布的,unacc所占的比例極大導致了先驗概率過高絕大多數的分類為unacc,使得分類的結果傾向于所占比例較大的類。

其他

其中data是汽車數據集,而means是封裝過后的貝葉斯函數。

而means文件夾下的test.py是處理隨機數的文件。load_data.py是處理car數據集的文件。

分析與總結

本次實驗主要對貝葉斯方法進行實驗,也只是實現了一小部分,貝葉斯分類種類很多,高斯和多項式等。對樸素貝葉斯有了更深刻的理解,在實際代碼實現時,要考慮各種數據情況,并做出相應的處理,增強其健壯性。

算法優點:

  • 算法邏輯簡單,易于實現(算法思路很簡單,只要使用貝葉斯公式轉化即可!)
  • 分類過程中時空開銷小(假設特征相互獨立,只會涉及到二維存儲)

缺點:

  • 樸素貝葉斯假設屬性之間相互獨立,這種假設在實際過程中往往是不成立的。在屬性之間相關性越大,分類誤差也就越大。

反思:

實驗遇到了許多bug,參考了相當多的資料,包括numpy,pandas,sklearn,通過本次實驗加深了對這些庫的使用熟練度,也學到了相當多的知識,像產生的二維隨機數特征若果不加以處理就會產生異常的數據庫,每一個類條件密度概率都非常低,導致結果下溢報錯,參考csdn,學習了數據的處理方法,還有sklearn的編碼庫,一開始我是使用的是python的replace操作去替代類型轉換,但是相當麻煩,查找資料,發現了sklearn的解決方案等等。實驗收獲很大,在以后面臨相同的問題時,知道該如何解決。

總結

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

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