4、朴素贝叶斯法

1、原理

对于给定的训练数据集,首先基于特征条件独立假设学习输入、输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

朴素贝叶斯法通过训练数据集学习联合概率分布P(X,Y),通过学习先验概率分布

4、朴素贝叶斯法

和条件概率分布

4、朴素贝叶斯法

由于对条件概率作了条件独立性假设,因此称为朴素贝叶斯法。条件独立性假设为

4、朴素贝叶斯法

条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。

朴素贝叶斯法分类时,对给定的输入x,通过学习到的模型计算后验概率分布4、朴素贝叶斯法,将后验概率最大的类作为x的类输出。后验概率计算根据贝叶斯定理:

4、朴素贝叶斯法

从而朴素贝叶斯分类器可表示为

4、朴素贝叶斯法

由于分母对所有的4、朴素贝叶斯法都是相同的,因此

4、朴素贝叶斯法

2、朴素贝叶斯的参数估计

应用极大似然估计估计先验概率4、朴素贝叶斯法

4、朴素贝叶斯法

设第j个特征4、朴素贝叶斯法可能取值的集合为4、朴素贝叶斯法,条件概率4、朴素贝叶斯法的极大似然估计为

4、朴素贝叶斯法

3、学习与分类算法

4、朴素贝叶斯法

假设这里要被分类的类别有两类,类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