西瓜書《機器學習》第一章部分課後題

題目1.1

1.1 表1.1中若只包含編號1和4的兩個樣例,試給出相應的版本空間。

編號 色澤 根蒂 敲聲 好瓜
1 青綠 蜷縮 濁響
4 烏黑 稍蜷 沉悶

用2位二進制表示色澤,01表示青綠,10表示烏黑,11表示通配符*,00表示該屬性值缺失;根蒂敲聲做同樣處理,例如,

11 11 11表示“色澤:*,根蒂:*,敲聲:*
01 01 01表示編號1的樣例,
10 10 10表示編號4的樣例。

這樣處理的好處是,若假設A包含假設B,則A | B = A,例如,

110101 | 010101 = 110101表示“*,蜷縮,濁響”包含“青綠,蜷縮,濁響”。

代碼如下,即可得到相應版本空間

color = {0: '01', 1: '10', 2: '11'}
root = {0: '01', 1: '10', 2: '11'}
sound = {0: '01', 1: '10', 2: '11'}

good = 0b010101
bad = 0b101010

space = []

for i in range(3):
    for j in range(3):
        for k in range(3):
            tempStr = '0b' + color[i] + root[j] + sound[k]
            tempInt = int(tempStr, 2)
            if tempInt | good == tempInt and tempInt | bad != tempInt:
                space.append(bin(tempInt))

print(space)

題目1.2

1.2 與使用單個合取式來進行假設表示相比,使用“析合範式”將使得假設空間具有更強的表示能力,例如
((=)(=)(=))((=)(=)(=))好瓜\leftrightarrow \big( (色澤=*) \land (根蒂=蜷縮) \land (敲聲=*) \big) \\ \lor \big( ( 色澤=烏黑) \land (根蒂=*) \land (敲聲=沉悶) \big)
會把(=)(=)(=)(色澤=*) \land (根蒂=蜷縮) \land (敲聲=*)以及(=)(=)(=)( 色澤=烏黑) \land (根蒂=*) \land (敲聲=沉悶)都分類爲好瓜
若使用最多包含kk個合取式的析合範式來表達表1.1西瓜分類問題的假設空間,試估算共有多少種可能的假設。

提示:留意題設“使用最多包含kk個合取式的析合範式”

表1.1的4個樣例,色澤有2種取值(青綠、烏黑),根蒂有3種取值(蜷縮、硬挺、稍蜷),敲聲有3種取值(濁響、清脆、沉悶),因此採用8位二進制描述一個合取式,例如,

01 001 001表示“((=)(=)(=))\big( (色澤 = 青綠) \land (根蒂 = 蜷縮) \land (敲聲 = 濁響) \big)”,
11 111 111 表示“((=)(=)(=))\big( (色澤 = *) \land (根蒂 = *) \land (敲聲 = *) \big)”。

共有3×4×4=483 \times 4 \times 4 = 48個基本假設(即合取式)。

共有2×3×3=182 \times 3 \times 3 = 18個葉子假設(即葉子合取式,其每個屬性都是具體值而非通配符)。此時,任何合取式、析合範式都可以用這18個葉子合取式的組合來表示,具體的,開闢一個大小18的布爾數組,

100000000000000000表示包含第1個葉子假設“((=)(=)(=))\big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=濁響) \big)”,
010000000000000000表示包含第2個葉子假設“((=)(=)(=))\big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=清脆) \big)”,
110000000000000000表示包含第1、2個葉子假設,即析合範式((=)(=)(=))((=)(=)(=))\big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=濁響) \big) \lor \big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=清脆) \big)

將合取式假設重編碼成大小爲18的布爾數組形式,則“((=)(=)(=))\big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=*) \big)”表示成111000000000000000,這樣處理的好處是,當k=3k = 3時,析合範式((=)(=)(=))((=)(=)(=))((=)(=)(=))\big((色澤=青綠)\land(根蒂=蜷縮)\land(敲聲=濁響)\big) \lor \big((色澤=青綠)\land(根蒂=蜷縮)\land(敲聲=清脆)\big) \lor \big((色澤=青綠)\land(根蒂=蜷縮)\land(敲聲=沉悶)\big)與合取式((=)(=)(=))\big( (色澤=青綠) \land (根蒂=蜷縮) \land (敲聲=*) \big)是同一種假設能夠被識別出來,設計出來的算法不會重複計數。另一個好處是,合取式A與合取式B的析合範式就是其對應兩個布爾數組的或運算的結果。

先利用8位二進制,將48個合取式處理成布爾數組編碼形式。當k=3k = 3時,從48個基本假設中任意抽取3個組成析合範式,實際上就是寫一個算法依次輸出

(1,2,3),(1,2,4),,(1,2,48),(1,3,4),(1,3,5),,(1,3,48),(1,4,5),(1,4,6),,(1,47,48),(2,3,4),(2,3,5),(1, 2, 3), (1,2,4), \dots,(1,2,48),(1,3,4),(1,3,5),\dots,(1,3,48),(1,4,5),(1,4,6),\dots,(1,47,48),(2,3,4),(2,3,5),\dots

即有三個指針i1,i2,i3i_1, i_2, i_3,滿足1i1<i2<i3481 \leq i_1 < i_2 < i_3 \leq 48

