決策樹和隨機森林(Decision Trees and Random Forests)

1. 基本概念

  • 學習分類:基於樹的算法被認爲是最好的,最常用的監督學習方法之一
  • 優勢
    • 基於樹的算法使預測模型具有較高的準確性,穩定性和易解釋性
    • 與線性模型不同,它們很好地映射了非線性關係
  • 用途
    • 解決分類問題(classification:categorical variables )
    • 解決迴歸問題(regression:continuous variables )
  • 縮略語
縮寫 描述 含義
MSE Mean Squared Error 均方誤差
MAE Mean Absolute Error 平均絕對誤差
OOB Out Of Bag

1.1 集成學習 (Ensemble Learning)

流派 特點
Boosting 各個弱學習器之間有依賴關係
Bagging 各個弱學習器之間沒有依賴關係,可以並行擬合

1.1.1 Bagging

在這裏插入圖片描述

1.1.2 Boosting

  • AdaBoost算法
  • 提升樹(boosting tree)系列算法
    • 梯度提升樹(Gradient Boosting Tree)
      在這裏插入圖片描述

2. 決策樹(Decision Trees)

  • 構造決策樹的基本思想
    • 隨着樹深度的增加,節點的熵迅速降低
    • 熵降低的速度越快越好,這樣就可得到一棵高度最矮的決策樹
  • 尋找最佳劃分點
    • 劃分屬性
    • 劃分屬性的取值
    • 每一種劃分,都可以計算出基於 劃分特徵= 某個特徵值, 將樣本集合D劃分爲兩個子集
    • 使用三種算法生成不同的決策樹
序號 算法 關鍵指標 特點 樹類型
1 ID3 信息增益
(取最大值)
1)取值多的屬性,更容易使數據更純,其信息增益更大
2)訓練得到的是一棵龐大且深度淺的樹:不合理
3)使用了大量的對數運算,計算量大
二叉樹及多叉樹
2 C4.5 信息增益率
(取最大值)
1) 採用信息增益率替代信息增益
2) 取值少的屬性
3) 使用了大量的對數運算,計算量大
二叉樹及多叉樹
3 CART 基尼係數
(取最小值)
1)以基尼係數替代熵
2)最小化不純度,而不是最大化信息增益
3)每次選擇最優屬性後,再選擇該屬性的一個取值進行劃分
二叉樹
  • 訓練階段
    • 從給定的訓練數據集D, 構造出一查決策樹
      class=DecisionTree(D)class = DecisionTree(D)
  • 分類或迴歸階段
    • 從根開始,按照決策樹的分類屬性逐層往下劃分,直到葉節點,獲得概念(決策、分類)結果
      y=DecisionTree(x)y = DecisionTree(x)

2.1 概念

  • 決策樹:是一種預測模型,該模型使用一組二進制規則來計算目標值
  • 使用不同的算法確定節點上的最佳分割
  • 優點
    • 易於解釋決策規則
    • 非參數,因此很容易合併一系列數字或分類數據層,並且無需選擇單峯訓練數據
    • 對訓練數據中的異常樣本具有很好的魯棒性
    • 一旦規則確定,分類速度很快
    • 可以處理非線性特徵
    • 考慮了特徵之間的相互作用
  • 缺點
    • 決策樹傾向於過擬合訓練數據,泛化能力差
    • 垂直於特徵空間軸分割並不總是有效的
    • 無法預測超出訓練數據中響應變量的最小和最大限制

2.1.1 信息熵(Entropy)

  • 信息熵(entropy):表示信息不確定性程度,不確定性越大,熵越大

    • 概率越大,信息熵越小
    • 概率越小,信息熵越大
  • 純度(purity): 純度越高,信息熵越小,概率越大

  • 單個樣本數據集D的熵 (樣本被分爲K類)
    H(D)=Ent(D)=k=1KpklnpkH(D) = Ent(D) = -\sum_{k=1}^K p_k \cdot \ln{p_k}

    • pkp_k:在樣本數據集D中(有K類樣本),第kk類樣本所佔的比例
  • 多個樣本數據集的熵 (有V個樣本數據集)
    Ent(D1,D2,...,DV)=v=1VDvDEnt(Dv)Ent(D_1, D_2, ..., D_V) = \sum_{v=1}^V \frac {|D_v|}{|D|} Ent(D_v)

    • D=D1D2...DVD = D_1 \cup D_2 \cup ... \cup D_V
    • Dv|D_v|:表示集合DvD_v中的樣本個數
    • D|D|:表示集合DD中的樣本個數

