python实现贝叶斯分类器_python实现简单的朴素贝叶斯分类器

本文使用的测试问题是“皮马印第安人糖尿病问题”

这个问题包括768个对于皮马印第安患者的医疗观测细节,记录所描述的瞬时测量取自患者的年龄,怀孕

和血液检查的次数。所有患者都是21岁以上的女性,所有属性都是数值型,而且属性的单位各不相同

每一个记录归属一个类,最后一列为类标签,表示患者是否在5年之内感染的糖尿病。

如果是,则为1,否则为0

下面是文件的地址,以.csv扩展名保存

第一次写,如有不足,请多多包涵

# -*- coding: utf-8 -*-

"""

Created on Wed Mar 29 10:49:47 2017

@author: Administrator

"""

import csv

import numpy as np

import math

#处理数据

data_name='data.csv'

np.random.seed(2017)

#训练集:80% 测试集: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]] #前八个为特征,最后一个为类别标签

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)

#提取训练集的属性特征

'''

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

'''

#训练集的同一类的均值,方差

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)

#假设数据服从高斯分布

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=[]

#对于测试集,判断其属于哪些类,并计算准确率,假设特征独立同分布

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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值