一、条件概率的定义与贝叶斯公式

二、朴素贝叶斯分类算法

朴素贝叶斯是一种有监督的分类算法,可以进行二分类,或者多分类。一个数据集实例如下图所示:

现在有一个新的样本, X = (年龄:<=30, 收入:中, 是否学生:是, 信誉:中),目标是利用朴素贝叶斯分类来进行分类。假设类别为C(c1=是 或 c2=否),那么我们的目标是求出P(c1|X)和P(c2|X),比较谁更大,那么就将X分为某个类。

下面,公式化朴素贝叶斯的分类过程。

三、实例

下面,将下面这个数据集作为训练集,对新的样本X = (年龄:<=30, 收入:中, 是否学生:是, 信誉:中)  作为测试样本,进行分类。

我们可以将这个实例中的描述属性和类别属性,与公式对应起来,然后计算。

四、Python实现

现在,利用Python编写上述实例对应的代码,代码如下。

# 针对 “买电脑”实例进行朴素贝叶斯分类if __name__ == '__main__':# 描述属性分别用数字替换# 年龄, <=30-->0, 31~40-->1, >40-->2# 收入, '低'-->0, '中'-->1, '高'-->2# 是否学生, '是'-->0, '否'-->1# 信誉: '中'-->0, '优'-->1# 类别属性用数字替换# 购买电脑是-->0, 不购买电脑否-->1MAP = [{'<=30': 0, '31~40': 1, '>40': 2},{'低': 0, '中': 1, '高': 2},{'是': 0, '否': 1},{'中': 0, '优': 1},{'是': 0, '否': 1}]# 训练样本train_samples = ["<=30 高 否 中 否","<=30 高 否 优 否","31~40 高 否 中 是",">40 中 否 中 是",">40 低 是 中 是",">40 低 是 优 否","31~40 低 是 优 是","<=30 中 否 中 否","<=30 低 是 中 是",">40 中 是 中 是","<=30 中 是 优 是","31~40 中 否 优 是","31~40 高 是 中 是",">40 中 否 优 否"]# 下面步骤将文字,转化为对应数字train_samples = [sample.split(' ') for sample in train_samples]# print(train_samples)# exit()train_samples = [[MAP[i][attr] for i, attr in enumerate(sample)]for sample in train_samples]# print(train_samples)# 待分类样本X = '<=30 中 是 中'X = [MAP[i][attr] for i, attr in enumerate(X.split(' '))]# 训练样本数量n_sample = len(train_samples)# 单个样本的维度: 描述属性和类别属性个数dim_sample = len(train_samples[0])# 计算每个属性有哪些取值attr = []for i in range(0, dim_sample):attr.append([])for sample in train_samples:for i in range(0, dim_sample):if sample[i] not in attr[i]:attr[i].append(sample[i])# 每个属性取值的个数n_attr = [len(attr) for attr in attr]# 记录不同类别的样本个数n_c = []for i in range(0, n_attr[dim_sample-1]):n_c.append(0)# 计算不同类别的样本个数for sample in train_samples:n_c[sample[dim_sample-1]] += 1# 计算不同类别样本所占概率p_c = [n_cx / sum(n_c) for n_cx in n_c]# print(p_c)# 将用户按照类别分类samples_at_c = {}for c in attr[dim_sample-1]:samples_at_c[c] = []for sample in train_samples:samples_at_c[sample[dim_sample-1]].append(sample)# 记录 每个类别的训练样本中,取待分类样本的某个属性值的样本个数n_attr_X = {}for c in attr[dim_sample-1]:n_attr_X[c] = []for j in range(0, dim_sample-1):n_attr_X[c].append(0)# 计算 每个类别的训练样本中,取待分类样本的某个属性值的样本个数for c, samples_at_cx in zip(samples_at_c.keys(), samples_at_c.values()):for sample in samples_at_cx:for i in range(0, dim_sample-1):if X[i] == sample[i]:n_attr_X[c][i] += 1# 字典转化为listn_attr_X = list(n_attr_X.values())# print(n_attr_X)# 存储最终的概率result_p = []for i in range(0, n_attr[dim_sample-1]):result_p.append(p_c[i])# 计算概率for i in range(0, n_attr[dim_sample-1]):n_attr_X[i] = [x/n_c[i] for x in n_attr_X[i]]for x in n_attr_X[i]:result_p[i] *= xprint('概率分别为', result_p)# 找到概率最大对应的那个类别,就是预测样本的分类情况predict_class = result_p.index(max(result_p))print(predict_class)

运行结果如图所示:

表明,样本被分为第一类,即会购买电脑。对应的概率与手动计算的结果相同。

参考:

1. 数据挖掘十大算法

2. 数据仓库与数据挖掘 李春葆

更新

有在评论中说到这个结果:

[0.0011757789535567313, 0.16457142857142862] 

我运行了多次原来的代码,但是结果始终如一。最后,又仔细阅读了一遍代码,发现问题在“n_attr_X”这个变量在转化为list的过程。

n_attr_X={0: [2, 4, 6, 6], 1: [3, 2, 1, 2]}为一个字典,如果转化为list则是[[3, 2, 1, 2], [2, 4, 6, 6]],这样可以得到我的结果。

