这篇文章利用了信息熵计算的东西,先写一个数据划分的东西,先写一个简单的逻辑划分:
def splitDataSet(dataSet, axis, value): retDataSet = [] for featVec in dataSet: if featVec[axis] == value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec)
这是最简单的一个逻辑划分,首先建立一个新的数据集,将划分后的数据添入该数据集,
下面介绍选择最最好的数据集划分方式:
1.建立该列的变化标签
2.计算每种划分的信息熵
对上面步骤进行循环。
下面贴出该步骤的代码:
def chooseBestFeatureToSplit(dataSet): numberFeatures = len(dataSet[0])-1 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0; bestFeature = -1; for i in range(numberFeatures): featList = [example[i] for example in dataSet] print(featList) uniqueVals = set(featList) print(uniqueVals) newEntropy =0.0 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy if(infoGain > bestInfoGain): bestInfoGain = infoGain bestFeature = i return bestFeature
下面给个运行结果截图: