• 朴素贝叶斯算法--python实现


    朴素贝叶斯算法要理解一下基础:    【朴素:特征条件独立   贝叶斯:基于贝叶斯定理】

    1朴素贝叶斯的概念【联合概率分布、先验概率、条件概率**、全概率公式】【条件独立性假设、】   极大似然估计
    2优缺点    
    【优点: 分类效率稳定;对缺失数据不敏感,算法比较简单,常用于文本分类;在属性相关性较小时,该算法性能最好    缺点:假设属性之间相互独立;先验概率多取决于假设;对输入数据的表达形式很敏感】
    3先验概率、后验概率
    先验概率的计算比较简单,没有使用贝叶斯公式;
    而后验概率的计算,要使用贝叶斯公式,而且在利用样本资料计算逻辑概率时,还要使用理论概率分布,需要更多的数理统计知识。
    4朴素贝叶斯的参数估计:
    ①极大似然估计(可能出现概率为0的情况)②贝叶斯估计(加入常数,拉普拉斯平滑)
     
    参考
    教你明白啥是朴素贝叶斯分类器    有助于理解朴素贝叶斯算法
     
    前提python2.7     数据来源:  http://pan.baidu.com/s/1pLoKUMJ
     # 极大似然估计  朴素贝叶斯算法
     1 #coding:utf-8
     2 # 极大似然估计  朴素贝叶斯算法
     3 import pandas as pd
     4 import numpy as np
     5 
     6 class NaiveBayes(object):
     7     def getTrainSet(self):
     8         dataSet = pd.read_csv('C://pythonwork//practice_data//naivebayes_data.csv')
     9         dataSetNP = np.array(dataSet)  #将数据由dataframe类型转换为数组类型
    10         trainData = dataSetNP[:,0:dataSetNP.shape[1]-1]   #训练数据x1,x2
    11         labels = dataSetNP[:,dataSetNP.shape[1]-1]        #训练数据所对应的所属类型Y
    12         return trainData, labels
    13 
    14     def classify(self, trainData, labels, features):
    15         #求labels中每个label的先验概率
    16         labels = list(labels)    #转换为list类型
    17         P_y = {}       #存入label的概率
    18         for label in labels:
    19             P_y[label] = labels.count(label)/float(len(labels))   # p = count(y) / count(Y)
    20 
    21         #求label与feature同时发生的概率
    22         P_xy = {}
    23         for y in P_y.keys():
    24             y_index = [i for i, label in enumerate(labels) if label == y]  # labels中出现y值的所有数值的下标索引
    25             for j in range(len(features)):      # features[0] 在trainData[:,0]中出现的值的所有下标索引
    26                 x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]
    27                 xy_count = len(set(x_index) & set(y_index))   # set(x_index)&set(y_index)列出两个表相同的元素
    28                 pkey = str(features[j]) + '*' + str(y)
    29                 P_xy[pkey] = xy_count / float(len(labels))
    30 
    31         #求条件概率
    32         P = {}
    33         for y in P_y.keys():
    34             for x in features:
    35                 pkey = str(x) + '|' + str(y)
    36                 P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y])    #P[X1/Y] = P[X1Y]/P[Y]
    37 
    38         #求[2,'S']所属类别
    39         F = {}   #[2,'S']属于各个类别的概率
    40         for y in P_y:
    41             F[y] = P_y[y]
    42             for x in features:
    43                 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]
    44 
    45         features_label = max(F, key=F.get)  #概率最大值对应的类别
    46         return features_label
    47 
    48 
    49 if __name__ == '__main__':
    50     nb = NaiveBayes()
    51     # 训练数据
    52     trainData, labels = nb.getTrainSet()
    53     # x1,x2
    54     features = [2,'S']
    55     # 该特征应属于哪一类
    56     result = nb.classify(trainData, labels, features)
    57     print features,'属于',result
    #朴素贝叶斯算法   贝叶斯估计, λ=1  K=2, S=3; λ=1 拉普拉斯平滑
     1 #coding:utf-8
     2 #朴素贝叶斯算法   贝叶斯估计, λ=1  K=2, S=3; λ=1 拉普拉斯平滑
     3 import pandas as pd
     4 import numpy as np
     5 
     6 class NavieBayesB(object):
     7     def __init__(self):
     8         self.A = 1    # 即λ=1
     9         self.K = 2
    10         self.S = 3
    11 
    12     def getTrainSet(self):
    13         trainSet = pd.read_csv('C://pythonwork//practice_data//naivebayes_data.csv')
    14         trainSetNP = np.array(trainSet)     #由dataframe类型转换为数组类型
    15         trainData = trainSetNP[:,0:trainSetNP.shape[1]-1]     #训练数据x1,x2
    16         labels = trainSetNP[:,trainSetNP.shape[1]-1]          #训练数据所对应的所属类型Y
    17         return trainData, labels
    18 
    19     def classify(self, trainData, labels, features):
    20         labels = list(labels)    #转换为list类型
    21         #求先验概率
    22         P_y = {}
    23         for label in labels:
    24             P_y[label] = (labels.count(label) + self.A) / float(len(labels) + self.K*self.A)
    25 
    26         #求条件概率
    27         P = {}
    28         for y in P_y.keys():
    29             y_index = [i for i, label in enumerate(labels) if label == y]   # y在labels中的所有下标
    30             y_count = labels.count(y)     # y在labels中出现的次数
    31             for j in range(len(features)):
    32                 pkey = str(features[j]) + '|' + str(y)
    33                 x_index = [i for i, x in enumerate(trainData[:,j]) if x == features[j]]   # x在trainData[:,j]中的所有下标
    34                 xy_count = len(set(x_index) & set(y_index))   #x y同时出现的次数
    35                 P[pkey] = (xy_count + self.A) / float(y_count + self.S*self.A)   #条件概率
    36 
    37         #features所属类
    38         F = {}
    39         for y in P_y.keys():
    40             F[y] = P_y[y]
    41             for x in features:
    42                 F[y] = F[y] * P[str(x)+'|'+str(y)]
    43 
    44         features_y = max(F, key=F.get)   #概率最大值对应的类别
    45         return features_y
    46 
    47 
    48 if __name__ == '__main__':
    49     nb = NavieBayesB()
    50     # 训练数据
    51     trainData, labels = nb.getTrainSet()
    52     # x1,x2
    53     features = [2,'S']
    54     # 该特征应属于哪一类
    55     result = nb.classify(trainData, labels, features)
    56     print features,'属于',result
     
     
     
  • 相关阅读:
    4.启动虚拟机 设置CentOS7
    Mybatis-09-缓存
    Mybatis-08-动态SQL
    Mybatis-07-多对一和一对多处理
    Mybatis-06-Lombok
    Mybatis-05-使用注解开发
    Mybatis-04-分页
    Mybatis-03-日志
    Mybatis-02-CRUD及配置解析
    Mybatis-01-什么是Mybatis以及第一个Mybatis
  • 原文地址:https://www.cnblogs.com/yiyezhouming/p/7364688.html
Copyright © 2020-2023  润新知