def MoveIndex(length, k):
    result = []
    id = 0
    postlist = [0] * k
    postlist[id] = 0
    exitFlag = False
    while(not exitFlag):
        if postlist[id] == length - (k - id):
            while postlist[id] == length - (k - id):
                id = id - 1
                if id == -1:
                    exitFlag = True
                    break
            if not exitFlag:
                postlist[id] = postlist[id] + 1
                while id < k - 1:
                    id = id + 1
                    postlist[id] = postlist[id - 1] + 1
                result.append(postlist.copy())
        else:
            if id < k - 1:
                while id < k - 1:
                    id = id + 1
                    postlist[id] = postlist[id - 1] + 1
                result.append(postlist.copy())
            else:
                postlist[id] = postlist[id] + 1
                result.append(postlist.copy())
    return result

萬事俱備,接下來寫完整代碼,注意此題僅有18個葉子假設,那麼至多也就只有218=2621442^{18} = 262144種假設(包括\varnothing),完整代碼如下(注意進行優化)

color = {0:'01', 1:'10', 2:'11'}
root = {0:'001', 1:'010', 2:'100', 3:'111'}
sound = {0:'001', 1:'010', 2:'100', 3:'111'}

leaf18 = []
for i in range(2):
    for j in range(3):
        for k in range(3):
            s = '0b' + color[i] + root[j] + sound[k]
            leaf18.append(int(s, 2))

space48 = []
for i in range(3):
    for j in range(4):
        for k in range(4):
            s = '0b' + color[i] + root[j] + sound[k]
            space48.append(int(s, 2))

encode48 = [0] * 48
for i in range(48):
    for j in range(18):
        if space48[i] | leaf18[j] == space48[i]:
            encode48[i] = encode48[i] | (1 << j)

visited = [False] * (2 ** 18)
length = 48
for k in range(1, 48):
    id = 0
    postlist = [0] * k
    postlist[id] = 0
    if k == 1:
        visitInd = 0
        for var in postlist:
            visitInd = visitInd | encode48[var]
        visited[visitInd] = True
    exitFlag = False
    while(not exitFlag):
        if postlist[id] == length - (k - id):
            while postlist[id] == length - (k - id):
                id = id - 1
                if id == -1:
                    exitFlag = True
                    break
            if not exitFlag:
                postlist[id] = postlist[id] + 1
                while id < k - 1:
                    id = id + 1
                    postlist[id] = postlist[id - 1] + 1
                visitInd = 0
                for var in postlist:
                    visitInd = visitInd | encode48[var]
                visited[visitInd] = True
        else:
            if id < k - 1:
                while id < k - 1:
                    id = id + 1
                    postlist[id] = postlist[id - 1] + 1
                visitInd = 0
                for var in postlist:
                    visitInd = visitInd | encode48[var]
                visited[visitInd] = True
            else:
                postlist[id] = postlist[id] + 1
                visitInd = 0
                for var in postlist:
                    visitInd = visitInd | encode48[var]
                visited[visitInd] = True
    count = 0
    for var in visited:
        if var:
            count = count + 1
    print(k ,count)

運行結果如下:

1 48
2 897
3 8385
4 41742
5 115821
6 201303
7 248853
8 260787
9 262143

算法跑了蠻久,這裏只跑到k=9k = 9的情況,易推k9k \geq 9時,結果恆等於262143262143(注意前面提到的最大可能情況值)。

題目1.3

若數據包含噪聲,則假設空間中有可能不存在與所有訓練樣本都一致的假設,在此情形下,試設計一種歸納偏好用於假設選擇。

答案可以有很多種,例如:(1)直接去除屬性值相同但類別標籤不同的樣例;(2)屬性值相同但類別標籤不同的樣例,假設有nn個,從中隨機保留1個。

題目1.4

1.4 本章1.4節在論述“沒有免費的午餐”定理時,默認使用了“分類錯誤率”作爲性能度量來對分類器進行評估。若換用其他性能度量\ell,則式(1.1)將改爲
Eote(LaX,f)=hxXXP(x)(h(x),f(x))P(hX,La),E_{ote}(\mathcal{L}_a | X, f) = \sum_h \sum_{\bm{x} \in \mathcal{X} -X} P(\bm{x}) \ell \big( h(\bm{x}), f(\bm{x}) \big) P(h | X, \mathcal{L}_a),
試證明“沒有免費的午餐”定理仍成立。

本章1.4節NFL定理的證明推導換成如下形式,看起來會比較清晰,
在這裏插入圖片描述
所有的真實目標函數fFf \in \mathcal{F}可以用一張0-1表來描述,舉一個例子,假如xXX\bm{x} \in \mathcal{X} - X有3個樣例,

fif_i x1\bm{x}_1 x2\bm{x}_2 x3\bm{x}_3
f1()f_1(\cdot) 0 0 0
f2()f_2(\cdot) 0 0 1
f3()f_3(\cdot) 0 1 0
f4()f_4(\cdot) 0 1 1
f5()f_5(\cdot) 1 0 0
f6()f_6(\cdot) 1 0 1
f7()f_7(\cdot) 1 1 0
f8()f_8(\cdot) 1 1 1

對每個xXX\bm{x} \in \mathcal{X} - X,有一半f(x)f(\bm{x})的值與h(x)h(\bm{x})的值不相等,恆有如下等式(其中CC是常數)
在這裏插入圖片描述
也可以設
在這裏插入圖片描述
同樣易證上述式子。

性能度量\ell換成指示函數I\mathbb{I},有
在這裏插入圖片描述

在這裏插入圖片描述
證畢。

Acknowledge

上述答案參考自:
https://blog.csdn.net/dicker6315/article/details/81265066
非常感謝@零食i

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