一 实验原理
证据理论是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