[机器学习]01-构建简单的贝叶斯分类器
第一部分:绘制两类后验概率密度函数(PDF)和样本分类结果。
第二部分:引入风险权重后,计算风险函数并重新分类,决策边界仍为x=0。
通过高斯分布和贝叶斯分布计算两类问题的分类预测,并可视化结果。
import numpy as np
import math
import matplotlib.pyplot as pltPw1 = 0.9
Pw2 = 0.1
ob = [-2.67, -3.55, -1.24, -0.98, -0.79, -2.85, -2.76, -3.73, -3.54, -2.27, -3.45, -3.08, -1.58, -1.49, -0.74, -0.42, -1.12, 4.25, -3.99, 2.88, -0.98, 0.79, 1.19, 3.07]
Pxw1_mean = -2
Pxw1_std = 1.5
Pxw2_mean = 2
Pxw2_std = 2
omi11 = 0
omi12 = 7
omi21 = 2
omi22 = 0def BackDensity(a, b, x):return (1 / (math.sqrt(2 * math.pi) * b)) * math.exp(-((x - a) ** 2) / (2 * b ** 2))x_range = np.linspace(min(ob) - 2, max(ob) + 2, 1000)
pdf_w1 = [Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) / (Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) + Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x)) for x in x_range]
pdf_w2 = [Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x) / (Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) + Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x)) for x in x_range]plt.figure(figsize=(8, 6))
plt.plot(x_range, pdf_w1, label='Class w1 (Normal)', color='blue')
plt.plot(x_range, pdf_w2, label='Class w2 (Abnormal)', color='red')
plt.fill_between(x_range, pdf_w1, alpha=0.2, color='blue')
plt.fill_between(x_range, pdf_w2, alpha=0.2, color='red')
plt.title('Probability Density Functions')
plt.xlabel('Observation Value')
plt.ylabel('Probability Density')for x in ob:P1 = BackDensity(Pxw1_mean, Pxw1_std, x)P2 = BackDensity(Pxw2_mean, Pxw2_std, x)A = P1 * Pw1 / (P1 * Pw1 + P2 * Pw2)B = P2 * Pw2 / (P1 * Pw1 + P2 * Pw2)if A > B:plt.scatter(x,A,c='blue', marker='o', label=f'Class w1: {x}')elif A < B:plt.scatter(x,B,c='red', marker='x', label=f'Class w2: {x}')else:plt.scatter(x, 0.5, c='green', marker='s', label=f'Boundary: {x}')# 绘制决策界面
plt.axvline(x=0, color='green', linestyle='--', label='Decision Boundary')#plt.legend(fontsize='small')
plt.grid(True)
plt.show()x_range = np.linspace(min(ob) - 2, max(ob) + 2, 1000)
pdf_w1 = [Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) / (Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) + Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x)) for x in x_range]
pdf_w2 = [Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x) / (Pw1 * BackDensity(Pxw1_mean, Pxw1_std, x) + Pw2 * BackDensity(Pxw2_mean, Pxw2_std, x)) for x in x_range]
pdf_w11 = [aa*omi11+aa*omi12 for aa in pdf_w1]
pdf_w22 = [bb*omi21+bb*omi22 for bb in pdf_w2]
plt.figure(figsize=(8, 6))
plt.plot(x_range, pdf_w11, label='Class w1 (Normal)', color='blue')
plt.plot(x_range, pdf_w22, label='Class w2 (Abnormal)', color='red')
plt.fill_between(x_range, pdf_w11, alpha=0.2, color='blue')
plt.fill_between(x_range, pdf_w22, alpha=0.2, color='red')
plt.title('Probability Density Functions')
plt.xlabel('Observation Value')
plt.ylabel('Probability Density')for x in ob:P1 = BackDensity(Pxw1_mean, Pxw1_std, x)P2 = BackDensity(Pxw2_mean, Pxw2_std, x)A = P1 * Pw1 / (P1 * Pw1 + P2 * Pw2)B = P2 * Pw2 / (P1 * Pw1 + P2 * Pw2)R1 = (A * omi11 + A * omi12)R2 = (B * omi21 + B * omi22)if R1 > R2:plt.scatter(x,R2,c='blue', marker='o', label=f'Class w1: {x}')elif R1 < R2:plt.scatter(x,R1,c='red', marker='x', label=f'Class w2: {x}')else:plt.scatter(x, 0.5, c='green', marker='s', label=f'Boundary: {x}')# 绘制决策界面
plt.axvline(x=0, color='green', linestyle='--', label='Decision Boundary')#plt.legend(fontsize='small')
plt.grid(True)
plt.show()
运行结果: