ハンドラインツリーコード - 詳細原理(1)(のpython3)

前提

情報エントロピーのために

簡単な方法は、小さなパートナーの研究物理化学は理解:
エントロピーは分子運動乱れ障害の程度の尺度である、より大きなエントロピー、大きな混乱の度合いを。
そのため、情報エントロピー含まイベントに関する情報の内部障害の
数学で:
事が起こることは稀であるとき、私たちは大量の情報を取得している
一つのことは非常に可能性が発生するとき情報の量は、我々は小さな取得したとき

の例を:
1.トランプは、中国のおとり捜査実際には
2トランプはZZです。
結論:
メトリック情報は、確率分布に依存すべき
エントロピーH(X)であるべきである確率P(X)は単調関数であるように。

派生:
xがyのイベントイベントに関連付けられていない場合:(XおよびYイベントの独立したイベント)
我々は、イベントX、イベントY = X + Yイベント情報、イベント情報の情報量の合計得る
ある:H(X、Y)を= H(X)+ H( Y)------------(1)
同様に、X、Yイベントの独立したので
、X、イベント発生確率ながら= X * yの確率事象の発生確率Y
すなわち:P(XY)= P( X)* P(Y)
の対数その両側の
導光板(XY)= LG(P (X)* P(Y))= LGP(X)+ LGP(Y) - -----(2)
(1)、(2)その締結により
、H(X)はP(X)は、ログの関数である確率であるべきである
(P(X)ログが負の後0-1確率通常のエントロピーH(X)は正でなければなりません)
だから私たちは式の前にマイナス記号を追加する必要があります。
基板、底e学習典型的機械として、一般に、コンピュータ2(ビット)に、誰底を記録します。
したがって、単一のランダム変数はXI。のXイベント情報エントロピー
ここに画像を挿入説明
ランダム変数XイベントXI平均(所望の治療)のすべての値が考慮
全体イベント情報エントロピーを与えることである:
ここに画像を挿入説明
コードアタッチ:
PS:
イベント:全データセットである
ランダム変数:データセットクラス
確率:データセット全体のインスタンスの発生総数データセットの確率は、回数データの特定のクラス
、我々のデータセットの属性値スイカ仮定は、最後の列は、決意の結果である
最後の列にデータの各セットを見つけます結果は、データセット全体のインスタンスの確率占め
どのように多くの良いメロン、どのように多くの腐ったメロン確率の確率を

#  度量数据集的无序程度(计算香农熵)
def calcShannonEnt(dataSet):  # calculate shannon entropy计算香农熵
    numEntries = len(dataSet)  # 得到数据集的长度,entries词典的条目的数量,就是词条的数量
    labelCounts = {}  # 新建空字典
    for featVec in dataSet:  # 遍历数组
        currentLabel = featVec[-1]  # currentLabel 存储dataSet最后一列的数值,最后一列是最终判断的结果
        if currentLabel not in labelCounts.keys():  # 如果数值不在字典里
            labelCounts[currentLabel] = 0  # 如果判断不在字典里,扩展字典,将currentLabel的键值设为0
        labelCounts[currentLabel] += 1  # 将currentLabel的键值加1,记录当前,类别的判断在字典里出现的次数
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries  # probablity 计算字典中的类别在数据集中出现的概率
        shannonEnt += -prob * log(prob, 2)  # 香农熵的计算公式,其实就是算所以信息的期望值
    return shannonEnt

情報利得

情報とデータの混乱の高い程度は、また、一般的には、この種のものに対処する私たちの大きな困難に代わって、私たちは一つのことに遭遇し、または頻繁に情報が含まれている、より高いレベルのタスクを、配置します非常に、無力と混沌を混同している我々はすべて、情報、有益な情報と、より秩序の純度を増加させるエントロピーを減らす無効な情報を排除することができるようにしたいので。
私たちは、呼び出された変更情報や行動の純度の変更情報をエントロピー情報ゲイン
獲得するために情報
の情報ゲインが0よりも一般的に大きいので、私たちはすべての希望は、それを減らすために、エントロピーの一般的な情報を
分類情報ゲインの前にエントロピー= -分類した後、情報エントロピー

