#贝叶斯算法的实现 2020.1.14
import numpy
class Bayes:
def __init__(self):
self.lenght = -1
self.labels_count = dict() #{类别:该类别在总类别中的比例}
self.vector_count = dict() #{类别:特征向量}
def fit (self,dataSet:list,labels:list):
if(len(dataSet)!=len(labels)):
raise ValueError("输入的测试数组和类别数组长度不一致")
self.lenght = dataSet[0] #测试数据特征值的长度
labels_num = len(labels) #总的类别的个数
differ_label = set(labels) #类别中不同类别的数量
for item in differ_label: #对不同的类别建立比率,即字典,{label:rate}
this_label = item
self.label_count[this_label] = labels.count(this_label)/labels_num #当前类别在在总的类别中出现的次数与总的类别的比率
#循环结束后,此时的label_count中存放的是每个类别的在总的类别中出现的次数占总类别的个数的比例
for vector,label in zip(dataSet,labels): #序列解包
if(label not in self.vector_count): #如果当前类别未在字典vector_count中,{类别:特征向量}
self.vector_count[label] = [] #把当前类别加进去
self.vector_count[label].append(vector) #在把当前类别的“所有”的特征向量存进字典中,是所有的
print("训练结束!")
return self
def bayes_test (self,Test_data,labels_Set):
if(self.lenght == 1):
raise ValueError("未开始训练!")
#计算testdata分别为各个类别的概率
lbDict = dict()
for thislb in labels_Set: #依次遍历各个类别
p = 1
all_label = self.labels_count[thislb] #把当前类别占总类别的比例取出
all_vector = self.vector_count[thislb] #在把当前类别的所有的特征向量取出,此时all_vector为[[特征向量],[特征向量],...[特征向量]]
v_num = len(all_vector) #求出一共有多少个特征向量
all_vector = numpy.array(all_vector).T #对当前的list做一个转置
for index in range(0,len(Test_data)): #遍历测试机中的每个测试数据
vector = list(all_vector[index])
#此时的all_vector为一个二维数组,all_vector[index]表示的是所有特征向量的第index个特征
#在将这些特征弄成一个特征列表vector
p*=vector.count(Test_data[index])/v_num #Test_data[index]表示Test_data的第index个特征,然后该特征在特征列表中出现的比例在乘上p
lbDict[thislb]=p*all_label
#此处为全概率公式,将此时求得的结果为Test_data为该标签(thislb)的概率,并把它存到lbDict字典中
thislabel = sorted(lbDict,key = lambda x:lbDict[x],reverse=True)[0] #对lbDict的value进行排序,为降序排列,并取最大值
return thislabel #返回求得的结果``
python实现贝叶斯
最新推荐文章于 2024-08-06 11:08:19 发布