朴素贝叶斯算法实现

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 28 14:35:24 2018

@author: 李慧泽
"""
#根据给定的训练数据X,Y,预测x所属分类
def predict(X,Y,x):    
   #将数组Y的元素(类别值)嫁接到数组X每行的末尾
   NEWX=X
   for i in range(0,len(X)):
       NEWX[i].append(Y[i])
   #第一步:去重,提取Y的类别值,组成集合PureY
   PureY=list(set(Y))
   #第二步:计算所有类别结果值在Y中的出现次数,放到集合T中。
   T=[0]*len(PureY)  
   for j in range(0,len(PureY)):
       T[j]=Y.count(PureY[j])
   #数组x与数组PureY每条映射关系的概率,放到集合P中。 
   P=[0]* len(PureY)          
   
   #定义一个二维数组D,统计每列不同的特征值与该特征值出现的的次数 ,以字典的形式作为元素储存在D
   #定义一个数组div,用来承装每列不同的特征值出现的次数与T[j]的比值,如果分子为0,则
   #分子与分母同时加0 
   D=[[] for j in range(len(PureY))]
   div =[0]*len(x) 
   for j in range(0,len(PureY)):
   #遍历数组PureY的元素,在数组X最后一列提取该元素所在的所有行,将这些行组成数组a
       a=[x for x in NEWX if x[len(NEWX[0])-1]== PureY[j]]
       for i in range(0,len(x)):
          #取出数组a中的第i列,放到数组b中
           b=[x[i] for x in a]
           #遍历数组b,按照不同的元素和其对应的出现次数储存在字典c
           c={k:b.count(k) for k in set(b)} 
           #将字典c添加到数组D
           D[j].append(c)
   for j in range(0,len(PureY)):
       w=1
       for i in range(0,len(x)):
           if x[i] in D[j][i]:
               for k in D[j][i]:
                    if k==x[i]:
                        div[i]=D[j][i].get(k)/T[j]
           else:
               div[i]=1/(T[j]+1)
           w= w* div[i]         
       P[j]=w*(T[j]/len(NEWX))
   #将所有的类别值与其对应的概率存放到字典中,遍历得到最大的概率所对应的类别,并返回
   for k,v in dict(zip(PureY,P)).items():
       if v==max(P):
           return k  
#测试
X = [[0, 0, 1],
     [0, 1, 0],
     [1, 0, 0]]
Y = [1, 2, 3]
x=[0,1,0]
print(predict(X,Y,x)) 
 

猜你喜欢

转载自blog.csdn.net/qq_41424519/article/details/81744479
今日推荐