1、贝叶斯定理:
2、高斯分布(正态分布):
(
为均值,
为标准差)
3、高斯朴素贝叶斯算法:
假设在给定的样本中不同特征之间是独立的,在样本之间是独立同分布(iid)的
由贝叶斯定理:
示例:
已知鸢尾花如下,其有四种性状和三种分类结果,不同的结果对应不同的鸢尾花品种
花瓣长(x0) | 花瓣宽(x1) | 花萼长(x2) | 花萼宽(x3) | 结果(y) |
---|---|---|---|---|
5.0 | 3.6 | 1.4 | 0.2 | 0 |
6.4 | 3.1 | 5.5 | 1.8 | 2 |
5.9 | 3.0 | 5.1 | 1.8 | 2 |
5.6 | 3.0 | 4.1 | 1.3 | 1 |
5.4 | 3.4 | 1.7 | 0.2 | 0 |
5.4 | 3.0 | 4.5 | 1.5 | 1 |
6.7 | 3.1 | 5.6 | 2.4 | 2 |
6.7 | 3.0 | 5.2 | 2.3 | 2 |
5.7 | 2.9 | 4.2 | 1.3 | 1 |
5.7 | 2.5 | 5.0 | 2.0 | 2 |
6.7 | 3.1 | 4.4 | 1.4 | 1 |
6.4 | 2.8 | 5.6 | 2.1 | 2 |
7.2 | 3.0 | 5.8 | 1.6 | 2 |
6.9 | 3.1 | 5.1 | 2.3 | 2 |
5.0 | 3.5 | 1.6 | 0.6 | 0 |
使用高斯朴素贝叶斯算法来推断已知性状(花瓣长:7.1,花瓣宽:3.2,花萼长:5.3,花萼宽1.8)对应的鸢尾花品种方法如下:
由上表格可知:
1、求先验概率
2、假定该样本是独立同分布的。并且服从高斯分布(正态分布)
3、先验概率对应的均值和标准差,例如当时:
4、计算
即计算
例如当时
比较以上(1),(2),...,(m)式的大小,例如(1)式最大,说明当发生时
发生的概率最大
那么当前的预测结果就是
高斯朴素贝叶斯算法python代码实现如下:
import numpy as np
class myGaussianNB(object):
#初始化方法
def __init__(self):
#训练方法
def fit(self,X,y):
#将输入参数转为numpy方便计算
X = np.array(X)
y = np.array(y)
#校验参数
if X.ndim!=2 or y.ndim!=1 or X.shape[0]!=y.shape[0]:
raise ValueError("参数错误")
#获取特征数量
self.n_feature = X.shape[1]
#定义先验概率
self.y_probs = {}
#定义条件概率的概率密度函数参数mus,sigma
self.X_y_params = {}
#去掉重复标签
lables = set(y)
#固定标签顺序
self.lables = list(lables)
#循环遍历标签
for lable in lables:
#获取先验概率
self.y_probs[lable] = (y == lable).mean()
#筛选当前标签对应的x
X_lables = X[y==lable]
#计算当前标签对应x的mus,sigma
mus = X_lables.mean()
sigmas = X_lables.std()
#将标签参数存入概率密度函数参数
self.X_y_params[lable] = {"mus":mus,"sigmas":sigmas}
#高斯分布概率密度函数方法
def Gaussian(x,mus,sigma):
return 1 / np.sqrt(2 * np.pi) / sigma * np.exp(-(x - mus) ** 2 / 2 / simga ** 2))
#预测方法
def predict(self,X):
#将输入参数转为numpy方便计算
X = np.array(X)
#校验参数
if X.ndim!=2 or X.shape[1]!=self.n_feature:
raise ValueError("参数错误")
#定义返回结果标签
return = []
#遍历样本
for x in X:
#定义当前样本概率数组
probs = []
#计算每个标签对应的概率
for lable in self.lables:
prob = self.y_probs[lable]
for feature_idx in range(self.n_feature):
prob *= self.Gaussian(x=x[feature_idx],
mus=self.X_y_params[lable]["mus"][feature_idx],
sigma=self.X_y_params[lable]["sigmas"][feature_idx],)
probs.append(prob)
#从当前样本概率数组选取概率最大的标签加入结果标签
result.append(self.lables[np.array(probs).argmax()])
return result