国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現樸素貝葉斯分類器

2020-01-04 15:27:03
字體:
來源:轉載
供稿:網友

本文用的是sciki-learn庫的iris數據集進行測試。用的模型也是最簡單的,就是用貝葉斯定理P(A|B) = P(B|A)*P(A)/P(B),計算每個類別在樣本中概率(代碼中是pLabel變量)

以及每個類下每個特征的概率(代碼中是pNum變量)。

寫得比較粗糙,對于某個類下沒有此特征的情況采用p=1/樣本數量。

有什么錯誤有人發現麻煩提出,謝謝。

[python] view plain copy# -*- coding:utf-8 -*- from numpy import * from sklearn import datasets import numpy as np  class NaiveBayesClassifier(object):    def __init__(self):     self.dataMat = list()     self.labelMat = list()     self.pLabel = {}     self.pNum = {}    def loadDataSet(self):     iris = datasets.load_iris()     self.dataMat = iris.data     self.labelMat = iris.target     labelSet = set(iris.target)     labelList = [i for i in labelSet]     labelNum = len(labelList)     for i in range(labelNum):       self.pLabel.setdefault(labelList[i])       self.pLabel[labelList[i]] = np.sum(self.labelMat==labelList[i])/float(len(self.labelMat))    def seperateByClass(self):     seperated = {}     for i in range(len(self.dataMat)):       vector = self.dataMat[i]       if self.labelMat[i] not in seperated:         seperated[self.labelMat[i]] = []       seperated[self.labelMat[i]].append(vector)     return seperated    # 通過numpy array二維數組來獲取每一維每種數的概率   def getProbByArray(self, data):     prob = {}     for i in range(len(data[0])):       if i not in prob:         prob[i] = {}       dataSetList = list(set(data[:, i]))       for j in dataSetList:         if j not in prob[i]:           prob[i][j] = 0         prob[i][j] = np.sum(data[:, i] == j) / float(len(data[:, i]))     prob[0] = [1 / float(len(data[:,0]))] # 防止feature不存在的情況     return prob    def train(self):     featureNum = len(self.dataMat[0])     seperated = self.seperateByClass()     t_pNum = {} # 存儲每個類別下每個特征每種情況出現的概率     for label, data in seperated.iteritems():       if label not in t_pNum:         t_pNum[label] = {}       t_pNum[label] = self.getProbByArray(np.array(data))     self.pNum = t_pNum    def classify(self, data):     label = 0     pTest = np.ones(3)     for i in self.pLabel:       for j in self.pNum[i]:         if data[j] not in self.pNum[i][j]:           pTest[i] *= self.pNum[i][0][0]         else:           pTest[i] *= self.pNum[i][j][data[j]]     pMax = np.max(pTest)     ind = np.where(pTest == pMax)     return ind[0][0]    def test(self):     self.loadDataSet()     self.train()     pred = []     right = 0     for d in self.dataMat:       pred.append(self.classify(d))     for i in range(len(self.labelMat)):       if pred[i] == self.labelMat[i]:         right += 1     print right / float(len(self.labelMat))  if __name__ == '__main__':   NB = NaiveBayesClassifier()   NB.test() 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰兴市| 太仆寺旗| 高台县| 开江县| 陇南市| 张家口市| 武宁县| 砚山县| 汶上县| 红原县| 芒康县| 醴陵市| 宕昌县| 资兴市| 唐山市| 罗源县| 明溪县| 惠州市| 长泰县| 东城区| 龙川县| 石楼县| 界首市| 鹤庆县| 天津市| 常熟市| 武义县| 庆云县| 洪洞县| 黄浦区| 江华| 藁城市| 汶川县| 中阳县| 钟山县| 新民市| 五常市| 阜南县| 元氏县| 山西省| 孝感市|