Accord.NET_Naive Bayes Classifier
我们这个系列主要为了了解并会使用Accord.NET中机器学习有关算法,因此主要关注的是算法针对的的问题,算法的使用。所以主要以代码为主,通过代码来学习,在脑海中形成一个轮廓。下面就言归正传,开始贝叶斯分类器的学习。
朴素贝叶斯分类器,一个基于贝叶斯理论的简单概率分类器。简单的说,贝叶斯理论是独立特征模型,也就是说一个类别的指定特征的表现与否,跟其他任何特征无关。
TestCase1
著名的打网球实验(Tom Mitchell (1998))。实验中,基于四个条件,推测某人是否想去打网球。这些条件变量都是可分类的,即各变量的可取值之间没有关系
首先需要将问题的表现形式简化。通过Accord.Statistics.Filters.Codification,将问题转为用数字表示的codebook,比如Sunny转为0,Overcast为1,Rain为2。以此类推,得到训练用的输入输出。
接下来应该训练贝叶斯模型,用来预测最后一列,是否打网球。这里使用“Outlook”,“Temperature”,“Humidity”,“Wind”作为条件,预测是否打网球,四个输入一个输出。由于输入条件都是可分类的,在创建贝叶斯模型时应该指定每个变量的取值有几种可能,如果训练集的输入已经覆盖了每个变量的所有的情况,可以不创建模型,本例就是如此,因为算法的Learn函数会检查模型是否为空,空的情况下会根据输入输出创建。
得到分类器后,使用Decide方法根据输入计算输出。
接下来看代码
public void ComputeTest()
{
#region doc_mitchell
DataTable data = new DataTable("Mitchell's Tennis Example"); data.Columns.Add("Day", "Outlook", "Temperature", "Humidity", "Wind", "PlayTennis"); data.Rows.Add("D1", "Sunny", "Hot", "High", "Weak", "No");
data.Rows.Add("D2", "Sunny", "Hot", "High", "Strong", "No");
data.Rows.Add("D3", "Overcast", "Hot", "High", "Weak", "Yes");
data.Rows.Add("D4", "Rain", "Mild", "High", "Weak", "Yes");
data.Rows.Add("D5", "Rain", "Cool", "Normal", "Weak", "Yes");
data.Rows.Add("D6", "Rain", "Cool", "Normal", "Strong", "No");
data.Rows.Add("D7", "Overcast", "Cool", "Normal", "Strong", "Yes");
data.Rows.Add("D8", "Sunny", "Mild", "High", "Weak", "No");
data.Rows.Add("D9", "Sunny", "Cool", "Normal", "Weak", "Yes");
data.Rows.Add("D10", "Rain", "Mild", "Normal", "Weak", "Yes");
data.Rows.Add("D11", "Sunny", "Mild", "Normal", "Strong", "Yes");
data.Rows.Add("D12", "Overcast", "Mild", "High", "Strong", "Yes");
data.Rows.Add("D13", "Overcast", "Hot", "Normal", "Weak", "Yes");
data.Rows.Add("D14", "Rain", "Mild", "High", "Strong", "No");
#endregion #region doc_codebook
// 创建codification codebook
// 把字符串变量转为独立的符号变量
Codification codebook = new Codification(data,
"Outlook", "Temperature", "Humidity", "Wind", "PlayTennis"); // 提取出输入输出对作为训练集
DataTable symbols = codebook.Apply(data);
int[][] inputs = symbols.ToArray<int>("Outlook", "Temperature", "Humidity", "Wind");
int[] outputs = symbols.ToArray<int>("PlayTennis");
#endregion #region doc_learn
// 创建一个贝叶斯算法实例
var learner = new NaiveBayesLearning(); // 用训练集学习一个贝叶斯模型
NaiveBayes nb = learner.Learn(inputs, outputs);
#endregion #region doc_test
// 测试一组数据,在sunny,cool,humid,windy的条件下,某人是否会打网球
// 先将条件通过codebook编码为符号
int[] instance = codebook.Translate("Sunny", "Cool", "High", "Strong"); // 获得数字输出表示的答案
int c = nb.Decide(instance); // answer will be 0 // 将数字输出的答案通过codebook转为实际的"Yes"/"No"
string result = codebook.Translate("PlayTennis", c); // 答案是"No" // 还可以提取每种答案的概率
double[] probs = nb.Probabilities(instance); // { 0.795, 0.205 }
#endregion Assert.AreEqual("No", result);
Assert.AreEqual(, c);
Assert.AreEqual(0.795, probs[], 1e-);
Assert.AreEqual(0.205, probs[], 1e-);
Assert.AreEqual(, probs.Sum(), 1e-);
Assert.IsFalse(double.IsNaN(probs[]));
Assert.AreEqual(, probs.Length);
}
TestCase2
下面的例子针对离散模型设置了更具体的学习参数。
public void laplace_smoothing_missing_sample()
{
#region doc_laplace
// Laplace rule针对当某个输入符号的某个类别不在训练集中时
// 比如本例中输入的第二列应包含0,1,2三个值
// 但实际的例子中只有1,2两种情况 int[][] inputs =
{
// 输入 输出
new [] { , }, // 0
new [] { , }, //
new [] { , }, //
new [] { , }, //
new [] { , }, //
new [] { , }, //
new [] { , }, //
new [] { , }, //
new [] { , }, //
}; int[] outputs = // 对应的分类
{
, , , , , , , , ,
}; // 由于训练集没有覆盖实际期望的所有情况Since the data is not enough to determine which symbols we are
// 所以需要指定贝叶斯模型
// 第一个输入有两种情况,第二个输入有三种情况
var bayes = new NaiveBayes(classes: , symbols: new[] { , }); // 创建学习算法时指定模型
var learning = new NaiveBayesLearning()
{
Model = bayes
}; // 使用Laplace rule
learning.Options.InnerOption.UseLaplaceRule = true; // 训练贝叶斯模型
learning.Learn(inputs, outputs); // 第二个输入为0来预测分类结果
int answer = bayes.Decide(new int[] { , });
#endregion Assert.AreEqual(, answer); double prob = bayes.Probability(new int[] { , }, out answer);
Assert.AreEqual(, answer);
//Assert.AreEqual(0.52173913043478259, prob, 1e-10);
Assert.AreEqual(0.44444444444444453, prob, 1e-); double error = new ZeroOneLoss(outputs)
{
Mean = true
}.Loss(bayes.Decide(inputs)); Assert.AreEqual( / 9.0, error);
}
TestCase3
下面的例子创建了一个多类别的分类器,使用整数输入并创建离散的贝叶斯模型。
public void ComputeTest3()
{
#region doc_multiclass
// 将下列数据分成三类//
int[][] inputs =
{
// 输入 输出
new int[] { , , , }, // 0
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
new int[] { , , , }, //
}; int[] outputs = // 对应的输出类别
{
, , , , ,
, , , , ,
, , , , ,
}; // 创建算法
var learner = new NaiveBayesLearning(); // 训练模型
NaiveBayes nb = learner.Learn(inputs, outputs); // 使用第一个样本测试
int answer = nb.Decide(new int[] { , , , }); // should be 1
#endregion double error = new ZeroOneLoss(outputs).Loss(nb.Decide(inputs));
Assert.AreEqual(, error); for (int i = ; i < inputs.Length; i++)
{
error = nb.Compute(inputs[i]);
double expected = outputs[i];
Assert.AreEqual(expected, error);
}
}
TestCase4
下面的例子使用了高斯模型,并且展示如何设置更加具体的学习参数。
public void learn_test()
{
#region doc_learn
// 将下面的输入分成三类 double[][] inputs =
{
// 输入 输出
new double[] { , , , }, // 0
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
new double[] { , , , }, //
}; int[] outputs = // 对应输出的类别
{
, , , , ,
, , , , ,
, , , , ,
}; // 高斯模型
var teacher = new NaiveBayesLearning<NormalDistribution>(); // component distributions
teacher.Options.InnerOption = new NormalOptions
{
Regularization = 1e- // 避免0变异
}; // 训练模型
NaiveBayes<NormalDistribution> bayes = teacher.Learn(inputs, outputs); // 预测输出
int[] predicted = bayes.Decide(inputs); // 预估模型误差,应为0
double error = new ZeroOneLoss(outputs).Loss(predicted); // 预测指定输入
int answer = bayes.Decide(new double[] { , , , }); // 应为1
#endregion Assert.AreEqual(, error);
Assert.AreEqual(, answer);
Assert.IsTrue(predicted.IsEqual(outputs));
}
Accord.NET_Naive Bayes Classifier的更多相关文章
- 学习笔记之Naive Bayes Classifier
Naive Bayes classifier - Wikipedia https://en.wikipedia.org/wiki/Naive_Bayes_classifier In machine l ...
- 朴素贝叶斯分类器的应用 Naive Bayes classifier
一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒 打喷嚏 农夫 过敏 头痛 建筑工 ...
- 机器学习算法 --- Naive Bayes classifier
一.引言 在开始算法介绍之前,让我们先来思考一个问题,假设今天你准备出去登山,但起床后发现今天早晨的天气是多云,那么你今天是否应该选择出去呢? 你有最近这一个月的天气情况数据如下,请做出判断. 这个月 ...
- 机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)
朴素贝叶斯分类器是一组简单快速的分类算法.网上已经有很多文章介绍,比如这篇写得比较好:https://blog.csdn.net/sinat_36246371/article/details/6014 ...
- PGM学习之三 朴素贝叶斯分类器(Naive Bayes Classifier)
介绍朴素贝叶斯分类器的文章已经很多了.本文的目的是通过基本概念和微小实例的复述,巩固对于朴素贝叶斯分类器的理解. 一 朴素贝叶斯分类器基础回顾 朴素贝叶斯分类器基于贝叶斯定义,特别适用于输入数据维数较 ...
- Naive Bayes Classifier 朴素贝叶斯分类器
贝叶斯分类器的分类 根据实际处理的数据类型, 可以分为离散型贝叶斯分类器和连续型贝叶斯分类器, 这两种类型的分类器, 使用的计算方式是不一样的. 贝叶斯公式 首先看一下贝叶斯公式 $ P\left ( ...
- naive bayes classifier in data mining
https://www-users.cs.umn.edu/~kumar001/dmbook/slides/chap4_naive_bayes.pdf -- textbook https://www. ...
- OpenCV Machine Learning 之 正态贝叶斯分类器 (Normal Bayes Classifier)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhjm07054115/article/details/27631913
- [Machine Learning & Algorithm] 朴素贝叶斯算法(Naive Bayes)
生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本文介绍朴素贝叶斯分类器(Naive Bayes classifier),它是一种简单有效的常用分类算法. 一.病人分类的例子 让我从一个例子 ...
随机推荐
- Analog/digital converter (ADC)
1.ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters. 所谓successive appro ...
- 编写自己的Nmap(NSE)脚本
编写自己的Nmap脚本 一.介绍 在上一篇文章Nmap脚本引擎原理中我们介绍了基本的NSE知识,这篇文章介绍如何基于Nmap框架编写简单的NSE脚本文件,下一篇文章,Nmap脚本文件分析(AMQP协议 ...
- 不小心用js重做了一遍贪吃蛇
贪吃蛇游戏想必没人会感到陌生,这个游戏的js版本在网上也是一搜一大把,今天我要介绍的仍然是如何用js做一个贪吃蛇游戏,但在关键一步,蛇的运动的实现上略有不同. 贪吃蛇的js版本通常用连续的方块元素来实 ...
- .NET 开发环境搭建
概述 在接下来的时间里,将会入手ASP.NET MVC这一专题,尽量用最快的时间,最有效的方法,分别从深度和广度上剖析这一专题,力求讲明白.讲透.以此来与大家分享,力求达到共同学习,共同交流,共同进步 ...
- 前端学习数据库MYSQL
这篇文章主要写了 1.数据库MYSQL 2.基本上会遇到的所有SQL语句 数据库可视化软件------Navicat 数据库里边存放的是表,表与表之间是有关联的,而且可以对表进行相关操作(增,删,改, ...
- docker在windows,centos中的安装
centos安装方式,采用阿里云的镜像和安装脚本 或者到https://store.docker.com/search?type=edition&offering=community下载相应系 ...
- R语言统计分析技术研究——岭回归技术的原理和应用
岭回归技术的原理和应用 作者马文敏 岭回归分析是一种专用于共线性分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息,降低精度为代价获得回归系数更为符合 ...
- MongoDB--MapReduce分布统计s
MapReduce Mapreduce:要操作的目标集合 Map:映射函数(生成键值对序列,作为reduce函数参数) //传入分组的key和需要统计的值 Reduce:统计函数 //格式化返回的参数 ...
- java 实例变量的初始化
1.对于实例变量,该类没创建一次实例,就需要为实例变量分配一块内存空间:2.程序通过Person对象来访问eyeNum类变量时,底层依然会转换为通过Person访问eyeNum类变量:3.当Perso ...
- 基于两种架构的ETL实现及ETL工具选型策略
企业信息化建设过程中,业务系统各自为政.相互独立造成的"数据孤岛"现象尤为普遍,业务不集成.流程不互通.数据不共享--.这给企业进行数据的分析利用.报表开发等带来了巨大困难.在此情 ...