python实现贝叶斯分类器_python实现简单的朴素贝叶斯分类器
本文使用的測(cè)試問題是“皮馬印第安人糖尿病問題”
這個(gè)問題包括768個(gè)對(duì)于皮馬印第安患者的醫(yī)療觀測(cè)細(xì)節(jié),記錄所描述的瞬時(shí)測(cè)量取自患者的年齡,懷孕
和血液檢查的次數(shù)。所有患者都是21歲以上的女性,所有屬性都是數(shù)值型,而且屬性的單位各不相同
每一個(gè)記錄歸屬一個(gè)類,最后一列為類標(biāo)簽,表示患者是否在5年之內(nèi)感染的糖尿病。
如果是,則為1,否則為0
下面是文件的地址,以.csv擴(kuò)展名保存
第一次寫,如有不足,請(qǐng)多多包涵
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 29 10:49:47 2017
@author: Administrator
"""
import csv
import numpy as np
import math
#處理數(shù)據(jù)
data_name='data.csv'
np.random.seed(2017)
#訓(xùn)練集:80% 測(cè)試集:20%
def splitData(filename):
testSets=[]
trainSets=[]
lines=list(csv.reader(open(filename,'r')))
for line in lines:
p=np.random.randint(100)
if p<20:
testSets.append(line)
else:
trainSets.append(line)
return trainSets,testSets
trainSets,testSets=splitData(data_name)
#分為特征和類別
def fea_and_class(trs,tes):
tr_feas0=[]
tr_feas1=[]
tr_dict={}
te_feas0=[]
te_feas1=[]
te_dict={}
for tr in trs:
tr_fea=[float(x) for x in tr[:8]]
tr_cl=int(tr[-1])
if tr_cl==0:
#tr_dict[tr_cl]=tr_fea
tr_feas0.append(tr_fea)
if tr_cl==1:
tr_feas1.append(tr_fea)
tr_dict[0]=tr_feas0
tr_dict[1]=tr_feas1
for te in tes:
te_fea=[float(x) for x in te[:8]] #前八個(gè)為特征,最后一個(gè)為類別標(biāo)簽
te_cl=int(te[-1])
#te_dict[te_cl]=te_fea
if te_cl==0:
te_feas0.append(te_fea)
if te_cl==1:
te_feas1.append(te_fea)
te_dict[0]=te_feas0
te_dict[1]=te_feas1
return tr_dict,te_dict
#return tr_dict,te_dict
tr_dict,te_dict=fea_and_class(trainSets,testSets)
#提取訓(xùn)練集的屬性特征
'''
trDict={}
tr=[]
te=[]
for i in range(len(tr_class)):
if tr_class[i][0]==0:
tr.append(trSets[i])
if tr_class[i][0]==1:
te.append(trSets[i])
trDict[0]=tr
trDict[1]=te
'''
#訓(xùn)練集的同一類的均值,方差
tr_mean0=np.mean(tr_dict[0],axis=0)
tr_var0=np.var(tr_dict[0],axis=0)
tr_mean1=np.mean(tr_dict[1],axis=0)
tr_var1=np.var(tr_dict[1],axis=0)
#假設(shè)數(shù)據(jù)服從高斯分布
def gaussian(x,mu,sigma):
val=1/math.sqrt(2*math.pi*sigma)
return val*(math.exp((-(x-mu)**2)/(2*sigma)))
#values=gaussian(10.0,tr_mean0[0],tr_var0[0])
pre_cla0=[]
pre_cla1=[]
#對(duì)于測(cè)試集,判斷其屬于哪些類,并計(jì)算準(zhǔn)確率,假設(shè)特征獨(dú)立同分布
for te0 in te_dict[0]:
val0=1
val1=1
for i in range(len(te0)):
val0=gaussian(te0[i],tr_mean0[i],tr_var0[i])
val0*=val0
val1=gaussian(te0[i],tr_mean1[i],tr_var1[i])
val1*=val1
if val0>val1:
classes=0
else:
classes=1
pre_cla0.append(classes)
for te1 in te_dict[1]:
val0_=1
val1_=1
for i in range(len(te1)):
val0_=gaussian(te1[i],tr_mean0[i],tr_var0[i])
val0_*=val0_
val1_=gaussian(te1[i],tr_mean1[i],tr_var1[i])
val1_*=val1_
if val0_>val1_:
classes=0
else:
classes=1
pre_cla1.append(classes)
count=0
for pre_cla0_each in pre_cla0:
if pre_cla0_each==0:
count+=1
for pre_cla1_each in pre_cla1:
if pre_cla1_each==1:
count+=1
acc=count/(len(pre_cla0)+len(pre_cla1))
總結(jié)
以上是生活随笔為你收集整理的python实现贝叶斯分类器_python实现简单的朴素贝叶斯分类器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python与材料计算公式_《从问题到程
- 下一篇: 北京环球影城淡旺季时间