西瓜書習題試答-第11章-特徵選擇與稀疏學習

試答系列:「西瓜書」-周志華《機器學習》習題試答
系列目錄
[第01章:緒論]
[第02章:模型評估與選擇]
[第03章:線性模型]
[第04章:決策樹]
[第05章:神經網絡]
[第06章:支持向量機]
第07章:貝葉斯分類器
第08章:集成學習
第09章:聚類
第10章:降維與度量學習
第11章:特徵選擇與稀疏學習
第12章:計算學習理論(暫缺)
第13章:半監督學習
第14章:機率圖模型
(後續章節更新中...)html



11.1 試編程實現Relief算法,並考察其在西瓜數據集3.0上的運行結果。

:詳細代碼附後。須要注意的是:在計算樣本間距離尋找最近鄰樣本時,因爲西瓜數據集3.0中含有離散屬性,其中既有「有序屬性」,又有「無序屬性」,嚴格來講,能夠按照第9章9.3節中介紹的方法進行計算。可是,在這裏爲了與(11.3)式中的距離計算方法保持一致,簡單地處理爲:值同爲0,值異爲1,不考慮「序」關係。
運行結果(按相關統計量從大到小排列):python

特徵 紋理 臍部 根蒂 含糖率 密度 敲聲 觸感 色澤
相關統計量 9 7 4 2.04 -0.5 -1 -4 -7

11.2 試寫出Relief-F的算法描述。

算法

  • 輸入:樣本數據X,類標記Y
  • 過程
    01:計算樣本數m,特徵數n,類別數N=|y|,各種樣本所佔比例p
    02:初始化相關統計量\(\delta=\text{zeros}(n)\)
    03:for \(i\)=1,2,…,m:
    04:  \(x_i\)的所屬類別爲\(k\)
    05:  在\(x_i\)的同類樣本中找到最近鄰同類樣本\(x_{i,nh}\)
    06:  for \(j\)=1,2,…,n:
    07:    \(δ_j=δ_j-\text{diff}(x_i^j-x_{i,nh}^j)^2\)
    08:  for \(l\)=1,2,...,k-1,k+1,…,N :
    09:    在屬於\(l\)類別的樣本子集\(D_l\)中找到與\(x_i\)最近鄰的樣本\(x_{i,l,nm}\)
    10:    for \(j\)=1,2,…,n:
    11:      \(δ_j=δ_j+p_l*\text{diff}(x_i^j-x_{i,l,nm}^j)^2\)
  • 輸出:相關統計量\(δ\)

11.3 Relief算法是分別考察每一個屬性的重要性。試設計一個能考察每一對屬性重要性的改進算法。

:只需將計算單個屬性相關統計量的(11.3)式擴充爲針對兩個屬性的統計量便可:編程

\[\delta^{i,j}=\sum_k –\text{diff}(x_k^{i,j},x_{k,nh}^{i,j})^2+ \text{diff}(x_k^{i,j},x_{k,nm}^{i,j})^2 \]

11.4 試爲LVW設計一個改進算法,即使有運行時間限制,該算法也必定能給出解。

:當時間到了,可是t≥T的條件未到,將當前搜索到的最佳解A*給出便可。不會這麼簡單吧,或許沒能理解題意?網絡

11.5 結合圖11.2,試舉例說明L1正則化在何種狀況下不能產生稀疏解。


sdd
觀察上圖左,在\(L_2\)狀況下,取得最優解\(ω^*\)時,必然有平方偏差等值線和\(L_2\)等值線在\(ω^*\)處相切,或者說,斜率相等,或者說,梯度方向恰好反向。
\(L_2\)等值線是一組圓,在第一象限中,從A點至B點,斜率從0連續變化到-∞。因而,平方偏差等值線在第一象限中只要是單調遞減曲線,總可以與\(L_2\)等值線相切。
所以,\(L_2\)等值線與平方偏差等值線很容易在各個象限中發生相切,沒法產生稀疏解。機器學習

\(L_1\)的狀況下,\(L_1\)等值線在各個象限中的斜率老是等於±1。
參見上圖右,觀察第一象限的狀況:\(L_1\)等值線的斜率爲-1,偏差等值線1在第一象限中斜率絕對值老是小於1,沒法與\(L_1\)等值線相切;偏差等值線2的斜率存在k=-1的點,可以與\(L_1\)等值線相切;偏差等值線3的斜率絕對值老是大於1,也沒法與L1等值線相切。
所以,在\(L_1\)狀況下,\(L_1\)等值線和與偏差等值線在不少狀況下沒法相切,最優解只能發生在座標軸上,對應於稀疏解。
當偏差等值線在第一、3象限存在斜率爲-1的點,或者在第二、4象限存在斜率爲1的點時,可以與\(L_1\)等值線發生相切,此時,沒法產生稀疏解。函數

11.6 試析嶺迴歸與支持向量機的聯繫。

