Numpy 實現基尼指數算法的決策樹

基尼系數實現決策樹

基尼指數

Gini ? ( D ) = 1 ? ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 \operatorname{Gini}(D)=1-\sum_{k=1}^{K}\left(\frac{\left|C_{k}\right|}{|D|}\right)^{2} Gini(D)=1?k=1K?(DCk??)2

特征 A A A條件下集合 D D D的基尼指數:

Gini ? ( D , A ) = ∣ D 1 ∣ ∣ D ∣ Gini ? ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ Gini ? ( D 2 ) \operatorname{Gini}(D, A)=\frac{\left|D_{1}\right|}{|D|} \operatorname{Gini}\left(D_{1}\right)+\frac{\left|D_{2}\right|}{|D|} \operatorname{Gini}\left(D_{2}\right) Gini(D,A)=DD1??Gini(D1?)+DD2??Gini(D2?)

import numpy as npdef calculate_gini(labels):# 計算標簽的基尼系數_, counts = np.unique(labels, return_counts=True)probabilities = counts / len(labels)gini = 1 - np.sum(probabilities ** 2)return ginidef calculate_gini_index(data, labels, feature_index, threshold):# 根據給定的特征和閾值劃分數據left_mask = data[:, feature_index] <= thresholdright_mask = data[:, feature_index] > thresholdleft_labels = labels[left_mask]right_labels = labels[right_mask]# 計算左右子集的基尼系數left_gini = calculate_gini(left_labels)right_gini = calculate_gini(right_labels)# 計算基尼指數total_gini = calculate_gini(labels)left_weight = len(left_labels) / len(labels)right_weight = len(right_labels) / len(labels)gini_index = (left_weight * left_gini) + (right_weight * right_gini)return gini_indexdef find_best_split(data, labels):num_features = data.shape[1]best_gini_index = float('inf')best_feature_index = -1best_threshold = Nonefor feature_index in range(num_features):feature_values = data[:, feature_index]unique_values = np.unique(feature_values)for threshold in unique_values:gini_index = calculate_gini_index(data, labels, feature_index, threshold)if gini_index < best_gini_index:best_gini_index = gini_indexbest_feature_index = feature_indexbest_threshold = thresholdreturn best_feature_index, best_thresholddef create_decision_tree(data, labels):# 基本情況:如果所有標簽都相同,則返回一個葉節點,其中包含該標簽if len(np.unique(labels)) == 1:return {'label': labels[0]}# 找到最佳的劃分特征best_feature_index, best_threshold = find_best_split(data, labels)# 創建一個新的內部節點,其中包含最佳特征和閾值node = {'feature_index': best_feature_index,'threshold': best_threshold,'left': None,'right': None}# 根據最佳特征和閾值劃分數據left_mask = data[:, best_feature_index] <= best_thresholdright_mask = data[:, best_feature_index] > best_thresholdleft_data = data[left_mask]left_labels = labels[left_mask]right_data = data[right_mask]right_labels = labels[right_mask]# 遞歸創建左右子樹node['left'] = create_decision_tree(left_data, left_labels)node['right'] = create_decision_tree(right_data, right_labels)return nodedef predict(node, sample):if 'label' in node:return node['label']feature_value = sample[node['feature_index']]if feature_value <= node['threshold']:return predict(node['left'], sample)else:return predict(node['right'], sample)# 示例數據集
data = np.array([[1, 2, 0],[1, 2, 1],[1, 3, 1],[2, 3, 1],[2, 3, 0],[2, 2, 0],[1, 1, 0],[1, 1, 1],[2, 1, 1],[1, 3, 0]
])labels = np.array([0, 1, 1, 1, 0, 0, 0, 1, 1, 1])# 創建決策樹
decision_tree = create_decision_tree(data, labels)# 測試數據
test_data = np.array([[1, 2, 0],[2, 1, 1],[1, 3, 1],[2, 3, 0]
])# 預測結果
for sample in test_data:prediction = predict(decision_tree, sample)print(f"樣本: {sample}, 預測標簽: {prediction}")

在這里插入圖片描述

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

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

相關文章

使用ssm框架進行mapper或者service單純測試時報錯問題處理

問題 使用注解方式配置好ssm后&#xff0c;無法在測試中單獨測試mapper層和service層。效果如下&#xff1a; 解決 關閉配置類中的EnableWebMvc 再次運行&#xff0c;即可完成測試。

【SpringBoot篇】5種類型參數傳遞json數據傳參的操作

&#x1f38a;專欄【SpringBoot】 &#x1f354;喜歡的詩句&#xff1a;天行健&#xff0c;君子以自強不息。 &#x1f386;音樂分享【如愿】 &#x1f384;歡迎并且感謝大家指出小吉的問題&#x1f970; 文章目錄 &#x1f33a;普通參數&#x1f33a;POJO參數&#x1f33a;嵌套…

uniapp切換頁面時報錯問題

我們來看如下錯誤&#xff1a; 該錯誤的意思是不能切換到 tabbar 頁面。tabbar頁面通常是公共頁面或者底部導航欄&#xff0c;如果我們用 navigateTo 或者 redirectTo 都不能實現頁面切換。 我們有兩種方式&#xff1a; 第一種是用 switchTab 來進行切換&#xff0c;但注意切…

xml文本轉Java對象

Java對象轉String public static String toData(Object object) throws Exception {JAXBContext jc JAXBContext.newInstance(object.getClass());Marshaller m jc.createMarshaller();StringWriter output new StringWriter(2048);m.marshal(object, output);String data …

STM32之SPI總線

一、SPI總線概述 1、SPI總線介紹 SPI是一種通信協議&#xff0c;它是摩托羅拉公司研發出來的一種通信協議&#xff0c;就有自己的特點&#xff08;串行&#xff0c;并行&#xff0c;單工&#xff0c;半雙工&#xff0c;全雙工&#xff0c;同步異步&#xff09;。它主要應用于音…

ffprobe命令行超詳細使用詳解

本文做為閱讀ffprobe源碼的前課程。為了之后方便理解ffprobe的源碼,咱們先從ffprobe的命令學習。 課程內容如下: 文章目錄 一、ffprobe主要選項說明1、每次使用ffprobe都打印編譯環境的信息,太煩了2、如何分析媒體文件中存在的流信息3、如何指定查詢某路流信息4、查看輸入文…

CS106L2023 and CS106B 環境配置(詳細教程)

1.問題&#xff1a; &#xff08;1&#xff09;CS106L 運行./setup.sh 腳本時出錯 &#xff08;windows 請下載git&#xff0c;在git bash 打開運行&#xff09; &#xff08;2&#xff09;CS106B&#xff0c;QT構建 構建錯誤&#xff1a;一般構建錯誤&#xff0c;例如 Erro…

【Java+MySQL】前后端連接小白教程

目錄 &#x1f36d;【IntelliJ IDEA】操作 &#x1f36d;1. 連接MySQL數據庫 &#x1f308;1.1 錯誤解決 &#x1f36d;2. 操作MySQL數據庫 &#x1f308;2.1 雙擊查看表數據 &#x1f308;2.2 編寫SQL腳本 &#x1f36d;【IntelliJ IDEA】 IntelliJ IDEA是由JetBrains公司…

2013年全國碩士研究生入學統一考試管理類專業學位聯考數學試題——解析版

文章目錄 2013 級考研管理類聯考數學真題一、問題求解&#xff08;本大題共 15 小題&#xff0c;每小題 3 分&#xff0c;共 45 分&#xff09;下列每題給出 5 個選項中&#xff0c;只有一個是符合要求的&#xff0c;請在答題卡上將所選擇的字母涂黑。真題&#xff08;2013-01&…

Django自定義中間件

自定義中間件 傳統方法的的五大鉤子函數&#xff1a;&#xff08;需要調用MiddlewareMixin類&#xff09; process_request&#xff0c;請求剛到來&#xff0c;執行視圖之前&#xff1b;正序 process_view&#xff0c;路由轉發到視圖&#xff0c;執行視圖之前&#xff1b;正序…

【Linux】地址空間

本片博客將重點回答三個問題 什么是地址空間&#xff1f; 地址空間是如何設計的&#xff1f; 為什么要有地址空間&#xff1f; 程序地址空間排布圖 在32位下&#xff0c;一個進程的地址空間&#xff0c;取值范圍是0x0000 0000~ 0xFFFF FFFF 回答三個問題之前我們先來證明地址空…

【Python數據結構與算法】—— 搜索算法 | 期末復習不掛科系列

? &#x1f308;個人主頁: Aileen_0v0&#x1f525;系列專欄: 數據結構與算法&#x1f4ab;個人格言:"沒有羅馬,那就自己創造羅馬~" 這篇博客主要探索的是計算機科學常見問題---搜索算法 “時間緊&#xff0c;任務重&#xff01;” 話不多說&#xff0c;開始今天…

HarmonyOS--ArkTS(0)--目錄

官方API文檔&#xff1a; HarmonyOS應用開發官網 - 華為HarmonyOS打造全場景新服務 華為開發者官方網站_創新從這里開始

MySQL的鎖機制

1.簡介 MySQL的隔離性是由鎖機制來保證的。鎖是計算機協調多個進程或線程并發地訪問某一資源你的機制。當多線程并發地訪問某個數據時&#xff0c;尤其是在涉及金錢等安全敏感性數據的時候&#xff0c;需要保證數據在任意時刻最多只有一個線程可以對其進行修改&#xff0c;從而…

Android 分享小結

關于作者&#xff1a;CSDN內容合伙人、技術專家&#xff0c; 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 &#xff0c;擅長java后端、移動開發、商業變現、人工智能等&#xff0c;希望大家多多支持。 目錄 一、導讀二、微信 分享 三、 QQ 、QQ空間&#xff08;Qz…

MATLAB基礎運算

矩陣和數字相乘 就是矩陣里面每個元素跟這個數字乘一遍&#xff0c;無論是點乘還是叉乘&#xff0c;對于這個都一樣。 >> Aones(3) A 1 1 11 1 11 1 1 >> 10*A ans 10 10 1010 10 1010 10 10 矩陣和矩陣叉乘 能不能相…

C++普通函數與函數模板的調用規則

調用規則 如果函數模板和普通函數都可以實現&#xff0c;優先調用普通函數可以通過空模板參數列表來強制調用函數模板函數模板也可以重載如果函數模板可以產生更好的匹配&#xff0c;優先調用函數模板 總結&#xff1a;既然提供了函數模板&#xff0c;最好就不要提供普通函數…

CSS 如何居中 DIV

如何居中 div&#xff1f; 水平居中&#xff1a;給 div 設置一個寬度&#xff0c;然后添加 margin:0 auto 屬性 div {width: 200px;margin: 0 auto; }水平居中&#xff0c;利用 text-align:center 實現 .container {background: rgba(0, 0, 0, 0.5);text-align: center;font…

基于ssm鐵嶺河醫院醫患管理系統論文

摘 要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人們所認識&#xff0c;科學化的管理&#xff0c;使信息存…

logback的使用

1 logback概述 SLF4J與其它日志組件調用關系圖如下所示。 SLF4J&#xff0c;即Java中的簡單日志門面&#xff08;Simple Logging Facade for Java&#xff09;&#xff0c;不是具體的日志解決方案&#xff0c;它只服務于各種各樣的日志系統。 SLF4J最常用的日志實現框架是&am…