1.1
针对西瓜分类分题进行讲解
属性: 3个属性
色泽:(青绿,乌黑,浅白)
根蒂:(蜷缩,硬挺,稍蜷)
敲声:(浊响,清脆,沉闷)
假设空间: 属性所有可能取值组成的可能的样本
假设空间的个数:4 * 4 * 4+1 = 49个,
求法:这三个值组成一个向量,这个向量的每个属性的可能
取值的集合就是假设空间。每个属性可以取通配符 *,为都符合
的意思,上面的+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,(色泽=青绿、根蒂=蜷缩、敲声=浊响),好瓜)
可以删除假设空间中的3、5、6、8、9、11-15、17-21、23-30、32-49
(2,(色泽=乌黑、根蒂=蜷缩、敲声=浊响),好瓜)
可以删除剩余假设空间中的2、10、16、31
(3,(色泽=青绿、根蒂=硬挺、敲声=清脆),坏瓜)
可以删除剩余假设空间中的1
(4,(色泽=乌黑、根蒂=稍蜷、敲声=沉闷),坏瓜)
剩余假设空间中无可删除的假设
学习过后剩余的假设为:
4 色泽=*,根蒂=蜷缩,敲声=*
7 色泽=*,根蒂=*,敲声=浊响
22 色泽=*,根蒂=蜷缩,敲声=浊响
这三个就是这个训练集下的版本空间
总结:
1、写出假设空间:先列出所有可能的样本点(即特征向量)
(即每个属性都取到所有的属性值)
2、对应着给出的已知数据集,将与正样本不一致的、与负样本
一致的假设删除。
若表1.1只含编号为1和4的两个样例,则数据集如下
表 1.1 西瓜数据集
编号 | 色泽 | 根蒂 | 敲声 | 好瓜 |
1 | 青绿 | 蜷缩 | 浊响 | 是 |
4 | 乌黑 | 稍蜷 | 沉闷 | 否 |
从一般到特殊或是从特殊到一般对整个假设空间进行搜索,删除与正例1不一致的假设,或与反例4一致的假设,最终得到版本空间为:
1.(色泽=青绿)∧(根蒂= ∗ )∧(敲声= ∗ )
2.(色泽= ∗ )∧(根蒂=蜷缩)∧(敲声= ∗ )
3.(色泽= ∗ )∧(根蒂= ∗ )∧(敲声=浊响)
4.(色泽=青绿)∧(根蒂=蜷缩)∧(敲声= ∗ )
5.(色泽=青绿)∧(根蒂= ∗ )∧(敲声=浊响)
6.(色泽= ∗ )∧(根蒂=蜷缩)∧(敲声=浊响)
7.(色泽=青绿)∧(根蒂=蜷缩)∧(敲声=浊响)

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)
set_hyp.add("#") #代表空集
return set_hyp
def classify(list_ins):
"""划分正反例"""
positive_class = []
negative_class = []
for instance in list_ins:
ins = instance[0:3]
if instance[3] == "Y":
positive_class.append(ins[0:3])
else:
negative_class.append(ins[0:3])
return positive_class, negative_class
def get_version_space(list_ins, set_hyp):
"""
如果某假设未能包含所有的正例,剔除
如果某假设包含任何反例,剔除
"""
p_class, n_class = classify(list_ins)
delete_items = set()
for hypothesis in set_hyp:
for negative in n_class:
re_hyp_n = re.match(hypothesis, negative) # 判断两者是否匹配
if re_hyp_n is None:
for positive in p_class:
re_hyp_p = re.match(hypothesis, positive)
if re_hyp_p is None:
delete_items.add(hypothesis)
else:
delete_items.add(hypothesis)
version_space = set_hyp - delete_items
return version_space
def main():
#正文案例
# "A"->青绿 "B"->乌黑
# "C"->蜷缩, ”D"->硬挺 “E"->稍蜷
# “F"->浊响 ”G"->清脆 "H" ->沉闷
list_attr = [["A", "B", "."], ["C", "D","E" ,"."], ["F", "G","H", "."]]
list_ins = ["ACFY","BCFY", "ADGN","BDHN"]
all_hypothesis = get_all_hyp(list_attr)
print("假设空间:", all_hypothesis, len(all_hypothesis))
version_space = get_version_space(list_ins, all_hypothesis)
print("版本空间:", version_space, len(version_space))
#练习题1.1
list_attr = [["A", "B", "."], ["C", "D", "."], ["E", "F", "."]]
"""该程序的局限:仅支持三个属性,但属性值任意,有机会再完善"""
list_ins = ["ACEY", "BDFN"]
all_hypothesis = get_all_hyp(list_attr)
print("假设空间:",all_hypothesis, len(all_hypothesis))
version_space = get_version_space(list_ins, all_hypothesis)
print("版本空间:", version_space, len(version_space))
if __name__ == "__main__":
main()
执行结果
假设空间: {'.CF', '.EG', 'ADF', 'BDH', 'AEH', 'BCF', 'BC.', '.EH', 'AEG', 'A.G', 'ACH', 'BEG', 'BE.', '.DF', 'AE.', 'BCH', 'AC.', 'BDF', 'BD.', 'ADH', '..H', '.E.', 'A.F', '.C.', '..F', '.DH', '.EF', 'AD.', 'BCG', 'BEF', 'ACF', 'BEH', 'B.F', 'ACG', 'B.H', 'A..', 'ADG', '#', 'B..', 'B.G', '.DG', '...', '.D.', '.CG', 'AEF', '.CH', '..G', 'A.H', 'BDG'} 49
版本空间: {'.C.', '.CF', '..F'} 3
假设空间: {'.CF', 'ADF', '..E', 'BCF', 'BDE', 'BC.', 'ADE', '.DF', 'A.E', 'BDF', 'AC.', 'BD.', 'A.F', '.C.', '..F', 'AD.', 'BCE', 'ACF', 'B.F', 'A..', 'ACE', 'B..', '...', '#', 'B.E', '.D.', '.DE', '.CE'} 28
版本空间: {'A..', '.C.', 'ACE', '..E', 'A.E', 'AC.', '.CE'} 7
相关参考: