【Python機器學習(一)】NumPy/Pandas手搓決策樹+使用Graphviz可視化(以西瓜書數據集為例)

下題來源于筆者學校的《模式識別與機器學習》課程的作業題,本文將通過使用NumPy處理數學運算,Pandas處理數據集,Graphviz實現決策樹可視化等Python庫來實現決策樹算法及其格式化。

導入用到的Python庫:

import numpy as np
import pandas as pd
from graphviz import Digraph

將數據集整理為DataFrame對象。數據集中除“好瓜”一欄表示類別外,其他欄均為屬性和屬性值:

data = pd.DataFrame({
"好瓜" : ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否'], 
"色澤" : ['青綠', '烏黑', '烏黑', '青綠', '淺白', '青綠', '烏黑', '烏黑', '烏黑', '青綠', '淺白', '淺白', '青綠', '淺白', '烏黑', '淺白', '青綠'], 
"根蒂" : ['蜷縮', '蜷縮', '蜷縮', '蜷縮', '蜷縮', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '硬挺', '硬挺', '蜷縮', '稍蜷', '稍蜷', '稍蜷', '蜷縮', '蜷縮'], 
"敲聲" : ['濁響', '沉悶', '濁響', '沉悶', '濁響', '濁響', '濁響', '濁響', '沉悶', '清脆', '清脆', '濁響', '濁響', '沉悶', '濁響', '濁響', '沉悶'], 
"紋理" : ['清晰', '清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '清晰', '稍糊', '清晰', '模糊', '模糊', '稍糊', '稍糊', '清晰', '模糊', '稍糊'], 
"觸感" : ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '軟粘', '軟粘', '硬滑', '硬滑', '軟粘', '硬滑', '軟粘', '硬滑', '硬滑', '軟粘', '硬滑', '硬滑'], 
"含糖量" : [0.46, 0.376, 0.264, 0.318, 0.215, 0.237, 0.149, 0.211, 0.091, 0.267, 0.057, 0.099, 0.161, 0.198, 0.37, 0.042, 0.103]
})

創建節點類和邊類:

class Node:def __init__(self, feature = None, cls = None, data = None):self.feature = feature #若為非葉節點,使用self.feature存儲該節點的分類屬性self.cls = cls #若為葉節點,使用self.cls存儲該節點的分類結果self.data = data #儲存分至該節點的樣本class edge:def __init__(self, start = None, end = None):self.start = start #父節點self.end = end #子節點

使用全局變量列表和字典分別存儲決策樹的各節點和邊,其中邊的存儲格式為edge_dict[邊的屬性值]=邊 。

由于數據集中含有屬性值為連續值的屬性,需使用二分法來處理。使用全局變量best_mid_point 來存儲最佳二分點:

node_list = []
edge_dict = {} #屬性值作為有向邊字典的索引
best_mid_point = 0

決策樹學習基本算法如下圖所示:

筆者使用信息增益作為劃分標準,將其應用至決策樹學習基本算法中,計算各屬性的信息增益,取信息增益最大者為最優劃分屬性。

根據屬性a對數據集D劃分后的信息增益的定義如下:

Gain(D,a)=H(D)-H(D|a)

其中,H(D)表示經驗熵:H(D)=-\sum^{|y|}_{k=1}\frac{|D_k|}{D}log_2\frac{D_k}{D}

表示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85316.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react-activation 組件級緩存解決方案

