机器学习小白:朴素贝叶斯及其平滑技术

好文链接:
http://www.imooc.com/article/259855
https://www.cnblogs.com/yiyezhouming/p/7364688.html

前面两篇文章中两位大佬讲得很清楚了,我再重复一遍
1.我们的目的是什么?
假设我们已有一定的数据集(已知他们的特征 xi 和标签 y),现在来了一个新的具有某些特征的数据,我们的目的就是找出 使P( y | x ) 最大的那个 y
2.那么该如何求呢?
直接求解 P( y | x ) 很难 ,所以我们要引入贝叶斯公式来简化求解过程,如下图所示,我们可以通过求解右边的式子
在这里插入图片描述
问题·转化为如何求解 P(x | c)
最前面转载的文章链接中有计算的两种方法,频率派和贝叶斯派

下面介绍朴素贝叶斯
就是多了一个条件独立性假设,假设各个特征条件独立
在这里插入图片描述
注:
因为我们是为了求一个C使得上式概率最大,所以P(x)可以忽略

(1)http://www.imooc.com/article/259855中举了一个算概率的西瓜例子,讲得很好,包括离散型以及连续型特征如何计算概率。
(2)还有一个比较经典的垃圾邮件分类中,因为是一个二分类问题,可以通过 两种概率相除是否大于1来判断属于哪种类别在这里插入图片描述

可是在实际过程中会出现一些问题
(1)条件独立性假设+贝叶斯 = 朴素贝叶斯
因为加入了一个条件独立性假设,也带来一定问题,比如
垃圾邮件分类中 ”武松打死老虎“ =”老虎打死武松“是一样的[摊手],不过在实际情况中分类效果很好
(2)

在这里插入图片描述
第二个问题就比较麻烦,所以存在三种平滑手段的朴素贝叶斯模型
(1)多项式模型(2)伯努利模型 (3)混合模型
这一段笔记记得比较乱,根本上就是让问题(2)中计算的概率不能为0,之前链接有相关代码,大概看一下就好

import pandas as pd
import numpy as np

class NaiveBayes(object):
    def getTrainSet(self):
    # print(dataSet)                                     # 15个数据,x1 x2是特征,Y为标签,DataFrame格式
        dataSet = pd.read_csv('D:/machine learning data/naivebayes_data.csv')
        dataSetNP = np.array(dataSet)
        trainData = dataSetNP[:,0:dataSetNP.shape[1]-1]      #提取 数据的特征,也就是前两行
        labels = dataSetNP[:,dataSetNP.shape[1]-1]           #dataSetNP.shape[1]为3,python中 : 
        return trainData, labels


    def classify(self, trainData, labels, features):
        labels = list(labels)                               #把标签从array -》 list 形式
        P_y = {}                                            #用于存放每种label的概率值
        for label in labels:
            P_y[label] = labels.count(label)/float(len(labels))

        # print(type(P_y) )                                 # P_y格式为dirt ,字典

        # features = [2,'S']
        P_xy = {}  
        for y in P_y.keys():                                # P_y.keys() 是 -1 与1
            y_index = [i  for i, label in enumerate(labels) if label == y]  
                                                        # i, label 分别是下标 和 对应的label值
            for j in range(len(features)): 
                x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]# x_index 是与feather特征相同的下标
                xy_count = len(set(x_index) & set(y_index)) # set(x_index)&set(y_index)列出两个表相同的元素
                pkey = str(features[j]) + '*' + str(y)
                P_xy[pkey] = xy_count / float(len(labels))  # 求的是 P(xy)

        P = {}                                              #求条件概率
        for y in P_y.keys():
            for x in features:
                pkey = str(x) + '|' + str(y)
                P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y])    #P[X1/Y] = P[X1Y]/P[Y]
        F = {}  
        for y in P_y:
            F[y] = P_y[y]
            for x in features:
                F[y] = F[y]*P[str(x)+'|'+str(y)] #P[y/X] = P[X/y]*P[y]/P[X],分母相等,比较分子即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y]


        features_label = max(F, key=F.get)
        return features_label

if __name__ == '__main__':
    nb = NaiveBayes()
    trainData, labels = nb.getTrainSet()#得到训练数据以及标签

    features = [2,'S']                  # 该特征应属于哪一类
    result = nb.classify(trainData, labels, features)
    print (features,'属于',result)    在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值