2.1.2 信息增益

  • 物理含義:表示向純度方向邁出的步長 ,邁得越快越好
  • 公式:
    g(D,a)=Gain(D,a)=Ent(D)v=1VDvDEnt(Dv)g(D,a)=Gain(D,a) = Ent(D) - \sum_{v=1}^V \frac{|D_v|}{|D|}Ent(D_v)
    • 劃分前的信息熵 減去 劃分後的信息熵
    • aa:表示屬性
      • 假定屬性aaVV種取值,因此輸入數據集合D, 根據屬性a可以將D劃分爲V個分支集合
      • 那麼根據屬性aa劃分得到的信息增益爲Gain(D,a)Gain(D,a)
    • DvD_v:表示根據屬性aa的某個取值ava_v得到的分支集合
    • Ent(D)Ent(D):劃分前的信息熵
    • v=1VDvDEnt(Dv)\sum_{v=1}^V \frac {|D_v|}{|D|} Ent(D_v):劃分後的信息熵
    • DvD\frac {|D_v|}{|D|}:第vv個分支的權重,樣本越多越重要,即本分支樣本個數除以D中的樣本總數
    • Ent(Dv)Ent(D_v):第vv分支樣本集合的信息熵
  • 應用
    • 信息增益越大,則意味着使用屬性a進行劃分帶來的純度提升越大,因此可以根據信息增益選擇屬性
    • 因爲劃分後的純度越高, 那麼信息熵越小, 即第二項越小, 因此增益越大

2.2 如何構建決策樹

  • 構造過程
    • 決策樹的特徵選擇
    • 決策樹的生成(ID3,C4.5)
    • 決策樹的剪枝

2.2.1 樹長到何時停?

  • 當前結點包含的樣本全屬於同一類別,無需劃分
  • 當前結點包含的樣本集合爲空,不能劃分

2.2.2 樹如何長?

2.2.2.1 ID3算法 (根據信息增益劃分)

  • 長的過程
    • 在根節點處計算信息熵
    • 然後根據屬性依次劃分並計算其節點的信息熵,用根節點信息熵–屬性節點的信息熵=信息增益
    • 根據信息增益進行降序排列,排在前面的就是第一個劃分屬性
    • 其後依次類推,這就得到了決策樹的形狀,也就是怎麼“長”了
  • 侷限性
    • 對可取值數目較多的屬性有所偏好 (如對無意義的且唯一的ID編號,其信息增益每次都是最大的)

2.2.2.2 C4.5算法(根據信息增益率劃分)

  • 爲解決信息增益的問題(即ID3的侷限性),引入了信息增益率

  • 信息增益率
    Gainratio(D,a)=Gain(D,a)IV(a)Gain_ratio (D,a) = \frac{Gain(D,a)}{IV(a)}
    其中IV(a)=v=1VDvDlnDvDIV(a) = -\sum_{v=1}^V \frac {|D^v|} {|D|} \ln {\frac {|D^v|}{|D|}}
    -IV(a)IV(a): 特徵a的可能取值數目越多(即V越大),則IV(a)的值通常就越大

  • 信息增益率的本質

    • 是在信息增益的基礎之上乘上一個懲罰參數
    • 具有此特徵的樣本數較多時,懲罰參數較小
    • 具有此特徵的樣本數較少時,懲罰參數較大
  • 侷限性

    • 信息增益率偏向取值較少的特徵
  • 信息增益率使用方法

    • 基於其侷限性,並不是直接選擇信息增益率最大的特徵
    • 而是先在候選特徵中找出信息增益高於平均水平的特徵
    • 然後在這些特徵中再選擇信息增益率最高的特徵

