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))
最近事情比较多,先写到这,准确率67.51%