scikit-learn机器学习(六)--朴素贝叶斯分类原理及python实现
朴素贝叶斯分类原理:
关于贝叶斯定理,参考上一篇博客:
scikit-learn机器学习(五)–条件概率,全概率和贝叶斯定理及python实现
贝叶斯分类,个人理解,通俗的说:
假设各个特征之间都是独立存在的,根据这些特征来判断一个事件所属的类别的概率,该事件属于概率最大的类别
给定各个特征的情况下,计算这个事件属于某一类的概率,最大概率即属于该类别
比如结婚的时候嫁人,要考虑长相,性格,身高和上进心,这时一个长得不帅,性格不好,不高收入低的人对你求婚,你考虑嫁给他还是不嫁,这个时候把这个问题转化到数学上就是:
P(嫁|不帅,性格不好,不高,收入低)
但是这个我们没法直接求得,根据贝叶斯定理,我们可以根据三个已知的事件发生概率来求得这个事件发生的概率,
P(嫁|不帅,性格不好,不高,收入低)=P(不帅,性格不好,不高,收入低|嫁)*P(嫁)/P(不帅,性格不好,不高,收入低)
而其他三个概率可以通过样本求得
这个例子具体可参考:
带你搞懂朴素贝叶斯分类算法
数据
我把他的数据重新做了一下:
我们需要根据以上数据,来求出要不要嫁给一个不帅,性格不好,个子矮,收入低的男生,
即求出:
P(嫁|不帅,性格不好,不高,收入低)
根据贝叶斯定理,我们就把这个问题拆成了求其他三个概率的问题:
1.P(不帅,性格不好,不高,收入低|嫁)
2.P(嫁)
3.P(不帅,性格不好,不高,收入低)
1)P(不帅,性格不好,不高,收入低|嫁)
这个概率就是在嫁给他的情况下他长得不帅,性格不好,不高,收入低的概率,从数据中我们可以得出
P(不帅,性格不好,不高,没有上进心|嫁)=P(嫁)*P(不帅|嫁)*P(性格不好|嫁)*P(不高|嫁)*P(收入低|嫁)
从数据表中我们可知此事件发生概率为:P1=1/2*1/2*1/6*1/6*1/6
2)P(嫁)
从表中可知P(嫁)=1/2
3)P(不帅,性格不好,不高,收入低)
P(不帅,性格不好,不高,收入低)=P(不帅)*P(性格不好)*P(矮)*P(收入低)
从数据表总我们可知此事件发生的概率为:P2=5/12*1/3*7/12*5/12
根据上述三个概率,我们可得出在四种情况都不好的情况下要不要嫁给他的概率:
P(嫁|不帅,性格不好,不高,收入低)=P1*P(嫁)/P2=0.017
所以这种情况下嫁给他的概率只有0.017,自然是不嫁给他了啊 ,
这种问题就相当于分类了,嫁和不嫁是两种类别,长相,性格,身高,收入就是用于分类的四个特征,我们根据已知数据样本,根据贝叶斯定理,来计算出给定特征下属于某一类别的概率,这就是贝叶斯分类的原理
python代码实现
1)随机生成一个样本:
import random
def create_MarriageData():
looks=['帅','不帅']
characters=['好','不好']
heights=['高','矮']
incomes=['高','低']
marriages=['嫁','不嫁']
datasets=[]
for i in range(0,12):
dataset = []#创建样本
dataset.append(random.choice(looks))#每个样本随机选择长相
dataset.append(random.choice(characters))#同理,随机选择性格
dataset.append(random.choice(heights))#同理
dataset.append(random.choice(incomes))#同理
dataset.append(random.choice(marriages))#同理
print(dataset)
datasets.append(dataset)#将每一组样本加入到样本集中
print(datasets)
return datasets
create_MarriageData()
结果:
2)计算三个概率
def compute_threeProb(datasets,c1,c2,c3,c4,c5):#数据集,特征1,2,3,4,类别c5
p2_count=0
p1_count=0
p3_count=0
l1=len(datasets)
for dataset in datasets:
if dataset[4]==c5:
p2_count+=1#该类别的数量
if dataset[0]==c1 and dataset[1]== c2 and dataset[2]==c3 and dataset[3]==c4:
p1_count+=1#该类别下满足这四个特征的个数
#计算样本中符合四个特征的数量
if dataset[0] == c1 and dataset[1] == c2 and dataset[2] == c3 and dataset[3] == c4:
p3_count+=1
p1=(p2_count/l1)*(p1_count/p2_count)
p2=p2_count/l1
p3=p3_count/l1
if p3!=0:
prob_marriage=p1*p2/p3
print(prob_marriage)
return prob_marriage
else:
print("这些特征组合不存在!")
return 0
3)输出结果
datasets=create_MarriageData()
compute_threeProb(datasets,c1='帅',c2='不好',c3='矮',c4='低',c5='嫁')
结果如下:
这是我自己随便举的例子,下一篇博客利用机器学习库scikit-learn中的数据集进行计算,看看他们的效果
上一篇: java工程师面试题
下一篇: 抓娃学习笔记(2)