热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实现贝叶斯分类器_从头开始在Python中实现高斯朴素贝叶斯

NaiveBayes是一种非常方便,流行且重要的机器学习算法,尤其适用于文本分析和一般分类。在本文中,我将讨论高斯朴素贝叶斯:
0b16576372084eb80c5b15b663fa83ed.png

Naive Bayes是一种非常方便,流行且重要的机器学习算法,尤其适用于文本分析和一般分类。在本文中,我将讨论高斯朴素贝叶斯:算法,其实现和应用于微型维基百科数据集(维基百科中给出的数据集)。

算法:

高斯朴素贝叶斯算法是一种概率算法。它涉及到对数据集中的类和给定类的测试数据分别进行先验概率和后验概率的计算。

58b3375f93275581ebcd89dd27d8dfd6.png

先验概率的数学公式…eq-1)

所有类的先验概率都使用相同的公式计算。

07336eb58c08ee1ca5a9b1749821e6cc.png

eq-2)

给定c类的测试数据x的后验概率的数学公式,它是给定c类的测试数据的所有特征的条件概率的乘积 .....eq-2)

但是,如何获得给定类的测试数据特征的条件概率呢?

这由从高斯(正常)分布获得的概率给出。

c2776e013c443c4a0ca3fa09a033ab3e.png

eq-3)

给定一个类和x_i是一个测试数据特征,得到该测试特征的条件概率的数学表达式,c是一个类和相关的样本方差σ².....eq-3)

最后,使用贝叶斯定理计算给定实例(测试实例)的每个类的条件概率。

fc8d65fb0d4cbdafc1b7eec0bc43eec0.png

给定测试数据x, c_i类条件概率的数学表达式 ... eq-4)

对所有类重复等式4),并且显示最高概率的类最终被声明为预测结果。

从头开始在Python中实现:

如前所述,从头开始编写算法时,除了Numpy(它为Python提供了matlab类型的环境)和列表/字典相关的库之外,没有使用其他库。4个模块实现了高斯朴素贝叶斯二元分类,每个模块执行不同的操作。

=> pre_prob():它通过将标签集y作为输入,按照eq-1)返回2个类的先验概率。Python实现如下:

# Importing necessary libraries...import collections import numpy as npdef pre_prob(y): y_dict = collections.Counter(y) pre_probab = np.ones(2) for i in range(0, 2): pre_probab[i] = y_dict[i]/y.shape[0] return pre_probab

e5c9b3b7c71a9fc78113b5c2d1c53415.png

=> mean_var():在给定特征集X和标签集y作为输入的情况下,该函数返回2个类标签(二元分类)的所有特征的均值和方差。Python实现如下:

def mean_var(X, y): n_features = X.shape[1] m = np.ones((2, n_features)) v = np.ones((2, n_features)) n_0 = np.bincount(y)[np.nonzero(np.bincount(y))[0]][0] x0 = np.ones((n_0, n_features)) x1 = np.ones((X.shape[0] - n_0, n_features)) k = 0 for i in range(0, X.shape[0]): if y[i] == 0: x0[k] = X[i] k = k + 1 k = 0 for i in range(0, X.shape[0]): if y[i] == 1: x1[k] = X[i] k = k + 1 for j in range(0, n_features): m[0][j] = np.mean(x0.T[j]) v[0][j] = np.var(x0.T[j])*(n_0/(n_0 - 1)) m[1][j] = np.mean(x1.T[j]) v[1][j] = np.var(x1.T[j])*((X.shape[0]-n_0)/((X.shape[0] - n_0) - 1)) return m, v # mean and variance

874fb0349a403bc0c9348fc714cbed5c.png

=> prob_feature_class():通过将均值m,方差v和测试数据x作为输入,返回给定类c(eq-2)的测试数据x的后验概率的函数。Python时如下:

