php机器学习算法之NaiveBayes朴素贝叶斯分类的一个简单的例子

时间:2017-12-14 15:13:39 阅读:368次
php机器学习算法之NaiveBayes朴素贝叶斯分类

示例数据

去超市买水果时,苹果往往是必备的。长年累月,摸索了一套挑选苹果的方法,一般红润而圆滑的果子都是好苹果,泛青无规则的一般都比较一般,现在根据之前几次买过的苹果,已经验证过了10个苹果,主要根据大小,颜色和形状这三个特征,来区分是好是坏,如下:

    

编号大小 颜色  形状 好果
1青色非规则
2红色非规则
3红色圆形
4青色圆形
5青色非规则
6红色圆形
7青色非规则
8红色非规则

9

青色圆形
10
红色圆形

   

现在在超市我正要买的一个苹果的特征如下,问是好果还是一般的苹果?

大   红色  圆形        ?


问是好果还是一般的苹果,根据已有的数据集概率是多大?

先验概率 P(c) ,简化的求解方法:c类样本的个数除以所有样本个数,因此:

P(c=好果)=  4/10

P(c=一般) = 6/10


每个属性的类条件概率,可以初步这么求解:这个类别下的样本中对应这个属性的样本个数除以这个类别下的样本个数,因此:

P(大小=大 | c=好果) =   3/4

P(颜色=红色 | c=好果) = 4/4

P(形状=圆形 | c=好果) = 3/4


P(大小=大 | c=一般) =  3/6

P(颜色=红色 | c=一般) = 1/6

P(形状=圆形 | c=一般) =  2/6


因此:  

P(c=好果) * P(大小=大 | c=好果) * P(颜色=红色 | c=好果) * P(形状=圆形 | c=好果)  

= 4/10 * 3/4 * 4/4 * 3/4 

= 0.225


P(c=一般) * P(大小=大 | c=一般) * P(颜色=红色 | c=一般) * P(形状=圆形 | c=一般)  

= 6/10 * 3/6 * 1/6 * 2/6

= 0.0167


显然,0.225 > 0.0167  所以:这个苹果为好果。

<?php
/*
设置大1 小0 红色1 青色0 圆形1 非规则0  好果1 一般0
*/
$samples = [
	['0', '0', '0'], //小 青色  非规则 一般
	['1', '1', '0'], //大 红色  非规则 好果
	['1', '1', '1'], //大 红色  圆形   好果
	['1', '0', '1'], //大 青色  圆形   一般
	['1', '0', '0'], //大 青色  非规则 一般
	['0', '1', '1'], //小 红色  圆形   好果
	['1', '0', '0'], //大 青色  非规则 一般
	['0', '1', '0'], //小 红色  非规则 一般
	['0', '0', '1'], //小 青色  圆形   一般
	['1', '1', '1'], //大 红色  圆形   好果
];
$labels  = [0,1,1,0,0,1,0,0,0,1];

require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Classification\NaiveBayes;

$classifier = new NaiveBayes();
$classifier->train($samples, $labels);

//预测 大 红色 圆形 1,1,1
echo "大 红色 圆形".$classifier->predict([1, 1, 1])."\r\n"; //好果
//预测 大 青色 圆形 1,0,1
echo "大 青色 圆形".$classifier->predict([1, 0, 1]); //坏果


通过已知的数据集发现:  P(颜色=青色 | c=好果) = 0,那么无论 P(其他属性 | c=好果) 取值为多大,哪怕在其他属性上取值多么像好果,相乘后都为0,这显然不太合理,那么有没有解决方法呢? 请参考概率估计的平滑处理。

扫描二维码关注程序员爱笔记,接收更多资讯

评论

快速评论