2.2.2.3 CART算法(根據基尼係數劃分)

  • CART: Classification And Regression Trees
  • 基於信息增益及信息增益率的不足,引入了基尼指數
  • 集合D的基尼值
    Gini(D)=k=1Kkkpkpk=k=1Kpk(1pk)=1n=1Kpk2Gini(D) = \sum_{k=1}^K \sum_{k' \ne k} p_k p_{k'} = \sum_{k=1}^K p_k (1-p_k) = 1-\sum_{n=1}^K p_k^2
    • 含義:表示在樣本集合中一個隨機選中的樣本被分錯的概率
    • Gini(D)越小,數據集D的純度越高
  • 對每一種劃分,都可以計算出基於 劃分特徵= 某個特徵值 將樣本集合D劃分爲兩個子集的純度
  • 特徵a的基尼係數
    GiniIndex(D,a)=D1DGini(D1)+D2DGini(D2)GiniIndex(D, a) = \frac {|D_1|}{|D|} Gini(D_1) + \frac {|D_2|}{|D|} Gini(D_2)
    • aa:爲特徵
    • 根據使基尼係數最小的特徵進行選擇
    • 最後根據葉節點中樣本的標籤數量, 取多數類別作爲該葉子節點的類別
  • 對於一個具有多個取值(超過2個)的特徵,需要計算以每一個取值作爲劃分點,對樣本D劃分之後子集的純度Gini(D,ai)Gini(D,ai),(其中Ai 表示特徵A的可能取值)
  • 然後從所有的可能劃分的Gini(D,ai)Gini(D,a_i)中找出Gini係數最小的劃分,這個劃分的劃分點,便是使用特徵A對樣本集合D進行劃分的最佳劃分點。到此就可以長成一棵“大樹”了。
  • 流程(最小化平方誤差)
    • 先選擇一個屬性,再選擇一個取值將節點集合分爲兩個子集
    • 對每個子集選擇一個輸出值使得劃分後的兩個集合與該輸出值的的平方差最小
    • 然後根據最小平方差, 選擇最優屬性最優切分點
    • 最後得到多個葉節點,每個葉節點包含多個樣本,葉節點的輸出值取所有樣本輸出值的均值或使平方差最小的值。

2.3 分類樹

  • 輸入:樣本數據
  • 輸出:離散的類別

2.3.1 構建分類樹

  • 使用訓練數據創建模型
  • 樹生成器確定
    • 在節點上拆分哪個變量以及拆分的值
    • 決定停止(生成葉節點)或再次拆分
    • 將葉節點分配給一個類

2.3.2 剪枝(Pruning)

  • 過擬合很常見,因爲單個像素可能是葉節點
  • 分類樹可以具有數百或數千個節點,需要通過修剪來減少這些節點以簡化樹
  • 限制樹大小的目標參數:
    • 最小節點數(minimum node size)
    • 一個節點上樣本的標準偏差最大化(maximum standard deviation of samples at a node)

2.4 迴歸樹(Regression Trees)

  • 輸入:樣本數據
  • 輸出:連續值

2.4.1 特點

  • 迴歸計算預測變量和響應變量之間的關係
  • 結構與分類樹類似
  • 葉節點是預測的函數值
  • 預測值限於葉節點中的值

2.5 決策樹評價函數

  • 評介函數
    C(T)=tleafNtH(t)C(T) = \sum_{t \in leaf} N_t \cdot H(t)
    • NtN_t:爲樣本tt類所佔的比例
    • 越小越好,類似損失函數

3. 隨機森林(Random Forests)

  • Bagging思想
    • Bagging是bootstrap aggregating
    • 就是從總體樣本當中隨機取一部分樣本進行訓練,通過多次這樣的結果,進行投票獲取平均值作爲結果輸出
    • 這就極大可能的避免了不好的樣本數據,從而提高準確度
    • 因爲有些是不好的樣本,相當於噪聲,模型學入噪聲後會使準確度不高

3.1 隨機森林是什麼?

  • 用途:解決決策樹泛化能力弱的特點
  • 隨機森林:是一種基於樹模型的Bagging的優化版本,一棵樹的生成肯定還是不如多棵樹,因此就有了隨機森林

3.2 Bagging的生成方法

  • 採樣方式
    • 放回抽樣
  • 生成過程
    • 從樣本集中通過重採樣的方式產生n個樣本
    • 假設樣本特徵數目爲a,對n個樣本選擇a中的k個特徵,用建立決策樹的方式獲得最佳分割點
    • 重複m次,產生m棵決策樹
    • 多數投票機制來進行預測

