• 朴素贝叶斯

    • 一、连续型

      • 1.计算高斯概率密度CalcuGaussProb(x,mean,stdev)
      • 2.获取各类别中各特征的均值、方差和标签集getMeanStdLabel(self,train_data)
      • 3. 计算连续型数据所属类的概率CalcuClassProbCon(arr,cx_mean,cx_std)
      • 4.获取单个样本的预测类别predict(arr,cmean,cstd,label_array)
      • 5.获取整个数据集的预测结果getPredictions(testarr,cmean,cstd,label_array)
      • 6.计算准确率
    • 二、离散型
      • 1.初始化init(lamda=1)
      • 2.获取相关参数 getParams(data)
      • 3.计算先验概率 calPriorProb()
      • 4.计算条件概率 calCondProb()
      • 5.预测给定一个实例 predict(traindata,testdata)
      • 6.计算预测准确度getAccuracy(traindata,testdata)
    • 三、数据集测试
      • 1.连续型
      • 2.离散型

朴素贝叶斯

一、连续型

当特征中数据是连续型时,通常有两种方法来估计条件概率。
第一种方法是把每一个连续的数据离散化,然后用相应的离散区间替换连续数值。这种方法对于划分离散区间的粒度要求较高,不能太细,也不能太粗。
第二种方法是假设连续数据服从某个概率分布,使用训练数据估计分布参数,通常我们用高斯分布来表示连续数据的类条件概率分布。
此处我们使用第二种方法:

1.计算高斯概率密度CalcuGaussProb(x,mean,stdev)

公式为:
12πσ2−−−−√e(−12σ2(x−μ)2)12πσ2e(−12σ2(x−μ)2)\sqrt{\frac{1}{2πσ^2}}e^{(-\frac{1}{2σ^2}(x-μ)^2)}
μ为均值,σ2σ2σ^2为方差,σ为标准差
给定来自训练数据中已知特征的均值和标准差后,可以使用高斯函数来评估一个给定的特征值的概率。即用高斯概率密度函数来表示条件概率P(x(j)|ck)P(x(j)|ck)P(x^{(j)}|c_k)

#计算高斯概率密度函数
def CalcuGaussProb(self,x,mean,stdev):exponent = np.exp(-(np.power(x-mean,2))/(2*np.power(stdev,2)))GaussProb = (1/(np.sqrt(2*np.pi)*stdev))*exponentreturn GaussProb

2.获取各类别中各特征的均值、方差和标签集getMeanStdLabel(self,train_data)

获取类标签,并获取每个类中各个特征的均值和方差

#获取训练集每一类中每个特征的均值和方差以及类标签的取值集合
def getMeanStdLabel(self,train_data):label_counts=train_data.label.value_counts()label_arr=np.array(label_counts.index)label_arr.sort()#得到除标签外特征数num_feature = len(train_data.columns.values) - 1#按类别划分数据names = locals()for i in range(len(label_arr)):names['c%s' % i] = train_data[train_data["label"]==label_arr[i]]#按类别对每个属性求均值和方差c_mean=[]c_std=[]for j in range(len(label_arr)):names['mc%s' % j] = []names['sc%s' % j] = []for k in range(num_feature):names['mc%s' % j].append(np.mean(names['c%s' % j][k]))names['sc%s' % j].append(np.std(names['c%s' % j][k],ddof=1))for x in range(len(label_arr)):c_mean.append(names['mc%s' % x])c_std.append(names['sc%s' % x])names['arr_c%s' % x] = np.array(names['c%s' % x])return c_mean,c_std,label_arr

3. 计算连续型数据所属类的概率CalcuClassProbCon(arr,cx_mean,cx_std)

n个样本的样本集为xi∈{x1,x2,...,xn}xi∈{x1,x2,...,xn}x_i\in\{x_1,x_2,...,x_n\},第i个样本xixix_i有m个特征x(j)i∈{x(1)i,x(2)i,...,x(m)i}xi(j)∈{xi(1),xi(2),...,xi(m)}x_i^{(j)}\in\{x_i^{(1)},x_i^{(2)},...,x_i^{(m)}\}
对于一个样本属于某类的概率,我们用这个样本所有特征概率之乘积来表示,即∏j=1mP(x(j)|ck)∏j=1mP(x(j)|ck)\prod\limits_{j=1}^mP(x^{(j)}|c_k)

#计算连续数据所属类的概率
def CalcuClassProbCon(self,arr,cx_mean,cx_std):cx_probabilities=1for i in range(len(cx_mean)):cx_probabilities *= self.CalcuGaussProb(arr[i],cx_mean[i],cx_std[i])return cx_probabilities

