import math
defcreatedataset
(): dataset = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]#資料集的最後一列稱作value,label稱作attr
labels = ['no su***cing', 'flippers']
return dataset, labels
defcreatetree
(dataset, labels):
values = [value[-1] for value in dataset]# 獲取當前資料集的value
if values.count(values[0]) == len(values):#樹的葉子節點是同乙個類別的資料
return values[0]
if len(dataset[0]) == 1:#所有屬性都用完
return select(values)
labelno = calmaxgain(dataset)# 獲取本次要使用的label編號
label = labels[labelno] # 獲取本次要使用的label
del (labels[labelno]) # 刪除本次使用的label
allnewset = splitdataset(dataset, labelno)
tree = }
for newdataset in allnewset.items():#原資料集已被拆分,newdataset[0]是allnewset的key,newdataset[1]是value
tree[label][newdataset[0]]=createtree(newdataset[1],labels)
return tree
defsplitdataset
(dataset, labelno):
'''根據所選屬性,將資料集拆分成多個新資料集,返回值為字典,包含所有的新資料集:key為被拆分的屬性值,value為拆分的新資料集'''
values=[value[labelno] for value in dataset]
uniqueval=list(set(values))
allnewset={}
for i in range(len(uniqueval)):
newdataset =
for data in dataset:
if(data[labelno]==uniqueval[i]):
newline=data[:labelno]
newline=newline+data[labelno+1:]#製作新資料集中的一行資料
allnewset[uniqueval[i]]=newdataset
return allnewset
defselect
(list):
'''選擇出現次數最多的value'''
dict = {}
values = set(list)
for val in values:
#計算每種value的數量
dict[val] = list.count(val)
sortdict = sorted(dict.items(), key=lambda item: item[1], reverse=true)# 根據value的數量進行排序
return sortdict[0][0] # 返回字典中第乙個key的value值
defcalinfo
(dataset):
'''計算info(t)'''
values = [value[-1] for value in dataset]
uniqueval = set(values)
prob =
for val in uniqueval:
#計算p
return cali(prob)
defcali
(prob):
'''計算i'''
i = 0.0
for p in prob:
if p != 0: # p=0時不能計算log
i += -p * math.log(p, 2)
return i
defcalattrinfo
(dataset, label):
'''計算info(attr,t)'''
attr = [value[label] for value in dataset]
values = [value[-1] for value in dataset]
uniqueattr = set(attr)
uniqueval = set(values)
family = * len(uniqueattr)# 每個類別的yes和no集合
pattr = * len(uniqueattr)# 每個類別yes和no的prob
pt = # 每種類別的prob
for j in uniqueattr:
#遍歷屬性的全部類別
for i in range(len(attr)):
#根據屬性類別分割values
if j == attr[i]:
family[j] = family[j] + [values[i]]
for val in uniqueval:
pattr[j] = pattr[j] + [family[j].count(val) / float(len(family[j]))]
i =
for p in pattr:
#計算i
info = 0
for j in range(len(pt)):
info += pt[j] * i[j]
return info
defcalmaxgain
(dataset):
'''返回當前擁有最大gian的label'''
infot = calinfo(dataset)
gain = {}
for i in range(len(dataset[0]) - 1):
gain[i] = infot - calattrinfo(dataset, i)
sortgain = sorted(gain.items(), key=lambda item: item[1], reverse=true)#選取最大gain
return sortgain[0][0]
dataset, labels = createdataset()
print(createtree(dataset, labels))
輸出決策樹
}}}
ID3演算法的Python實現
本篇文章的 是在 id3演算法的原理及實現 python 的基礎上進行新增和修改實現的,感謝原作者。1 新增的功能 1 拆分檔案,使得函式的呼叫更加清晰 2 增加了gui,增加了資料的讀取和 功能 3 增加了乙個遞迴終止條件 2 gui介面展示 以檔案中給出的資料集為例,填充如下 注 這裡類標籤的位...
用python實現ID3演算法
coding utf 8 from math import log import operator 資料樣本 編號 用腮呼吸 是否有腳蹼 屬於魚類 1 是 是 是 2 是 否 是 3 是 否 否 4 否 是 否 5 否 是 否 def createdataset dataset 1,1,yes 1,...
資料探勘演算法 決策樹ID3演算法
id3演算法是一種分類 演算法,其核心思想是 資訊熵 id3演算法通過計算每個屬性的資訊增益,認為資訊增益高的是好屬性,每次劃分選取資訊增益最高的屬性為劃分標準,重複這個過程,直至生成乙個能完美分類訓練樣例的決策樹。該決策樹方法先根據訓練集資料形成決策樹,如果該樹不能對所有物件給出正確地分類那麼選擇...