4、朴素贝叶斯法
1、原理
对于给定的训练数据集,首先基于特征条件独立假设学习输入、输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y),通过学习先验概率分布
和条件概率分布
由于对条件概率作了条件独立性假设,因此称为朴素贝叶斯法。条件独立性假设为
条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。
朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布,将后验概率最大的类作为x的类输出。后验概率计算根据贝叶斯定理:
从而朴素贝叶斯分类器可表示为
由于分母对所有的都是相同的,因此
2、朴素贝叶斯的参数估计
应用极大似然估计估计先验概率为
设第j个特征可能取值的集合为,条件概率的极大似然估计为
3、学习与分类算法
假设这里要被分类的类别有两类,类c1和c2,那么我们需要计算概率P(c1|x,y)和P(c2|x,y)的大小并进行比较:
如果:p(c1|x,y)>p(c2|x,y),则(x,y)属于类c1
p(c1|x,y)<p(c2|x,y),则(x,y)属于类c2
实现代码
import numpy as np
from functools import reduce
class NaiveBayesClassifier(object):
def __init__(self):
self.dataMat = list()
self.labelMat = list()
self.pLabel1 = 0
self.p0Vec = list()
self.p1Vec = list()
def loadDataSet(self, filename):
fr = open(filename)
for line in fr.readlines():
lineArr = line.strip().split()
dataLine = list()
for i in lineArr:
dataLine.append(float(i))
label = dataLine.pop()
self.dataMat.append(dataLine)
self.labelMat.append(int(label))
def train(self):
dataNum = len(self.dataMat)
featureNum = len(self.dataMat[0])
self.pLabel1 = sum(np.array(self.labelMat) / float(dataNum))
p0Num = np.zeros(featureNum)
p1Num = np.zeros(featureNum)
p0Denom = 1.0
p1Denom = 1.0
for i in range(dataNum):
if self.labelMat[i] == 1:
p1Num += self.dataMat[i]
p1Denom += sum(self.dataMat[i])
else:
p0Num += self.dataMat[i]
p0Denom += sum(self.dataMat[i])
self.p0Vec = p0Num / p0Denom
self.p1Vec = p1Num / p1Denom
def classify(self, data):
p1 = reduce(lambda x, y: x * y, data * self.p1Vec) * self.pLabel1
p0 = reduce(lambda x, y: x * y, data * self.p0Vec) * (1 - self.pLabel1)
if p1 > p0:
return 1
else:
return 0
def test(self):
self.loadDataSet('testNB.txt')
self.train()
print(self.classify([1, 2]))
if __name__ == '__main__':
NB = NaiveBayesClassifier()
NB.test()
代码转自 https://www.cnblogs.com/yechanglv/p/6947283.html
数据集
0 0 0
0 0 1
0 0 0
0 0 1
0 0 0
0 0 1
1 0 0
0 0 1
1 0 0
0 0 1
1 0 0
1 0 1
1 1 0
1 0 1
1 1 0
1 1 1
1 1 0
1 1 1
1 1 0
1 1 1