題目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 與使用單個合取式來進行假設表示相比,使用“析合範式”將使得假設空間具有更強的表示能力,例如
會把以及都分類爲好瓜。
若使用最多包含個合取式的析合範式來表達表1.1西瓜分類問題的假設空間,試估算共有多少種可能的假設。
提示:留意題設“使用最多包含個合取式的析合範式”
表1.1的4個樣例,色澤有2種取值(青綠、烏黑),根蒂有3種取值(蜷縮、硬挺、稍蜷),敲聲有3種取值(濁響、清脆、沉悶),因此採用8位二進制描述一個合取式,例如,
01 001 001表示“”,
11 111 111 表示“”。
共有個基本假設(即合取式)。
共有個葉子假設(即葉子合取式,其每個屬性都是具體值而非通配符)。此時,任何合取式、析合範式都可以用這18個葉子合取式的組合來表示,具體的,開闢一個大小18的布爾數組,
100000000000000000表示包含第1個葉子假設“”,
010000000000000000表示包含第2個葉子假設“”,
110000000000000000表示包含第1、2個葉子假設,即析合範式。
將合取式假設重編碼成大小爲18的布爾數組形式,則“”表示成111000000000000000,這樣處理的好處是,當時,析合範式與合取式是同一種假設能夠被識別出來,設計出來的算法不會重複計數。另一個好處是,合取式A與合取式B的析合範式就是其對應兩個布爾數組的或運算的結果。
先利用8位二進制,將48個合取式處理成布爾數組編碼形式。當時,從48個基本假設中任意抽取3個組成析合範式,實際上就是寫一個算法依次輸出
,
即有三個指針,滿足。
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個葉子假設,那麼至多也就只有種假設(包括),完整代碼如下(注意進行優化)
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
算法跑了蠻久,這裏只跑到的情況,易推時,結果恆等於(注意前面提到的最大可能情況值)。
題目1.3
若數據包含噪聲,則假設空間中有可能不存在與所有訓練樣本都一致的假設,在此情形下,試設計一種歸納偏好用於假設選擇。
答案可以有很多種,例如:(1)直接去除屬性值相同但類別標籤不同的樣例;(2)屬性值相同但類別標籤不同的樣例,假設有個,從中隨機保留1個。
題目1.4
1.4 本章1.4節在論述“沒有免費的午餐”定理時,默認使用了“分類錯誤率”作爲性能度量來對分類器進行評估。若換用其他性能度量,則式(1.1)將改爲
試證明“沒有免費的午餐”定理仍成立。
本章1.4節NFL定理的證明推導換成如下形式,看起來會比較清晰,
所有的真實目標函數可以用一張0-1表來描述,舉一個例子,假如有3個樣例,
0 | 0 | 0 | |
0 | 0 | 1 | |
0 | 1 | 0 | |
0 | 1 | 1 | |
1 | 0 | 0 | |
1 | 0 | 1 | |
1 | 1 | 0 | |
1 | 1 | 1 |
對每個,有一半的值與的值不相等,恆有如下等式(其中是常數)
也可以設
同樣易證上述式子。
性能度量換成指示函數,有
則
證畢。
題目1.5
試述機器學習能在互聯網搜索的哪些環節起什麼作用。
(略)