Dempster证据理论python复现

证据理论

Dempster合成规则是证据理论的核心,由于在证据理论中需要的先验数据比概率推理理论中的更为直观,再加上Dempster合成公式可以综合不同专家或数据源的知识和数据,使得证据理论在专家系统,信息融合,情报分析,多属性决策等领域广泛应用。

证据理论的概念

  • 基本概率分配(BPA):识别框架上的mass函数,证据不为0的元成为焦元。
  • 似真函数:也称作似真度函数,定义为 P l ( A ) = ∑ B ⋂ A ≠ Φ m ( B ) Pl(A) = \sum_{B\bigcap A\neq \Phi}^{ } m(B) Pl(A)=BA=Φm(B)
  • 信任函数: B e l ( A ) = ∑ B ⊆ A m ( B ) Bel(A) = \sum_{B\subseteq A}^{ } m(B) Bel(A)=BAm(B)
  • 信任区间:新人函数和似真函数组成信任区间

证据理论的特点

  • 满足比bayes概率理论更弱的条件,即不必满足概率可加性。
  • 具有直接表达“不确定”和“不知道”的能力,这些信息表示在mass函数中,并在证据合成过程中保留了这些信息。
  • 证据理论不但允许人们将信度赋予假设空间的单个元素,而且还能赋予它的子集。

Dempster组合公式

m 1 ⊕ m 2 ( A ) = 1 1 − K ∑ B ⋂ C = A m 1 ( B ) m 2 ( C ) m_1 \oplus m_2(A)=\frac{1}{1-K} \sum_{B\bigcap C=A}^{ } m_1(B) m_2(C) m1m2(A)=1K1BC=Am1(B)m2(C)
其中
K = ∑ B ⋂ C = Φ m 1 ( B ) m 2 ( C ) K= \sum_{B\bigcap C=\Phi}^{ } m_1(B)m_2(C) K=BC=Φm1(B)m2(C)

python复现


def bit_and(a,b):
	l = len(a)
	ans =''
	for i in range(l):
		ans += str(int(a[i]) and int(b[i]))
	return ans

def DS_fusions(A):
	#编码那个太难想了,简简单单字符串比较好
	#A为n*3矩阵,首列为证据集合编码,后续两列为支持度。
	#mass函数假设只有两个
	num_terrorist = len(A[0][0])#字符串长度就是单个恐怖分子的数目
	all_terrorist = len(A) #整体数目,用来遍历
	ans = [0] * all_terrorist#最后的答案
	k = 0#算分母
	intersection = 0#算分子,用一个循环算完
	for i in range(all_terrorist):
		first = A[i][0]
		for j in range(all_terrorist):
			second = A[j][0]
			#tmp = first and second
			tmp = bit_and(first,second)
			print(first,second,tmp)
			if tmp == '0'*num_terrorist:
				k += A[i][1]*A[j][2]
			for ii in range(all_terrorist):
				if tmp ==  A[ii][0]:
					ans[ii] += A[i][1]*A[j][2]
	print(1-k)
	for i in range(all_terrorist):
		ans[i] = ans[i]/(1-k)
	return ans

def input_A():
	A = []
	while 1:

		tmp = [input('input terrorist(press q finish input): ')]
		if tmp[0] == 'q':
			break
		tmp.append(float(input('input first mass: ')))
		tmp.append(float(input('input second mass: ')))
		A.append(tmp)
	return A

if __name__ == '__main__':
	# A = input_A()
	# print(A)
	A = [['100',0.4, 0.2], ['010', 0.3, 0.2], ['001', 0.1, 0.05], ['110', 0.1, 0.5], ['111', 0.1, 0.05]]

	print(DS_fusions(A))

输入为n*3维矩阵,矩阵每一行第一列是支持的证据的编码,支持则该位为1,不支持为0。后面两列为两组支持度。
DS_fusions函数为证据融合主函数,一个循环内同时,将两组证据的字符串按位与,如果为‘000’则给K增加,若为A中的某个数则给ans中增加,同时计算分子和分母。

实验结果

实验结果为
[0.4657534246575344, 0.363013698630137, 0.020547945205479458,0.14383561643835618, 0.006849315068493152]与ppt答案一致。

你可能感兴趣的:(AI人工智能,python,机器学习,算法)