1. 程式人生 > >決策樹構建與深度節點數簡單例子

決策樹構建與深度節點數簡單例子

1、構建treePlotter.py

#coding:utf-8
import matplotlib.pyplot as plt

# 定義決策樹決策結果的屬性,用字典來定義  
# 下面的字典定義也可寫作 decisionNode={boxstyle:'sawtooth',fc:'0.8'}  
# boxstyle為文字框的型別,sawtooth是鋸齒形,fc是邊框線粗細  
decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")

def plotNode(nodeTxt, centerPt, parentPt, nodeType):
    # annotate是關於一個數據點的文字  
    # nodeTxt為要顯示的文字,centerPt為文字的中心點,箭頭所在的點,parentPt為指向文字的點 
    createPlot.ax1.annotate(nodeTxt, xy=parentPt,  xycoords='axes fraction',
             xytext=centerPt, textcoords='axes fraction',
             va="center", ha="center", bbox=nodeType, arrowprops=arrow_args )

def createSimplePlot():     
    fig = plt.figure(1,facecolor='white') # 定義一個畫布,背景為白色
    fig.clf() # 把畫布清空
    # createPlot.ax1為全域性變數,繪製圖像的控制代碼,subplot為定義了一個繪圖,
    #111表示figure中的圖有1行1列,即1個,最後的1代表第一個圖 
    # frameon表示是否繪製座標軸矩形 
    createPlot.ax1 = plt.subplot(111,frameon=False) 
    plotNode('a decision node',(0.5,0.1),(0.1,0.5),decisionNode) 
    plotNode('a leaf node',(0.8,0.1),(0.3,0.8),leafNode) 
    plt.show() 
    

def getNumLeafs(myTree):
    numLeafs = 0
    firstSides = list(myTree.keys())
    firstStr = firstSides[0]    
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]).__name__ == 'dict':
            numLeafs += getNumLeafs(secondDict[key])
        else: numLeafs += 1
    return numLeafs

def getTreeDepth(myTree):
    maxDepth = 0
    firstSides = list(myTree.keys())
    firstStr = firstSides[0]    
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]).__name__ == 'dict':
            thisDepth = 1+ getTreeDepth(secondDict[key])
        else: thisDepth = 1
        if thisDepth > maxDepth: maxDepth = thisDepth
    return maxDepth


def createPlot(inTree):
    fig = plt.figure(1, facecolor='white')
    fig.clf()
    axprops = dict(xticks=[], yticks=[])# 定義橫縱座標軸,無內容  
    #createPlot.ax1 = plt.subplot(111, frameon=False, **axprops) # 繪製圖像,無邊框,無座標軸  
    createPlot.ax1 = plt.subplot(111, frameon=False) 
    plotTree.totalW = float(getNumLeafs(inTree))   #全域性變數寬度 = 葉子數
    plotTree.totalD = float(getTreeDepth(inTree))  #全域性變數高度 = 深度
    #圖形的大小是0-1 ,0-1
    plotTree.xOff = -0.5/plotTree.totalW;  #例如繪製3個葉子結點,座標應為1/3,2/3,3/3
    #但這樣會使整個圖形偏右因此初始的,將x值向左移一點。
    plotTree.yOff = 1.0;
    plotTree(inTree, (0.5,1.0), '')
    plt.show()

def plotTree(myTree, parentPt, nodeTxt):
    numLeafs = getNumLeafs(myTree)  #當前樹的葉子數
    depth = getTreeDepth(myTree) #沒有用到這個變數
    firstSides = list(myTree.keys())
    firstStr = firstSides[0] 
    #cntrPt文字中心點   parentPt 指向文字中心的點 
    cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW, plotTree.yOff)
    plotMidText(cntrPt, parentPt, nodeTxt) #畫分支上的鍵
    plotNode(firstStr, cntrPt, parentPt, decisionNode)
    secondDict = myTree[firstStr]
    plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD #從上往下畫
    for key in secondDict.keys():
        if type(secondDict[key]).__name__=='dict':#如果是字典則是一個判斷(內部)結點  
            plotTree(secondDict[key],cntrPt,str(key))       
        else:   #列印葉子結點
            plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW
            plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)
            plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))
    plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalD 

def plotMidText(cntrPt, parentPt, txtString):
    xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]
    yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]
    createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30)
    

#這個是用來建立資料集即決策樹
def retrieveTree(i):
    listOfTrees =[{'no surfacing': {0:{'flippers': {0: 'no', 1: 'yes'}}, 1: {'flippers': {0: 'no', 1: 'yes'}}, 2:{'flippers': {0: 'no', 1: 'yes'}}}},
                  {'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}
                  ]
    return listOfTrees[i]

2、構建Treetest.py
import treePlotter
#treePlotter.createSimplePlot()

mytree= {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}} 

#mytree =  treePlotter.retrieveTree(0)
print (treePlotter.getNumLeafs(mytree))
print (treePlotter.getTreeDepth(mytree))
treePlotter.createPlot(mytree)


相關推薦

決策構建深度節點簡單例子

1、構建treePlotter.py #coding:utf-8 import matplotlib.pyplot as plt # 定義決策樹決策結果的屬性,用字典來定義 # 下面的字典定義也可寫作 decisionNode={boxstyle:'sawtooth'

離散型連續型資料決策構建及列印實現 R語言,ID3,C4.5演算法

