D-S证据推理算法(人工智能导论实验)

一 实验原理

证据理论是Dempster于1967年首先提出,由他的学生Shafer于1976年进一步发展起来的一种不精确推理理论,也称为Dempster/Shafer 证据理论(D-S证据理论),属于人工智能范畴,最早应用于专家系统中,具有处理不确定信息的能力。作为一种不确定推理方法,证据理论的主要特点是:满足比贝叶斯概率论更弱的条件;具有直接表达“不确定”和“不知道”的能力。 在DS证据理论中,由互不相容的基本命题(假定)组成的完备集合称为识别框架,表示对某一问题的所有可能答案,但其中只有一个答案是正确的。该框架的子集称为命题。分配给各命题的信任程度称为基本概率分配(BPA,也称m函数),m(A)为基本可信数,反映着对A的信度大小。信任函数Bel(A)表示对命题A的信任程度,似然函数Pl(A)表示对命题A非假的信任程度,也即对A似乎可能成立的不确定性度量,实际上,[Bel(A),Pl(A)]表示A的不确定区间,[0,Bel(A)]表示命题A支持证据区间,[0,Pl(A)]表示命题A的拟信区间, [Pl(A),1]表示命题A的拒绝证据区间。设m1和m2是由两个独立的证据源(传感器)导出的基本概率分配函数,则Dempster组合规则可以计算这两个证据共同作用产生的反映融合信息的新的基本概率分配函数。

二· 案例描述

  • 案例描述:
    某个病人可能患有的病:[cold,flu,meningitis,indigestion],可以根据不同医生给出的证据推理出这个病人大概率患哪几种病。
  • 问题描述:
    在识别框架[cold,flu,meningitis,indigestion]下,
    给定以下三个不同的证据:
    [[{‘cold’, ‘flu’},0.6], [{‘meningitis’},0.2], [{‘indigestion’},0.1], [{‘’},0.1]]
    [[{‘meningitis’,‘indigestion’},0.7], [{‘’},0.3]]
    [[{‘cold’,‘flu’,‘indigestion’},0.99], [{‘’},0.01]]
    ’ '代表全集。分别计算:
    [‘flu’,‘indigestion’,‘cold’],
    [‘flu’,‘cold’],
    [‘meningitis’,‘indigestion’],
    [‘indigestion’],
    [‘meningitis’]
    的信任区间。
  • 具体步骤:
    (1) 定义mass融合函数,融合不同证据提供的mass函数得到组合mass函数
    (2) 定义信任函数和似然函数。
    (3) 整理结果得到最终信任区间

三 实验代码

import pprint

ill_all = {'cold', 'flu', 'meningitis', 'indigestion'}
ill_gai_1 = {('cold', 'flu'): 0.6, 'meningitis': 0.2, 'indigestion': 0.1,
             ('cold', 'flu', 'meningitis', 'indigestion'): 0.1}
ill_gai_2 = {('meningitis', 'indigestion'): 0.7, ('cold', 'flu', 'meningitis', 'indigestion'): 0.3}
ill_gai_3 = {('cold', 'flu', 'indigestion'): 0.99, ('cold', 'flu', 'meningitis', 'indigestion'): 0.01}
need_list = [
    ['flu', 'indigestion', 'cold'],
    ['flu', 'cold'],
    ['meningitis', 'indigestion'],
    ['indigestion'],
    ['meningitis']
]


def work_k(see: dict, stt: dict) -> int:
    k_value = 0
    tag = 0
    for i, j in see.items():
        for a, b in stt.items():
            if isinstance(i, tuple) and isinstance(a, tuple):
                for te in i:
                    if te in a:
                        tag = 1
                    else:
                        pass
                if tag == 0:
                    k_value += j * b

            if isinstance(i, tuple) and not isinstance(a, tuple):
                if a in i:
                    pass
                else:
                    k_value += j * b
            if not isinstance(i, tuple) and isinstance(a, tuple):
                if i in a:
                    pass
                else:
                    k_value += j * b

    return 1 - k_value