def prob_feature_class(m, v, x): n_features = m.shape[1] pfc = np.ones(2) for i in range(0, 2): product = 1 for j in range(0, n_features): product = product * (1/sqrt(2*3.14*v[i][j])) * exp(-0.5 * pow((x[j] - m[i][j]),2)/v[i][j]) pfc[i] = product return pfc

8608e9001b27e1a1e02513be84c71730.png

=> GNB():最后通过获取测试实例x(eq-4)来计算2个类中每个类的条件概率。特征集X,标签集y和测试数据x作为输入并返回

  1. 所有特征的2个等级的平均值
  2. 所有特征的2个类的方差
  3. 数据集中2个类的先验概率
  4. 测试数据的后验概率给出了每类2类
  5. 给定这两类中的每一类的测试数据的后验概率
  6. 高斯朴素贝叶斯算法给出的最终预测

GNB()的Python实现如下:

def GNB(X, y, x): m, v = mean_var(X, y) pfc = prob_feature_class(m, v, x) pre_probab = pre_prob(y) pcf = np.ones(2) total_prob = 0 for i in range(0, 2): total_prob = total_prob + (pfc[i] * pre_probab[i]) for i in range(0, 2): pcf[i] = (pfc[i] * pre_probab[i])/total_prob prediction = int(pcf.argmax()) return m, v, pre_probab, pfc, pcf, prediction

650e9dcbddb3448dfcdfbeb9a5320278.png

高斯朴素贝叶斯在微型数据集中的应用

维基百科中给出的样本性别数据集已用于实施的高斯朴素贝叶斯的应用。

朴素贝叶斯分类器--Dataset(https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Sex_classification)

问题陈述:“ 考虑到身高(以英尺为单位),体重(以磅为单位)和足部尺寸(以英寸为单位),预测该人是男性还是女性 ”

=>数据读取使用Pandas完成,因为数据集包含列的文本标题。

import pandas as pdimport numpy as npdata = pd.read_csv('gender.csv', delimiter = ',')data.head()

59a0144ed5f4338f383175916d1be617.png
dff915a2fb934b0f1400309275e4863c.png

=>对Wikipedia中使用的测试实例执行4-module-Gaussian Naive Bayes。

朴素贝叶斯分类器 - 测试(https://en.wikipedia.org/wiki/Naive_Bayes_classifier#Testing)

# converting from pandas to numpy ...X_train = np.array(data.iloc[:,[1,2,3]])y_train = np.array(data['Person'])for i in range(0,y_train.shape[0]): if y_train[i] == "Female": y_train[i] = 0 else: y_train[i] = 1x = np.array([6, 130, 8]) # test instance used in Wikipedia# executing the Gaussian Naive Bayes for the test instance...m, v, pre_probab, pfc, pcf, prediction = GNB(X_train, y_train, x)print(m) # Output given below...(mean for 2 classes of all features)print(v) # Output given below..(variance for 2 classes of features)print(pre_probab) # Output given below.........(prior probabilities)print(pfc) # Output given below............(posterior probabilities)print(pcf) # Conditional Probability of the classes given test-dataprint(prediction) # Output given below............(final prediction)

ca536a4faed41538c2752ead94cb1cc7.png
2f7cdeee39786e3e4386d4a23a51e3b3.png

所有特征(列)的2个类(行)的均值

13a0c7956e0c31d78c80277fe2217e39.png

所有特征(列)的2类(行)的样本方差

fcc74d3b47912b5964b0eb87398f64f9.png

类的先验概率, Female and Male

cd09ac722df48159da8fa120221dacb1.png

给出两个类别中的每一个的测试数据的后验概率

8e7fa7906e3d504281dc2d1c1c83d6e5.png

给出测试数据的2个类的最终条件概率

7bc001a1d3f0137eb19fe2cb2d32c504.png

最终预测

最后,计算和预测结果符合使用相同数据集的Wikipedia中显示的结果。



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
wen260693700
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有