4.获取单个样本的预测类别predict(arr,cmean,cstd,label_array)

对于单个样本返回预测结果,即比较所有类别下,这个样本的概率,找到最大的概率值,返回其类别和概率值。
传入测试样本、均值、方差和标签集合。

#单一样本预测
def predict(self,trainData,testData):prob = []#print(trainData)self.cmean,self.cstd,self.label_array=self.getMeanStdLabel(trainData)for i in range(len(self.cmean)):cx_mean = self.cmean[i] #x类的均值cx_std = self.cstd[i] #x类的方差#print(testData)prob.append(self.CalcuClassProbCon(testData,cx_mean,cx_std)) #将计算得到的各类别概率存入列表bestLabel,bestProb = None,-1 #初始化最可能的类和最大概率值    for i in range(len(prob)): #找到所有类别中概率值最大的类if prob[i] > bestProb:bestProb = prob[i]bestLabel = self.label_array[i]return bestLabel,bestProb

5.获取整个数据集的预测结果getPredictions(testarr,cmean,cstd,label_array)

#整个数据集预测
def getPredictions(self,TrainData,TestData):self.prediction = []self.testdata = np.array(TestData)for i in range(len(self.testdata)):result,proby = self.predict(TrainData,self.testdata[i])self.prediction.append(result)return self.prediction

6.计算准确率

同理推广到整个数据集(测试集)上,通过比对预测结果和真实标签,计算出准确率
acc=预测正确数数据集总数acc=预测正确数数据集总数acc=\frac{预测正确数}{数据集总数}

#计算准确性
def getAccuracy(self):correct = 0for i in range(len(self.testdata)):if(self.testdata[i][-1]==self.prediction[i]):correct += 1return (correct/float(len(self.testdata)))*100.0

二、离散型

1.初始化init(lamda=1)

lamda为贝叶斯平滑因子,默认取1(即拉普拉斯平滑)

def __init__(self,lamda=1):self.lamda = lamda

2.获取相关参数 getParams(data)

#获取相关参数
def getParams(self,data):self.ck_counts = data.label.value_counts()#训练样本中类为ck的数量集合self.ck_name = np.array(self.ck_counts.index)#训练样本中类ck名称集合    self.DataNum = len(data)#训练样本总数Nself.CNum = len(self.ck_counts)#类的个数Kself.DataSet = data

3.计算先验概率 calPriorProb()

先验概率:Pλ(Y=ck)=∑i=1NI(yi=ck)+λN+KλPλ(Y=ck)=∑i=1NI(yi=ck)+λN+KλP_λ(Y=c_k)=\frac{\sum\limits_{i=1}^NI(y_i=c_k)+λ}{N+Kλ}
∑i=1NI(yi=ck)∑i=1NI(yi=ck)\sum\limits_{i=1}^NI(y_i=c_k),用ck_counts表示

#计算先验概率
def calPriorProb(self):self.ck_PriorProb = []for i in range(self.CNum):cx_PriorProb = (self.ck_counts[i]+self.lamda)/(self.DataNum+self.CNum*self.lamda)self.ck_PriorProb.append(cx_PriorProb)

4.计算条件概率 calCondProb()

