【简单认识】机器学习常见分类算法——朴素贝叶斯

贝叶斯在1763年,《机会学说中一个问题的解》中提出了贝叶斯定理。

生活中不乏分类,比如我们经常通过一些人的衣着,来下意识的区别某些人是杀马特亦或是文艺青年。我们是如何做出这些判断或者说是分类的呢?这些判断大多来自我们的“经验之谈”,即,我们首先脑海中会先存有“某类人通常会如何着装打扮”的概念,然后当遇到这类显著特征之后,便会下意识的对其进行分类。

那么如何让机器进行这种类似的判断区分呢?

朴素贝叶斯分类法是一种相对简单易理解的机器分类方法。它的思想是首先对一些已知分类的样本进行采样(机器学习),比如已知某个人是非洲人,他的特征是肤色黑,于是我们相对的会提高非洲人肤色黑的概率(即P[肤色黑|是非洲人]),当然为了提高分类的成功度,同时还要收集其他特征。那么当学习结束,进行应用的时候,倘若对一个黑色皮肤的人进行分类,虽然我们不能确定他一定是某类人,但仅由当前已知特性进行判断,是非洲人的概率相对高,于是我们将其归类为非洲人。

从数学计算上:

1.我们假设将某种待区分事物x = {a1, a2, a3, ...., am},其中xi代表A的第i种特征属性(类似上述的"肤色")。

2.类别集合B = {y1, y2, y3, ....},其中yi代表第i类(类似上述"非洲人")。

3.表示之前通过"学习"得知的yi类中具有ai特征属性的人的概率。

4.由贝叶斯公式:

其中分母我们设为P(x)

显然,由于P(x)为一常量,比较时可只关注分子部分。以及待鉴别事物同时具有多种特征,可得:

至此,我们通过了“以往经验”得到了具体推算某事物x属于yi类的概率P(yi|x)的方法。

显然对于所有的P(yi|x),值最大的,即为x最有可能属于的那一类。

总结一下,朴素贝叶斯进行分类总共分为三步:确定特征属性,通过样本数据进行计算,以及应用判断。

接下来举个简单的例子,顺带附上一份粗糙而又简陋的代码。

对于目前的博客网站,很多人可能同时拥有不止一个博客,然而网站管理员需要知道当前有多少账号是用户主用的账号或者是活跃用户,哪些是偶尔使用或者废弃的账号。

首先我们需要确定区分【用户主用账号】和【用户辅助账号】这两者的特征属性,并加以分类:

1.发表博文数量/ID注册天数(三类<0.1, 0.1~0.2, >0.2)

2.互加好友数量/ID注册天数(三类<0.1, 0.1~0.8, >0.8)

3.是否上传真实头像(两类0否, 1是)

对于某个账户,可以很容易地从后台得到如上我们需要的数据。

以下是代码,学习部分暂时用Virtual_Learned()函数代表虚拟结果。