:嶺迴歸與支持向量機,前者是迴歸,後者是分類,做爲比較,將嶺迴歸與支持向量迴歸進行比較,更加合適。
嶺迴歸的表達式爲(11.6)式:學習

\[\min_\omega\sum_{i=1}^m(y_i-\omega^Tx_i)^2+\lambda|\omega|_2^2 \]

支持向量迴歸的表達式爲(6.43)式:優化

\[\min_{\omega,b}\frac{1}{2}||\omega||_2^2+C\sum_{i=1}^m l_\epsilon (f(x_i)-y_i) \]

嶺迴歸和支持向量迴歸的優化目標表達式很是相近,不一樣點在於採用的損失函數不一樣,嶺迴歸採用平方偏差損失函數,而支持向量迴歸採用\(\epsilon\)不敏感損失:spa

\[l_\epsilon (z)= \begin{cases} 0,&|z|\leq\epsilon\\ |z|-\epsilon, &otherwise \end{cases} \]

在這裏插入圖片描述
另外,咱們知道支持向量迴歸的結果表達爲支持向量的形式,其解是稀疏性的。在本章又知道,嶺迴歸採用\(L_2\)正則化,其結果不稀疏,而LASSO採用\(L_1\)正則化,其結果稀疏。所以,在支持向量機和支持向量迴歸中,儘管也採用\(L_2\)正則化,其結果的稀疏性是因爲所採用的損失函數形式致使的;而在LASSO中,其稀疏性是由\(L_1\)正則化致使的。

11.7 試述直接求解L0範數正則化會遇到的困難。

\(L_0\)範數等於非零元素的個數,亦即\(|\omega|_0=\sum_i (\omega_i\neq 0)\)。考慮二維的狀況,此時的等值線比較特殊:在原點,\(L_0\)=0; 在各個座標軸上\(L_0\)=1; 在各個象限區域,\(L_0\)=2。
在這裏插入圖片描述
在各個象限區域時,\(L_0\)項爲一個常量,等於2,此時求解最優解至關於\(L_0\)項不存在同樣。能夠設想一下,求解L0正則化下的迴歸問題大概是這樣子的:

  • 先不考慮\(L_0\)項,求解平方偏差項的最優解爲\(\omega^{*1}\),以及對應的目標函數值\(J_1=\text{erro}_1+2\)
  • 而後限定\(\omega_1=0\),求解此時的最優解爲\(\omega^{*2}\),以及對應的目標函數值\(J_2=\text{erro}_2+1\);
  • 而後限定\(\omega_2=0\),求解此時的最優解爲\(\omega^{*3}\),以及對應的目標函數值\(J_3=\text{erro}_3+1\);
  • 而後計算\(\omega=0\)時的目標函數值\(J_4=\text{erro}_4\);
  • 最後,比較\(J_1\sim J_4\),擇其最小者做爲最終結果。

推而廣之,在\(L_0\)正則化時的求解方法是,分別設定\(\omega\)中某些元素爲零的狀況下,求解無正則化的優化問題,最終比較各類狀況下的目標函數值,肯定最優解。
貌似也沒什麼困難的吧,只是比較繁雜而已。
設特徵數爲N,則按照上面的方法,要在\(2^N\)的狀況下分別求解優化問題,這個次數隨特徵數指數級增加,當特徵數較多時,比較困難。

11.8 試給出求解L1範數最小化問題中的閉式解(11.14)的詳細推導過程。

:(11.13)式能夠表示爲各個份量相加的形式,各個份量互不影響,所以略去下標i,將x當作標量,因而(11.13)能夠改寫爲:

\[x_{k+1}=argmin_x \frac{L}{2}(x-z)^2+\lambda|x| \]

令等式右邊的目標函數爲g(x),對其求導有:

\[g^\prime(x)=L(x-z)+\lambda \text{sign}(x) \]

其中sign(x)是符號函數,x爲正時等於1,x爲負時等於-1,在x=0處存在突變。
若是對\(g^\prime (x)\)函數圖像做圖,其中\(L(x-z)\)是一條直線,後一部分\(\lambda \text{sign}(x)\)的效果是在x>0時將曲線向上平移\(\lambda\),x<0時曲線向下平移\(\lambda\)。對\(g^\prime (x)\)除以正數L,不影響最小化結果。對\(g^\prime (x)/L\)函數變化曲線分狀況做圖以下:
在這裏插入圖片描述
\(g^\prime(x)=0\),或者正負號改變處對應於極小值取值處,因而有(11.14)式的結論:

\[x_{k+1}= \begin{cases} z+\frac{\lambda}{L},&z<-\frac{\lambda}{L}\\ 0,&|z|<\frac{\lambda}{L}\\ z-\frac{\lambda}{L},&z>\frac{\lambda}{L} \end{cases}\]

11.9 試述字典學習與壓縮感知對稀疏性利用的異同。(暫缺)

11.10 試改進式(11.15),以學習出具備分組稀疏性的字典。(暫缺)


附:編程代碼

習題11.1(Python)