3.3 隨機森林工作流程

  • 來源
    • 隨機森林:是Bagging的擴展變體
    • 它在以決策樹爲基礎構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機特徵選擇
  • 過程
    • 隨機選擇樣本(放回抽樣, 行抽樣)
    • 構建決策樹(CART樹)
    • 隨機選擇特徵(列抽樣)
    • 隨機森林投票(平均)

3.4 隨機森林與Bagging比較

  • 隨機選擇樣本和Bagging相同
  • 隨機選擇特徵是指在樹的構建中,會從樣本集的特徵集合中隨機選擇部分特徵,然後再從這個子集中選擇最優的屬性用於劃分,這種隨機性導致隨機森林的偏差會有稍微的增加(相比於單棵不隨機樹),但是由於隨機森林的‘平均’特性,會使得它的方差減小,而且方差的減小補償了偏差的增大,因此總體而言是更好的模型
  • Bagging使用的是‘確定性’決策樹,在選擇特徵劃分結點時,要對所有的特徵進行考慮
  • 隨機森林使用的是‘隨機性’特徵數,只需考慮特徵的子集

3.2 隨機森林如何工作?

  • 隨機選擇樣本子集:選擇一個不同的訓練數據子集(約2/3,有放回)進行訓練,以訓練每棵決策樹
  • 隨機選擇分類器
    • ID3
    • C4.5
    • CART
    • SVM
    • LOGISTIC
  • 隨機選擇特徵子集
    • 隨機選擇的特徵子集用於拆分每個節點
    • 變量(特徵)的使用數量由用戶決定
    • 較小的子集產生較少的相關性(較低的錯誤率),但較低的預測能力(較高的錯誤率) (即過擬合)
    • 最佳值範圍通常很廣
  • 測試數據:用於估計誤差變量重要性
  • 計算結果
    • 投票機制:
      • 一票否決制
      • 少數服從多數
      • 加權多數
    • 分類問題:通過所有樹的投票數進行類分配
    • 迴歸問題:使用迴歸結果的平均值進行迴歸
  • 隨機森林常用參數
    • 輸入數據(predictor and response)
    • 決策樹的數量(Number of trees)
    • 每次拆分要使用的變量數(特徵數)
    • 計算誤差及變量的重要性信息
    • 有無替換樣本

3.3 優缺點

  • 優點

    • 無需修剪決策樹
    • 自動生成準確性和變量的重要性
    • 過擬合不是問題
    • 對訓練數據中的異常值不太敏感
    • 易於設置參數
    • 在當前的很多數據集上,相對其他算法有着很大的優勢,表現良好。
    • 它能夠處理很高維度(feature很多)的數據,並且不用做特徵選擇(因爲特徵子集是隨機選擇的)
    • 在訓練完後,它能夠給出哪些feature比較重要
    • 訓練速度快,容易做成並行化方法(訓練時樹與樹之間是相互獨立的)
    • 在訓練過程中,能夠檢測到feature間的互相影響
    • 對於不平衡的數據集來說,它可以平衡誤差
    • 如果有很大一部分的特徵遺失,仍可以維持準確度
  • 缺點

    • 迴歸無法預測訓練數據範圍外的值
    • 在迴歸中,經常無法準確預測極端值–低估了高點,高估了低點

4. 隨機森林算法實現

4.1 隨機森林訓練

4.1.1 訓練示意圖

在這裏插入圖片描述