#include <iostream>
#include <vector>
#define MAX_Class 2
#define MAX_Character 3
//类别:用户主用账号, 用户辅助账号(0, 1)
//特征属性:1.发表博文数量/ID注册天数(<0.1, 0.1~0.2, >0.2)
//         2.互加好友数量/ID注册天数(<0.1, 0.1~0.8, >0.8)
//         3.是否上传真实头像(0.0否, 1.0是)
double P_C[MAX_Class];
//P_C[i] : i类别占训练样本总体的概率
std::vector<double> P[MAX_Class][MAX_Character];
//P[i][j][k] : i类别条件下, j特征, k情况的概率
double lap = (double)MAX_Character;
struct Check {
    int p_kind[3] = {0};
    Check(double a, double b, int c) {
        if(a < 0.1) p_kind[0] = 0;
        else if(a < 0.2) p_kind[0] = 1;
        else p_kind[0] = 2;
        if(b < 0.1) p_kind[1] = 0;
        else if(b < 0.8) p_kind[1] = 1;
        else p_kind[1] = 2;
        if(c == 0) p_kind[2] = 0;
        else p_kind[2] = 1;
    }
} ;
void Virtual_Learned() {
    P_C[0] = 0.89, P_C[1] = 0.11;
    P[0][0].push_back(0.3), P[0][0].push_back(0.5), P[0][0].push_back(0.2);
    P[1][0].push_back(0.75), P[1][0].push_back(0.15), P[1][0].push_back(0.1);
    P[0][1].push_back(0.1), P[0][1].push_back(0.7), P[0][1].push_back(0.2);
    P[1][1].push_back(0.7), P[1][1].push_back(0.2), P[1][1].push_back(0.1);
    P[0][2].push_back(0.2), P[0][2].push_back(0.8);
    P[1][2].push_back(0.9), P[1][2].push_back(0.1);
}
int main() {
    Virtual_Learned();
    double a, b;
    int c;
    //分别输入:发表博文数量/ID注册天数
    //         互加好友数量/ID注册天数
    //         是否上传真实头像(0否, 1是)
    while(std::cin >> a >> b >> c) {
        Check test = Check(a, b, c);
        double test_ans[MAX_Class] = {0.0};
        for(int i = 0; i < MAX_Class; i++) {
            test_ans[i] = P_C[i];
            for(int j = 0; j < MAX_Character; j++) {
                test_ans[i] *= P[i][j][test.p_kind[j]];
            }
            //test_ans[i] /= lap;
        }
        std::cout << "该账号为主用账号的相对系数:" ;
        std::cout << test_ans[0] << std::endl;
        std::cout << "该账号为辅助账号的相对系数:" ;
        std::cout << test_ans[1] << std::endl;
        if(test_ans[0] >= test_ans[1])
            std::cout << "故该账号为用户主用账号" << std::endl;
        else std::cout << "故该账号为用户辅助账号" << std::endl;
    }
    return 0;
}

假设,当前有一个账号,该账号并没有上传真实头像,但是其第1属性值为0.1,第二属性值为0.4

通过计算,我们将得到:

由此,我们也可大致地发现,当特征属性比较多的时候,朴素贝叶斯可以具有相对较强的抗干扰能力。

————————————————————————————————————————————————

【PS:以上的例子中,由于特征属性之间均互相独立,我们以样本数据中某的出现频率当作概率,然而当特征属性是连续值得时候。通常是假设该值服从高斯分布,需要求出样本中该值的均值和标准差,然后以如下公式带入求得P值。】

         

时间: 2024-10-08 12:33:07

【简单认识】机器学习常见分类算法——朴素贝叶斯的相关文章

机器学习(五)—朴素贝叶斯

最近一直在看机器学习相关的算法,今天我们学习一种基于概率论的分类算法—朴素贝叶斯.本文在对朴素贝叶斯进行简单介绍之后,通过Python编程加以实现. 一  朴素贝叶斯概述                                                               1 前言 “贝叶斯”又是一个响当当的名字,刚开始接触的是贝叶斯定理.贝叶斯分类器是一类分类算法的总称,是两种最为广泛的分类模型之一,另一种就是上篇中的决策树了.贝叶斯分类均以贝叶斯定理为基础,朴素贝叶斯是

Stanford机器学习[第六讲]-朴素贝叶斯算法

引文:由于之前讲过了朴素贝叶斯的理论Stanford机器学习[第五讲]-生成学习算法第四部分,同时朴素贝叶斯的算法实现也讲过了,见机器学习算法-朴素贝叶斯Python实现.那么这节课打算讲解一下朴素贝叶斯算法的具体计算流程,通过一个具体的实例来讲解. PS:为了专注于某一个细节,本章节只抽取了视频的一部分来讲解,只讲解一个贝叶斯算法的计算流程,关于视频里面的具体内容请参考下面的视频链接. 讲解的实例是一个文本分类的例子,区分一句话是粗鲁的还是文明的,类别标签只有Yes或No,表示是粗鲁的和不是粗

第四章:基于概率论的分类方法: 朴素贝叶斯

