本文使用的测试问题是“皮马印第安人糖尿病问题”
这个问题包括768个对于皮马印第安患者的医疗观测细节,记录所描述的瞬时测量取自患者的年龄,怀孕
和血液检查的次数。所有患者都是21岁以上的女性,所有属性都是数值型,而且属性的单位各不相同
每一个记录归属一个类,最后一列为类标签,表示患者是否在5年之内感染的糖尿病。
如果是,则为1,否则为0
下面是文件的地址,以.csv扩展名保存
第一次写,如有不足,请多多包涵
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 29 10:49:47
@author: Administrator
"""
import csv
import numpy as np
import math
#处理数据
data_name='data.csv'
np.random.seed()
#训练集: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))