Python 贝叶斯算法

Python 贝叶斯分类


贝叶斯的基本思想

朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。
以上了解一下即可

贝叶斯分类定义

1.设x={ a 1 , a 2 , a 3 . . . a m a_1,a_2,a_3...a_m a1,a2,a3...am}为一个待分类项,每个a为x的一个特征属性
2.有类别集合y={ y 1 , y 2 , y 3 . . . y n y_1,y_2,y_3...y_n y1,y2,y3...yn}
3.计算 P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , P ( y 3 ∣ x ) . . . P ( y n ∣ x ) P(y_1|x),P(y_2|x),P(y_3|x)...P(y_n|x) P(y1x),P(y2x),P(y3x)...P(ynx)
4.如果 P ( y k ∣ x ) = m a x P(y_k|x)=max P(ykx)=max{ P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , P ( y 3 ∣ x ) . . . P ( y n ∣ x ) P(y_1|x),P(y_2|x),P(y_3|x)...P(y_n|x) P(y1x),P(y2x),P(y3x)...P(ynx)} 则
以上了解一下即可,代码部分和这个只有一点点关系,为什么这样说呢,我们判断两个样本是否相同不是看整个样本,而是化整为稀碎,看这一个样本中每个特征在训练集中占同类特征的比例
那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:
1.找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
2.统计得到在各类别下各个特征属性的条件概率估计。即
P ( a 1 ∣ y 1 ) , P ( a 2 ∣ y 1 ) . . . P ( a m ∣ y 1 ) ; P ( a 1 ∣ y 2 ) , P ( a 2 ∣ y 2 ) . . . P ( a m ∣ y 2 ) . . . P ( a 1 ∣ y n ) , P ( a 2 ∣ y n ) . . . P ( a m ∣ y n ) P(a_1|y_1),P(a_2|y_1)...P(a_m|y_1);P(a_1|y_2),P(a_2|y_2)...P(a_m|y_2)...P(a_1|y_n),P(a_2|y_n)...P(a_m|y_n) P(a1y1),P(a2y1)...P(amy1);P(a1y2),P(a2y2)...P(amy2)...P(a1yn),P(a2yn)...P(amyn)

3.如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:
P ( y i ∣ x ) = P ( x ∣ y i ) P ( y i ) P ( x ) P(y_i|x)=\frac{P(x|y_i)P(y_i)}{P(x)} P(yix)=P(x)P(xyi)P(yi)
因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:
P ( x ∣ y i ) P ( y i ) = P ( a 1 ∣ y i ) , P ( a 2 ∣ y i ) . . . P ( a m ∣ y i ) P(x|y_i)P(y_i)=P(a_1|y_i),P(a_2|y_i)...P(a_m|y_i) P(xyi)P(yi)=P(a1yi),P(a2yi)...P(amyi)
3里面的两个公式是代码的核心

例子

手写体数字识别

现有一个手写体数字
为了识别它,我们先要对图片进行处理

处理代码如下:
#change the type of the picture
from PIL import Image#获取图片每一个点的颜色用的
im=Image.open("E:\\数字2.jpg")
fh=open("E:/数字2.txt",'a')
width=im.size[0]
height=im.size[1]
for i in range(0,width):
    for j in range(0,height):
        k=im.getpixel((i,j))#获取颜色
        clo=k[0]+k[1]+k[2]
        if clo==0:#是黑色就把这个点作为1写入文本
            fh.write("1")
        else:
            fh.write("0")
    fh.write("\n")
fh.close        

图片处理完后会得到一个由0和1组成的矩阵
在识别手写体数字之前我要对已有训练集进行训练
这里训练的意思就是求训练集中每一个类别占总类别的比例

代码如下:
import numpy as np
class Bayes:
    def __init__(self):
        self.length=-1
        self.labelcount=dict()#建了一个字典用来存放类别所占比例
        self.vectorcount=dict()#建了一个字典用来存放特征
    def fit(self,dataSet,labels):#训练的函数
        if len(dataSet)!=len(labels):#每一组特征都要对应一个类别
            raise ValueError("length is not same")#报错提示
        self.length=len(dataSet[0])#获取特征的个数
        labelsnum=len(labels)#获取总类别的个数
        norlabels=set(labels)#获取不同的类别
        for item in norlabels:#算出同类别的个数
            thislabel=item
            self.labelcount[thislabel]=labels.count(thislabel)/labelsnum#current pr
        for vector,label in zip(dataSet,labels):
            if(label not in vectorcount):
                self.vectorcount[label]=[]
            self.vectorcount[label].append(vector)
        print("over")
        return self
贝叶斯算法:
def btest(self,TestData,labelsSet):
        if self.length==-1:#判断是否训练
            raise ValueError("please fit first")
        ibDict=dict()#用来存放所有类别概率的字典
        for thislb in labelsSet:#遍历所有的类别
            p=1
            alllabel=self.labelcount[thislb]#当前类别所占比例
            allvector=self.vectorcount[thislb]#当前类别的所有样本特征
            vnum=len(allvector)
            allvector=np.array(allvector).T#将训练集看成一个矩阵然后转置
            for index in range(0,len(TestData)):#遍历待预测样本所有特征
                vector=list(allvector[index])#训练样本该类特征的列表
                p*=vector.count(TestData[index])/vnum#求出该类特征的比例即P(a_1|y_i),P(a_2|y_i)...P(a_m|y_i)
            ibDict[thislb]=p*alllabel#预测样本是该类别的概率
        thislabel=sorted(lbDict,renerse=True)[0]#排序
        return thislabel

贝叶斯分类算法完毕

嗝~~~~好饱

你可能感兴趣的:(Python,贝叶斯)