本章内容□使用概率分布进行分类□学习朴素贝叶斯分类器□解析RSS源数据口使用朴素贝叶斯来分析不同地区的态度 前两章我们要求分类器做出艰难决策,给出“该数据实例属于哪一类”这类问题的明确答案.不过,分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时给出这个猜测的概率估计值.       概率论是许多机器学习算法的基础,所以深刻理解这一主题就显得十分重要.第3章在计算特征值取某个值的概率时涉及了一些概率知识,在那里我们先统计特征在数据集中取某个特定值的次数,然后除以数据集的

【机器学习实验】使用朴素贝叶斯进行文本的分类

引言 朴素贝叶斯由贝叶斯定理延伸而来的简单而强大的概率模型,它根据每个特征的概率确定一个对象属于某一类别的概率.该方法基于一个假设,所有特征需要相互独立,即任一特征的值和其他特征的值没有关联关系. 虽然这种条件独立的假设在许多应用领域未必能很好满足,甚至是不成立的.但这种简化的贝叶斯分类器在许多实际应用中还是得到了较好的分类精度.训练模型的过程可以看作是对相关条件概率的计算,它可以用统计对应某一类别的特征的频率来估计. 朴素贝叶斯最成功的一个应用是自然语言处理领域,自然语言处理的的数据可以看做是

基于概率论的分类方法:朴素贝叶斯算法实践学习

      关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月12日 13:03:46所撰写内容(http://blog.csdn.net/qq_37608890/article/details/78738552).             本文根据最近学习机器学习书籍 网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过.          通过前两篇文章,我们对于k-近

机器学习算法-朴素贝叶斯Python实现

引文:前面提到的K最近邻算法和决策树算法,数据实例最终被明确的划分到某个分类中,下面介绍一种不能完全确定数据实例应该划分到哪个类别,或者说只能给数据实例属于给定分类的概率. 基于贝叶斯决策理论的分类方法之朴素贝叶斯 优点:在数据较少的情况下仍然有效,可以处理多类别问题 缺点:对于输入数据的准备方式较为敏感 适用数据类型:标称型数据. 朴素贝叶斯的一般过程 收集数据:可以使用任何方式 准备数据:需要数据型或是布尔型数据 分类数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好 训练算法:计

(笔记)斯坦福机器学习第六讲--朴素贝叶斯

本讲内容 1. Naive Bayes(朴素贝叶斯) 2.Event models(朴素贝叶斯的事件模型) 3.Neural network (神经网络) 4.Support vector machines(支持向量机) 1.朴素贝叶斯 上讲中的垃圾邮件问题有几个需要注意的地方: (1)  一个单词只有出现和不出现两种可能,因此每个特征x只有两个取值 (2) 特征向量x的个数应该等于词典的长度,比如  将该算法一般化: (1) 让 可以取更多的值 此时  服从多项式分布,而不再是伯努利分布.一种

《机器学习实战》笔记——朴素贝叶斯

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值. 是一种监督算法. 广泛应用于垃圾邮件检测等等. 1 # _*_coding:utf-8_*_ 2 from numpy import * 3 4 # 4-1 词表到向量的转换函数(实验样本) 5 def loadDataSet(): 6 postingList = [['my', 'dog', 'has', 'flea', 'problems

机器学习之&amp;&amp;贝叶斯定理、朴素贝叶斯实现、贝叶斯网络等知识博客整理

什么是历史,历史就是我们,不是你,不是他,不是她,是所有人. ----------题记 本文是博主对于bayes及其相关知识的读物总结. 一.数学之美番外篇:平凡而又神奇的贝叶斯方法 二.机器学习理论与实战(三)朴素贝叶斯 三.从贝叶斯方法谈到贝叶斯网络 四.数学之美----贝叶斯网络 (2) 五.贝叶斯网络的学习 六.Stanford概率图模型(Probabilistic Graphical Model)- 第一讲 贝叶斯网络基础 七.隐马尔科夫模型 和动态贝叶斯网络 八.贝叶斯网络在线构建过