网站建设谢辞,wordpress vip查看插件,南宁网站seo推广优化公司,站群系统开发【1】引言
前序学习进程中#xff0c;对条件概率进行了简单探索#xff1a;https://blog.csdn.net/weixin_44855046/article/details/145388138?spm1001.2014.3001.5501
今天#xff0c;以此为基础#xff0c;探索机器学习中朴素贝叶斯方法的基本程序。
【2】代码解读 …【1】引言
前序学习进程中对条件概率进行了简单探索https://blog.csdn.net/weixin_44855046/article/details/145388138?spm1001.2014.3001.5501
今天以此为基础探索机器学习中朴素贝叶斯方法的基本程序。
【2】代码解读
【2.1】库引入
这里只需要numpy库
# 引入numpy模块
import numpy as np
【2.2】初始定义
这里现需要定义一个矩阵用于后续计算
在机器学习中可以认为一个3行2列的矩阵是由3个样本组成的大样本每个样本包含两个特征。
矩阵的行数就是样本数矩阵的列数就是特征数。
# 假设有3个样本2个特征
# 样本数就是行数特征数是列数
X np.array([[1, 0], # 样本1[1, 1], # 样本2[0, 1] # 样本3
])
然后定义一个类别标签数组
# 这里天然地认为0对应第一个样本后面的1和1对应第2和第3个样本
# y内部的数据认为是类别
y np.array([0, 1, 1]) # 样本1属于类别0样本2和3属于类别1
经过y的定义矩阵X被划分为 [1, 0], # 样本1 → 类别0 [1, 1], # 样本2 → 类别1 [0, 1] # 样本3 → 类别1 然后需要定义一些变量来存储数据
# 定义常数n_classes
n_classes 2
# 定义n_features存储X的第二个维度特征也就是列数
n_features X.shape[1] # 2个特征
# 定义一个type动态函数创建一个名为Dummy的类
# 继承自objectobject是Python 所有类的基类提前内置好无需在代码中定义
# {}是类的属性和方法但是此处没有定义所以没有任何属性和方法
self type(Dummy, (object,), {})() # 创建临时对象
# 定义一个conditional的纯0矩阵大小为n_classes行n_features列
self.conditional np.zeros((n_classes, n_features))
其中n_classes和n_features存储单个数据self.conditional是一个纯0矩阵。
变量定义 变量类型示例用途说明n_classes标量int2类别数量确定矩阵行数可通过X.shape[0]获取n_features标量int2特征数量确定矩阵列数可通过X.shape[1]获取self.conditional矩阵ndarray shape( n_classes,n_features) 存储条件概率的二维数组初始定义为纯0矩阵selfDummy类使用type()动态函数定义是一个临时对象
其中n_classes和n_features存储单个数据self.conditional是一个纯0矩阵。
【2.3】计算
之后进行计算
# 定义一个for循环对y进行枚举
# np.unique(y)是对y进行合并同类项
# i是y合并同类项以后具体的项对应的位置
# c是y合并同类项以后具体的项
for i, c in enumerate(np.unique(y)):# 当y中的取值为类别cX_c为True# 当y取值为c时yc的值应该是True但X[yc]可以取出yc时的X值X_c X[y c]print(f类别 {c} 的样本\n{X_c})# 计算条件概率,使用拉普拉斯平滑公式self.conditional[i] (X_c.sum(axis0) 1) / (X_c.shape[0] n_features)print(f类别 {c} 的条件概率{self.conditional[i]}\n)
这里定义了一个枚举函数enumerate()的for循环
枚举函数enumerate()函数中的参数是np.unique(y)可以实现对y这个数组的同类项合并操作。
前面的公式定义了y np.array([0, 1, 1])经过执行np.unique(y)会获得[0,1]这样的精简数组。
执行X_c X[y c]时
先按照y0进行判断此时将会对应y的实际定义值[0, 1, 1]得到[True,False,False]X[yc]则只会输出True对应位置处的样本[1,0]。然后按照y1进行判断此时将会对应y的实际定义值[0, 1, 1]得到[False,True,True,]X[yc]则只会输出True对应位置处的样本[1,1]和[0,1]。 然后就可以调用拉普拉斯平滑公式进行条件概率计算
self.conditional[i] (X_c.sum(axis0) 1) / (X_c.shape[0] n_features)
X_c.sum(axis0) 1的意思是先按照各列单独相加求和然后求和结果再增加1比如
y1是X_c获得 [1,1] [0,1] 这两个样本排列成2行2列执行X_c.sum(axis0) 1后获得 [10,11][1,1][2,3] 此时的 X_c.shape[0] 2即样本的数量
n_features2即每个样板的特征。
此时计算的结果就是 [2/(22),3/(22)][0.5,0.75] 完整代码为
# 引入numpy模块
import numpy as np# 假设有3个样本2个特征
# 样本数就是行数特征数是列数
X np.array([[1, 0], # 样本1[1, 1], # 样本2[0, 1] # 样本3
])
# 这里天然地认为0对应第一个样本后面的1和1对应第2和第3个样本
# y内部的数据认为是类别
y np.array([0, 1, 1]) # 样本1属于类别0样本2和3属于类别1# 定义常数n_classes
n_classes 2
# 定义n_features存储X的第二个维度特征也就是列数
n_features X.shape[1] # 2个特征
# 定义一个type动态函数创建一个名为Dummy的类
# 继承自objectobject是Python 所有类的基类提前内置好无需在代码中定义
# {}是类的属性和方法但是此处没有定义所以没有任何属性和方法
self type(Dummy, (object,), {})() # 创建临时对象
# 定义一个conditional的纯0矩阵大小为n_classes行n_features列
self.conditional np.zeros((n_classes, n_features))# 定义一个for循环对y进行枚举
# np.unique(y)是对y进行合并同类项
# i是y合并同类项以后具体的项对应的位置
# c是y合并同类项以后具体的项
for i, c in enumerate(np.unique(y)):# 当y中的取值为类别cX_c为True# 当y取值为c时yc的值应该是True但X[yc]可以取出yc时的X值X_c X[y c]print(f类别 {c} 的样本\n{X_c})# 计算条件概率,使用拉普拉斯平滑公式self.conditional[i] (X_c.sum(axis0) 1) / (X_c.shape[0] n_features)print(f类别 {c} 的条件概率{self.conditional[i]}\n) 代码运行后的输出为 类别 0 的样本 [[1 0]] 类别 0 的条件概率[0.66666667 0.33333333] 类别 1 的样本 [[1 1] [0 1]] 类别 1 的条件概率[0.5 0.75] 【3】总结 学习了机器学习朴素贝叶斯方法中拉普拉斯平滑计算条件概率的基本方法。