朴素贝叶斯四种模型

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("贝叶斯混合模型参数估计完成,结果已保存为图片")    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万能小贤哥

感谢大捞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值