哪些公司做企业网站,给网站做seo的价格,天津设计公司排名榜,重庆市建设工程信息网证件信息分类算法除了需要测量信息熵#xff0c;还需要划分数据集#xff0c;度量划分数据集的熵#xff0c;以便判断当前是否正确划分了数据集。
我们将对每个特征划分数据集的结果计算一次信息熵#xff0c;然后判断按照哪个特征划分数据集是最好的划分方式。
想象一个分部在二…分类算法除了需要测量信息熵还需要划分数据集度量划分数据集的熵以便判断当前是否正确划分了数据集。
我们将对每个特征划分数据集的结果计算一次信息熵然后判断按照哪个特征划分数据集是最好的划分方式。
想象一个分部在二维空间的数据散点图需要再数据之间画条线将他们分成两部分。
按照给定的特征划分数据集
def splitDataSet(dataSet,axis,value):#创建新的list对象reDataSet[]for featVec in dataSet:if featVec[axis]value:#抽取数据resuceFeatVecfeatVec[:axis]resuceFeatVec.extend(featVec[axis1:])reDataSet.append(resuceFeatVec)return reDataSet
上述代码有3个输入参数待划分的数据集、划分数据集的特征、需要返回的特征的值。
需要注意的是Python语言不用考虑内存分配的问题。Python语言在函数中传递的是列表的引用在函数内部对列表的修改将会影响该列表对象的整个生存周期。
为了消除这一不良影响我们需要在函数的开始声明一个新列表对象。因为该函数代码在同一数据集上被调用多次为了不修改原始数据集创建一个新的列表对象数据集这个列表中的各个元素也是列表我们要遍历数据集中的每个元素一旦发现符合要求的值则将其添加到新创建的列表中。在if语句中程序将符合特征的数据抽取出来。
代码中使用了Python自带的extend()和append()方法。
利用鱼类分类数据进行测试
myDat,labelscreateDataSet()
print(splitDataSet(myDat,0,1))
print(splitDataSet(myDat,0,0))接下来遍历整个数据集循环计算香农熵和splitDataSet()函数找到最好的特征划分方式。熵计算将会告诉我们如何划分数据集是最好的数据组织方式。
def chooseBestFeatureToSplit(dataSet):numFeatureslen(dataSet[0])-1baseEntropycalcShannonEnt(dataSet)bestInfoGain0.0bestFeature-1for i in range(numFeatures):featList[example[i] for example in dataSet]uniqueValsset(featList)newEntropy0.0for value in uniqueVals:subDataSetsplitDataSet(dataSet,i,value)prodlen(subDataSet)/float(len(dataSet))newEntropynewEntropyprod*calcShannonEnt(subDataSet)infoGainbaseEntropy-newEntropyif (infoGainbestInfoGain):bestInfoGaininfoGainbestFeatureireturn bestFeature
上述代码实现了选取特征、划分数据集、计算得出最好的划分数据集特征。
在函数chooseBestFeatureToSplit()使用了calcShannonEnt()、splitDataSet()在函数中调用的数据需要满足一定的要求第一个要求是数据必须是一种由列表元素组成的列表而且所有的列表元素都要具有相同的长度第二个要求是数据的最后一列或者每个实例的最后一个元素是当前实例的类别标签。数据集一旦满足上述要求我们就可以在函数的第一行判定当前数据集包含多少特征属性。我们无需限定list中的数据类型它们既可以是数字也可以是字符串并不影响计算。
在开始划分数据集之前chooseBestFeatureToSplit()函数的第2行代码计算了整个数据集的原始香农熵我们保存最初的无需度量值用于与划分完之后的数据集计算的熵值进行比较。第1个for循环遍历数据集中的所有特征。使用列表推导来创建新的列表将数据集中的所有第i个特征值或者所有可能存在的值写入这个新list中。然后使用Python原生的集合set数据类型。集合数据类型与列表类型相似不同之处仅在于集合类型中的每个值互不相同。从列表中创建集合是Python语言得到列表中唯一元素值的最快方法。
遍历当前特征中的所有唯一属性值对每个唯一属性值划分一次数据集然后计算数据集的新熵值并对所有唯一特征值得到的熵求和。信息增益是熵的减少或者数据无序度的减少。最后比较所有特征中的信息增益返回最好特征划分的索引值。
现在测试代码
myDat,labelscreateDataSet()
print(chooseBestFeatureToSplit(myDat))
print(myDat) 结果告诉我们第0个特征是最好的用于花粉数据集的特征。