朴素贝叶斯是一种依据统计概率理论实现的一种分类方式。
统计样本空间中相同特征值的样本,计算属于某类别的概率(决策树思想:相似的输入必会产生相似的输出),但若样本空间中没有完全匹配的数据(样本空间中没有相似的样本),该怎样预测?
贝叶斯定理:
:样本空间中事件发生的概率;
:联合概率,两个事件同时发生的概率;
:条件概率,事件出现的条件下,事件出现的概率;
例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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)