贝叶斯分类算法 实现

Posted yaggy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贝叶斯分类算法 实现相关的知识,希望对你有一定的参考价值。

(一)贝叶斯理论

 

1.设x={a1,a2,a3,...,an}为一个待分类项,而a为x的一个特征属性

2.有类别集合C={y1,y2,...,yn}

3.计算P(y1|x), P(y2|x), P(y3|x),...,P(yn|x)

4.比较得出结果

 

(二)根据训练集计算P(yi|x):

 

1.统计在各类别下各个特征属性的条件概率

       P(a1|y1), P(a2|y1), .... , P(am|y1)

       P(a2|y1), P(a2|y2), .... , P(am|y2)

       P(am|yn), P(am|yn), ... , P(am|yn)

2.假设各个特征属性之间是相互独立的,根据贝叶斯定理有:

                   技术图片

 

 

因为分母对于所有类别是常数,所以技术图片正比于技术图片

技术图片

 

 

 

在连续的情况下,技术图片

 

 

 

3.以技术图片最大作为x的所属类别

   注】都代表的是第i种类别,表示第i种类别的平均值,代表第i种类别的标准差

计算(数据来源:iris_15.txt)

数据共有15个samples,因为没有给测试集,所以假定第一个样本

5

3.6

1.4

0.2

Iris-setosa

 

为测试集,其余14个样本为训练集。计算

Step1:Iris-setosa为类别1,Iris-versicolor为类别2,Iris-virginica为类别3;记第一个属性为a1, 第二个属性为a2, 第3个属性为a3, 第4个属性为a4

Step2:计算。

计算1

对属性a1:

   属性值a1=[5.4, 4.6, 4.9, 5.1, 6.5, 5.7, 6.3, 4.9, 6.6, 6.8, 5.7, 5.8, 6.4, 6.5]

   对于该属性而言,有技术图片技术图片

 

 

同理算出属性a2,a3,a4

 

计算2:

对于类别1,有samples

1   5.4  3.9  1.7  0.4      Iris-setosa

2   4.6  3.4  1.4  0.3      Iris-setosa

3   4.9  3.1  1.5  0.1      Iris-setosa

4   5.1  3.3  1.7  0.5      Iris-setosa

对属性a1:技术图片,技术图片,技术图片

 

 

同理算出a2,a3,a4的在类别1下的概率

 

对于类别二,有测试samples

5   6.5  2.8  4.6  1.5  Iris-versicolor

6   5.7  2.8  4.5  1.3  Iris-versicolor

7   6.3  3.3  4.7  1.6  Iris-versicolor

8   4.9  2.4  3.3  1.0  Iris-versicolor

9   6.6  2.9  4.6  1.3  Iris-versicolor

 

 

 

 

类别三,有测试samples

10  6.8  3.0  5.5  2.1   Iris-virginica

11  5.7  2.5  5.0  2.0   Iris-virginica

12  5.8  2.8  5.1  2.4   Iris-virginica

13  6.4  3.2  5.3  2.3   Iris-virginica

14  6.5  3.0  5.5  1.8   Iris-virginica

同理分别算出属性在类别2,3的条件概率

 

 

 

(三)得出结果

根据(二)得出的结果算出样本属于类别1,2,3的概率,较大者为样本所属的类别。

 

实验代码:

import math as Math
import pandas as pd
def fun_average(a):
    sum =0
    for i in range(len(a)):
       sum=sum+a[i]
    return sum/len(a)

def fun_squaresubstract(a,u):
    sum=0;
    for i in range(len(a)):
        sum=sum+(a[i]-u)*(a[i]-u)
    return sum/(len(a)-1)

def fun_p(x,u,temp,all):
    a = 1 / (temp * Math.sqrt(2 * 3.1415926))
    b=-(u-x)*(u-x)/(2*all*all)
    return a*Math.exp(b)

def main():
    data = pd.read_csv(rC:Users25826Desktopdataminingiris.csv,header = None)
    data_2=data.tail(14)
    sample=[5.0,3.6,1.4,0.2]
    print(data_2)
    for i in range(4):
        print(""+str(i)+"个属性")
        data_1=list(data_2[i])
        print(list(data_1))
        average = fun_average(data_1)
        print(average)
        all=fun_squaresubstract(data_1,average)
        print(all)
        a=[]
        a.append(data_1[0:3])
        a.append(data_1[4:8])
        a.append(data_1[9:13])
        for j in range(3):
            ave = fun_average(a[j])
            square = fun_squaresubstract(a[j],ave)
            res = fun_p(sample[i],ave,Math.sqrt(square),all)
            print(ave,square,res)
main()

 

以上是关于贝叶斯分类算法 实现的主要内容,如果未能解决你的问题,请参考以下文章

Java代码利用朴素贝叶斯分类算法实现信息分类

太赞了!机器学习基础核心算法:贝叶斯分类!(附西瓜书案例及代码实现)

Java代码利用朴素贝叶斯分类算法实现信息分类

第五篇:朴素贝叶斯分类算法原理分析与代码实现

用C++完成贝叶斯分类算法的设计与实现

朴素贝叶斯算法——实现自动分类