機器學習總結(17)-XGBoost

文章目錄

  • lecture17:XGBoost(eXtreme Gradient Boosting)
  • 目錄
    • 1. XGBoost的基本信息
    • 2. XGBoost與GBDT的異同點
    • 3. XGBoost的原理
        • 3.1定義樹的復雜度
        • 3.2 分裂節點
        • 3.3 自定義損失函數
    • 4. XGBoost的使用

lecture17:XGBoost(eXtreme Gradient Boosting)

目錄

1. XGBoost的基本信息

全稱:eXtreme Gradient Boosting
作者:程天奇(華盛頓大學博士)
基礎:GBDT
所屬:boosting 迭代算法、樹類算法
應用類型:分類和回歸
優點:速度快,效果好,可以并行計算處理大量數據,支持多種語言,支持自定義損失函數,正則化,高度靈活性,缺失值處理,剪枝,內置交叉驗證,在已有模型基礎上繼續訓練等等
缺點:發布時間短,工業領域應用較少,需要檢驗

參考博客

2. XGBoost與GBDT的異同點

相同點:
xgboost是在GBDT的基礎上對boosting算法進行的改進,內部決策樹使用的是回歸樹,簡單回顧GBDT如下:
在這里插入圖片描述
注意

XGBoost和GBDT本質的思想都是一種殘差學習方式,即當前的弱分類器的主要目標是學習上一個弱分類器的誤差;最后,通過將所有的弱分類器集成在一起,組成一個混合模型,從而降低模型的方差和偏差。

不同點:
如果不考慮工程實現、解決問題上的一些差異,xgboost與gbdt比較大的不同就是目標函數的定義。如下圖是XGBoost目標函數的定義:
在這里插入圖片描述
注意從目標函數的表達式可以看出,XGBoost的目標函數主要分為:加入一顆新樹后模型的誤差,正則化項和一個常數項;其中模型誤差項,可以將加入的新樹看成?X,然后對L函數求泰勒展開,就得到最下面的公式了,從最下面的公式可以看出,目標函數中的損失項包括:上一顆樹所在模型的損失,當前加入新樹后模型的一階導數和加入新樹后的二階導數。XGBoost利用泰勒展開三項,做一個近似,我們可以很清晰地看到,最終的目標函數只依賴于每個數據點的在誤差函數上的一階導數和二階導數。正則化項包括對當前新加入的樹葉子結點個數的約束(L1正則化項)和當前新加入樹的葉子結點的權重的約束(L2正則化項)。

3. XGBoost的原理

對于上面給出的目標函數,我們可以進一步化簡

3.1定義樹的復雜度

對于f的定義做一下細化,把樹拆分成結構部分q和葉子權重部分w。下圖是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,而w給定了每個索引號對應的葉子分數是什么
在這里插入圖片描述
定義這個復雜度包含了一棵樹里面節點的個數,以及每個樹葉子節點上面輸出分數的L2模平方。

當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。下圖還給出了復雜度計算的一個例子

在這里插入圖片描述
在這種新的定義下,我們可以把目標函數進行如下改寫,其中I被定義為每個葉子上面樣本集合
在這里插入圖片描述
g是一階導數,h是二階導數

在這里插入圖片描述
注意

在上面的公式中,由于誤差項中的第一項是上一個樹所在模型的誤差,與當前新加入的樹無關,所以為一個常數,與目標函數的優化(優化的目標是找到一顆最佳的樹(f(t)),將誤差降低)無關,可以省略,于是誤差項變成了一階導數和二階導數之和;由于最終的樣本都會劃分到每個葉子節點上,所以可以將最開始的樣本的遍歷換成葉子結點的遍歷,從而可以和正則化項中的L2項進行合并,得到最終的公式如上圖。
在這里插入圖片描述

3.2 分裂節點

論文中給出了兩種分裂節點的方法

(1)貪心法
每一次嘗試去對已有的葉子加入一個分割,且每次分割的目標就是使得損失函數最小
在這里插入圖片描述
注意:

XGBoost和決策樹的構造準則不同,它不在基于gini系數或者熵,而是通過比較劃分前和劃分后對模型的損失(之前推到的那個目標函數)的影響,來選出最佳的樹節點的劃分。

對于每次擴展,我們還是要枚舉所有可能的分割方案,如何高效地枚舉所有的分割呢?我假設我們要枚舉所有x < a 這樣的條件,對于某個特定的分割a我們要計算a左邊和右邊的導數和
在這里插入圖片描述
我們可以發現對于所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度和GL和GR。然后用上面的公式計算每個分割方案的分數就可以了。

觀察這個目標函數,大家會發現第二個值得注意的事情就是引入分割不一定會使得情況變好,因為我們有一個引入新葉子的懲罰項。優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小于一個閥值的時候,我們可以剪掉這個分割。大家可以發現,當我們正式地推導目標的時候,像計算分數和剪枝這樣的策略都會自然地出現,而不再是一種因為heuristic(啟發式)而進行的操作了。

**下面是論文中的算法 **
在這里插入圖片描述
(2)近似算法:

主要針對數據太大,不能直接進行計算

3.3 自定義損失函數

(1)常用損失函數
在這里插入圖片描述
(2)一階導數和二階導數的推到:
在這里插入圖片描述

4. XGBoost的使用

(1)官方代碼

#!/usr/bin/python
import numpy as np
import xgboost as xgb
###
# advanced: customized loss function
#
print ('start running example to used customized objective function')dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')# note: for customized objective function, we leave objective as default
# note: what we are getting is margin value in prediction
# you must know what you are doing
param = {'max_depth': 2, 'eta': 1, 'silent': 1}
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2# user define objective function, given prediction, return gradient and second order gradient
# this is log likelihood loss
def logregobj(preds, dtrain):labels = dtrain.get_label()preds = 1.0 / (1.0 + np.exp(-preds))grad = preds - labelshess = preds * (1.0-preds)return grad, hess# user defined evaluation function, return a pair metric_name, result
# NOTE: when you do customized loss function, the default prediction value is margin
# this may make builtin evaluation metric not function properly
# for example, we are doing logistic loss, the prediction is score before logistic transformation
# the builtin evaluation error assumes input is after logistic transformation
# Take this in mind when you use the customization, and maybe you need write customized evaluation function
def evalerror(preds, dtrain):labels = dtrain.get_label()# return a pair metric_name, result# since preds are margin(before logistic transformation, cutoff at 0)return 'error', float(sum(labels != (preds > 0.0))) / len(labels)# training with customized objective, we can also do step by step training
# simply look at xgboost.py's implementation of train
bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)

(2)XGBoost調參
通用參數
這些參數用來控制XGBoost的宏觀功能。

  • booster[默認gbtree]
    • 選擇每次迭代的模型,有兩種選擇:gbtree:基于樹的模型 ; gbliner:線性模型
  • silent[默認0]
    • 當這個參數值為1時,靜默模式開啟,不會輸出任何信息。
    • 一般這個參數就保持默認的0,因為這樣能幫我們更好地理解模型
  • nthread[默認值為最大可能的線程數]
    • 這個參數用來進行多線程控制,應當輸入系統的核數。
    • 如果你希望使用CPU全部的核,那就不要輸入這個參數,算法會自動檢測它。

還有兩個參數,XGBoost會自動設置,目前你不用管它。接下來咱們一起看booster參數

booster參數
盡管有兩種booster可供選擇,我這里只介紹tree booster,因為它的表現遠遠勝過linear booster,所以linear booster很少用到

  • eta[默認0.3]
    • 和GBM中的 learning rate 參數類似。
    • 通過減少每一步的權重,可以提高模型的魯棒性。
    • 典型值為0.01-0.2。
  • min_child_weight[默認1]
    • 決定最小葉子節點樣本權重和。
    • 和GBM的 min_child_leaf 參數類似,但不完全一樣。XGBoost的這個參數是最小樣本權重的和,而GBM參數是最小樣本總數。
    • 這個參數用于避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。
    • 但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。
  • max_depth[默認6]
    • 和GBM中的參數相同,這個值為樹的最大深度
    • 這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更局部的樣本。
    • 需要使用CV函數來進行調優。
    • 典型值:3-10
  • max_leaf_nodes
    • 樹上最大的節點或葉子的數量。
    • 可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n^2個葉子
    • 如果定義了這個參數,GBM會忽略max_depth參數。
  • gamma[默認0]
    • 在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。
    • 這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。
  • max_delta_step[默認0]
    • 這參數限制每棵樹權重改變的最大步長。如果這個參數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那么它會讓這個算法更加保守。
    • 通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。
    • 這個參數一般用不到,但是你可以挖掘出來它更多的用處
  • subsample[默認1]
    • 和GBM中的subsample參數一模一樣。這個參數控制對于每棵樹,隨機采樣的比例。
    • 減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。
    • 典型值:0.5-1
  • 典型值:0.5-1
    • 和GBM里面的max_features參數類似。用來控制每棵隨機采樣的列數的占比(每一列是一個特征)。
    • 典型值:0.5-1
  • colsample_bylevel[默認1]
    • 用來控制樹的每一級的每一次分裂,對列數的采樣的占比。
    • 我個人一般不太用這個參數,因為subsample參數和colsample_bytree參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。
  • lambda[默認1]
    • 權重的L2正則化項。(和Ridge regression類似)。
    • 這個參數是用來控制XGBoost的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的
  • alpha[默認1]
    • 權重的L1正則化項。(和Lasso regression類似)。
    • 可以應用在很高維度的情況下,使得算法的速度更快。
  • scale_pos_weight[默認1]
    • 在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。

學習目標參數
這個參數用來控制理想的優化目標和每一步結果的度量方法。

  • objective[默認reg:linear]
    這個參數定義需要被最小化的損失函數。最常用的值有:
    • binary:logistic 二分類的邏輯回歸,返回預測的概率(不是類別)。
    • multi:softmax 使用softmax的多分類器,返回預測的類別(不是概率)。
      • 在這種情況下,你還需要多設一個參數:num_class(類別數目)。
    • multi:softprob 和multi:softmax參數一樣,但是返回的是每個數據屬于各個類別的概率。
  • eval_metric[默認值取決于objective參數的取值]
    • 對于有效數據的度量方法。
    • 對于回歸問題,默認值是rmse,對于分類問題,默認值是error。
    • 典型值有:
      在這里插入圖片描述
  • seed(默認0)
    • 隨機數的種子
    • 設置它可以復現隨機數據的結果,也可以用于調整參數

(3)Python中對XGBoost的使用

  • 任務:二分類,存在樣本不均衡問題(scale_pos_weight參數可以加快訓練速度)
def xgboost_predict():import xgboost as xgb#xgboost start heredtest = xgb.DMatrix(test_x)dval = xgb.DMatrix(val_x , label = val_y)dtrain = xgb.DMatrix(x,label = y)params = {'booster':'gbtree','silent':1 ,#設置成1則沒有運行信息輸出,最好是設置為0.#'nthread':7,# cpu 線程數 默認最大'eta': 0.007, # 如同學習率'min_child_weight':3, # 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言#,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。'max_depth':6, # 構建樹的深度,越大越容易過擬合'gamma':0.1,  # 樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。'subsample':0.7, # 隨機采樣訓練樣本'colsample_bytree':0.7, # 生成樹時進行的列采樣 'lambda':2,  # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。#'alpha':0, # L1 正則項參數#'scale_pos_weight':1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。#'objective': 'multi:softmax', #多分類的問題#'num_class':10, # 類別數,多分類與 multisoftmax 并用'seed':1000, #隨機種子#'eval_metric': 'auc'}watchlist = [(dval,"val"),(dtrain,"train")] xgboost_model = xgb.train(params , dtrain , num_boost_round = 3000 , evals = watchlist)#xgboost_model.save_model("./xgboost.model")#predict the test setxgboost_predict_y = xgboost_model.predict(dtest , ntree_limit = xgboost_model.best_ntree_limit)
  • DART:將dropput思想引入XGBoost
import xgboost as xgb
# read in data
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# specify parameters via map
param = {'booster': 'dart','max_depth': 5, 'learning_rate': 0.1,'objective': 'binary:logistic', 'silent': True,'sample_type': 'uniform','normalize_type': 'tree','rate_drop': 0.1,'skip_drop': 0.5}
num_round = 50
bst = xgb.train(param, dtrain, num_round)
# make prediction
# ntree_limit must not be 0
preds = bst.predict(dtest, ntree_limit=num_round)
  • XGBoost在sklearn中的例子:
