加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 我的候选消除算法不起作用

发布时间:2020-12-20 13:11:32 所属栏目:Python 来源:网络整理
导读:我试图在 Python中实现“候选消除算法”,但我的代码不起作用. 我写了3个函数: 一致地检查假设和训练样例之间的一致性 more_general用于查找更一般的参数 more_specific用于查找更具体的参数 但我的算法没有添加或删除G和S的假设.我无法找到问题所在.你能帮
我试图在 Python中实现“候选消除算法”,但我的代码不起作用.

我写了3个函数:

>一致地检查假设和训练样例之间的一致性
> more_general用于查找更一般的参数
> more_specific用于查找更具体的参数

但我的算法没有添加或删除G和S的假设.我无法找到问题所在.你能帮助我吗?

# the general hypothesis

G = [ ('?','?','?') ]

# the specific hypothesis

S = [('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',{'sample': ('far','none','yes'),'positive': False},'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))

解决方法

这是您的代码崩溃的地方:

S.remove(s)

        dd = d['sample'] 
        if s == 0:
            h = dd[s]
        else:
            h = '?'  

        if consistent(h,h) for g in G]):
            S.append(h)

s是一个元组,但在if条件下,当你比较零时,你将它视为标量值.在if之后,h包含一个标量,但是在下一个if中,对consistent()的调用期望它的第一个参数,h是一个元组,而不是一个标量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读