朴素贝叶斯

理论知识是参考的《统计学习方法》第四章

def bayes(X,y,y_set,xi): #X是训练数据的输入,y是训练数据的分类,y_set是所有的分类,xi是预测数据的输入
    dictY = {}  #记录每一个类的输入  dictY[Ck]包含了所有分类为Ck的输入数据
    pY = {}  #记录每一个类的出现次数  ∑I(y=Ck)
    maxP = 0
    pred = 0 #预测值
    
    #依据不同的概率模型,P(x|y)的计算方式也不同,这里与书上的计算方法相同
    for i in range(len(y)):
        dictY.setdefault(y[i],[])
        dictY[y[i]].append(X[i])
        pY.setdefault(y[i],0)
        pY[y[i]] += 1
    for ck in y_set:
        curP = pY[ck] / len(y)  #每个类的概率等于出现次数除以总训练实例数
        xs = dictY[ck] #所有分类为ck的输入数据
        for i in range(len(xi)):
            sumXi = sum(xs[x][i] == xi[i] for x in range(len(xs)))
            curP *= sumXi / len(xs)
        if curP > maxP:
            maxP = curP
            pred = ck
    print(maxP)  #后验概率最大化,注意这是后验概率的分子(分母都一样,所以不考虑)
    return ck  #预测的分类

课本例题测试:

X = [
    [1,'S'],[1,'M'],[1,'M']
    ,[1,'S'],[1,'S'],[2,'S']
    ,[2,'M'],[2,'M'],[2,'L']
    ,[2,'L'],[3,'L'],[3,'M']
    ,[3,'M'],[3,'L'],[3,'L']
    ]
y = [-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]
bayes(X,y,[1,-1],[2,'S'])

计算概率时循环次数比较多,并且用字典保存数据占用内存,以后参考一下别人的写法,看看能不能优化

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值