[Machine Learning]朴素贝叶斯(NaiveBayes)

C++ 描述:

 1 #include <iostream>
 2 #include <string>
 3 #include <fstream>
 4 #include <sstream>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8
 9 using namespace std;
10
11 class NaiveBayes {
12 public:
13     void load_data(string path);
14     void train_model();
15     int predict(const vector<int> &item);
16 private:
17     vector<vector<int>> data;
18     map<pair<int, int>, double> c_p; //conditional prob
19     map<int, double> p_p; // prior prob
20 };
21
22 void NaiveBayes::load_data(string path) {
23     ifstream fin(path.c_str());
24     if (!fin) {
25         cerr << "open file error" << endl;
26         exit(1);
27     }
28
29     string line;
30     while (getline(fin, line)) {
31         if (line.size() > 1) {
32             stringstream sin(line);
33             int elem;
34             vector<int> tmp;
35             while (sin >> elem) {
36                 tmp.push_back(elem);
37             }
38             data.push_back(tmp);
39         }
40     }
41     fin.close();
42 }
43
44 void NaiveBayes::train_model() {
45     for (auto &d : data) {
46         int len = d.size();
47         p_p[d[len - 1]] += (1.0 / data.size());
48     }
49
50     for (auto &p : p_p) {
51         int label = p.first;
52         double prior = p.second;
53         for (auto &d : data) {
54             for (int i = 0; i < d.size(); ++i) {
55                 c_p[make_pair(d[i], label)] += (1.0 / (prior * data.size()));
56             }
57         }
58     }
59 }
60
61 int NaiveBayes::predict(const vector<int> &item) {
62     int result;
63     double max_prob = 0.0;
64     for (auto &p : p_p) {
65         int label = p.first;
66         double prior = p.second;
67         double prob = prior;
68         for (int i = 0; i < item.size() - 1; ++i) {
69             prob *= c_p[make_pair(item[i], label)];
70         }
71
72         if (prob > max_prob) {
73             max_prob = prob;
74             result = label;
75         }
76     }
77
78     return result;
79 }
80
81 int main() {
82     NaiveBayes naive_bayes;
83     naive_bayes.load_data(string("result.txt"));
84     naive_bayes.train_model();
85
86     vector<int> item{2, 4};
87     cout << naive_bayes.predict(item);
88     return 0;
89 }

数据集:

1 4 -1
1 5 -1
1 5 1
1 4 1
1 4 -1
2 4 -1
2 5 -1
2 5 1
2 6 1
2 6 1
3 6 1
3 5 1
3 5 1
3 6 1
3 6 -1
时间: 2024-10-09 01:37:16

[Machine Learning]朴素贝叶斯(NaiveBayes)的相关文章

[Machine Learning] 朴素贝叶斯算法(Naive Bayes)

生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本文介绍朴素贝叶斯分类器(Naive Bayes classifier),它是一种简单有效的常用分类算法. 一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒  打喷嚏 农夫 过敏  头痛 建筑工人 脑震荡  头痛 建筑工人 感冒  打喷嚏 教师 感冒  头痛 教师 脑震荡 现在又来了第七个病人,是一个打喷嚏的建筑工人.请问他患

【Machine :Learning】 朴素贝叶斯

1. 朴素贝叶斯: 条件概率在机器学习算法的应用.理解这个算法需要一点推导.不会编辑公式.. 核心就是 在已知训练集的前提条件下,算出每个特征的概率为该分类的概率, 然后套贝叶斯公式计算 预测集的所有分类概率,预测类型为概率最大的类型 from numpy import * def loadDataSet(): """ Returns: postingList: list, 用于测试的静态数据 classVec: list, 标签,与 postingList 对应, 1 代表

朴素贝叶斯-Machine Learining In Action学习笔记

优点:在数据较少的情况下仍然有效,可以处理多类别问题. 缺点:对于输入数据的准备方式较为敏感. 适用数据类型:标称型数据. 条件概率:p(x,y|c?) 需要先验知识和逻辑推理 频数概率:从数据本身获得结论,并不考虑逻辑推理及先验知识 朴素贝叶斯的一般过程: 1. 收集数据:可以使用任何方法. 2. 准备数据:需要数值型或者布尔型数据 3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好. 4. 训练算法:计算不同的独立特征的条件概率. 5. 测试算法:计算错误率. 6. 使用

机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现

本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序. 方法概述 学习(参数估计) 实现:朴素贝叶斯下的文本分类 模型概述 朴素贝叶斯方法,是指 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是 p(y|x)=p(x|y)p(y)p(x)......(1) 在这里,x是一个特征向量,将设x维度为M.因为朴素

Step by Step 改进朴素贝叶斯算法

引言 如果你对naive bayes认识还处于初级阶段,只了解基本的原理和假设,还没有实现过产品级的代码,那么这篇文章能够帮助你一步步对原始的朴素贝叶斯算法进行改进.在这个过程中你将会看到朴素贝叶斯假设的一些不合理处以及局限性,从而了解为什么这些假设在简化你的算法的同时,使最终分类结果变得糟糕,并针对这些问题提出了改进的方法. 朴素贝叶斯(Naive Bayes) 出处: <机器学习>(Machine Learning by Tom M.Mitchell) 符号和术语 假设待分类的实例 X 可

统计学习方法:朴素贝叶斯

作者:桂. 时间:2017-04-20  18:31:37 链接:http://www.cnblogs.com/xingshansi/p/6740308.html 前言 本文为<统计学习方法>第四章:朴素贝叶斯(naive bayes),主要是借助先验知识+统计估计,本文主要论述其分类的思路.全文包括: 1)模型描述 2)算法求解 3)理论应用 内容为自己的学习记录,其中参考他人的地方,最后一并给出链接. 一.模型描述 A-理论框架 日常生活中,总会这么表达:“我觉得吧....”,“以我的经验

【转载】判别模型、生成模型与朴素贝叶斯方法

判别模型.生成模型与朴素贝叶斯方法 转载时请注明来源:http://www.cnblogs.com/jerrylead 1判别模型与生成模型 上篇报告中提到的回归模型是判别模型,也就是根据特征值来求结果的概率.形式化表示为,在参数确定的情况下,求解条件概率.通俗的解释为在给定特征后预测结果出现的概率. 比如说要确定一只羊是山羊还是绵羊,用判别模型的方法是先从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率.换一种思路,我们可以根据山羊的特征首先学习出一个山羊

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

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

朴素贝叶斯方法(Naive Bayes)

本文主要描述了朴素贝叶斯分类方法,包括模型导出和学习描述.实例部分总结了<machine learning in action>一书中展示的一个该方法用于句子感情色彩分类的程序.1 方法概述 学习(参数估计) 实现:朴素贝叶斯下的文本分类 模型概述 朴素贝叶斯方法,是指 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是 p(y|x)=p(x|y)p(y)p(x)......(1) 在这里,x是一个特征向量,将设x维度为M.因为朴