朴素贝叶斯分类原理:
朴素贝叶斯分类是一种依据统计概率理论而实现的一种分类方式。
天气情况 | 穿衣风格 | 约女朋友 | ==》 | 心情 |
0(晴天) | 0(休闲) | 0(约了) | ==》 | 0(高兴) |
0 | 1(社会) | 1(没约) | ==》 | 0 |
1(多云) | 1 | 0 | ==》 | 0 |
0 | 2(破旧) | 1 | ==》 | 1(郁闷) |
2(下雨) | 2 | 0 | ==》 | 0 |
... | ... | ... | ==》 | ... |
0 | 1 | 0 | ==》 | ? |
通过上述的数据预测:晴天,穿衣社会,约了女朋友的心情
1. 由决策树的思想,可以整理相同特征值的样本,计算属于某类型的概率就行
2. 如果样本空间内,没有完全匹配的数据呢?
答:# 贝叶斯定理
P(A):A事件发生的概率
P(A, B):A,B同时发生的概率(联合概率)
P(B|A):A出现的情况下,B出现的概率(条件概率)
P(A, B) = P(A)*P(B|A)
贝叶斯定理: P(A|B)= P(B|A)*P(A) / P(B) 《== P(A, B) = P(A)*P(B|A)
假设一个学校有60%男和40%女。女生穿裤子的人数和穿裙子的人数相等,所有男生都穿裤子。随机看到一个穿裤子的学生,是女生的概率是多少?
P(女) = 0.4 P(裤子|女) = 0.5 P(裤子) = 0.6 + 0.2 = 0.8 P(女|裤子) = P(裤子|女) * P(女) / P(裤子) = 0.25
可见通过训练样本的特征概率统计,可以推出没有完全匹配的数据的概率大小。
一般这种概率统计的方法是通过概率密度函数统计的,所以数据要满足一些分布(比如高斯分布)
代码实现:
import numpy as np
import matplotlib.pyplot as plt
import sklearn.naive_bayes as nb
x = np.array([[4, 7],
[3.5, 8],
[3.1, 6.2],
[0.5, 1],
[1, 2],
[1.2, 1.9],
[6, 2],
[5.7, 1.5],
[5.4, 2.2]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
# 构建高斯朴素贝叶斯模型
model = nb.GaussianNB()
model.fit(x, y)
# 获取样本集的边界
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
# 把可视区间划分为500 * 500的二维坐标矩阵
n = 500
# np.linspace(l, r, n)从 l到r 之间拆 500份
# np.meshgrid() 相当于一个500*500的点阵,grid_x 横坐标(500*500) grid_y 纵坐标(500*500)
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
# 使用模型,得到点阵中每个坐标的类别
# grid_x.ravel() 500*500变成1行 1*250000
# np.column_stack() 两个矩阵按照列合并 (25000*2)
mesh_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
mesh_z = model.predict(mesh_x) # mesh_z (250000*1)
grid_z = mesh_z.reshape(grid_x.shape)
# 画图
plt.figure('LR Classifcation', facecolor='lightgray')
plt.title('LR Classifcation', fontsize=16)
plt.scatter(x[:, 0], x[:, 1], c=y, cmap = 'jet', label='Sample Points', s=70, zorder=3) # c=y 按照结果y划分颜色,cmap = 'jet'颜色工具包, zorder=3提高图层层面
# 调用plt.pcolormesh()绘制分类边界
# 原理: 根据参数,把可是区间拆分成坐标网格,由于每个网格都有相应的类别,可以使用cmap为每个网格填充颜色
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
plt.legend()
plt.show()
输出: