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%python

相關文章
相關標籤/搜索