目录
1.1:
解:
由于好瓜的3个属性值与坏瓜都不同。所以能与训练集一致的假设就有很多可能了,从最具体的入手,往上逐层抽象可得,从一般到特殊或是从特殊到一般对整个假设空间进行搜索,删除与正例1不一致的假设,或与反例4一致的假设,最终得到版本空间为:
1.2:
解:
代码:
import numpy as np
import itertools as it
import time
def get_18(data): #把三维向量变为代表特征组合的18维向量
a = np.zeros([2,3,3])
if data[0] == 0: #对于第一种属性为"*"的情况
a1 = [1,2]
else:
a1 = [data[0]]
if data[1] == 0: #对于第二种属性为"*"的情况
a2 = [1,2,3]
else:
a2 = [data[1]]
if data[2] == 0: #对于第三种属性为"*"的情况
a3 = [1,2,3]
else:
a3 = [data[2]]
for m1 in a1:
for m2 in a2:
for m3 in a3:
a[m1-1][m2-1][m3-1] = 1
a = a.flatten()
return a #得到了一个18维向量(0/1二值),代表18种特征组合
def turn_48_to_trible(num):
# num in [0,47],把一个小于48的数字对应到一个三维数组中
i = num//16
j = num%16//4
k = num%16%4
return [i,j,k]
def from_48_to_18(num): #把0-47的某个数唯一对应到某个18维向量
data = turn_48_to_trible(num)
a = get_18(data)
return a
def main(k):
hypo_list=[]
for i in it.combinations(range(48),k):
#开始对48取k的组合数进行穷举,i是一个k元数组,其中每个元素都是0-47中的某个数,代表(A1,A2,*)(B1,B2,B3,*)(C1,C2,C3,*)的一个组合
subset = 0
for j in range(k):
p = i[j]
subset = subset | hypo48_oct[p]
hypo_list.append(subset)
if len(hypo_list) > 5000000:
hypo_list = list(set(hypo_list)) #set是集合,是对rset数组进行去重!
#设置500W上限为了防止set操作时数组长度太长导致程序崩掉
hypo_list = list(set(hypo_list)) #最终set操作一下得到最终结果
print("正好包含%d个合取式的析合范式能表示 : %d 种假设" % (k, len(hypo_list)))
return(hypo_list)
hypo48 = []
for i in range(48):
h = from_48_to_18(i)
hypo48.append(h)
hypo48_oct = []
for hypo in hypo48:
hypo_bin = '0b'
for i in hypo:
hypo_bin = hypo_bin + str(int(i))
hypo_oct = eval(hypo_bin)
hypo48_oct.append(hypo_oct)
start = time.time()
hypo_stack = []
for k in range(18):
k = k+1
hypo_list = main(k)
hypo_stack = hypo_stack + hypo_list
hypo_stack = list(set(hypo_stack))
end = time.time()
print( "最多包含%d个合取式的析合范式能表示 : %d 种假设"%(k,len(hypo_stack)+1)) #加1是因为还有空集这个假设,即不存在好瓜
print("用时:%.2fs"%(end-start))
题目是最多包含k个,所以我把空集假设,即好瓜不存在也算上了。
运行结果:
正好包含1个合取式的析合范式能表示 : 48 种假设
最多包含1个合取式的析合范式能表示 : 49 种假设
正好包含2个合取式的析合范式能表示 : 879 种假设
最多包含2个合取式的析合范式能表示 : 898 种假设
正好包含3个合取式的析合范式能表示 : 8223 种假设
最多包含3个合取式的析合范式能表示 : 8386 种假设
正好包含4个合取式的析合范式能表示 : 40911 种假设
最多包含4个合取式的析合范式能表示 : 41743 种假设
正好包含5个合取式的析合范式能表示 : 112962 种假设
最多包含5个合取式的析合范式能表示 : 115822 种假设
正好包含6个合取式的析合范式能表示 : 193998 种假设
最多包含6个合取式的析合范式能表示 : 201304 种假设
正好包含7个合取式的析合范式能表示 : 233640 种假设
最多包含7个合取式的析合范式能表示 : 248854 种假设
正好包含8个合取式的析合范式能表示 : 233424 种假设
最多包含8个合取式的析合范式能表示 : 260788 种假设
正好包含9个合取式的析合范式能表示 : 218394 种假设
最多包含9个合取式的析合范式能表示 : 262144 种假设
用时:8899.29s
1.3:
解:
解答一:
在训练过程中选择满足最多样本的假设。也可以对每个假设,求得其准确率。准确率=(符合假设的条件且为好瓜的样例数量)/(符合假设的条件的样例数量)。选择准确率最高的假设。
另一解答:通常认为两个数据的属性越相近,则更倾向于将他们分为同一类。若相同属性出现了两种不同的分类,则认为它属于与他最临近几个数据的属性。也可以考虑同时去掉所有具有相同属性而不同分类的数据,留下的数据就是没误差的数据,但是可能会丢失部分信息。
解答二:
归纳偏好是在无法断定哪一个假设更好的情况下使用的。既然问题是存在噪声,那么如果能知道噪声的分布(例如高斯噪声),就可以将这些性能相同的假设对应的误差减去由噪声引起的部分,此时再使用奥卡姆剃刀原则或者多释原则来进行假设选择就好了。更常见的做法是引入正则化(regularization)项,在建立模型时避免拟合噪声。
1.4:
解:
1.5:
解:
1.在向搜索引擎提交信息的阶段,能够从提交文本中进行信息提取,进行语义分析。
2.在搜索引擎进行信息匹配的阶段,能够提高问题与各个信息的匹配程度。
3.在向用户展示搜索结果的阶段,能够根据用户对结果感兴趣的程度进行排序。