#貝葉斯算法的實現 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實現貝葉斯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.