def work_dict(see: dict, stt: dict) -> dict:
    all_dict = dict()
    all_set = set()
    temp_set = set()
    for i, j in see.items():
        for a, b in stt.items():
            all_set.discard(())
            if isinstance(i, tuple) and isinstance(a, tuple):
                temp_set.clear()
                for te in i:
                    if te in a:
                        temp_set.add(te)
                    else:
                        pass
                # print(len(temp_set))
                if len(temp_set) == 1:
                    temp_set_str = ''.join(temp_set)
                    tae = 0
                    for one in all_set:
                        if isinstance(one, tuple):
                            pass
                        else:
                            if one == temp_set_str:
                                all_dict[one] += j * b
                                temp_set.clear()

                    pass
                else:
                    ta_ = 0
                    for one in all_set:
                        if isinstance(one, tuple):
                            if tuple(temp_set) == one:
                                all_dict[one] += j * b
                                ta_ = 1
                            else:
                                pass
                        else:
                            if i == one:
                                all_dict[one] += j * b

                                ta_ = 1
                            else:
                                pass

                    if ta_ == 1:
                        pass
                    else:
                        all_dict.update({tuple(temp_set): j * b})
                        all_set.add(tuple(temp_set))
                        temp_set.clear()
            if () in all_dict:
                del all_dict[()]

            if (not isinstance(i, tuple)) and isinstance(a, tuple):
                tagg = 0
                aa = list(all_set)
                if i in a:
                    gaaa = 0
                    for te in aa:
                        if isinstance(te, tuple):
                            if i in a and i in te:
                                all_dict[te] += j * b
                                gaaa = 1
                            elif i in a and i not in te:
                                pass
                            elif i not in a:
                                gaaa = 3
                        else:
                            if i in a and i == te:
                                all_dict[te] += j * b
                                gaaa = 1
                            elif i != te:
                                pass
                    if gaaa == 0:
                        all_dict.update({i: j * b})
                        all_set.add(i)
                    else:
                        pass
                else:
                    pass

    # del all_dict[()]
    return all_dict


def believe(tee: list, deal_dic: dict) -> list:
    res_list = []
    res_dict = {}

    for i in tee:
        print('=--------------' + str(i))
        if len(i) == 1:
            for a, b in deal_dic.items():
                if isinstance(a, tuple):
                    pass
                else:
                    if ''.join(i) == a:
                        if ''.join(i) in res_dict:
                            res_dict[''.join(i)] += b
                        else:
                            res_dict[''.join(i)] = b
                    else:
                        pass
        else:
            temp = set(i)
            for a, b in deal_dic.items():
                if isinstance(a, tuple):
                    if set(a).issubset(temp):
                        if tuple(i) in res_dict:
                            res_dict[tuple(i)] += b
                        else:
                            res_dict[tuple(i)] = b
                    elif set(a) == temp:
                        if tuple(i) in res_dict:
                            res_dict[tuple(i)] += b
                        else:
                            res_dict[tuple(i)] = b
                    else:
                        pass
                else:
                    if a in temp:
                        if tuple(i) in res_dict:
                            res_dict[tuple(i)] += b
                        else:
                            res_dict[tuple(i)] = b
                    else:
                        pass
        print(res_dict)
    for ii, jj in res_dict.items():
        res_list.append(jj)
    return res_list


def plausibility(tee: list, deal_set: set, deal_dic: dict) -> list:
    res_list = []
    for i in tee:
        te_list = []
        for j in deal_set:
            if j in i:
                pass
            else:
                te_list.append(j)
        res_list.append(te_list.copy())
        te_list.clear()
    in_te_list = believe(res_list, deal_dic)
    res_num_list = []
    for i in in_te_list:
        res_num_list.append(1 - i)

    return res_num_list


if __name__ == '__main__':
    k_1 = work_k(ill_gai_1, ill_gai_2)
    cen_dic = work_dict(ill_gai_1, ill_gai_2)
    print(cen_dic)
    for i, j in cen_dic.items():
        cen_dic[i] = cen_dic[i] / k_1
    print(cen_dic)
    su = 0
    for i, j in cen_dic.items():
        su += j
    print(su)
    print("======================================================================")
    k_2 = work_k(cen_dic, ill_gai_3)
    fin_dic = work_dict(cen_dic, ill_gai_3)
    print(fin_dic)
    for i, j in fin_dic.items():
        fin_dic[i] = fin_dic[i] / k_2
    pprint.pprint(fin_dic, width=1)
    sum = 0
    for i, j in fin_dic.items():
        sum += j
    print(sum)
    print('''=================================
    =====================================================
    ===============================================================================''')
    bel_fun = believe(need_list, fin_dic)
    pla_fun = plausibility(need_list, ill_all, fin_dic)

    print("结果是")
    all_ = []
    zip_list = zip(bel_fun, pla_fun)
    for i in zip_list:
        all_.append(list(i))
    need_tuple = [set(a) for a in need_list]

    res_zip_list = zip(need_tuple, all_)
    result = []
    for i in res_zip_list:
        result.append(tuple(i))
    pprint.pprint(result)

运行结果

真正有用的,需要的结果

