开启生长之旅!这是我参加「日新方案 12 月更文挑战」的第29天,点击查看活动概况
目录
条件概率
朴素贝叶斯代码完成python
python 标题(朴素贝叶斯)
拉普拉斯滑润 =1 K=2, S=3; =1 拉普拉斯滑润
生成形式和判别形式的差异
- P(B)称为”先验概率”,即在A事情产生之前,对B事情概率的一个判断。
- P(B|A)称为”后验概率”,即在A事情产生之后,对B事情概率的从头评价。
- P(A|B)/P(A)称为”可能性函数”,这是一个调整因子,使得预估概率更挨近真实概率。
- 后验概率=先验概率*调整因子
条件概率
求解小硬币的个数;
朴素贝叶斯代码完成python
机器学习之朴素贝叶斯算法详解_平原的博客-CSDN博客_朴素贝叶斯算法
一、 朴素贝叶斯
1、概率基础知识:
条件概率是指事情A在另外一个事情B现已产生条件下的产生概率。 条件概率表明为: P(A|B), 读作“在B条件下A的概率”。
若只要两个事情A, B, 那么:
全概率公式: 表明若事情A1,A2,…,An构成一个完备事情组且都有正概率,则对任意一个事情B都有公式建立。
python 标题(朴素贝叶斯)
第一阶段——准备阶段, 依据具体状况确定特征特点, 对每个特征特点进行恰当划分, 然后由人工对一部分待分类项进行分类,构成练习样本调集。这一阶段的输入是一切待分类数据,输出是特征特点和练习样本。这一阶段是整个朴素贝叶斯分类中仅有需要人工完结的阶段, 其质量对整个过程将有重要影响,分类器的质量很大程度上由特征特点、特征特点划分及练习样本质量决议。
第二阶段——分类器练习阶段, 这个阶段的使命就是生成分类器,首要作业是核算每个类别在练习样本中的呈现频率及每个特征特点划分对每个类别的条件概率估量, 并将结果记载。 其输入是特征特点和练习样本,输出是分类器。这一阶段是机械性阶段, 依据前面评论的公式可以由程序主动核算完结。
第三阶段——应用阶段。 这个阶段的使命是运用分类器对待分类项进行分类, 其输入是分类器
和待分类项, 输出是待分类项与类别的映射联系。这一阶段也是机械性阶段, 由程序完结。
#coding:utf-8
# 极大似然估量 朴素贝叶斯算法
import pandas as pd
import numpy as np
class NaiveBayes(object):
def getTrainSet(self):
dataSet = pd.read_csv('naivebayes_data.csv')
dataSetNP = np.array(dataSet) #将数据由dataframe类型转换为数组类型
trainData = dataSetNP[:,0:dataSetNP.shape[1]-1] #练习数据x1,x2
labels = dataSetNP[:,dataSetNP.shape[1]-1] #练习数据所对应的所属类型Y
return trainData, labels
def classify(self, trainData, labels, features):
#求labels中每个label的先验概率
labels = list(labels) #转换为list类型
labels = list(labels) #转换为list类型
P_y = {} #存入label的概率
for label in labels:
P_y[label] = labels.count(label)/float(len(labels)) # p = count(y) / count(Y)
#求label与feature同时产生的概率
P_xy = {}
for y in P_y.keys():
y_index = [i for i, label in enumerate(labels) if label == y] # labels中呈现y值的一切数值的下标索引
for j in range(len(features)): # features[0] 在trainData[:,0]中呈现的值的一切下标索引
x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]
xy_count = len(set(x_index) & set(y_index)) # set(x_index)&set(y_index)列出两个表相同的元素
pkey = str(features[j]) + '*' + str(y)
P_xy[pkey] = xy_count / float(len(labels))
#求条件概率
P = {}
for y in P_y.keys():
for x in features:
pkey = str(x) + '|' + str(y)
P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y]) #P[X1/Y] = P[X1Y]/P[Y]
#求[2,'S']所属类别
F = {} #[2,'S']归于各个类别的概率
for y in P_y:
F[y] = P_y[y]
for x in features:
F[y] = F[y]*P[str(x)+'|'+str(y)] #P[y/X] = P[X/y]*P[y]/P[X],分母持平,比较分子即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y]
features_label = max(F, key=F.get) #概率最大值对应的类别
return features_label
if __name__ == '__main__':
nb = NaiveBayes()
# 练习数据
trainData, labels = nb.getTrainSet()
# x1,x2
features = [2,'S']
# 该特征应归于哪一类
result = nb.classify(trainData, labels, features)
print (features,'归于',result)
修改
朴素贝叶斯算法–python完成 – 一叶舟鸣 – 博客园
拉普拉斯滑润 =1 K=2, S=3; =1 拉普拉斯滑润
在估量条件概率P(X|Y)时呈现概率为0的状况怎么办?
简略来说:引入,当=1时称为拉普拉斯滑润。
#coding:utf-8
#朴素贝叶斯算法 贝叶斯估量, =1 K=2, S=3; =1 拉普拉斯滑润
import pandas as pd
import numpy as np
class NavieBayesB(object):
def __init__(self):
self.A = 1 # 即=1
self.K = 2
self.S = 3
def getTrainSet(self):
trainSet = pd.read_csv('naivebayes_data.csv')
trainSetNP = np.array(trainSet) #由dataframe类型转换为数组类型
trainData = trainSetNP[:,0:trainSetNP.shape[1]-1] #练习数据x1,x2
labels = trainSetNP[:,trainSetNP.shape[1]-1] #练习数据所对应的所属类型Y
return trainData, labels
def classify(self, trainData, labels, features):
labels = list(labels) #转换为list类型
#求先验概率
P_y = {}
for label in labels:
P_y[label] = (labels.count(label) + self.A) / float(len(labels) + self.K*self.A)
#求条件概率
P = {}
for y in P_y.keys():
y_index = [i for i, label in enumerate(labels) if label == y] # y在labels中的一切下标
y_count = labels.count(y) # y在labels中呈现的次数
for j in range(len(features)):
pkey = str(features[j]) + '|' + str(y)
x_index = [i for i, x in enumerate(trainData[:,j]) if x == features[j]] # x在trainData[:,j]中的一切下标
xy_count = len(set(x_index) & set(y_index)) #x y同时呈现的次数
P[pkey] = (xy_count + self.A) / float(y_count + self.S*self.A) #条件概率
#features所属类
F = {}
for y in P_y.keys():
F[y] = P_y[y]
for x in features:
F[y] = F[y] * P[str(x)+'|'+str(y)]
features_y = max(F, key=F.get) #概率最大值对应的类别
return features_y
if __name__ == '__main__':
nb = NavieBayesB()
# 练习数据
trainData, labels = nb.getTrainSet()
# x1,x2
features = [2,' U']
# 该特征应归于哪一类
result = nb.classify(trainData, labels, features)
print (features,'归于',result)
修改
【朴素:特征条件独立 贝叶斯:基于贝叶斯定理】
1朴素贝叶斯的概念【联合概率散布、先验概率、条件概率**、全概率公式】【条件独立性假定、】 极大似然估量
2优缺陷
【长处: 分类功率安稳;对缺失数据不灵敏,算法比较简略,常用于文本分类;在特点相关性较小时,该算法功能最好 缺陷:假定特点之间相互独立;先验概率多取决于假定;对输入数据的表达形式很灵敏】
3先验概率、后验概率
先验概率的核算比较简略,没有运用贝叶斯公式;
而后验概率的核算,要运用贝叶斯公式,并且在利用样本资料核算逻辑概率时,还要运用理论概率散布,需要更多的数理统计知识。
4朴素贝叶斯的参数估量:
①极大似然估量(可能呈现概率为0的状况)②贝叶斯估量(加入常数,拉普拉斯滑润)
在估量条件概率P(X|Y)时呈现概率为0的状况怎么办?
简略来说:引入,当=1时称为拉普拉斯滑润。
4、 朴素贝叶斯的优缺陷
长处:对小规模的数据表现很好,合适多分类使命,合适增量式练习。
缺陷:对输入数据的表达形式很灵敏(离散、连续,值极大极小之类的)。
重点:
面试的时候怎么回答朴素贝叶斯呢?
首先朴素贝斯是一个生成模型(很重要),其次它通过学习已知样本,核算出联合概率,再求条件概率。
生成形式和判别形式的差异
生成形式:由数据学得联合概率散布,求出条件概率散布P(Y|X)的猜测模型;
常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、约束玻尔兹曼机
判别形式:由数据学得决策函数或条件概率散布作为猜测模型
常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场
朴素贝叶斯算法–python完成 – 一叶舟鸣 – 博客园
机器学习之朴素贝叶斯算法详解_平原的博客-CSDN博客_朴素贝叶斯算法