条件概率:Pλ(X(j)=ajl|Y=ck)=∑i=1NI(x(j)i=ajl,yi=ck)+λ∑i=1NI(yi=ck)+mλPλ(X(j)=ajl|Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+mλP_λ(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum\limits_{i=1}^NI(x_i^{(j)}=a_{jl},y_i=c_k)+λ}{\sum\limits_{i=1}^NI(y_i=c_k)+mλ}
我们将计算得到的每个类的每个特征取值的条件概率存起来

#计算条件概率
def calCondProb(self):names = locals()#使用动态变量self.CondProb = []#存储所有类别的所有特征取值的条件概率self.feat_value = []#所有特征取值列表#对于每一类别的数据集for i in range(len(self.ck_name)):names['Q%s' % i] = self.DataSet[self.DataSet["label"]==self.ck_name[i]]#按类别划分数据集names['ConProbC%s' % i] = []#定义动态变量,表示各类别中所有特征取值的条件概率集合feature_arr = self.DataSet.columns.tolist()[0:len(self.DataSet.columns)-1]#获取训练数据集特征集#对于每一个特征求该特征各个取值的条件概率for feature in (feature_arr):names['Q%s' % feature]=[]#定义动态变量,表示某个类别的某个特征的所有取值条件概率#对于某个特征的所有可能取值求条件概率for value in self.DataSet[feature].value_counts().index.tolist():#生成所有特征取值列表if value not in self.feat_value:#如果这个取值不在列表中,则加入这个取值self.feat_value.append(value)#这里用了拉普拉斯平滑,使得条件概率不会出现0的情况#如果某个类的某个特征取值在训练集上都出现过,则这样计算if value in names['Q%s' % i][feature].value_counts():temp = (names['Q%s' % i][feature].value_counts()[value]+self.lamda)/(names['Q%s' % i][feature].value_counts().sum()+len(names['Q%s' % i][feature].value_counts())*self.lamda)#如果某个类的某个特征取值并未在训练集上出现,为了避免出现0的情况,分子取1(即lamda平滑因子,取1时为拉普拉斯平滑)else:temp = self.lamda/(names['Q%s' % i][feature].value_counts().sum()+len(names['Q%s' % i][feature].value_counts())*self.lamda)#将求得的特征取值条件概率加入列表names['Q%s' % feature].append(temp)#将得到的某个类别的某个特征的所有取值条件概率列表加入某个类别中所有特征取值的条件概率集合names['ConProbC%s' % i].extend(names['Q%s' % feature])#将某个类别中所有特征取值的条件概率集合加入所有类别所有特征取值的条件概率集合self.CondProb.append(names['ConProbC%s' % i])#将所有特征取值列表也加入所有类别所有特征取值的条件概率集合(后面用来做columns--列索引)self.CondProb.append(self.feat_value)#用类别名称的集合来生成行索引indexindex = self.ck_name.tolist()index.extend(['other'])#此处由于我最后一行是feat_value,后面会删掉,因此在行索引上也多加一个,后面删掉#将所有类别所有特征取值的条件概率集合转换为DataFrame格式self.CondProb = pd.DataFrame(self.CondProb,columns=self.CondProb[self.CNum],index = index)self.CondProb.drop(['other'],inplace = True)

5.预测给定一个实例 predict(traindata,testdata)

#对一个样本进行预测
def predict(self,traindata,testdata):self.getParams(traindata)#获取参数self.calPriorProb()#获取先验概率self.calCondProb()#获取条件概率self.ClassTotalProb = []#初始化各类别总概率列表bestprob = -1#初始化最高概率bestfeat = ''#初始化最可能类别for feat in self.ck_name:pp = self.ck_PriorProb[self.ck_name.tolist().index(feat)]#pp为先验概率cp = 1#初始化条件概率for value in self.feat_value:if value in testdata.value_counts().index.tolist():cp = cp * self.CondProb[value][feat]#计算各特征取值的条件概率之积TotalProb = pp * cp#条件概率之积与先验概率相乘self.ClassTotalProb.append(TotalProb)#找到最可能类别和其概率    for i in range(len(self.ck_name)):if self.ClassTotalProb[i] > bestprob:bestprob = self.ClassTotalProb[i]bestfeat = self.ck_name[i]return bestprob,bestfeat

6.计算预测准确度getAccuracy(traindata,testdata)

#计算预测准确度
def getAccuracy(self,traindata,testdata):num = 0realFeat = testdata.label.tolist()for i in range(len(testdata)):temp = testdata.iloc[i][0:len(testdata.columns)-1]    predProb,predFeat = self.predict(traindata,temp)print(predProb,predFeat,realFeat[i])if(realFeat[i] == predFeat):num = num + 1acc = num / len(realFeat)return acc

三、数据集测试

1.连续型

用的是pima印第安人糖尿病数据集来测试

diabetes = pd.read_csv(path+"pima-indians-diabetes.csv")
dia_train,dia_test = train_test_split(diabetes,test_size=0.1)
model_NBC = NaiveBayesContinuous()
model_NBC.getPredictions(dia_train,dia_test)
acc1 = model_NBC.getAccuracy()
print("准确率:","%.2f" % acc1,"%")
准确率: 83.12 %

2.离散型

用的是汽车性价比CarEvalution数据集来测试

car = pd.read_csv(path+"CarEvalution.csv")
car_train,car_test = train_test_split(car,test_size=0.1)
model_NBD = NaiveBayesDiscrete()
acc2 = model_NBD.getAccuracy(car_train,car_test)
print("%.2f" % acc2,"%")
87.02 %

代码
参考
原理

【机器学习实战】朴素贝叶斯(连续型/离散型)相关推荐

  1. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)

    <机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...

  2. 机器学习实战 朴素贝叶斯分类器

    基于概率论的分类方法: 朴素贝叶斯 我的微信公众号: s406205391; 欢迎大家一起学习,一起进步!!! k-近邻算法和决策树会给出"该数据属于哪一类"的明确回答.不过,分类 ...

  3. 机器学习实战—朴素贝叶斯及要点注解

    书籍:<机器学习实战>中文版 IDE:PyCharm Edu 4.02 环境:Adaconda3  python3.6 #!/usr/bin/env python3 # -*- codin ...

  4. 机器学习:朴素贝叶斯模型算法原理(含实战案例)

    机器学习:朴素贝叶斯模型算法原理 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页

  5. 机器学习:朴素贝叶斯

    机器学习:朴素贝叶斯 1 朴素贝叶斯应用场景 2 朴素贝叶斯相关公式 3 sklearn库中朴素贝叶斯运用 3.1 伯努利朴素贝叶斯 3.2 多项式朴素贝叶斯 3.3 高斯朴素贝叶斯 4 代码 4.1 ...

  6. 机器学习之朴素贝叶斯方法(Naive Bayes)原理和实现

    目录 一.贝叶斯理论 二.实战朴素贝叶斯 实战朴素贝叶斯1 实战朴素贝叶斯3 三.scikit-learn中朴素贝叶斯的分类算法的适用 四.贝叶斯算法的优缺点 一.贝叶斯理论 贝叶斯模型 现在我们来看 ...

  7. 【机器学习】朴素贝叶斯、SVM和数据分布检验分析

    [机器学习]朴素贝叶斯.SVM和数据分布检验分析 文章目录 1 朴素贝叶斯 2 SVM2.1 线性可分2.2 最大间隔超平面2.3 SVM 最优化问题 3 数据分布检验方法3.1 数据分布检验3.2 ...

  8. 机器学习之朴素贝叶斯 1

    机器学习之朴素贝叶斯 1 朴素贝叶斯 2 朴素贝叶斯应用 3 代码实现贝努力朴素贝叶斯 4 代码实现高斯朴素贝叶斯 5 代码实现多项式朴素贝叶斯 6 总结 前言:主要介绍朴素贝叶斯的概念.公式,以及代 ...

  9. 【机器学习算法-朴素贝叶斯、支持向量机】

    机器学习算法-朴素贝叶斯算法 1.朴素贝叶斯算法 2.支持向量机 2.1SVM基本综述 1.朴素贝叶斯算法 朴素贝叶斯是生成模型,需要根据已有的数据求出先验概率. 1.联合概率 2.条件概率 3.相互 ...

  10. 朴素贝叶斯 php,PHP实现机器学习之朴素贝叶斯算法详解.pdf

    PHP实实现现机机器器学学习习之之朴朴素素贝贝叶叶斯斯算算法法详详解解 本文实例讲述了PHP实现机器学习之朴素贝叶斯算法.分享给大家供大家参考 具体如下: 机器学习已经在我们的生活中变得随处可见了.比 ...