# -*- coding: utf-8 -*-
"""
Created on Mon May 18 11:34:22 2020

@author: MS

11.1 試編程實現Relief算法,並考察其在西瓜數據集3.0上的運行效果
"""
import numpy as np

def Relief(X,Y):
    # Relef算法
    # 輸入:
    #     X:樣本數據,列表類型,容許連續型和離散型數據,維度爲樣本數×特徵數
    #     Y: 類標記,列表或者numpy.array類型,這裏僅考慮2分類狀況
    # 輸出:
    #     r:計算出的相關統計量,對應於教材上的(11,3)式,長度爲特徵數
    
    m=len(X)        #樣本數
    n=len(X[0])     #特徵數
    Y=np.asarray(Y) #轉換爲numpy.array類型
    
    types=np.array([type(xj) for xj in X[0]])          #各個特徵的類型
    d_index=np.where(types==str)[0]                    #離散屬性序號
    c_index=np.where((types==int)|(types==float))[0]   #連續屬性序號
    Xd=np.array([[x[i] for i in d_index] for x in X])  #X之離散屬性部分
    Xc=np.array([[x[i] for i in c_index] for x in X])  #X之連續屬性部分
    Xc=(Xc-Xc.min(0))/(Xc.max(0)-Xc.min(0))            #連續值部分規範化到[0,1]區間
    
    r=np.zeros(n)                                      #存儲相關統計量
    for i in range(m):
        # 計算xi與全部樣本的距離平方(等號右邊兩項分別爲離散和連續特徵貢獻)
        dist2=(Xd[i,:]!=Xd).sum(1)+((Xc[i,:]-Xc)**2).sum(1)
        # 同類最近鄰
        dist2_nh=dist2.copy()                #拷貝距離副本
        dist2_nh[i]=max(dist2)+1             #自身距離本爲0,將其強制設爲較大值
        dist2_nh[Y!=Y[i]]=max(dist2)+1       #異類距離也設爲較大值
        nh_index=np.argmin(dist2_nh)         #同類中最近鄰樣本的索引號
        r[d_index]-=Xd[i]!=Xd[nh_index]      #r之離散屬性部分
        r[c_index]-=(Xc[i]-Xc[nh_index])**2  #r之連續屬性部分
        # 異類最近鄰
        dist2_nm=dist2.copy()                #拷貝距離副本
        dist2_nm[Y==Y[i]]=max(dist2)+1       #同類距離設爲較大值
        nm_index=np.argmin(dist2_nm)         #異類中最近鄰樣本的索引號
        r[d_index]+=Xd[i]!=Xd[nm_index]      #r之離散屬性部分
        r[c_index]+=(Xc[i]-Xc[nm_index])**2  #r之連續屬性部分

    return r

#====================================
#              主程序
#====================================   
# 表4.3 西瓜數據集3.0
FeatureName=['色澤','根蒂','敲聲','紋理','臍部','觸感','密度','含糖率']
X=[['青綠','蜷縮','濁響','清晰','凹陷','硬滑',0.697,0.460],
   ['烏黑','蜷縮','沉悶','清晰','凹陷','硬滑',0.774,0.376],
   ['烏黑','蜷縮','濁響','清晰','凹陷','硬滑',0.634,0.264],
   ['青綠','蜷縮','沉悶','清晰','凹陷','硬滑',0.608,0.318],
   ['淺白','蜷縮','濁響','清晰','凹陷','硬滑',0.556,0.215],
   ['青綠','稍蜷','濁響','清晰','稍凹','軟粘',0.403,0.237],
   ['烏黑','稍蜷','濁響','稍糊','稍凹','軟粘',0.481,0.149],
   ['烏黑','稍蜷','濁響','清晰','稍凹','硬滑',0.437,0.211],
   ['烏黑','稍蜷','沉悶','稍糊','稍凹','硬滑',0.666,0.091],
   ['青綠','硬挺','清脆','清晰','平坦','軟粘',0.243,0.267],
   ['淺白','硬挺','清脆','模糊','平坦','硬滑',0.245,0.057],
   ['淺白','蜷縮','濁響','模糊','平坦','軟粘',0.343,0.099],
   ['青綠','稍蜷','濁響','稍糊','凹陷','硬滑',0.639,0.161],
   ['淺白','稍蜷','沉悶','稍糊','凹陷','硬滑',0.657,0.198],
   ['烏黑','稍蜷','濁響','清晰','稍凹','軟粘',0.360,0.370],
   ['淺白','蜷縮','濁響','模糊','平坦','硬滑',0.593,0.042],
   ['青綠','蜷縮','沉悶','稍糊','稍凹','硬滑',0.719,0.103]]
Y=[1]*8+[0]*9
# 計算相關統計量
r=Relief(X,Y)
order=np.argsort(r)[::-1]
print('===================相關統計量排序結果===================')
for i in order:
    print(FeatureName[i]+':'+str(r[i]),end=';  ')
相關文章
相關標籤/搜索