1.1
表1. 1 中若只包含编号为 1 和 4 的两个样例?试给出相应的版本空间.
表1.1的训练数据集对应的假设空间应该如下:
- 1 色泽=*,根蒂=*,敲声=*
- 2 色泽=青绿,根蒂=*,敲声=*
- 3 色泽=乌黑,根蒂=*,敲声=*
- 4 色泽=*,根蒂=蜷缩,敲声=*
- 5 色泽=*,根蒂=硬挺,敲声=*
- 6 色泽=*,根蒂=稍蜷,敲声=*
- 7 色泽=*,根蒂=*,敲声=浊响
- 8 色泽=*,根蒂=*,敲声=清脆
- 9 色泽=*,根蒂=*,敲声=沉闷
- 10 色泽=青绿,根蒂=蜷缩,敲声=*
- 11 色泽=青绿,根蒂=硬挺,敲声=*
- 12 色泽=青绿,根蒂=稍蜷,敲声=*
- 13 色泽=乌黑,根蒂=蜷缩,敲声=*
- 14 色泽=乌黑,根蒂=硬挺,敲声=*
- 15 色泽=乌黑,根蒂=稍蜷,敲声=*
- 16 色泽=青绿,根蒂=*,敲声=浊响
- 17 色泽=青绿,根蒂=*,敲声=清脆
- 18 色泽=青绿,根蒂=*,敲声=沉闷
- 19 色泽=乌黑,根蒂=*,敲声=浊响
- 20 色泽=乌黑,根蒂=*,敲声=清脆
- 21 色泽=乌黑,根蒂=*,敲声=沉闷
- 22 色泽=*,根蒂=蜷缩,敲声=浊响
- 23 色泽=*,根蒂=蜷缩,敲声=清脆
- 24 色泽=*,根蒂=蜷缩,敲声=沉闷
- 25 色泽=*,根蒂=硬挺,敲声=浊响
- 26 色泽=*,根蒂=硬挺,敲声=清脆
- 27 色泽=*,根蒂=硬挺,敲声=沉闷
- 28 色泽=*,根蒂=稍蜷,敲声=浊响
- 29 色泽=*,根蒂=稍蜷,敲声=清脆
- 30 色泽=*,根蒂=稍蜷,敲声=沉闷
- 31 色泽=青绿,根蒂=蜷缩,敲声=浊响
- 32 色泽=青绿,根蒂=蜷缩,敲声=清脆
- 33 色泽=青绿,根蒂=蜷缩,敲声=沉闷
- 34 色泽=青绿,根蒂=硬挺,敲声=浊响
- 35 色泽=青绿,根蒂=硬挺,敲声=清脆
- 36 色泽=青绿,根蒂=硬挺,敲声=沉闷
- 37 色泽=青绿,根蒂=稍蜷,敲声=浊响
- 38 色泽=青绿,根蒂=稍蜷,敲声=清脆
- 39 色泽=青绿,根蒂=稍蜷,敲声=沉闷
- 40 色泽=乌黑,根蒂=蜷缩,敲声=浊响
- 41 色泽=乌黑,根蒂=蜷缩,敲声=清脆
- 42 色泽=乌黑,根蒂=蜷缩,敲声=沉闷
- 43 色泽=乌黑,根蒂=硬挺,敲声=浊响
- 44 色泽=乌黑,根蒂=硬挺,敲声=清脆
- 45 色泽=乌黑,根蒂=硬挺,敲声=沉闷
- 46 色泽=乌黑,根蒂=稍蜷,敲声=浊响
- 47 色泽=乌黑,根蒂=稍蜷,敲声=清脆
- 48 色泽=乌黑,根蒂=稍蜷,敲声=沉闷
- 49 Ø
加入 1 号数据,(色泽=青绿、根蒂=蜷缩、敲声=浊响) 好瓜
,剩下
- 1 色泽=*,根蒂=*,敲声=*
- 2 色泽=青绿,根蒂=*,敲声=*
- 4 色泽=*,根蒂=蜷缩,敲声=*
- 7 色泽=*,根蒂=*,敲声=浊响
- 10 色泽=青绿,根蒂=蜷缩,敲声=*
- 16 色泽=青绿,根蒂=*,敲声=浊响
- 22 色泽=*,根蒂=蜷缩,敲声=浊响
- 31 色泽=青绿,根蒂=蜷缩,敲声=浊响
加入 4 号数据,(色泽=乌黑、根蒂=稍蜷、敲声=沉闷) 坏瓜
,剩下
- 2 色泽=青绿,根蒂=*,敲声=*
- 4 色泽=*,根蒂=蜷缩,敲声=*
- 7 色泽=*,根蒂=*,敲声=浊响
- 10 色泽=青绿,根蒂=蜷缩,敲声=*
- 16 色泽=青绿,根蒂=*,敲声=浊响
- 22 色泽=*,根蒂=蜷缩,敲声=浊响
- 31 色泽=青绿,根蒂=蜷缩,敲声=浊响
成功构建版本空间
1.2
与使用单个合取式来进行假设表示相比,使用"析合范式"将使得假设空间具有更强的表示能力。
例如
好瓜 <-> ((色泽=*(根蒂=蜷缩) ^ (敲声= *)) v ((色泽=乌黑) ^ (根蒂=*) ^ (敲声=沉闷))
会把(色泽=青绿)^(根蒂=蜷缩)^(敲声=清脆)
以及(色泽=乌黑) ^ (根蒂=硬挺) ^ (敲声=沉闷)
都分类为"好瓜"
若使用最多包含 k k k 个合取式的析合范式来表达。表1. 1 西瓜分类问题的假设空间, 试估算共有多少种可能的假设.
不会
- 48
从网上抄到一份代码(不过我觉得可以用动态规划试一试§(* ̄▽ ̄*)§)
import numpy as np
import itertools as it
def get_18_from_trible(trible): #把三维向量变为代表特征的18维向量
a = np.zeros([2,3,3])
a1 = trible[0]
a2 = trible[1]
a3 = trible[2]
if a1 == 3: #对于第一种属性为"*"的情况
a1 = [1,2]
else:
a1 = [a1]
if a2 == 4: #对于第二种属性为"*"的情况
a2 = [1,2,3]
else:
a2 = [a2]
if a3 == 4: #对于第三种属性为"*"的情况
a3 = [1,2,3]
else:
a3 = [a3]
#print (a1,a2,a3)
#print(a)
for m1 in a1:
for m2 in a2:
for m3 in a3:
a[m1-1][m2-1][m3-1] = 1
return a #得到了一个18维向量(0/1二值),代表18种特征情况
def turn_48_to_trible(num):
# num in [0,47],把一个小于48的数字对应到一个三维数组中
for i in range(3):
for j in range(4):
for k in range