朴素贝叶斯的连续型---高斯分布

前面有个垃圾邮件识别的,可以看做是离散型数据吧,这里写的是单纯的连续型数据。数据集用的是iris数据集。

import numpy as np
import time
from sklearn import datasets
iris = datasets.load_iris()
#print(iris.data)
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
#预测自己的数据
start1 = time.clock()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
end1 = time.clock()
print('运行的时间是:',end1-start1)
print(iris.data.shape[0],(iris.target != y_pred).sum())
'''这个预测的公式比较简单,就是计算这个公式的值。
连续属性:拟合一个高斯模型,属性值代入高斯模型得到概率,对于每个c有个高斯函数,这个是要求出来的
上面这种方法的话,不好对应,但是如果每个都算一遍重复有太多。连续值暂时不考虑了。连续值还是可以的,只要求出
那两个参数即可。因此,主要是求高斯的拟合,公式书上有。
input:医生的数据
output:
'''

'''input:2darray
   output:[[某属性,类别1的系数:a,b],[],[],[]]
   某个类别中的某个属性的值集合,也就是分表操作。这次是竖着分表.直接上numpy
   高斯分布的系数直接用公式
'''
def getGaussianCoeff(data_X,data_y):
    values= list(set(data_y.tolist()))  #需要分表的个数
    #print(values)
    box =[]
    coeff = []
    data = np.column_stack((data_X,data_y)) #X,y连接在一起
  #  print(data)
    for value in values:   #按照值进行分表
        zhongjie = []
        for i in range(len(data)):
            if data[i][-1]==value:
                zhongjie.append(data[i].tolist())
        box.append(zhongjie)
    #对每个属性,计算高斯分布的系数
    box = np.array(box) #分表转成ndarray,这是多维数组(3,50,5)
    for i in range(len(values)):#对于每个分表
        sigema =[]
        uVector = np.average(box[i],axis=0) #均值向量,axis表示竖着求均值
        #print(uVector)
        uVecyorMinusAvg = np.array([(box[i][j]-uVector) for j in range(len(box[i]))])#x-u
        uVecyorMinusAvgTranspose = uVecyorMinusAvg.T
        xieFangChaMatrix = np.dot(uVecyorMinusAvg,uVecyorMinusAvgTranspose)#算出协方差
        #遍历出[1,1],[2,2]...这些位置上的数字,也就是各个sigema
        for j in range(len(xieFangChaMatrix)):
            for k in range(len(xieFangChaMatrix)):
                if j ==k:
                  sigema.append(round(xieFangChaMatrix[j][k],3))
        coeff.append(list(zip(sigema,uVector)))
    return coeff
    '''input: preData : ndarray or list
       return list
       0,先计算出P1的概率,就是出现某种结果的概率
       1,预测过程就是取出每个数据
       2,对于可能的每个种类计算出相关概率,概率最大的就是那个类
          2.1 相关概率=此情况概率P1*每个属性的高斯分布概率P2
          2.2取出最大的概率即可
    '''
def gaussiFunc(sigema,u,x):#这里的sigema是平方的形式
    outxishu = 1/(np.sqrt(2*np.pi*sigema))
    inxishu = -((x-u)**2)/(2*sigema)
    return outxishu*np.exp(inxishu)

def trainBayes(Data_X,Data_Y,preData):
    #求出高斯函数的系数
    coeff = getGaussianCoeff(Data_X,Data_Y)
    if len(Data_X)!=len(Data_Y):
        raise TypeError
    if not isinstance(Data_X,list):#转成list
        Data_X = Data_X.tolist()
        Data_Y = Data_Y.tolist()
    numOfPreData = len(preData)  #需要预测的个数
    values = list(set(Data_Y)) #分表的个数
    preDataY=[]
    #计算出数据归为这个类的概率,
    counts = [0]*len(values)
    for k in range(len(Data_X)):
        for value in values:
            if Data_Y[k]==value:
                counts[values.index(value)]=counts[values.index(value)]+1
    P1s =[counts[l]/sum(counts) for l in range(len(values))] #计算出P1的概率
    for i in range(numOfPreData):
        probabilities = []
        for j in range(len(values)):  #每种结果的概率            
            #用上面的高斯分布求每个概率,然后相乘
            P2 = 1
            for m in range(len(Data_X[0])):
                myCoeff = coeff[j][m]  #是一个tuple,第一个元素是sigema,第二个参数是平均值u
                probaOfOneAtrr = gaussiFunc(myCoeff[0],myCoeff[1],preData[i][m])#第i个数据,第m个属性的高斯概率值
                P2 = P2*probaOfOneAtrr
            probabilities.append(P2*P1s[j])#把所有可能的结果的概率放入
        probabilities = np.array(probabilities)
        index = np.argmax(probabilities) #选取那个最大的概率
        preDataY.append(index)  #每个数据的结果写入
    return preDataY
'''
x = np.linspace(-10,10,100)#高斯函数检测
y = gaussiFunc(1,2,x)
import matplotlib.pyplot as plt
plt.plot(x,y)
plt.show()           
'''   
start2 = time.clock()      
preData = trainBayes(iris.data,iris.target,iris.data)        
end2 = time.clock()
print('我的程序运行的时间是:',end2 -start2) 
print((iris.target != preData).sum())

猜你喜欢

转载自blog.csdn.net/tortelee/article/details/79484735
今日推荐