from sklearn.model_selection import train_test_split
from sklearn import metrics
from  sklearn.datasets import make_hastie_10_2
import xgboost as xgb
#記錄程序運行時間
import time start_time = time.time()
X, y = make_hastie_10_2(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)##test_size測試集合所占比例#xgb矩陣賦值
xgb_train = xgb.DMatrix(X_train, label=y_train)
xgb_test = xgb.DMatrix(X_test,label=y_test)##參數
params={
'booster':'gbtree',
'silent':1 ,#設置成1則沒有運行信息輸出,最好是設置為0.
#'nthread':7,# cpu 線程數 默認最大
'eta': 0.007, # 如同學習率
'min_child_weight':3, 
# 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言
#,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。
#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。
'max_depth':6, # 構建樹的深度,越大越容易過擬合
'gamma':0.1,  # 樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。
'subsample':0.7, # 隨機采樣訓練樣本
'colsample_bytree':0.7, # 生成樹時進行的列采樣 
'lambda':2,  # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
#'alpha':0, # L1 正則項參數
#'scale_pos_weight':1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。
#'objective': 'multi:softmax', #多分類的問題
#'num_class':10, # 類別數,多分類與 multisoftmax 并用
'seed':1000, #隨機種子
#'eval_metric': 'auc'
}plst = list(params.items())
num_rounds = 100 # 迭代次數watchlist = [(xgb_train, 'train'),(xgb_test, 'val')]#訓練模型并保存
# early_stopping_rounds 當設置的迭代次數較大時,early_stopping_rounds 可在一定的迭代次數內準確率沒有提升就停止訓練
model = xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds=100)#model.save_model('./model/xgb.model') # 用于存儲訓練出的模型
print("best best_ntree_limit",model.best_ntree_limit)y_pred = model.predict(xgb_test,ntree_limit=model.best_ntree_limit)
print('error=%f' % (  sum(1 for i in range(len(y_pred)) if int(y_pred[i]>0.5)!=y_test[i]) /float(len(y_pred))))  
#輸出運行時長
cost_time = time.time()-start_time
print("xgboost success!",'\n',"cost time:",cost_time,"(s)......")```

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

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

相關文章

C++基礎學習(01)--(介紹,環境配置,基本語法,注釋)

文章目錄目錄一. c介紹二. c開發環境到的配置三. c基本語法四. c注釋目錄 一. c介紹 C 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言&#xff0c;支持過程化編程、面向對象編程和泛型編程。 C 被認為是一種中級語言&#xff0c;它綜合了高級語言和低…

《Head First設計模式》讀書筆記_第一章

策略模式 例&#xff1a;設計一個模擬鴨子游戲&#xff0c;游戲中有各種鴨子&#xff0c;一邊戲水一邊嘎嘎叫。 所以學習設計模式前&#xff0c;我們最先想到的就是設置一個超類&#xff0c;并讓其他子類去繼承這個類&#xff0c;UML圖如下&#xff1a; * * 但是&#xff0…

根據數組建立平衡二叉搜索樹

它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1&#xff0c;并且左右兩個子樹都是一棵平衡二叉&#xff08;搜索&#xff09;樹。 二分&#xff1a;用有序數組中中間的數生成搜索二叉樹的頭節點&#xff0c;然后對數組的左右部分分別生成左右子樹即可&#xff08;重復…

C++基礎學習(02)--(數據類型,變量類型,變量作用域,常量,修飾符類型)

文章目錄目錄一. 數據類型C 中的數據類型typedefenumeration枚舉類型c中變量類型二.變量作用域三.常量四.修飾符類型目錄 一. 數據類型 C 中的數據類型 使用編程語言進行編程時&#xff0c;需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著&a…

commons-lang常用方法

maven引入 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency> 跟java.lang這個包的作用類似&#xff0c;Commons Lang這一組API也是提供一些基…

c++基礎學習(03)--(存儲類,運算符,循環,判斷)

文章目錄目錄一.存儲類二.運算符三.循環whilefor四.判斷目錄 一.存儲類 可見static存儲類修飾之后&#xff0c;i的值沒有從頭開始&#xff0c;而是從上一次的結果中保留下來 #include <iostream>using namespace std; class Data { public:Data(){}~Data(){}void show()…

皇后問題

八皇后問題是一個以國際象棋為背景的問題&#xff1a;如何能夠在 88 的國際象棋棋盤上放置八個皇后&#xff0c;使得任何一個皇后都無法直接吃掉其他的皇后&#xff1f;為了達到此目的&#xff0c;任兩個皇后都不能處于同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的…

c++基礎學習(04)--(函數、數字、數組、字符串)

文章目錄目錄1.函數2.數字3.字符串4.數組目錄 1.函數 #include <iostream> #include <limits>using namespace std;void swap(int *x , int *y);int main(){int a 100 , b200;cout<<"交換前:"<<"a is :"<<a<<"…

【精品計劃0】藍橋杯 摔手機

原題描述&#xff1a; x星球的居民脾氣不太好&#xff0c;但好在他們生氣的時候唯一的異常舉動是&#xff1a;摔手機。 各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試&#xff0c;并且評定出一個耐摔指數來&#xff0c;之后才允許上市流通。 …

數據結構課上筆記15

圖的存儲 多重鏈表&#xff1a;完全模擬圖的樣子&#xff0c;每個節點內的指針都指向該指向的節點。 節點結構內指針數為度 缺點&#xff1a;浪費空間、不容易操作 數組表示法&#xff08;鄰接矩陣表示法&#xff09; 可用兩個數組存儲。其中一個 一維數組存儲數據元素&#…

c++基礎學習(05)--(指針,引用)

文章目錄目錄1.指針2.引用目錄 1.指針 #include <iostream>using namespace std;int main () {int var1;char var2[10];cout << "var1 變量的地址&#xff1a; ";cout << &var1 << endl;cout << "var2 變量的地址&#xff…

由旅行商問題認識何為狀態壓縮

動態規劃 動態規劃(dynamic programming)是運籌學的一個分支&#xff0c;是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優化問題時&#xff0c;提出了著名的最優化原理(pri…

c++基礎學習(06)--(時間,輸入輸出,數據結構)

文章目錄目錄1.時間2.輸入輸出數據結構目錄 1.時間 當前日期和時間 下面的實例獲取當前系統的日期和時間&#xff0c;包括本地時間和協調世界時&#xff08;UTC&#xff09;。 #include <iostream> #include <ctime>using namespace std;int main( ) {// 基于當前…

Abstract Self-Balancing Binary Search Tree

二叉搜索樹 二叉查找樹&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索樹&#xff0c;二叉排序樹&#xff09;它或者是一棵空樹&#xff0c;或者是具有下列性質的二叉樹&#xff1a; 若它的左子樹不空&#xff0c;則左子樹上所有結…

AVL Tree

前言 希望讀者 了解二叉搜索樹 了解左旋右旋基本操作 https://blog.csdn.net/hebtu666/article/details/84992363 直觀感受直接到文章底部&#xff0c;有正確的調整策略動畫&#xff0c;自行操作。 二叉搜索樹 二叉查找樹&#xff08;Binary Search Tree&#xff09;&a…

c++基礎學習(07)--(類)

文章目錄目錄類與對象1.類成員函數2.類訪問修飾符3.構造函數與析構函數4.拷貝構造函數5. 友元函數6.內聯函數7.this指針8.指向類的指針9.類的靜態成員目錄 類與對象 #include <iostream>using namespace std;class Box {public:double length; // 長度double breadth;…

【大總結1】數據結構與傳統算法總結

由于時間和水平有限&#xff0c;肯定有錯誤或者寫得不好的地方 歡迎在文章下評論指出。 涉及語言&#xff1a; py3&#xff1a;注重算法本身的知識 c/c&#xff1a;實現基礎數據結構和算法 java&#xff1a;實現較復雜數據結構 一、概述 c語言知識體系 算法體系參考 課上筆…

c++基礎學習(08)--(繼承、重載、多態、虛函數)

文章目錄目錄1.繼承2.重載3.多態 && 虛函數目錄 1.繼承 #include <iostream>using namespace std;// 基類 class Shape {public:void setWidth(int w){width w;}void setHeight(int h){height h;}protected:int width;int height; };// 派生類 class Rectang…

圖的應用

1. 圖的應用總覽 在數據結構中圖的應用很廣泛&#xff0c;本文主要從以下四個方面介紹&#xff1a; ①最小生成樹&#xff1a;給定一個無向網絡&#xff0c;在該網的所有生成樹中&#xff0c;使得各邊權數之和最小的那棵生成樹稱為該網的最小生成樹&#xff0c;也叫最小代價…

c++基礎學習(09)--(數據抽象、數據封裝、接口)

文章目錄目錄1.數據抽象2.數據封裝3.抽象接口類目錄 1.數據抽象 數據抽象&#xff1a;就是把它當做黑箱子使用&#xff0c;內部實現與外部接口分開 C類實現數據抽象&#xff0c;如sort()函數&#xff0c;ostream的cout對象 #include <iostream> using namespace std…