from numpy import *
from math import log
import operator
def calcshannonent(dataset):
numdataset=len(dataset)
labelcount={}
for data in dataset:
curlabel=data[-1]
if curlabel not in labelcount.keys():
labelcount[curlabel]=0
labelcount[curlabel]+=1
shannonent=0.0
for key in labelcount:
prob=float(labelcount[key])/numdataset
shannonent-=prob*log(prob,2)
return shannonent
def creatdataset():
dataset=[['青年','否','否','一般','否'],
['青年','否','否','好','否'],
['青年','是','否','好','是'],
['青年','是','是','一般','是'],
['青年','否','否','一般','否'],
['中年','否','否','一般','否'],
['中年','否','否','好','否'],
['中年','是','是','好','是'],
['中年','否','是','非常好','是'],
['中年','否','是','非常好','是'],
['老年','否','是','非常好','是'],
['老年','否','是','好','是'],
['老年','是','否','好','是'],
['老年','是','否','非常好','是'],
['老年','否','否','一般','否']]
label=['年齡','有工作','有自己的房子','信貸情況']
return dataset,label
def splitdataset(dataset,axis,value):
retdataset=
for featvec in dataset:
if featvec[axis] == value:
redfeatvec=featvec[:axis]
redfeatvec.extend(featvec[axis+1:])
return retdataset
# 與id3的區別主要在該程式塊中體現
def choosebestfeaturntosplit(dataset):
numfeature=len(dataset[0])-1
baseentropy=calcshannonent(dataset)
bestinfogain=0.0
bestfeature=-1
for i in range(numfeature):
features=[example[i] for example in dataset]
uniquevals=set(features)
newentropy=0.0
splitinfo=0.0
for value in uniquevals:
subdataset=splitdataset(dataset,i,value)
prob=len(subdataset)/float(len(dataset))
newentropy+=prob*calcshannonent(subdataset)
splitinfo-=prob*log(prob,2)
infocain=(baseentropy-newentropy)/splitinfo
if infocain>bestinfogain:
bestinfogain=infocain
bestfeature=i
return bestfeature
# return label[bestfeature]
def majority(classlist):
classcount={}
for vote in classlist:
if vote not in classcount.keys():
classcount[vote]=0
classcount+=1
sortedclasscount=sorted(classcount,key=operator.itemgetter(1),reverse=true)
return sortedclasscount[0][0]
def createtree(dataset,labels):
classlist=[example[-1] for example in dataset]
if classlist.count(classlist[0])==len(classlist):
return classlist[0]
if len(dataset[0])==1:
return majority(classlist)
bestfeat=choosebestfeaturntosplit(dataset)
bestfeatlabel=labels[bestfeat]
mytree=}
del(labels[bestfeat])
featvalues=[example[bestfeat] for example in dataset]
uniqualvals=set(featvalues)
for value in uniqualvals:
mytree[bestfeatlabel][value]=createtree(splitdataset(dataset,bestfeat,value),labels)
return mytree
dataset,labels=creatdataset()
# print(dataset,labels)
shannonent=calcshannonent(dataset)
print(shannonent)
bestfeature=choosebestfeaturntosplit(dataset)
print(bestfeature)
mytree=createtree(dataset,labels)
print(mytree)
關於該演算法的理論部分參照李航統計方法決策樹部分,**部分參考機器學習實戰,並對其進行改進,以c4,5演算法形式展示出來 《統計學習方法》 李航 學習大綱
最近在學習李航寫的統計學習方法概論,每一章都用xmind理清了思路,括號裡是書裡的公式,第一次寫博文,敬請指教 第一章 統計學習方 第二章 感知機 每個方法其實只需要著重掌握三要素和輸入輸出就可以了,主要看模型 策略和演算法。感知機主要是二類分類的線性分類模型。看到後面會注意感知機和支援向量機的區別...
維特比演算法實現 李航《統計學習方法》
維特比演算法實現 參考 李航 統計學習方法 p208 author xueqing,2019 08 19 輸入 a 盒子狀態轉移矩陣 b 觀測概率矩陣 pi 初始概率分布 ou 觀測序列 a 0.5,0.2,0.3 0.3,0.5,0.2 0.2,0.3,0.5 b 0.5,0.5 0.4,0.6 ...
李航《統計學習方法》 感知機
這一章就講了感知機。我覺得是深受工業革命的影響,把一些可以實現功能的基本單元都喜歡叫做什麼機,這裡的感知機,還有後來的以感知機為基礎的支援向量機。直接看定義,看本質,實際上,感知機是一種線性分類模型。下面就以這句話為中心仔細闡述一下。什麼叫線性。線性liner,正如其名,兩個變數的關係的函式是一條直...