import numpy as np
def data_set(n, p, k=3): # 产生训练数据集x(矩阵 n*p)和标记y(向量 长度为n) 类别由整数0,1,2,3,...表示
np.random.seed(20220312)
x = np.random.randint(0, 3, size=(n, p))
y = np.random.randint(0, k, size=n)
return x, y
def naive_bayes(x, y, x_test, k='infer'):
"""
1.feature均为分类变量,以x,y为训练集,对x_test(矩阵)进行分类预测
2.k='infer'表示y的类别数自动推断,可以传入整数进行指定类别的数量
3.返回由预测值组成的列表
"""
preds = []
for i in range(len(x_test)): # 每次循环对一个实例分类
data = x_test[i]
prob = [] # 记录该实例分别属于每一类的概率相对值
if isinstance(k, int) and k > 1: # classes为所有可能的类
classes = np.arange(k)
x = x[np.isin(y, classes)]
y = y[np.isin(y, classes)]
else:
classes = np.unique(y)
for cla in classes: # 每次循环求该实例属于某一类的概率相对值
cla_bool = (y == cla)
if isinstance(k, int) and k > 1:
p_cla = (cla_bool.sum()+1)/(k+len(y)) # 求P(Ci) 拉普拉斯校准子取1
else:
p_cla = cla_bool.mean() # 每个类别均有取值 不用拉普拉斯校准子
region = x[cla_bool] # region表示训练集x中所有类别为cla的行组成的矩阵
px_prod = 1 # 求P(X|Ci)
for j, f in enumerate(data): # 每次循环求一个P(Xj|Ci)
col = region[:, j]
length = len(np.unique(col))+len(col)+1 # 拉普拉斯校准子取1(每个特征的实际可能类别数未知,此处假定实际类别数比推断类别数多1)
if f in col:
px = ((col == f).sum()+1)/length
else:
px = 1/length
px_prod *= px
prob.append(p_cla*px_prod)
pred = classes[np.argmax(prob)]
preds.append(pred)
return preds
if __name__ == '__main__':
feature, label = data_set(50, 6)
test, _ = data_set(10, 6)
c = naive_bayes(feature, label, test)
print(c)
# [0, 0, 0, 1, 1, 2, 2, 1, 1, 1]
朴素贝叶斯python代码
最新推荐文章于 2024-08-22 17:08:36 发布
该博客介绍了如何使用Python实现朴素贝叶斯分类器。通过`data_set`函数生成训练数据集,`naive_bayes`函数进行分类预测,其中考虑了拉普拉斯平滑和特征概率计算。在示例中,分类器成功对10个测试样本进行了预测。
摘要由CSDN通过智能技术生成