机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现

naive_bayes_classifier.py

import numpy as np
import collections as cc  # 集合的计数功能
from scipy.stats import norm  # 极大似然估计样本的均值和标准方差
from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"""朴素贝叶斯分类器:对于连续属性两种方式操作,1是分箱处理,2是直接进行高斯分布的参数估计"""def __init__(self, is_binned=False, is_feature_all_R=False, feature_R_idx=None, max_bins=10):self.is_binned = is_binned  # 连续特征变量数据是否进行分箱操作,离散化if is_binned:self.is_feature_all_R = is_feature_all_R  # 是否所有特征变量都是连续数值,boolself.max_bins = max_bins  # 最大分箱数self.dbw = DataBinsWrapper()  # 分箱对象self.dbw_XrangeMap = dict()  # 存储训练样本特征分箱的段点self.feature_R_idx = feature_R_idx  # 混合式数据中连续特征变量的索引self.class_values, self.n_class = None, 0  # 类别取值以及类别数self.prior_prob = dict()  # 先验分布,键是类别取值,键是类别取值self.classified_feature_prob = dict()  # 存储每个类所对应的特征变量取值频次或者连续属性的高斯分布参数self.feature_values_num = dict()  # 训练样本中每个特征不同的取值数,针对离散数据self.class_values_num = dict()  # 目标集中每个类别的样本量,Dcdef _prior_probability(self, y_train):"""计算类别的先验概率:param y_train: 目标集:return:"""n_samples = len(y_train)  # 总样本量self.class_values_num = cc.Counter(y_train)  # Counter({'否': 9, '是': 8})# print(self.class_values_num)for key in self.class_values_num.keys():self.prior_prob[key] = (self.class_values_num[key] + 1) / (n_samples + self.n_class)# print(self.prior_prob)def _data_bin_wrapper(self, x_samples):"""针对特定的连续特征属性索引dbw_feature_idx,分别进行分箱,考虑测试样本与训练样本使用同一个XrangeMap:param x_samples: 样本:即可以是训练样本,也可以是测试样本:return:"""self.feature_R_idx = np.asarray(self.feature_R_idx)x_samples_prop = []  # 分箱之后的数据if not self.dbw_XrangeMap:# 为空,即创建决策树前所做的分箱操作for i in range(x_samples.shape[1]):if i in self.feature_R_idx:  # 说明当前特征是连续数值self.dbw.fit(x_samples[:, i])self.dbw_XrangeMap[i] = self.dbw.XrangeMapx_samples_prop.append(self.dbw.transform(x_samples[:, i]))else:x_samples_prop.append(x_samples[:, i])else:  # 针对测试样本的分箱操作for i in range(x_samples.shape[1]):if i in self.feature_R_idx:  # 说明当前特征是连续数值x_samples_prop.append(self.dbw.transform(x_samples[:, i], self.dbw_XrangeMap[i]))else:x_samples_prop.append(x_samples[:, i])return np.asarray(x_samples_prop).Tdef fit(self, x_train, y_train):"""朴素贝叶斯分类器训练,可将朴素贝叶斯分类器涉及的所有概率估值事先计算好存储起来:param x_train: 训练集:param y_train: 目标集:return:"""x_train, y_train = np.asarray(x_train), np.asarray(y_train)self.class_values = np.unique(y_train)  # 类别取值self.n_class = len(self.class_values)  # 类别数if self.n_class < 2:print("仅有一个类别,不进行贝叶斯分类器估计...")exit(0)self._prior_probability(y_train)  # 先验概率# 每个特征变量不同的取值数,类条件概率的分子D(x, xi)for i in range(x_train.shape[1]):self.feature_values_num[i] = len(np.unique(x_train[:, i]))if self.is_binned:self._binned_fit(x_train, y_train)  # 分箱处理else:self._gaussian_fit(x_train, y_train)  # 直接进行高斯分布估计def _binned_fit(self, x_train, y_train):"""对连续特征属性进行分箱操作,然后计算各概率值:param x_train::param y_train::return:"""if self.is_feature_all_R:  # 全部是连续self.dbw.fit(x_train)x_train = self.dbw.transform(x_train)elif self.feature_R_idx is not None:x_train = self._data_bin_wrapper(x_train)for c in self.class_values:class_x = x_train[y_train == c]  # 获取对应类别的样本feature_counter = dict()  # 每个离散变量特征中特定值的出现的频次,连续特征变量存u、sigmafor i in range(x_train.shape[1]):feature_counter[i] = cc.Counter(class_x[:, i])self.classified_feature_prob[c] = feature_counterprint(self.classified_feature_prob)def _gaussian_fit(self, x_train, y_train):"""连续特征变量不进行分箱,直接进行高斯分布估计,离散特征变量取值除外:param x_train::param y_train::return:"""for c in self.class_values:class_x = x_train[y_train == c]  # 获取对应类别的样本feature_counter = dict()  # 每个离散变量特征中特定值的出现的频次,连续特征变量存u、sigmafor i in range(x_train.shape[1]):if self.feature_R_idx is not None and (i in self.feature_R_idx):  # 连续特征# 极大似然估计均值和方差mu, sigma = norm.fit(np.asarray(class_x[:, i], dtype=np.float64))feature_counter[i] = {"mu": mu, "sigma": sigma}else:  # 离散特征feature_counter[i] = cc.Counter(class_x[:, i])self.classified_feature_prob[c] = feature_counterprint(self.classified_feature_prob)def predict_proba(self, x_test):"""预测测试样本所属类别的概率:param x_test: 测试样本集:return:"""x_test = np.asarray(x_test)if self.is_binned:return self._binned_predict_proba(x_test)else:return self._gaussian_predict_proba(x_test)def _binned_predict_proba(self, x_test):"""连续特征变量进行分箱离散化,预测:param x_test: 测试样本集:return:"""if self.is_feature_all_R:x_test = self.dbw.transform(x_test)elif self.feature_R_idx is not None:x_test = self._data_bin_wrapper(x_test)y_test_hat = np.zeros((x_test.shape[0], self.n_class))  # 存储测试样本所属各个类别概率for i in range(x_test.shape[0]):test_sample = x_test[i, :]  # 当前测试样本y_hat = []  # 当前测试样本所属各个类别的概率for c in self.class_values:prob_ln = np.log(self.prior_prob[c])  # 当前类别的先验概率,取对数# 当前类别下不同特征变量不同取值的频次,构成字典feature_frequency = self.classified_feature_prob[c]for j in range(x_test.shape[1]):  # 针对每个特征变量value = test_sample[j]  # 当前测试样本的当前特征取值cur_feature_freq = feature_frequency[j]  # Counter({'浅白': 4, '青绿': 3, '乌黑': 2})# 按照拉普拉斯修正方法计算prob_ln += np.log((cur_feature_freq.get(value, 0) + 1) /(self.class_values_num[c] + self.feature_values_num[j]))y_hat.append(prob_ln)  # 输入第c个类别的概率y_test_hat[i, :] = self.softmax_func(np.asarray(y_hat))  # 适合多分类,且归一化return y_test_hat@staticmethoddef softmax_func(x):"""softmax函数,为避免上溢或下溢,对参数x做限制:param x: 数组: 1 * n_classes:return:"""exps = np.exp(x - np.max(x))  # 避免溢出,每个数减去其最大值return exps / np.sum(exps)def _gaussian_predict_proba(self, x_test):"""连续特征变量不进行分箱,直接按高斯分布估计:param x_test: 测试样本集:return:"""y_test_hat = np.zeros((x_test.shape[0], self.n_class))  # 存储测试样本所属各个类别概率for i in range(x_test.shape[0]):test_sample = x_test[i, :]  # 当前测试样本y_hat = []  # 当前测试样本所属各个类别的概率for c in self.class_values:prob_ln = np.log(self.prior_prob[c])  # 当前类别的先验概率,取对数# 当前类别下不同特征变量不同取值的频次,构成字典feature_frequency = self.classified_feature_prob[c]for j in range(x_test.shape[1]):  # 针对每个特征变量value = test_sample[j]  # 当前测试样本的当前特征取值if self.feature_R_idx is not None and (j in self.feature_R_idx):  # 连续特征# 取极大似然估计的均值和方差# print(feature_frequency[j].values())mu, sigma = feature_frequency[j].values()prob_ln += np.log(norm.pdf(value, mu, sigma) + 1e-8)else:cur_feature_freq = feature_frequency[j]  # Counter({'浅白': 4, '青绿': 3, '乌黑': 2})# 按照拉普拉斯修正方法计算prob_ln += np.log((cur_feature_freq.get(value, 0) + 1) /(self.class_values_num[c] + self.feature_values_num[j]))y_hat.append(prob_ln)  # 输入第c个类别的概率y_test_hat[i, :] = self.softmax_func(np.asarray(y_hat))  # 适合多分类,且归一化return y_test_hatdef predict(self, x_test):"""预测测试样本所属类别:param x_test: 测试样本集:return:"""return np.argmax(self.predict_proba(x_test), axis=1)