4.1.2 訓練過程

  • 給定所有訓練圖像,把像素灰度值不爲0的像素作爲訓練集合的元素{(x,c)}\{(x, c) \}
    • (x,c)(x,c)中:xx表示像素, cc表示類別;(x,c)(x,c)表示像素xx的類別標籤爲cc
  • 隨機生成參數集合{ϕ=(u,v,thres)}\{\phi = (u, v, thres) \}
    • u,vu,v:表示像素xx偏移向量
    • thresthres:表示非葉子節點中的閾值
  • 決策樹的訓練步驟
    • 輸入
      • 樣本集合Q={X,C}Q=\{X,C\}
        • X={x1,x2,...,xi,...,xn}X=\{x_1, x_2, ..., x_i, ..., x_n \}:訓練像素的集合
        • C={c1,c2,...,c31}C=\{ c_1, c_2, ..., c_31\}:像素所屬類別的集合(即人體被細分爲31個部位)
      • 參數集合{(u,v,thres)}\{(u,v,thres)\}
    • 初始化
      • 決策樹增長的停止條件包括樹的最大深度節點中最小樣本數
    • 樹的增長
      • 第一步:判斷當前結點是否滿足樹的停止增長條件,若滿足執行步驟二,否則執行步驟三
      • 第二步:生成葉子結點 leaf node,計算其中樣本集合的類別概率分佈 P(C)P(C)
      • 第三步:生成分裂結點,根據參數的度量標準從參數集合中選取最優參數組(u,v,thres)(u,v,thres),按照(公式 1)把當前節點分裂爲左右子節點QleftQ_{left}QrightQ_{right}
      • 第四步:QleftQ_{left}QrightQ_{right}分別從第一步開始執行
    • 輸出
      • 每個分裂節點中的參數組(u,v,thres)(u,v,thres)
      • 所有葉子節點中的概率分佈P(C)P(C),即類別的統計直方圖(類別標籤的概率分佈)
        • 每個葉子節點所表示的是到達該節點所有像素在類別C 上的統計信息
        • 即類別分佈直方圖
  • 公式1:根據(u,v,thres)(u,v,thres)判斷像素xix_i的路徑
    {xiQleft,if fu,v(xi)thresxiQright,if fu,v(xi)>thres(1) \begin{cases} x_i \in Q_{left}, & \text{if $f_{u,v}(x_i) \le thres$} \\[2ex] x_i \in Q_{right}, & \text{if $f_{u,v}(x_i) \gt thres$} \end{cases}\quad\quad\quad\quad (公式1)
  • 公式2:像素xix_i的深度差分特徵
    fu,v(xi)=dI(xi+udI(xi))dI(xi+vdI(xi))(2) f_{u,v}(x_i) = d_I(x_i+ \frac{u}{d_I(x_i)}) - d_I(x_i+\frac{v}{d_I(x_i)}) \quad \quad (公式2)
    • uv1dI(xi)u和v乘以\frac{1}{d_I(x_i)}:對偏移量u,vu,v進行歸一化,以確保與深度無關
    • 比如:若u=4, 則在1米處爲4個像素,則在2米處則爲2個像素,越近相同尺寸的物體像素越多,越遠相同尺寸的物體像素越少,爲確保與深度無關,深度差應該爲始終爲人體上相同的兩個點的深度差,與距離攝像機的遠近無關
  • 公式3:選擇當前分裂節點的參數組(u,v,thres)(u,v,thres)
    • 選擇原則:使信息增益(或信息增益率或Gini係數)值最大( 這裏使用ID3)
      ϕ=arg maxϕInfoGain(ϕ)(3) \phi^* = \argmax_{\phi} InfoGain(\phi) \quad \quad (公式3)
    • ϕ=(u,v,thres)\phi = (u,v,thres)
    • 集合QQ的熵 (cjCc_j \in C)
      Entroy(Q)=j=1Cp(cj)log2p(cj)Entroy(Q) = - \sum_{j=1}^{|C|} p(c_j)log_{2}\,p(c_j)
    • 信息增益
      InfoGain(ϕ)=Entropy(Q)s{left,right}Qs(ϕ)Q(ϕ)Entropy(Qs(ϕ))InfoGain(\phi) = Entropy(Q) - \sum_{s \in \{ left, right\}} \frac{|Q_s(\phi)|}{|Q_(\phi)|}Entropy(Q_s(\phi))
      • 即通過此(u,v,thres)(u,v,thres)劃分之後,兩個新樣本集合比原樣本集合的純度提高了多少
  • 決策樹增長過程要解決的關鍵問題
    • 如何從隨機生成的參數集合中選取一個參數組,以能夠最大程度的來區分當前樣本集合,即度量標準 (ID3或C4.5或CART)
    • 在保證分類精度、樹的結構最簡,以及儘量減少訓練時間的情況下,確定何時停止樹的增長

4.2 隨機森林分類

  • 目的:預測像素的概率分佈類別標籤

4.2.1 分類示意圖

在這裏插入圖片描述

4.2.2 分類過程

  • 設隨機森林有 N 棵樹,則像素 xx 的最終類別概率分佈是該像素所到達的 N 個葉子結點中學習了的類別分佈的均值,計算公式如下:
    P(Cx)=1Ni=1NPi(Cx)(4)P(C|x) = \frac{1}{N} \sum_{i=1}^N P_i(C|x) \quad\quad\quad (公式4)
  • P(Cx)P(C|x)是測試像素的最終類別概率分佈,從中選取概率最大值的類別標籤cc 作爲像素 xx 的最終類別,即:
    c=arg maxcP(Cx)c = \argmax_{c} P(C|x)
  • 僞代碼數據結構如下:
  • 入口函數:prediction_out = DecisionTree(trained_decision_tree, test_data)
// trained_decision_tree中節點數據結構 
typedef struct tree_node_ {
    bool split;                              // true: 分裂節點, false: 葉節點
    union {
	    float probability_distribution[31];  // 類別標籤的概率分佈
	    struct {
		    int u_shift[2];    // u偏移向量
		    int v_shift[2];    // v偏移向量
		    float thres;       // 分裂閾值
	    } para;
    } data;
} TreeNode;

// test_data數據結構 (包含人體像素的位置和深度信息)
#define MAX_NUM (320*240)
#define POS_X  (0)     // 像素x座標
#define POS_X  (1)     // 像素y座標
#define DEPTH  (2)     // 像素深度值
int pixels_data[MAX_NUM][3];  

// prediction_out數據結構(每個人體像素的概率分佈)
float prediction_out[MAX_NUM][31];

4.3 隨機森林參數分析

4.3.1 決策樹的深度

在這裏插入圖片描述

4.3.2 偏移量對的取值範圍

  • 據樣本統計,每幅圖像中人體範圍水平方向大約爲 50 個像素,垂直方向大約 164 個像素,以 50 爲參考值
  • 如果選取的範圍偏大,則多數像素偏移後會落在人體範圍之外,這樣極有可能造成樹的深度極小,葉子結點個數也極少,從而導致決策樹分類的有效性差
  • 若選取的範圍偏小,極有可能使得相鄰的部位檢測率低,所以採取了一種折中方案訓練決策樹時,讓隨機產生的偏移量對的絕對值範圍定在 50 左右
  • u,v[50,50]u,v \in [-50, 50]較佳
  • 對於單個決策樹、樹深度爲15的條件下的實驗結果:
    在這裏插入圖片描述

4.3.3 決策樹的個數

  • u,v[50,50],thres[255,255]u,v \in [-50, 50], thres \in [-255,255]的條件下,決策樹的個數分別爲1、2、3、4時的部位檢測結果
    在這裏插入圖片描述
  • 爲什麼決策絝樹增加時,測試數據正確率反而下降?
    • 因爲樹越多,則隨機森林過擬合了
    • 儘管隨機森林在一定程度上可以避免單個決策樹的過擬合,但是當決策樹的個數增多時,由於樣本被多次選擇,容易引起過擬合

4.3.4 參數最優值

  • 決策樹的個數:22
  • 決策樹的深度:1515
  • 偏移向量對的範圍:u,v[50,50]u,v \in [-50, 50]
  • 閾值範圍:thres[255,255]thres \in [-255, 255]
  • 以上參數的實驗結果
    在這裏插入圖片描述

5. 基於部位檢測定位關節位置

  • 隨機森林:只是學習如何對每個像素進行分類,然後完成測試像素的分類,並不具有定位關節的功能
  • 定位關節:通過加權Mean Shift算法實現關節定位

5.1 部位合併

  • 對於那些細小部位(手、手腕、腳踝、脖子等)而言,由於訓練數據中這些較小部位的像素數目僅佔很小比例,則該細小部位的正確檢測率就會較低
  • 屬於細小部位的像素容易被劃分到相鄰主要部位中,比如人的脖子像素容易被劃分到相鄰的軀幹中去,或者相鄰的小部位由於其凹凸性不是很明顯,所以在同樣偏移向量下,提取的深度差分特徵值相近,這樣極易被錯分,比如人的頭部的四個部分
  • 爲了提高對較小部位相應關節的預測精度,在隨機森林輸出基於 31 個部位的人體標註圖像後,把那些占人體像素比例較小的部位劃分到相鄰的主要部位中(手腕合併到相鄰的手部,脖子劃分到相鄰的軀幹、腳踝劃分到腳部)
  • 相鄰的一些部位合併爲人體的主要部位(包括左右上臂、下臂臂肘合併爲左右臂,左右上軀幹合併爲人體軀幹,左右下軀幹合併爲人體胯部,左右小腿及腳合併爲腳)

5.2 算法實現

5.2.1 像素分類

  • 輸入:人體深度圖像I={x1,x2,...,xi,...,xn}I=\{x_1, x_2, ..., x_i, ..., x_n \}
  • 處理:
    • 隨機森林進行像素分類
    • 部位合併
  • 輸出:得到人體像素分類後的圖像
    • I={(x1,c1),(x2,c2),...,(xi,ci),...,(xn,cm)},ciC(i=1,2,...,m)I=\{(x_1, c_1), (x_2, c_2), ..., (x_i, c_i), ..., (x_n, c_m) \}, \quad c_i \in C (i=1,2,..., m)
    • 像素xix_i包含以下信息:
      • 像素的類別標籤
      • 像素在圖像中的位置
      • 像素的深度值
      • 像素所屬類別標籤的概率
    • 在實際場景中,人體部位的各個點(人體部位的凹凸性)在視角範圍內,並不在同一個平面 ,所以在三維空間中提取人體關節點更接近真實的人體骨架

5.2.2 Mean-Shift(均值偏移)定位關節點

  • 用途:尋找概率密度極大的點(局部極大值), 是一種基於非參核密度梯度估計模式匹配算法。
  • 基本特徵:
    • 引入核函數,使得距均值點不同的樣本點對其貢獻不同
    • 賦予樣本點一個權重係數,使得不同的樣本點重要性不一樣
    • Mean-Shift 方法僅僅依靠特徵空間中的樣本點進行分析和處理,算法原理簡單,易於並行和實現,由於不需要任何先驗知識和進行統計參數估計,使用範圍極其廣泛
    • 概率密度估計沿密度梯度方向遞增,直至收斂,最終收斂點即爲局部的概率密度極大值點, 可對應特徵空間中的一個模式
  • 工作原理: Mean shift 算法通過反覆迭代搜索特徵空間中樣本點最密集的區域,最後沿着樣本點核密度增加的方向收斂到局部概率密度極大值點

5.2.2.1 核函數

  • 假設 X 表示一個 D 維的歐式空間, {xi}i=1n\{ x_i \}_{i=1}^n是該空間中的樣本點集合(共有n個樣本),每個樣本點用列向量xx表示,則樣本點的模爲x2=xTx\Vert x \Vert^2 = x^Tx
  • 若一個函數K:XRK: X \rightarrow R存在一個剖面(profile) k:[0,]Rk:[0, \propto] \rightarrow R滿足以下條件,則稱K(x)K(x)爲核函數,其中 R 表示實數域。
    K(x)=k(x2)(5)K(x) = k(\Vert x \Vert^2) \quad \quad (公式5)
  • kk滿足:
    • 非負的
    • 非遞增的,即若 a<ba<b,則 k(a)k(b)k(a) \ge k(b)
    • 分段連續的,並且0k(r)dr<\int_0^{\propto} k(r)dr < \propto

5.2.2.2 核密度

  • 假設 X 表示一個 D 維的歐式空間, {xi}i=1n\{ x_i \}_{i=1}^n是該空間中的樣本點集合(共有n個樣本),x\mathbf x表示空間中的一個點, KH(x)K_{H}(x)表示核函數,則點x\mathbf x的密度估計爲:
    f^(x)=1ni=1nKH(xxi)(6)\hat f(x) = \frac{1}{n} \sum_{i=1}^n K_H(x - x_i) \quad \quad (公式6)

    • 其中KH(x)=H12K[H12(x)]K_H(x) =|H|^{-\frac{1}{2}} K [H^{-\frac{1}{2}} (x)]
    • HH:表示一個d×dd \times d的正定對稱矩陣,爲了簡化計算,一般將其表示爲正比於單位陣的矩陣,即H=h2IH=h^2I,使用該 H 是爲了增加密度估計的靈活性,則f^(x)\hat f(x)可表示爲:
      f^(x)=1nhdi=1nK(xxih)(7)\hat f(x) =\frac{1}{nh^d} \sum_{i=1}^n K(\frac{x - x_i}{h}) \quad \quad (公式7)
    • K(x)=ck,dk(x2)K(x)=c_{k,d}k(\Vert x^2 \Vert),其中係數ck,dc_{k,d}是爲了保證核函數在空間中的積分爲 1,則f^(x)\hat f(x)變爲:
      f^(x)=ck,dnhdi=1nk(xxih2)(8)\hat f(x) = \frac{c_{k,d}}{nh^d} \sum_{i=1}^n k(\Vert \frac{x-x_i}{h} \Vert^2) \quad \quad (公式8)
    • 對上式中的hh求導,可得:
      fh,K(x)=2ck,dnhd+2i=1nk(xxih2)(xxi)(9)\nabla f_{h,K} (x) = \frac {2c_{k,d}}{nh^{d+2}} \sum_{i=1}^n k' (\Vert \frac{x-x_i}{h} \Vert^2) (x-x_i) \quad \quad (公式9)
  • g(x)=k(x)g(x) = -k'(x),結合公式1知g(x)的核函數爲G(x)=ck,dg(x2)G(x) = c_{k,d}g(\Vert x^2 \Vert)將其代入公式,得:
    在這裏插入圖片描述

  • 其中把第一個大括號中的項定義 爲點xx的Mean Shift向量,即:
    在這裏插入圖片描述

  • 在點xx處的基於G(x)G(x)函數人概率密度估計爲:
    fh,G=ck,dnhd[i=1ng(xxih2)](12)f_{h,G} = \frac{c_{k,d}}{nh^d}[\sum_{i=1}^ng(\Vert \frac{x-x_i}{h} \Vert^2)] \quad (公式12)

  • 把公式 11和公式12代入到公式 10 並且進行移位變換後,發現mh,G(x)m_{h,G}(x) 與概率密度估計 h,K(x)\nabla_{h,K}(x)的方向就一致指向密度增加最大的方向

  • g(x)=1g(x)=1時,則變爲Mean Shift的基本形式,即點xx的均值偏移量:
    m(x)=1ni=1n(xxi)m(x) = \frac{1}{n}\sum_{i=1}^n (x - x_i)
    在這裏插入圖片描述

  • 上圖中的實心點表示點xx,空心點表示採樣點xix_i,虛線箭頭表示採樣點與基準點間相對偏移量,即: xixx_i-x ,這些偏移量的平均值用實線箭頭表示,即均值偏移量。

  • Mean Shift算法的基本思想:數據點在均值偏移量方向上的重複移動過程,直到收斂過程極值點

  • 核函數G(x)G(x)的用途:在一般情況下,由於樣本點距基準點的距離不同,則對均值偏移量的貢獻也不相同,所以Cheng 在基本 Mean Shift 算法中引入了核函數G(x)G(x)的概念

  • 權重係數gg的用途:考慮到每個樣本點對均值偏移量的不同程度的影響,因此,爲每個樣本點還賦予了一個權重w(xi)w(x_i) ,如公式11中的g(xxih2)g(\Vert \frac{x-x_i}{h} \Vert^2)就是樣本點xix_i的權重係數

  • 總結:

    • 給定樣本空間、核函數G(x)G(x)、初始點xx 及搜索半徑 hh 、停止搜索條件ε\varepsilon ,則基於核函數及權重係數的 Mean Shift 算法的一般步驟:
    • 1)使用公式11計算mh,G(x)m_{h,G}(x)
    • 2)若mh,G(x)>ε\Vert m_{h,G}(x) \Vert \gt \varepsilon, 把x+mh,G(x)x+m_{h,G}(x)賦給xx,繼續執行 第1)步,否則停止搜索,輸出 xx

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章