naive_bayes_continuous_data.py
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import seaborn as sns
import pymc3 as pm
import arviz as az
# 第一部分:高斯朴素贝叶斯用于鸢尾花分类
print("===== 高斯朴素贝叶斯用于鸢尾花分类 =====")
# 导入数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=12)
# 建模
gnb_clf = GaussianNB()
gnb_clf.fit(X_train, y_train)
# 对测试集进行预测
predict_class = gnb_clf.predict(X_test)
predict_class_proba = gnb_clf.predict_proba(X_test)
# 输出结果
print("测试集准确率为:", accuracy_score(y_test, predict_class))
# 绘制混淆矩阵
plt.figure(figsize=(10, 7))
cm = confusion_matrix(y_test, predict_class)
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",
xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('预测类别')
plt.ylabel('真实类别')
plt.title('高斯朴素贝叶斯分类器的混淆矩阵')
plt.tight_layout()
plt.savefig('gaussian_nb_confusion_matrix.png')
plt.close()
# 输出分类报告
print("\n分类报告:")
print(classification_report(y_test, predict_class, target_names=iris.target_names))
# 第二部分:贝叶斯混合模型用于聚类
print("\n===== 贝叶斯混合模型用于聚类 =====")
# 生成模拟数据
np.random.seed(42)
data = np.concatenate([np.random.normal(-1, 1, 100), np.random.normal(2, 1, 100)])
# 可视化原始数据
plt.figure(figsize=(10, 6))
sns.histplot(data, kde=True, bins=30)
plt.title('原始数据分布')
plt.xlabel('值')
plt.ylabel('频率')
plt.tight_layout()
plt.savefig('mixture_model_original_data.png')
plt.close()
# 定义模型
with pm.Model() as model:
# 混合成分的个数
K = 2
# 混合成分的权重
w = pm.Dirichlet('w', a=np.ones(K))
# 每个混合成分的均值和标准差
means = pm.Normal('means', mu=[-1, 2], sd=1, shape=K)
stds = pm.HalfNormal('stds', sd=1, shape=K)
# 混合成分
mixture = pm.NormalMixture('mixture', w=w, mu=means, sd=stds, observed=data)
# 运行 MCMC 采样
trace = pm.sample(1000, tune=1000, chains=2, cores=2, return_inferencedata=True)
# 绘制后验分布
plt.figure(figsize=(15, 10))
az.plot_posterior(trace, var_names=['w', 'means', 'stds'], kind='hist', credible_interval=0.95)
plt.suptitle('贝叶斯混合模型参数的后验分布')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.savefig('mixture_model_posterior.png')
plt.close()
# 预测每个数据点的类别
with model:
ppc = pm.sample_posterior_predictive(trace, samples=1000)
# 计算每个数据点属于每个类别的后验概率
posterior_prob = np.zeros((len(data), K))
for i in range(len(data)):
for k in range(K):
posterior_prob[i, k] = np.mean(ppc['mixture'][:, i] == k)
# 根据后验概率进行聚类
clusters = np.argmax(posterior_prob, axis=1)
# 可视化聚类结果
plt.figure(figsize=(10, 6))
sns.scatterplot(x=data, y=np.zeros_like(data), hue=clusters, palette=['red', 'blue'], s=100, alpha=0.6)
plt.title('贝叶斯混合模型聚类结果')
plt.xlabel('数据值')
plt.legend(title='聚类类别')
plt.tight_layout()
plt.savefig('mixture_model_clustering.png')
plt.close()
print("贝叶斯混合模型参数估计完成,结果已保存为图片")