二、可视化分类边界函数

plt_decision_function.py

import matplotlib.pyplot as plt
import numpy as npdef plot_decision_function(X, y, clf, is_show=True):"""可视化分类边界函数:param X: 测试样本:param y: 测试样本的类别:param clf: 分类模型:param is_show: 是否在当前显示图像,用于父函数绘制子图:return:"""if is_show:plt.figure(figsize=(7, 5))x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xi, yi = np.meshgrid(np.linspace(x_min, x_max, 100),np.linspace(y_min, y_max, 100))y_pred = clf.predict(np.c_[xi.ravel(), yi.ravel()])  # 模型预测值y_pred = y_pred.reshape(xi.shape)plt.contourf(xi, yi, y_pred, cmap="winter", alpha=0.4)plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors="k")plt.xlabel("Feature 1", fontdict={"fontsize": 12})plt.ylabel("Feature 2", fontdict={"fontsize": 12})plt.title("NativeBayes Model Classification Boundary", fontdict={"fontsize": 14})if is_show:plt.show()

三、朴素贝叶斯算法的测试

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from naive_bayes_classifier import NaiveBayesClassifier
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from plt_decision_function import plot_decision_function# wm = pd.read_csv("watermelon.csv").dropna()
# X, y = np.asarray(wm.iloc[:, 1:-1]), np.asarray(wm.iloc[:, -1])
# # print(X)
# # print(y)
# nbc = NaiveBayesClassifier(is_binned=True, feature_R_idx=[6, 7], max_bins=10)
# nbc.fit(X, y)
# y_proba = nbc.predict_proba(X)
# print(y_proba)
# y_hat = nbc.predict(X)
# print(y_hat)X, y = make_blobs(n_samples=500, n_features=2, centers=4, cluster_std=0.85, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)nbc = NaiveBayesClassifier(is_binned=True, max_bins=20, is_feature_all_R=True)
nbc.fit(X_train, y_train)
y_pred = nbc.predict(X_test)
print(classification_report(y_test, y_pred))
plt.figure(figsize=(14, 5))
plt.subplot(121)
plot_decision_function(X_train, y_train, nbc, is_show=False)nbc = NaiveBayesClassifier(is_binned=False, feature_R_idx=[0, 1])
nbc.fit(X_train, y_train)
y_pred = nbc.predict(X_test)
print(classification_report(y_test, y_pred))
plt.subplot(122)
plot_decision_function(X_train, y_train, nbc, is_show=False)
plt.show()# al = pd.read_csv("mushroom/agaricus-lepiota.data").dropna()

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中&#xff0c;要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上&#xff0c;包括对持久发布/子语义…