最新文章

  1. 一起谈.NET技术,C#中int和System.Int32理解总结
  2. silverlight 类似百度的图片浏览器,视频播放,附件下载功能,全部后台程序。...
  3. 的日志在哪里_写给大忙人看的,MyBatis日志如何做到兼容所有常用的日志框架?...
  4. 【论文解读】NLP重铸篇之Word2vec
  5. vue中waiting for update signal from wds_10个vue快捷开发技巧助你成为中级前端工程师!(二)...
  6. visual stdio 工程 宏
  7. MySQL/MariaDB表表达式(3):视图
  8. [转]static和final的区别
  9. TF-Lite极简参考-模型转换
  10. 阵列信号处理知识点合集
  11. 五种线粒体呼吸链复合体研究工具
  12. Python函数和面向对象,小白看了都说好
  13. 【论文阅读笔记】High Quality Monocular Depth Estimation via Transfer Learning
  14. 【云和恩墨大讲堂】罗海雄 | 如何在不改SQL的情况下优化数据库
  15. php公众号自动回复链接,微信公众号自动回复超链接怎么添加-微信公众号添加自动回复超链接的方法 - 河东软件园...
  16. Unix timestamp时间 与 普通时间 转换方法
  17. Vue 响应式实现原理深入浅出
  18. Android中的加密方法
  19. 软工实践第三次作业-结对项目1
  20. 5, excel vba 修改单元格里的数据

热门文章

  1. C++ using declaration
  2. 无线运维的起源与项目建设思考
  3. 一个计算机毕业生的求职经验
  4. Pytorch丨expand函数
  5. 集成QQ钱包---踩坑
  6. 【计量经济学导论】12. 格兰杰因果关系检验
  7. python英文怎么读-python英文怎么读
  8. Emlog采集插件 刀网资源采集 一键显示资源1.1
  9. 【重磅新闻】罗永浩约战王自如:一场两败俱伤的战役!
  10. Swagger 3.0