sklearn之朴素贝叶斯分类

'''
    朴素贝叶斯分类:朴素贝叶斯分类是一种依据统计概率理论而实现的一种分类方式。
        观察这组数据:
            天气情况         穿衣风格    约女朋友        ==>    心情
            0(晴天)    0(休闲)    0(约了)    ==>    0(高兴)
            0            1(风骚)    1(没约)    ==>    0
            1(多云)    1           0            ==>    0
            0            2(破旧)    1           ==>    1(郁闷)
            2(下雨)    2            0            ==>    0
            ...            ...            ...            ==>    ...
            0            1            0            ==>    ?

        通过上述训练样本如何预测:晴天、穿着休闲、没有约女朋友时的心情?可以整理相同特征值的样本,计算属于某类别的概率即可。
        但是如果在样本空间没有完全匹配的数据该如何预测?

    贝叶斯定理:P(A|B)=P(B|A)P(A)/P(B) <== P(A, B) = P(A) P(B|A) = P(B) P(A|B)
        例如:
            假设一个学校里有60%男生和40%女生.女生穿裤子的人数和穿裙子的人数相等,所有男生穿裤子.
            一个人在远处随机看到了一个穿裤子的学生.那么这个学生是女生的概率是多少?
                P(女) = 0.4
                P(裤子|女) = 0.5
                P(裤子) = 0.6 + 0.2 = 0.8
                P(女|裤子) = P(裤子|女) * P(女) / P(裤子) = 0.5 * 0.4 / 0.8 = 0.25

        根据贝叶斯定理,如何预测:晴天、穿着休闲、没有约女朋友时的心情?
            P(晴天,休闲,没约,高兴)
            = P(晴天|休闲,没约,高兴) P(休闲,没约,高兴)
            = P(晴天|休闲,没约,高兴) P(休闲|没约,高兴) P(没约,高兴)
            = P(晴天|休闲,没约,高兴) P(休闲|没约,高兴) P(没约|高兴)P(高兴)
            ( 朴素:条件独立,特征值之间没有因果关系)
            = P(晴天|高兴) P(休闲|高兴) P(没约|高兴)P(高兴)
        由此可得,统计总样本空间中晴天、穿着休闲、没有约女朋友时高兴的概率,
        与晴天、穿着休闲、没有约女朋友时不高兴的概率,择其大者为最终结果。

    高斯贝叶斯分类器相关API:
            import sklearn.naive_bayes as nb
            # 创建高斯分布朴素贝叶斯分类器
            model = nb.GaussianNB()
            model.fit(x, y)
            result = model.predict(samples)

    案例:multiple1.txt
'''
import numpy as np
import matplotlib.pyplot as mp
import sklearn.naive_bayes as nb

data = np.loadtxt('./ml_data/multiple1.txt', delimiter=',', unpack=False, dtype='f8')
print(data.shape)
x = np.array(data[:, :-1])
y = np.array(data[:, -1])

# 训练NB模型,完成分类业务
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
n = 500
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
test_x = np.column_stack((grid_x.ravel(), grid_y.ravel()))
test_y = model.predict(test_x)
grid_z = test_y.reshape(grid_x.shape)

# 画图
mp.figure('NB Classification', facecolor='lightgray')
mp.title('NB Classification', fontsize=16)
mp.xlabel('X', fontsize=14)
mp.ylabel('Y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x, grid_y, grid_z, cmap='gray')
mp.scatter(x[:, 0], x[:, 1], s=80, c=y, cmap='jet', label='Samples')

mp.legend()
mp.show()


输出结果:
(400, 3)

  

原文地址:https://www.cnblogs.com/yuxiangyang/p/11189256.html