腾讯云4核8G服务器优惠价格表(轻量+CVM)

腾讯云4核8G服务器多少钱&#xff1f;轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细配置和精准报价…

ChatGPT带火的HBM是什么?

“ChatGPT是人工智能领域的iPhone时刻&#xff0c;也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火&#xff0c;对大算力芯片提出了更高更多的要求。近日&#xff0c;据韩国经济日报报道&#xff0c;受惠于ChatGPT&am…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat&#xff08;加创建自启动脚本&#xff09; 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED&#xff0c;计时LEDESP32基础控制&#xff1a;温控输出串口监控&#xff0c;LCD事件计数器&#xff0c;SD卡读写&#xff0c;扫描WiFi网络&#xff0c;手机控制LED&#xff0c;经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

如何多环境切换?如何在微服务配置多环境?

问题本质: nacos配置中心的配置是如何被项目读取到的&#xff1f;(nacos的配置中心和项目是如何联系的&#xff1f;) 注意&#xff1a;nacos有配置管理和服务管理&#xff0c;别弄混。自动注册的是服务管理&#xff01;&#xff01;&#xff01; 1. 如何注册到nacos服务管理中心…

蓝桥杯备战刷题one(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬&#xff0c;我又回来了&#xff0c;最近2月太忙啦&#xff08;过年、奶娃、本子、材料、结题&#xff09;&#xff0c;断更了。现水一篇证明我还活着&#xff01;&#xff01;&#xff01; 最近在写国自然本子&#xff0c;遇到一个估计大家都会遇到的问…

Unity将4个纹理图拼接成1个纹理

需要的效果 最终实现的效果大概如下: 4个贴图上去 这里随便放一个切分的图。 Shader代码如下 直接上代码: // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)// Unlit shader. Simplest possible textured shad…

UE5 C++ Widget练习 Button 和 ProgressBar创建血条

一. 1.C创建一个继承Widget类的子类&#xff0c; 命名为MyUserWidget 2.加上Button 和 UserWidget的头文件 #include "CoreMinimal.h" #include "Components/Button.h" #include "Blueprint/UserWidget.h" #include "MyUserWidget.genera…

Python实现自动检测设备连通性并发送告警到企业微信

背景&#xff1a;门禁机器使用的WiFi连接&#xff0c;因为某些原因会不定期自动断开连接&#xff0c;需要人工及时干预&#xff0c;以免影响门禁数据同步&#xff0c;故写此脚本&#xff0c;定时检测门禁网络联通性。 #首次使用要安装tcping模块 pip install tcpingfrom tcpin…

【学习笔记】Serdes中的高速接口设计

参考文献&#xff1a; 一、绪论 1.1 背景 “串行替代并行”&#xff1a; 串行传输使用差分信号传输以传输更长距离&#xff1b; 并行传输因串扰无法长距离传输&#xff1b;并行线路对信号偏斜量的要求&#xff0c;限制了最大的传输速率。 SerDesSerializer Deserializer S…

欧拉函数性质和快速幂算法及python实现

目录 欧拉函数 快速幂算法 快速模幂算法 欧拉函数 两个不同的正整数a,b&#xff0c;若gcd(a,b)1,则a和b互质&#xff0c;1与任何正整数都互质 欧拉函数的意义 φ(n) 表示小于或等于正整数n的所有正整数中与n互质的数的个数 如φ(32) 16&#xff0c;即小于32的数中有16个…

Prompt 编程的优化技巧

一、为什么要优化 一&#xff09;上下文限制 目前 GPT-3.5 以及 GPT-4最大支持 16K 上下文&#xff0c;比如你输入超过 16k 的长文本&#xff0c;ChatGPT 会提示文本过大&#xff0c;为了避免 GPT 无法回复&#xff0c;需要限制 上下文在16k 以内 上下文对于 GPT 来说是非常重…

STL常用容器(vector容器)---C++

STL常用容器目录 2.vector容器2.1 vector基本概念2.2 vector构造函数2.3 vector赋值操作2.4 vector容量和大小2.5 vector插入和删除2.6 vector数据存取2.7 vector互换容器2.7.1 vector互换容器收缩内存空间 2.8 vector预留空间 2.vector容器 2.1 vector基本概念 功能&#xf…

自然语言处理(NLP)—— 神经网络自然语言处理(2)实际应用

本篇文章的第一部分是关于探索词嵌入&#xff08;word embedding&#xff09;向量空间。词嵌入是一种语言模型和文本表示技术&#xff0c;其中单词或短语从词汇表被映射到向量的高维空间中。通过这种方式&#xff0c;可以通过计算向量之间的距离来捕捉单词之间的语义关系。 1.…