本人的第一篇文章,趁著我們的資料探勘課設的時間,把實現的決策樹程式碼,拿出來分享下。有很多漏洞和缺陷,還有很多駭客思想的成分,但是總之,能實現,看網上的程式碼,能用的其實也沒幾個。廢話不多說,直接看程式碼 特別鳴謝博主skyonefly的程式碼 附上鍊接:R

決策構建

選擇 變量 question mage 預測 id3 算法 特征選擇 pan 信息熵: 生活中的所見所聞,都接觸到許許多多的信息,有的信息對我們有用,有的無用。如 “地球是自轉的”,這條信息對我們沒什麽用,因為我們都知道,而且是確確實實是這樣的。香

決策模型學習《一》

ini 相親 tor ext 測試的 select port RR rand html { } :root { } html { font-size: 14px; background-color: var(--bg-color); color: var(--tex

Python爬蟲(三)——開封市58同城出租房決策構建

off parent decision second string pre IE for 爬蟲 決策樹框架: 1 # coding=utf-8 2 import matplotlib.pyplot as plt 3 4 decisionNode = d

機器學習:決策(基尼系

try matplot 代碼實現 sci bubuko div tro 兩種 () 一、基礎理解  1)公式 k:數據集中樣本類型數量; Pi:第 i 類樣本的數量占總樣本數量的比例  2)實例計算基尼系數 3 種情況計算基尼系數: 基尼系數的性質與信息熵

【python和機器學習入門2】決策2——決策構建

參考部落格:決策樹實戰篇之為自己配個隱形眼鏡 (po主Jack-Cui,《——大部分內容轉載自                   參考書籍:《機器學習實戰》——第三章

決策分析實踐

1.分析 1.1 背景和意義:        相信很多人都玩過一個網路上傳的遊戲,腦海裡面想一個名人的名字,然後出若干多道問題,比如男的女的,國外的國內的,你只能答是或不是,最後給出你想的那個名人是誰。只要不是很偏的應該都能想出來,一般人覺得很震驚,其實這只是一種簡單機器

Java二叉構建深度優先遍歷和廣度優先遍歷

1.工程目錄如下: 2.定義節點資訊的類:TreeNode.java package binarytree; public class TreeNode{ public TreeNode() { // TODO Auto-generated construct

決策理解python實現

程式碼實現請直接移步博文末尾 在機器學習領域,決策樹是用於資料分類、預測的模型。決策樹演算法通過分析訓練集的各個資料特徵的不同,由原始資料集構造出一個樹形結構,比如我們分析一封郵件是否為垃圾郵件時,可以根據傳送方域名、郵件主題等方式區分郵件是否為垃圾郵件,新資料通過使用構造出的決策樹

遞迴遍歷 二叉 求高度 和 節點 和 葉子節點數

1,二叉樹的儲存結構: typedef struct Node { char data; struct Node *lchild,*rchild; }Node,*BiTree;2, 建

決策CARTID3,C4.5聯絡區別

CART與ID3和C4.5相同都由特徵選擇,樹的生成,剪枝組成。但ID3和C4.5用於分類,CART可用於分類與迴歸。 CART是在給定輸入隨機變數X條件下輸出隨機變數Y的條件概率分佈,與ID3和C4.5的決策樹所不同的是,ID3和C4.5生成的決策樹可以是多

《機器學習_09_01_決策_ID3C4.5》

### 簡介 先看一個例子,某銀行是否給使用者放貸的判斷規則集如下: ```python if 年齡==青年: if 有工作==是: if 信貸情況==非常好: 放 else: 不放 else:

Python網絡編程UDP服務器客服端簡單例子

... ket add and cti while NPU inpu dto [轉載] https://blog.csdn.net/hu330459076/article/details/7868028 UDP服務器代碼: #!/usr/bin/env pyt

ListSet的區別簡單例子

import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class SetDemo { public static void demo

Chromium原始碼獲取編譯--附加一個簡單例子的編譯

從工作到現在,一直弄介面相關的東西,弄了好多年,包括前公司也買了一套UI,但是用下來以後發現不是這個問題就是那個問題。現在新的公司還在用MFC。MFC其實沒什麼不好,就是不能改原始碼這點比較糾結。。(誰說不能改原始碼的,改完自己編譯就是了。。orz。。你倒是給我個工程檔案?

關於SpringWebSocket結合的簡單例子

      我的執行環境是:Tomcat 8.0 + Spring 4.0 + Myeclipse2014 + Firefox 42        JDK 1.8 不支援Spring 4.0 之前的版本       使用Google瀏覽器,Spring可能會丟擲異常:The

深入淺出據結構C語言版(22)——排序決策桶式排序

不改變 自然 只需要 都是 變種 限定 style buck oid   在(17)中我們對排序算法進行了簡單的分析,並得出了兩個結論:   1.只進行相鄰元素交換的排序算法時間復雜度為O(N2)   2.要想時間復雜度低於O(N2),算法必須進行遠距離的元素交換     

決策構建、展示決策

1. 概述 上一篇日誌中,我們介紹了兩個決策樹構建演算法 – ID3、C4.5: 決策樹的構建演算法 – ID3 與 C4.5 演算法 本篇日誌我們來看看如何使用這兩個演算法以及其他工具構建和展示我們的決策樹

決策構建演算法 -- ID3 C4.5 演算法

1. 概述 上一篇日誌中,我們介紹了最簡單的分類迴歸演算法 – K 近鄰演算法。 k 近鄰演算法 本篇日誌我們來介紹構建專家系統和資料探勘最常用的演算法 – 決策樹。 2. 決策樹 在系統流程圖中,我們常