但是如果,n_attr_X={1: [3, 2, 1, 2], 0: [2, 4, 6, 6]},那么转化为list之后就是[[3, 2, 1, 2], [2, 4, 6, 6]]。这样默认是类别为0的各个属性个数为3,2,1,2,因为后面使用的是列表,默认下标就代表着类别标签。可以在这个转化步骤之后,加上这句代码:

n_attr_X[0], n_attr_X[1] = n_attr_X[1], n_attr_X[0]

结果就不一样了。

所以最好用有序字典,并且不要采用“下标就代表着类别标签”的方法。

数据挖掘十大算法(九):朴素贝叶斯原理、实例与Python实现相关推荐

  1. 数据挖掘十大算法之分类算法(分类介绍及评价指标)

    文章目录 1. 分类相关知识 1.1 分类的概念 1.2 分类的流程 1.3 分类模型评价标准 2. 二分类分类案例 参考文章: 接上篇文章,接下来学习挖掘算法中的分类算法: 首先我们应该知道数据挖掘 ...

  2. 利用朴素贝叶斯原理过滤垃圾邮件(TF-IDF算法)

    本人是新手,为了还原该过程用了自己的方法,可能时间复杂度较高,并且在训练数据时也没有用到SKlearn模块中的贝叶斯分类器,是为了尝试自己去还原求后验条件概率这个过程. 目录 一.简述朴素贝叶斯原理 ...

  3. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  4. k近邻算法与朴素贝叶斯算法

    机器学习--k近邻算法与朴素贝叶斯算法 k近邻算法 朴素贝叶斯 理论基础: 精确率和召回率 交叉验证与网格搜索 k近邻算法 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大 ...

  5. [分类算法] :朴素贝叶斯 NaiveBayes

    [分类算法] :朴素贝叶斯 NaiveBayes 1. 原理和理论基础(参考) 2. Spark代码实例: 1)windows 单机 import org.apache.spark.mllib.cla ...

  6. 统计学习方法|朴素贝叶斯原理剖析及实现

    欢迎直接到我的博客查看最近文章:www.pkudodo.com.更新会比较快,评论回复我也能比较快看见,排版也会更好一点. 原始blog链接: http://www.pkudodo.com/2018/ ...

  7. multinormalNB多项式朴素贝叶斯原理及代码

    https://blog.csdn.net/u011239443/article/details/76176743 multinormalNB多项式朴素贝叶斯原理及代码 https://www.cnb ...

  8. 数据挖掘十大算法(九):朴素贝叶斯 python和sklearn实现

    第三个算法终于算是稍有了解了,其实当你结合数据了解了它的实现原理后,你会发现确实很朴素.这里对朴素贝叶斯算法做一个介绍和总结,包括(原理.一个代码示例.sklearn实现),皆为亲自实践后的感悟,下面 ...

  9. 机器学习(十)分类算法之朴素贝叶斯(Naive Bayes)算法

    贝叶斯定理 首先我们来了解一下贝叶斯定理: 贝叶斯定理是用来做什么的?简单说,概率预测:某个条件下,一件事发生的概率是多大? 了解一下公式 事件B发生的条件下,事件A发生的概率为: 这里写图片描述 同 ...

  10. pagerank数据集_从小白视角理解数据挖掘十大算法

    关注上方"数据挖掘工程师",选择星标, 关键时间,第一时间送达! 作者 | 雪山飞猪链接 | https://www.cnblogs.com/chenqionghe/p/12301 ...

最新文章

  1. 图神经网络越深,表现就一定越好吗?
  2. 将Windows 8.1 系统窗口背景设置成淡绿色?
  3. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
  4. DataGridView里的Checkbox全选问题解决了!
  5. Python的主要8大应用领域,你还不会吗?
  6. 数据结构java 图实验代码_20172329 2018-2019 《Java软件结构与数据结构》实验三报告...
  7. 【linux系统编程】基础开发工具:vi/vim
  8. opencv imshow 窗口无响应 the window does not seem to be responding. do you want to force
  9. Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)
  10. radiobutton在listview中处理
  11. webpack打包html中img,打包资源成功,图片引用错误,不能显示问题
  12. 南航计算机学院院长黄志球简历,南航计算机科学与技术学院导师介绍:沈国华...
  13. 大海捞针 - Everthing的实现思路
  14. 15.正则表达式扩展正则字符处理
  15. 记者求证北京将禁止外地车和外地人员从事网约车传闻
  16. Anno 让微服务、混合编程更简单(Net love Java)
  17. 小小的我,有大大的梦想
  18. 西门子实数转整数_西门子PLC字整数与双字整数之间的转换、双整数与实数之间的转换...
  19. 华为交换机查看设备型号
  20. 基于协同过滤的电影推荐

热门文章

  1. 9530 blackberry 上网
  2. 等差数列和等比数列公式
  3. 2022姓氏头像在线制作小程序源码+头像模块
  4. 基于Pytorch实现GAT(图注意力网络)
  5. 简单好用又免费的百度翻译mac桌面端
  6. Django model select获取数据详细讲解
  7. RNN实现股票预测实战案例
  8. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day39】—— 数据库6
  9. DayDream模拟手柄操作
  10. linux终端ppt,[转]TPP:linux终端下的ppt