朴素贝叶斯法(Naive Bayes)

综述

朴素贝叶斯法是基于贝叶斯定理与条件独立假设的分类方法。
首先要知道一些基本统计学的知识:
1、条件概率
2、联合概率
3、独立性
4、独立同分布
5、贝叶斯定理
定理公式不好敲,这里偷懒就不写了,查看概率论的书,就知道了。

代码实现

版本1:DIY版本

# coding:utf-8

import numpy as np

X = np.array([[1,1],[1,2],[1,2],[1,1],[1,1],[2,1],[2,2],[2,2],[2,3],[2,3],[3,3],[3,2],[3,2],[3,3],[3,3]]) 
# print(np.shape(X))
Y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
input_x = np.array([2,1])


class NB(object):
    def __init__(self,X,Y):
        self.X = X
        self.Y = Y
        self.N = len(Y)  #实例的个数
        self.K = len(X[0])  #特征的维数
        self.M = len(set(self.Y))   #类别的个数

    def cal_pri_prb(self):  # 计算先验概率

        p_p = dict()  #先验概率
        p_n = dict() #记录频数
        for y in set(self.Y):
            sum = 0
            for y_i in self.Y:
                if y==y_i:
                    sum = sum+1
                else:
                    pass
            p_p[y] = sum/self.N
            p_n[y] = sum 
        return p_p,p_n

    def cond_prb(self,p_p,p_n):   # 计算条件概率   
        p = list()   #用来存放条件概率乘积    
        for y in set(self.Y):  # y=(1,-1)
            p1 =1
            for j in range(self.K): # j = 0,1
                sum = 0
                for i,x in enumerate(self.X):
                    if (x[j]==input_x[j] and self.Y[i]==y):
                        sum = sum+1           
                pred = sum/p_n[y]
                p1 = p1*pred
            p.append(p1)
        y_result = dict()                     
        for i,y in enumerate(list(set(self.Y))):
                y_result[y] = p_p[y]*p[i]
        result = sorted(y_result.values())[-1]
        return y_result,result

    def show_result(self,y_result,result):
        show_dict = {v:k for k,v in  y_result.items()}
        print("预测结果为",show_dict[result])

nb = NB(X,Y)
p_p,p_n = nb.cal_pri_prb()
y_result,result =  nb.cond_prb(p_p,p_n)
nb.show_result(y_result,result) 
>>>
预测结果为 -1           



版本2:使用sklearn版本

#coding:utf-8

import numpy as np
from sklearn.naive_bayes import GaussianNB

X = np.array([[1,1],[1,2],[1,2],[1,1],[1,1],[2,1],[2,2],[2,2],[2,3],[2,3],[3,3],[3,2],[3,2],[3,3],[3,3]]) 
Y = np.array([-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1])
input_x = np.array([[2,1]])


gnb = GaussianNB()
y_pred = gnb.fit(X,Y).predict(input_x)
print(y_pred) 

>>>
[-1]

参考:《统计学习方法》–李航

猜你喜欢

转载自blog.csdn.net/liushui94/article/details/78698599