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

本文围绕DS证据理论展开实验。该理论是一种不精确推理理论,能处理不确定信息。文中以病人患病情况为例,在给定识别框架和不同证据下,通过定义融合函数、信任与似然函数等步骤,计算不同病症组合的信任区间,并给出了实验代码和运行结果。

一 实验原理

证据理论是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

远歌已逝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值