最初のステップ:データセットを分割する(データ分類の同じタイプ)

#  按照特征划分数据集,它的方式是去除该value,并返回去除所有value的数据组合起来的数据集
def splitDataSet(dataSet, axis, value):  # 输入带划分数据集,axis列的属性,value(划分数据集的特征),我们需要返回的特征的值
    retDataSet = []  # 创建新的list对象,为了不修改原始数据集
    for featVec in dataSet:
        if featVec[axis] == value:  # 找出每个数据组的axis轴的属性里的特征值,让它和value特征判断,相等去除掉value
            # 下面这个操作其实就是找每个数据组的axis列上是value的,我就删掉
            reducedFeatVec = featVec[:axis]  # 0-axis-1
            reducedFeatVec.extend(featVec[axis + 1:])  # axis+1到最后,两个合并起来
            retDataSet.append(reducedFeatVec)  # 变成[[reducedFeatVec1],[reducedFeatVec2],[reducedFeatVec3]]
    return retDataSet  # 这里面存着所有被删过value的数据组,没有value的数据组没有放进去

ステップインポートデータは、設定されフォーマット

それをリストに変換し、このステップでは、データをインポートし、コンマなどのクリーンアップ不要なスペース文字。

def file2matrix(filename):
    fr=open(filename)
    lists=fr.readlines()
    listnum=[]
    for k in lists:
        listnum.append(k.strip().split(','))
    return listnum

第3のステップは、最良のデータセットの分割方法を選択することです

各データセットカテゴリデータ、すなわち、それは、プロパティ値の5種類であり、5種類があると仮定される
、すなわちスイカ色、サイズ、細かさ、硬度、ストライプ
我々は、データセットを分割する方法として、各カテゴリ内にある、計算をそれのエントロピーが減少していない、第1分割手段として最大の情報ゲインがある最も強力な方法部門の縮小、

#  选择最好的数据集划分方式
'''
 dataSet = [[1,2,3],[4,2,6,7],[8,3,2,11]]
     for fc in dataSet:
         if fc[1] == 2:
             print(fc[:1],fc[2:],"!")
     for i in range(3):
         featlist = [example[i] for example in dataSet]
         print(featlist)
[1] [3] !
[4] [6, 7] !
[1, 4, 8]
[2, 2, 3]
[3, 6, 2]

'''
def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)  # 计算数据集的香农熵
    bestInfoGain = 0.0; bestFeature = -1
    for i in range(numFeatures):
        # 这个写法是遍历数据集中的每一行,把其中的第i个数据取出来组合成一个列表,每个i列表示一种属性
        featList = [example[i] for example in dataSet]  # 把属性i中相同类别的元素划在一个列表,再合起来组合成一个大列表
        uniqueVals = set(featList)  # set可以去掉重复元素
        newEntropy = 0.0
        # 找列表的第一个列表里遍历,在遍历列表里的第二个列表,以此类推
        for value in uniqueVals:  # 把所有类别的所有特征全部划分一次数据集
            subDataSet = splitDataSet(dataSet, i, value)  # 给出在属性i下不同的特征值获取每种不同划分方式的数据集
            # 对应到决策树的情况就是每次选判断条件(特征值),通过这个判断条件之后剩下来的数据集的信息熵是否减少
            prob = len(subDataSet) / float(len(dataSet))  # 计算i轴属性i下有value的数据组占整个数据组的概率
            newEntropy += prob * calcShannonEnt(subDataSet)  # 计算不同划分方式的信息熵
        infoGain = baseEntropy - newEntropy  # 计算所有的信息增益
        if infoGain > bestInfoGain:  # 选出最大的信息增益
            bestInfoGain = infoGain
            bestFeature = i  # 找到最好的划分方式特征并返回
        return bestFeature
公開された19元の記事 ウォンの賞賛4 ビュー498

おすすめ

転載: blog.csdn.net/qq_35050438/article/details/103489986