监督学习之朴素贝叶斯算法

1.条件概率

在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。其公式如下:
在这里插入图片描述

1.全概率公式

如果A和A’构成样本空间的一个划分,那么事件B的概率,就等于A和A’的概率分别乘以B对这两个事件的条件概率之和。其公式如下:
在这里插入图片描述

1.贝叶斯推断

对条件概率公式进行变形,可以得到如下形式:
在这里插入图片描述
我们把P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。

P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

1.朴素贝叶斯推断

若事件A和事件B相互独立,则P(AB)=P(A)*P(B)
在这里插入图片描述

import numpy as np
from functools import reduce
def loadDataSet():
    X_train=np.array([[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],
                      [0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],
                      [1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,1],
                      [1,1,1,0],[1,1,1,1]])
    y=np.array([0,0,0,1,
                0,1,1,1,
                1,1,1,1,
                1,1])
    return X_train,y

def Classifier(x,y):
    p1num=np.zeros(len(x[0]))
    p1matrix=0
    p0num=np.zeros(len(x[0]))
    p0matrix=0
    for i in range(len(x)):
        if y[i]==1:
            p1num+=x[i]
            p1matrix+=sum(x[i])
        else:
            p0num+=x[i]
            p0matrix+=sum(x[i])
    # 可能出现数据下溢出,这是由于太多很小的数相乘造成的。
    #在test函数中,两个小数相乘,越乘越小,这样就造成了下溢出。
    p1V=p1num/p1matrix
    p0V=p0num/p0matrix
    p1Class=sum(y)/float(len(x))
    return p0V,p1V,p1Class

def test(data,p0v,p1v,p1c):
    p1 = reduce(lambda x,y:x*y,data*p1v)*p1c
    p0 = reduce(lambda  x,y:x*y,data*p0v)*(1-p1c)
    print("p0:",p0)
    print("p1:",p1)
    if p1 > p0:
        return 1
    else:
        return 0

def main():
    x,y=loadDataSet()
    p0v,p1v,p1class=Classifier(x,y)
    print("p0v:",p0v)
    print("p1v:", p1v)
    print("p1class:", p1class)
    testData = np.array([0,0,1,1])
    res=test(testData,p0v,p1v,p1class)
    if res==0:
        print("测试数据属于第0类")
    else:
        print("测试数据属于第1类")
if __name__=="__main__":

运行结果如下:
在这里插入图片描述

import numpy as np
from functools import reduce

'''
初始化数据
X_train:训练数据
y:数据对应的标签
'''
def loadDataSet():
    # X_train=np.array([[1,1,0,1],[0,1,0,1],[0,0,1,1],[1,0,1,0]])
    # y=np.array([1,0,1,0])
    X_train=np.array([[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],
                      [0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],
                      [1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,1],
                      [1,1,1,0],[1,1,1,1]])
    y=np.array([0,0,0,1,
                0,1,1,1,
                1,1,1,1,
                1,1])
    return X_train,y

'''
分类器
p1num:属于类别1的每列数据求和
p0num:属于类别0的每列数据求和
p1matrix:属于类别1的标签个数
p1matrix:属于类别0的标签个数
p1class:属于类别1标签的概率
'''
def Classifier(x,y):
    p1num=np.ones(len(x[0]))
    p1matrix=2.0
    p0num=np.ones(len(x[0]))
    p0matrix=2.0
    for i in range(len(x)):
        if y[i]==1:
            p1num+=x[i]
            p1matrix+=sum(x[i])
        else:
            p0num+=x[i]
            p0matrix+=sum(x[i])
    # 使用log函数是为了防止数据下溢出,
    p1V=np.log(p1num/p1matrix)
    p0V=np.log(p0num/p0matrix)
    p1Class=sum(y)/float(len(x))
    return p0V,p1V,p1Class

'''
测试结果
p1:测试数据属于类别1的概率
p0:测试数据属于类别0的概率
概率相乘等于log函数相加[log(a*b)=log(a)+log(b)]
'''
def test(data,p0v,p1v,p1c):
    p1 = sum(data*p1v)+np.log(p1c)
    p0 = sum(data*p0v)+np.log(1-p1c)
    print("p0:",p0)
    print("p1:",p1)
    if p1 > p0:
        return 1
    else:
        return 0


'''
主函数
'''
def main():
    x,y=loadDataSet()
    p0v,p1v,p1class=Classifier(x,y)
    print("p0v:",p0v)
    print("p1v:", p1v)
    print("p1class:", p1class)
    testData = np.array([1,0,1,0])
    res=test(testData,p0v,p1v,p1class)
    if res==0:
        print("测试数据属于第0类")
    else:
        print("测试数据属于第1类")

'''
函数入口
'''
if __name__=="__main__":
    main()

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值