机器学习-5朴素贝叶斯

机器学习-5朴素贝叶斯,第1张

朴素贝叶斯是一种依据统计概率理论实现的一种分类方式。

统计样本空间中相同特征值的样本,计算属于某类别的概率(决策树思想:相似的输入必会产生相似的输出),但若样本空间中没有完全匹配的数据(样本空间中没有相似的样本),该怎样预测?

贝叶斯定理:

:样本空间中事件发生的概率;

:联合概率,两个事件同时发生的概率;

:条件概率,事件出现的条件下,事件出现的概率;

例1:

假设一学校里男生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

例2:朴素贝叶斯,朴素=条件独立,特征值之间没有因果关系

天气(晴天、多云、下雨)  穿衣  休闲、正装、简约)   打球 (打、没打)  心情(高兴、郁闷)

P(晴天,休闲,没打,高兴)

=P(晴天|休闲,没打,高兴)*P(休闲,没打,高兴)

=P(晴天|休闲,没打,高兴)*P(休闲|没打,高兴)*P(没打,高兴)

=P(晴天|休闲,没打,高兴)*P(休闲|没打,高兴)*P(没打|高兴)*P(高兴)

=P(晴天|高兴)*P(休闲|高兴)*P(没打|高兴)*P(高兴)(因为“朴素”)

这样得到晴天,休闲,没打时高兴的概率和不高兴的概率,选择大的为最终结果。

# -*- coding: utf-8 -*-
"""
Created on Sun May  8 02:04:26 2022

@author: xxxy
"""

import numpy as np
import sklearn.naive_bayes as nb
import matplotlib.pyplot as mp
data=np.loadtxt('C:/Users/xxxy/t2.txt',delimiter=',')
x=data[:,:2].astype('f8')
y=data[:,-1].astype('f8')
print(x.shape,y.shape)
#构建高斯朴素贝叶斯模型
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))
#使用模型,得到点阵中每个坐标的类别
mesh_x=np.column_stack(
    (grid_x.ravel(),grid_y.ravel()))
mesh_z=model.predict(mesh_x)
grid_z=mesh_z.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.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=y,cmap='brg',s=80)
mp.show()

划分训练集测试集,修改一下代码:

# -*- coding: utf-8 -*-
"""
Created on Sun May  8 02:04:26 2022

@author: xxxy
"""

import numpy as np
import sklearn.naive_bayes as nb
import matplotlib.pyplot as mp
import sklearn.model_selection as ms#不应该拿所有的样本做训练,但是对于分类问题,
                                     #不能随便划分训练集、测试集                                   
data=np.loadtxt('C:/Users/xxxy/t2.txt',delimiter=',')
x=data[:,:2].astype('f8')
y=data[:,-1].astype('f8')
print(x.shape,y.shape)
train_x,train_y,test_x,test_y=\
    ms.train_test_split(x,y,test_size=0.25,random_state=7)#划分训练集测试集
model=nb.GaussianNB()#构建高斯朴素贝叶斯模型
model.fit(train_x,train_y)
#模型的预测效果
pred_test_y=model.predict(test_x)
#正确分类的个数占比
accurate=(test_y==pred_test_y).sum()/test_y.size
print(accurate)
#画分类边界线
l,r=x[:,0].min(),x[:,0].max()
b,t=x[:,1].min(),x[:,1].max()
n=500
grid_x,grid_y=np.meshgrid(np.linspace(l,r,n),
                          np.linspace(b,t,n))
#使用模型,得到点阵中每个坐标的类别
mesh_x=np.column_stack(
    (grid_x.ravel(),grid_y.ravel()))
mesh_z=model.predict(mesh_x)
grid_z=mesh_z.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.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
#不画全部样本,只画测试样本,查看有误样本
mp.scatter(test_x[:,0], test_x[:,1], c=y,cmap='brg',s=80)
mp.show()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/876072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存