文章目錄 一、KeepAlive 組件二、AliveScope 容器三、useAliveController Hook四、生命周期五、完整示例 react-activation 主要解決 React 項目中的「頁面緩存」需求(是第三方庫&#xff0c;非React 官方)&#xff0c;類似于 Vue 中的 <KeepAlive>&#xff1a; 功能說明…

CentOS 7內核升級方案

關于升級 CentOS 7 系統內核至 4.19 版本的可執行升級方案,可根據實際情況進行調整和完善,希望能對大家有所幫助: 一、升級背景與目的 隨著業務的發展和系統穩定性的要求,當前 CentOS 7 系統所使用的內核版本 3.10.0-1160.el7.x86_64 已經無法滿足部分新功能需求以及面臨…

樹莓派實驗實踐記錄與技術分析

一、內核驅動開發&#xff1a;hello 模塊實現 驅動程序代碼 #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_INFO "hello kernel\n"); return 0; } module_init(hello_init); static void …

【秦九紹算法】小紅的 gcd

題目 牛客網&#xff1a;小紅的 gcd 題目分析 我們知道&#xff0c;求gcd就用歐幾里得算法&#xff08;輾轉相除法&#xff09;&#xff1a;gcd(a,b)gcd(b,a mod b)。但是這題的a非常大&#xff0c;最大是一個1e6位數&#xff0c;無法使用任何數據類型存儲。如果使用高精度…

AWS服務監控之EC2內存監控

首先在IAM里找到角色&#xff0c;創建角色&#xff0c;選擇EC2 然后在被監控的機器上安裝cloudwatch-agent 官方鏈接在本地服務器上安裝 CloudWatch 代理 - Amazon CloudWatch wget https://s3.amazonaws.com/amazoncloudwatch-agent/redhat/amd64/latest/amazon-cloudwatch-a…

鴻蒙 ArkWeb 和 H5混編開發

ArkWeb Web 相關標準技術(HTML/CSS/JS)&#xff0c;是業內支持性最廣泛的技術&#xff0c;可以在最廣泛的平臺下實現“一次編寫到處運行”&#xff1b;大部分對性能無需極致要求的應用頁面&#xff0c;都可以使用 Web 技術來實現。 鴻蒙 ArkWeb Kit&#xff08;方舟 Web&…

設計模式-迪米特法則(Law of Demeter, LoD)

迪米特法則&#xff08;Law of Demeter, LoD&#xff09; 別名&#xff1a;最少知識原則&#xff08;Least Knowledge Principle&#xff09; 核心思想&#xff1a;一個對象應盡可能少地與其他對象發生交互&#xff0c;只與直接的朋友&#xff08;成員變量、方法參數、方法返回…

python獲取AB直線間任意一點經緯度

獲取AB直線間任意一點經緯度 1、目標 已知A點經緯度,距離;B點經緯度,距離,如果C點在AB之間,且知道C點距離,求C點的經緯度信息。 目標:在AB這條直線上,根據給定的距離(從A點開始沿直線到某點的距離)來求該點的經緯度。 2、方法 首先計算AB的總長度(大圓距離),…

Android實戰——系統字體庫加載流程

Android 系統字體庫指的是在Android設備上用于顯示文本的字體集合。隨著Android系統的更新,其對字體的支持也日益增強,允許開發者和用戶更靈活地定制界面文字顯示。 一、字體庫介紹 1、字體庫文件 字體庫文件是指存儲字體數據的文件,這些文件包含了創建文本字符所需的所有…

嵌入式樂鑫音頻項目“無聲”問題深度調試復盤與方法論總結

前言&#xff1a;一場典型的“工程師尋蹤之旅” 本次調試始于一個看似簡單卻極其頑固的問題&#xff1a;在一個基于樂鑫ESP-ADF&#xff08;音頻開發框架&#xff09;的DuerOS示例項目中&#xff0c;移植到M5Stack ATOMIC Echo Base硬件上后&#xff0c;程序能夠成功編譯、燒錄…

地下安全防線:電纜通道防外破地釘如何守護城市隱形生命線

在繁華都市的柏油馬路之下、在靜謐鄉村的泥土深處&#xff0c;縱橫交錯的地下管線如同城市與鄉村的 “隱形生命線”&#xff0c;承載著電力輸送、供水供氣、通信傳輸等重要功能&#xff0c;默默維系著現代社會的正常運轉。然而&#xff0c;這條 “生命線” 正面臨著諸多潛在威脅…

linux時間同步方案

yum install chrony -y # 配置 chrony 使用國內服務器 sed -i s/^pool.*pool.ntp.org/#&/ /etc/chrony.conf cat >> /etc/chrony.conf <<EOF server ntp.aliyun.com iburst server ntp.tencent.com iburst server ntp.ntsc.ac.cn iburst server time1.cloud.t…

C語言筆記(鵬哥)上課板書+課件匯總(KMP算法的動態規劃簡易處理+字符函數和字符串函數)

一、目錄 kmp動態規劃簡易處理next數組字符函數與字符串函數 一、目錄二、引言C語?標準庫中提供了?系列庫函數 三、字符分類函數&#xff08;字符相關的函數&#xff09;推薦一個網站 四、字符轉換函數&#xff08;字符相關的函數&#xff09;五、strlen&#xff08;字符串相…

Java大模型開發入門 (13/15):擁抱官方標準 - Spring AI框架入門與實踐

前言 到目前為止&#xff0c;我們整個系列的旅程都是在功能強大的LangChain4j框架上構建的。它就像一個裝備齊全的“瑞士軍刀”&#xff0c;為我們提供了構建RAG和Agents所需的所有底層和高層工具。 然而&#xff0c;在Java企業級開發的世界里&#xff0c;有一個名字我們永遠…

Github搜索案例

今天的內容是這個案例的實現&#xff0c;以及其中涉及到的內容&#xff0c;需要全部掌握&#xff0c;比如ref&#xff0c;受控組件&#xff0c;props在組件之中的傳遞&#xff0c;以及Pubsub包的使用這些前端React框架有關的內容。現在進入正題 1.github搜索案例&#xff08;a…

Vue3學習(生命周期,hooks,axios的簡單講解)

一&#xff0c;前言 繼續努力&#xff0c;南方見。 二&#xff0c;生命周期 1.對生命周期的理解 例如&#xff1a;人的生命周期&#xff0c;出生&#xff0c;經歷&#xff0c;死亡 組件的話就是&#xff0c;創建&#xff0c;掛載&#xff0c;更新&#xff0c;銷毀。***在特…

Pytorch實戰四 基于 VGG net 搭建一個串聯的神經網絡結構

系列文章目錄 文章目錄 系列文章目錄前言一、VGG類的搭建1.源碼2.初始化類2.1 初始化函數2.2 前向傳播函數 forward(self,x) 二、卷積補充卷積 前言 對于標準的 VGG net 輸入圖像的尺寸是 24 x 24,進行 32 維的下采樣之后得到一個 7 x 7 的特征圖&#xff0c;然后用 FC 層完成分…

大學專業解讀——計算機

我們繼續&#xff0c;講講排名第二流行的新工科專業——計算機。說到計算機&#xff0c;可能所有人都知道&#xff0c;但具體到細分的專業類別&#xff0c;除了計算機科學&#xff0c;其實大多數人都是不了解的。 序&#xff1a; 計算機主要有如下幾個專業&#xff1a; 計算機…

Bootstrap 5學習教程,從入門到精通, Bootstrap 5 列表組(List Group)語法知識點及案例(14)

Bootstrap 5 列表組(List Group)語法知識點及案例 一、列表組基礎語法 列表組是Bootstrap中用于顯示一系列內容的靈活組件&#xff0c;常用于顯示菜單、導航或任何項目列表。 基本列表組結構 <ul class"list-group"><li class"list-group-item&quo…

FPGA基礎 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”機制 進行一次系統、專業的培訓。該機制在 Verilog 中是比較冷門但重要的仿真控制特性&#xff0c;主要用于 模塊間同步、行為仿真觸發、事件通信&#xff0c;在復雜的 Testbench、行為模型中尤為重要。 一、命名事…