「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
贝叶斯方法——背景知识
贝叶斯分类:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
先验概率:根据以往经验和分析得到的概率。我们用𝑃(𝑌)来代表在没有训练 数据前假设𝑌拥有的初始概率。
后验概率:根据已经发生的事件来分析得到的概率。以𝑃(𝑌|𝑋)代表假设𝑋 成 立的情下观察到𝑌数据的概率,因为它反映了在看到训练数据𝑋 后𝑌成立的置信度。
联合概率:联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。𝑋与𝑌的联合概率表示为𝑃𝑋, 𝑌 、 𝑃(𝑋𝑌) 或𝑃(𝑋 ∩ 𝑌) 。 联合概率: 假设𝑋和𝑌都服从正态分布,那么𝑃(𝑋 < 5, 𝑌 < 0)就是一个联合概 率,表示 𝑋 < 5, 𝑌 < 0两个条件同时成立的概率。表示两个事件 共同发生的概率。 贝叶斯公式如下:
朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率 分布 𝑃(𝑋, 𝑌),然后求得后验概率分布𝑃(𝑌|𝑋)。 具体来说,利用训练数据学习𝑃(𝑋|𝑌)和𝑃(𝑌)的估计,得到联合概率分布: 𝑃(𝑋, 𝑌)=𝑃(𝑋|𝑌) 𝑃(𝑌)
贝叶斯原理
朴素贝叶斯法是典型的生成学习方法。 生成方法由训练数据学习联合概率分布 𝑃(𝑋, 𝑌),然后求得后验概率分 布𝑃(𝑌|𝑋)。具体来说,利用训练数据学习𝑃(𝑋|𝑌)和𝑃(𝑌)的估计,得到 联合概率分布: 𝑃(𝑋, 𝑌)=𝑃(𝑌)𝑃(𝑋|𝑌) 概率估计方法可以是极大似然估计或贝叶斯估计。
朴素贝叶斯法的基本方法是条件独立性。
ck代表类别,k代表类别个数。 这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减 少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易 于实现。其缺点是分类的性能不一定很高。
朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。
代码实现
我们用贝叶斯方法实现文本分类
我们判断1XM属于第几类
#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类型
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]
print(P_y[y])
print(pkey)
#求[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 = [1,'X','M']
# 该特征应属于哪一类
result = nb.classify(trainData, labels, features)
print (features,'属于',result)