我正在尝试实施候选消除算法"在Python中,但我的代码不起作用。
我写了3个函数:
consistent
用于检查假设和培训示例之间的一致性more_general
用于查找更一般的参数more_specific
用于查找更具体的参数但我的算法不会添加或删除G
和S
中的假设。我找不到问题所在。你能救我吗?
# the general hypothesis
G = [ ('?', '?', '?', '?') ]
# the specific hypothesis
S = [('0', '0', '0', '0')]
# attributes:
AV = (['short', 'far'], ['cheap', 'expensive'], ['many', 'none'], ['yes', 'no'])
# training examples:
D = [
{'sample': ('far', 'cheap', 'many', 'no' ), 'positive': True },
{'sample': ('short', 'expensive', 'many', 'no' ), 'positive': True },
{'sample': ('far', 'expensive', 'none', 'yes'), 'positive': False},
{'sample': ('short', 'cheap', 'none', 'yes'), 'positive': False},
{'sample': ('short', 'cheap', 'many', 'yes'), 'positive': True }
]
def consistent(hypothesis, sample):
return all([hypothesis[i] == sample[i] or hypothesis[i] == '?' for i in
range(len(hypothesis))])
def more_general(a, b):
result = False
if a == '0' and b != '0':
result = True
elif a != '?' and b == '?':
result = True
return result
def more_specific(a, b):
result = False
if a == '?' and b != '?':
result = True
elif a != '0' and b == '0':
result = True
return result
for d in D:
if d['positive']:
G = [g for g in G if consistent(g, d['sample'])]
for s in S:
if not consistent(s, d['sample']):
S.remove(s)
# Adding to S all minimal generalizations of s by h:
dd = d['sample']
if s == 0:
h = dd[s]
else:
h = '?'
if consistent(h, d['sample']) and any([more_general(g, h) for g in G]):
S.append(h)
#Removing from S any hypothesis that is more general than another hypothesis in S
for s2 in S:
if any([more_general(s2, s3) and not s2 == s3 for s3 in S]):
S.remove(s2)
else:
S = [s for s in S if not consistent(s, d['sample'])]
for g in G:
if consistent(g, d['sample']):
G.remove(g)
# Add to G all minimal specializations h of g
for ai in range(len(AV)):
if g[ai] == '?':
h = list(g)
h[ai] = AV[ai][1 - AV[ai].index(d['sample'][ai])]
h = tuple(h)
if not consistent(h, d['sample']) and any([more_specific(s, h) for s in S]):
G.append(h)
print('Sample: {} {}\nG: {}\nS: {}\n'.format('+' if d['positive'] else '-', d['sample'], G, S))
答案 0 :(得分:0)
这是我的代码崩溃的地方:
S.remove(s)
dd = d['sample']
if s == 0:
h = dd[s]
else:
h = '?'
if consistent(h, d['sample']) and any([more_general(g, h) for g in G]):
S.append(h)
s
是一个元组,但在if
条件下,与零比较时,您将其视为标量值。在if
后,h
包含标量,但在下一个if
中,对consistent()
的调用期望其第一个参数h
为元组,不是标量。