机器学习_周志华 课后习题答案 第一章 Chapter1
习题1.1
Q:表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。
由所给出的数据集(训练集)可知,属性3个:色泽、根蒂、敲声,其属性值分别有两个。
以A、B分别代表每个属性的两个属性值,“●”代表取什么值都合适。
那么以上的数据集为:1: AAAY ;4:BBBN
因此,我们可以做出的假设规模为:3x3x3+1=28个。
(类似于三个箱子,每个里面取一个球:C(3,1)*C(3,1)*C(3,1))
PS:在此有必要说明一下,我们做出的所有假设均为:(色泽=’’;根蒂=’’;敲声=’’)是好瓜!
版本空间:即假设空间,所有与训练集一致的假设构成的集合(即:我们不收留与训练集相悖的假设)
AAA满足样例1,且不包含样例4,因此放入假设空间
●●●满足样例1,但包含样例4,因此,剔除
接下来我们要做的就是在我们28个假设中,剔除与训练集(样本1,4)相悖的。
——
Step1: 将每个属性的可能存在的属性排列组合,得到可能存在的28种假设;
Step2: 依次判断每种假设是否包含了所有的正例,否,则直接剔除,是则进行下一步;
Step3: 判断该假设是否包含反例(有一个都不行),是,剔除;否,保留。
Step4: 继续判断下一个假设,重复Step2,3
——
废话不多少,直接上代码:
import re # 正则表达式
def get_all_hyp(list_attr):
""""获取所有假设,其中不考虑空集的情况"""
set_hyp = set()
for value_attr0 in list_attr[0]:
for value_attr1 in list_attr[1]:
for value_attr2 in list_attr[2]:
x = value_attr0 + value_attr1 + value_attr2
set_hyp.add(x)
return set_hyp
def classify(list_ins):
"""划分正反例"""
positive_class = []
negative_class = []
for instance in list_ins:
ins = instance[0:3]
if instance[3] is "Y"