機(jī)器學(xué)習(xí)基礎(chǔ)(三)——信息、信息熵與信息增益x
發(fā)布時(shí)間:2020-08-28 來源: 入黨申請(qǐng) 點(diǎn)擊:
機(jī)器學(xué)習(xí)基礎(chǔ)(三)—— 信息、信息熵與信息增益 信息:information,信息熵:information entropy,信息增益:information gain(IG)
劃分?jǐn)?shù)據(jù)集的大原則是:將無序的數(shù)據(jù)變得更加有序。組織雜亂無章數(shù)據(jù)的一種方法就是使用信息論度量信息,信息論是量化處理信息的分支科學(xué)。
在劃分?jǐn)?shù)據(jù)集之前之后信息發(fā)生的變化稱為信息增益,知道如何計(jì)算信息增益,我們就可以計(jì)算每一個(gè)特征值劃分?jǐn)?shù)據(jù)集獲得的信息增益, 獲得信息增益最高的特征就是最好的選擇。
征就是最好的選擇。
信息、信息熵的定義 如果待分類的數(shù)據(jù)集可能劃分在多個(gè)分類之中,則類別 xi?? ??
的信息定義為:
l(xi)=−log2p(xi) ??(?? ?? ) = −log 2 ??(?? ?? )
其中 p(xi)??(?? ?? ) 是該類別的樣本所占的比例; 為了計(jì)算熵,我們需要計(jì)算所有類別所有可能包含的信息期望值(由離散型隨機(jī)變量的期望計(jì)算公式可知),
H=−∑i=1np(xi)log2p(xi) ?? = −∑??????=1(?? ?? )log 2 ??(?? ?? )
遍歷相乘再相加,可以使用內(nèi)積計(jì)算熵。
信息熵,被用來度量信息的無序程度(信息熵越大,越無序,等于 0 時(shí),意味著全部類別都相同,完全有序)
熵的性質(zhì):
熵的性質(zhì):
。1)非負(fù),0<p(xi)≤1→log2p(xi)≤00 < ??(?? ?? ) ≤ 1 → log 2 ??(?? ?? ) ≤ 0 (2)完全有序,也即 p(x)=1→H=0??(??) = 1 → ?? = 0 • (3)香農(nóng)熵越小越有序,越大越混亂。
計(jì)算數(shù)據(jù)集的香農(nóng)熵和最佳劃分特征 根據(jù)數(shù)據(jù)集的類別,計(jì)算數(shù)據(jù)集的香農(nóng)熵:
from collections import Counter
from math import log
def calcShannonEnt(dataset):
classCnt = [sample[-1] for sample in dataset]
n = len(dataset)
classCnt = Counter(classCnt)
ent = 0.
for times in classCnt.values():
ent -= times/n*log(times/n, 2)
return ent
按照給定特征(屬性列)劃分?jǐn)?shù)據(jù)集:
# 第三個(gè)參數(shù) val 不是手動(dòng)指定的,
# 該函數(shù)也不是直接交由外部調(diào),而是被其他函數(shù)調(diào)用
# 在函數(shù)內(nèi)部,也即遍歷屬性列不重復(fù)的屬性值時(shí),傳遞進(jìn)來 val 值
def splitDataset(dataset, axis, val):
splitedDataset = []
for sample in dataset:
if sample[axis] == val:
splitedDataset.append(sample[:axis]+sample[axis+1:])
return splitedDataset
選擇最好的數(shù)據(jù)集劃分方式,也即找到最好的屬性列,顯然需要遍歷屬性列,找到最大的信息增益:
def chooseBestFeatToSplit(dataset):
baseEnt = calcShannonEnt(dataset)
bestInfoGain, bestFeat = 0., -1
for j in range(len(dataset[0])-1):
featCol = [sample[j] for sample in dataset]
uniqFeat = set(featCol)
newEnt = 0.
for val in uniFeat:
subDataset = splitDataset(dataset, j, val)
newEnt = len(subDataset)/len(dataset)*calcShannonEnt(subDataset)
infoGain = baseEnt - newEnt
if bestInfo < infoGain:
bestInfo = infoGain
bestFeast = j
return bestFeat
熱點(diǎn)文章閱讀