(dataSet)
return bestFeature
计算数据集的熵
    :param dataSet: 数据集
    :return: 最优的特征值的索引
计算数据集的熵
    :param dataSet: 数据集
    :return: 最优的特征值的索引
计算数据集的熵 : param dataSet : 数据集 : return : 最优的特征值的索引
def chooseBestFeatureToSplit(dataSet):
    '''
    计算数据集的熵
    :param dataSet: 数据集
    :return: 最优的特征值的索引
    '''

    # 特征个数
    numFeatures = len(dataSet[0]) - 1
    # 数据集的熵
    baseEntropy = calcEntropy(dataSet)
    # 最优信息增益
    bestInfoGain = 0.0
    # 最优特征的索引值
    bestFeature = -1

    for i in range(numFeatures):
        # 获取数据集的第 i 个所有特征
        featList = [example[i] for example in dataSet]
        #创建 set集合{}，元素不可重复
        uniqueVals = set(featList)
        # 经验条件熵
        newEntropy = 0.0
        #计算信息增益
        for value in uniqueVals:
            # 数据集划分后的子集
            subDataSet = splitDataSet(dataSet, i, value)
            #计算子集的概率
            prob = len(subDataSet) / float(len(dataSet))
            #根据公式计算经验条件熵
            newEntropy += prob * calcEntropy((subDataSet))
        #信息增益
        infoGain = baseEntropy - newEntropy
        #打印每个特征的信息增益
        print("第%d个特征属性的信息增益为%.3f" % (i, infoGain))

        if (infoGain > bestInfoGain):
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature
def chooseBestFeatureToSplit ( dataSet ) : # 特征个数 numFeatures = len ( dataSet [ 0 ] ) - 1 # 数据集的熵 baseEntropy = calcEntropy ( dataSet ) # 最优信息增益 bestInfoGain = 0.0 # 最优特征的索引值 bestFeature = - 1 for i in range ( numFeatures ) : # 获取数据集的第 i 个所有特征 featList = [ example [ i ] for example in dataSet ] #创建 set集合{}，元素不可重复 uniqueVals = set ( featList ) # 经验条件熵 newEntropy = 0.0 #计算信息增益 for value in uniqueVals : # 数据集划分后的子集 subDataSet = splitDataSet ( dataSet , i , value ) #计算子集的概率 prob = len ( subDataSet ) / float ( len ( dataSet ) ) #根据公式计算经验条件熵 newEntropy += prob * calcEntropy ( ( subDataSet ) ) #信息增益 infoGain = baseEntropy - newEntropy #打印每个特征的信息增益 print ( "第%d个特征属性的信息增益为%.3f" % (i, infoGain)) if ( infoGain > bestInfoGain ) : bestInfoGain = infoGain bestFeature = i return bestFeature