# 结果是
[({'flu', 'cold', 'indigestion'}, [0.9921465968586385, 0.9947643979057592]),
 ({'flu', 'cold'}, [0.4712041884816753, 0.549738219895288]),
 ({'meningitis', 'indigestion'}, [0.4502617801047119, 0.5287958115183247]),
 ({'indigestion'}, [0.44319371727748674, 0.5235602094240839]),
 ({'meningitis'}, [0.005235602094240835, 0.007853403141361515])]

下边是上边的全部输出

{('flu', 'cold'): 0.18, 'meningitis': 0.19999999999999998, 'indigestion': 0.09999999999999999, ('meningitis', 'indigestion'): 0.06999999999999999, ('indigestion', 'flu', 'cold', 'meningitis'): 0.03}
{('flu', 'cold'): 0.31034482758620685, 'meningitis': 0.34482758620689646, 'indigestion': 0.17241379310344823, ('meningitis', 'indigestion'): 0.12068965517241377, ('indigestion', 'flu', 'cold', 'meningitis'): 0.051724137931034475}
0.9999999999999999
======================================================================
{('flu', 'cold'): 0.31034482758620685, 'meningitis': 0.0034482758620689646, 'indigestion': 0.29189655172413786, ('meningitis', 'indigestion'): 0.0012068965517241378, ('flu', 'cold', 'indigestion'): 0.051206896551724126, ('meningitis', 'flu', 'cold', 'indigestion'): 0.0005172413793103447}
{'indigestion': 0.44319371727748674,
 'meningitis': 0.005235602094240835,
 ('flu', 'cold'): 0.4712041884816753,
 ('flu', 'cold', 'indigestion'): 0.07774869109947641,
 ('meningitis', 'flu', 'cold', 'indigestion'): 0.0007853403141361254,
 ('meningitis', 'indigestion'): 0.0018324607329842928}
0.9999999999999997
=================================
    =====================================================
    ===============================================================================
=--------------['flu', 'indigestion', 'cold']
{('flu', 'indigestion', 'cold'): 0.9921465968586385}
=--------------['flu', 'cold']
{('flu', 'indigestion', 'cold'): 0.9921465968586385, ('flu', 'cold'): 0.4712041884816753}
=--------------['meningitis', 'indigestion']
{('flu', 'indigestion', 'cold'): 0.9921465968586385, ('flu', 'cold'): 0.4712041884816753, ('meningitis', 'indigestion'): 0.4502617801047119}
=--------------['indigestion']
{('flu', 'indigestion', 'cold'): 0.9921465968586385, ('flu', 'cold'): 0.4712041884816753, ('meningitis', 'indigestion'): 0.4502617801047119, 'indigestion': 0.44319371727748674}
=--------------['meningitis']
{('flu', 'indigestion', 'cold'): 0.9921465968586385, ('flu', 'cold'): 0.4712041884816753, ('meningitis', 'indigestion'): 0.4502617801047119, 'indigestion': 0.44319371727748674, 'meningitis': 0.005235602094240835}
=--------------['meningitis']
{'meningitis': 0.005235602094240835}
=--------------['meningitis', 'indigestion']
{'meningitis': 0.005235602094240835, ('meningitis', 'indigestion'): 0.4502617801047119}
=--------------['flu', 'cold']
{'meningitis': 0.005235602094240835, ('meningitis', 'indigestion'): 0.4502617801047119, ('flu', 'cold'): 0.4712041884816753}
=--------------['meningitis', 'flu', 'cold']
{'meningitis': 0.005235602094240835, ('meningitis', 'indigestion'): 0.4502617801047119, ('flu', 'cold'): 0.4712041884816753, ('meningitis', 'flu', 'cold'): 0.4764397905759161}
=--------------['flu', 'cold', 'indigestion']
{'meningitis': 0.005235602094240835, ('meningitis', 'indigestion'): 0.4502617801047119, ('flu', 'cold'): 0.4712041884816753, ('meningitis', 'flu', 'cold'): 0.4764397905759161, ('flu', 'cold', 'indigestion'): 0.9921465968586385}
结果是
[({'flu', 'cold', 'indigestion'}, [0.9921465968586385, 0.9947643979057592]),
 ({'flu', 'cold'}, [0.4712041884816753, 0.549738219895288]),
 ({'meningitis', 'indigestion'}, [0.4502617801047119, 0.5287958115183247]),
 ({'indigestion'}, [0.44319371727748674, 0.5235602094240839]),
 ({'meningitis'}, [0.005235602094240835, 0.007853403141361515])]

友情链接

这个链接是另一个人写的。
https://blog.csdn.net/2301_78700076/article/details/134997371?spm=1001.2014.3001.5502

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远歌已逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值