本文主要是介绍论文阅读——《A new combination method based on Pearson coefficient and information entropy for multi-sens》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、DS证据理论合成规则计算
- 二、论文提出的方法的计算过程
- 1、构造相关矩阵,并对其进行修正。
- 2、计算两个BBA之间的证据距离,并构造evidence distance matrix D(证据距离矩阵)。
- 3、计算证据 m i m_{i} mi和其他证据之间的距离
- 4、计算证据 m i m_{i} mi 的可信度水平 C r d Crd Crd,并作归一化 C r d ~ \widetilde{Crd} Crd
- 5、计算证据 m i m_{i} mi 的信息熵 Q Q Q
- 6、计算证据 m i m_{i} mi 的信息量 I V IV IV,并做归一化 I V ~ \widetilde{IV} IV
- 7、计算证据 m i m_{i} mi 的权重因子 W W W,并做归一化 W ~ \widetilde{W} W
- 8、得到 weighted average evidence (加权平均证据)
- 9、替换成新的加权平均证据,按照前文的DS融合规则进行融合。
- 完整代码:写成函数的形式
- 总结
前言
- 本文主要针对论文中提出的一个基于Dempster-Shafer证据理论(DS证据理论)对多个证据融合的新方法,给出了相应的计算代码,以便大家对该算法有一个更直观的认知和看法。因此,这里对DS理论的一些基本概念不做过多的介绍,在阅读本文之前,如果对DS理论不太熟悉,大家可以先去下面这几篇内容做一个详细的了解,再来阅读本文会更好。😀
- 一文读懂DS证据理论用法(详细公式步骤版)
- Dempster–Shafer theory(D-S证据理论)初探
- 浙大教授课件 第五章D-S证据理论
❗论文名称:A new combination method based on Pearson coefficient and information entropy for multi-sens(一种基于Pearson系数和信息熵的多传感器数据融合的新组合方法)
👀论文信息:由北京交通大学张阳等人2023年6月发表在《Information and Software Technology》期刊上
🎆论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0950584923001027
📌论文主要贡献:
- 面对一些非常矛盾的证据时,DS理论可能会表现出一些不足。该文介绍了一种基于Pearson相关系数和信息熵的冲突证据增强融合技术,通过事先处理证据体来解决矛盾信息。最终通过例子说明提出的技术可以处理高度冲突的证据,从而产生更精确的融合结果,有助于做出合理的决策。
一、DS证据理论合成规则计算
- 网上可以找到很多计算的例子,但是绝大多数只涉及到两个证据的融合,几乎没有涉及到更多的证据。尽管计算时也只需要两两计算即可,但是这里给出计算多个证据融合的具体过程以及相应的Python实现代码,方便自己有一个更清晰的理解。
- 以论文中所给的例子为例:
假设在不同地点部署了五种不同类型的探测器,以监督一个共同目标,则有三种可能的监视目标,它们构成识别框架Ω = {A, B, C}。传感器的指示由五个证据m1, m2, m3, m4, m5表示,具体如下:
- 融合结果计算过程:
首先还得了解一下DS理论的合成规则:
阅读以上的几篇内容可以发现,计算时习惯把证据作为行,事件作为列。因此,为方便计算,这里也写成同样的形式,其实就是将上面矩阵做一个转置:
暂且把上面这些数据组成的矩阵称之为证据-事件矩阵
。
根据上面的融合规则,首先计算 m 1 m_{1} m1和 m 2 m_{2} m2的融合结果:
F i r s t : c o m p u t e K ; K 表示的是事件交集不为空的两个 m a s s 函数的乘积的和 First:compute \quad K;K表示的是事件交集不为空的两个mass函数的乘积的和 First:computeK;K表示的是事件交集不为空的两个mass函数的乘积的和
K = m 1 ( A ) ∗ m 2 ( A ) + m 1 ( B ) ∗ m 2 ( B ) + m 1 ( C ) ∗ m 2 ( C ) + m 1 ( A , C ) ∗ m 2 ( A , C ) + m 1 ( A ) ∗ m 2 ( A , C ) + m 1 ( C ) ∗ m 2 ( A , C ) + m 2 ( A ) ∗ m 1 ( A , C ) + m 2 ( C ) ∗ m 1 ( A , C ) = 0.41 ∗ 0 + 0.29 ∗ 0.9 + 0.3 ∗ 0.1 + 0 ∗ 0 + 0.41 ∗ 0 + 0.3 ∗ 0 + 0 ∗ 0 + 0.1 ∗ 0 \begin{align*} K=m_{1}(A)*m_{2}(A)+m_{1}(B)*m_{2}(B)+m_{1}(C)*m_{2}(C)+m_{1}(A,C)*m_{2}(A,C)\\+m_{1}(A)*m_{2}(A,C)+m_{1}(C)*m_{2}(A,C)\\+m_{2}(A)*m_{1}(A,C)+m_{2}(C)*m_{1}(A,C)\\=0.41*0+0.29*0.9+0.3*0.1+0*0+0.41*0+0.3*0+0*0+0.1*0 \end{align*} K=m1(A)∗m2(A)+m1(B)∗m2(B)+m1(C)∗m2(C)+m1(A,C)∗m2(A,C)+m1(A)∗m2(A,C)+m1(C)∗m2(A,C)+m2(A)∗m1(A,C)+m2(C)∗m1(A,C)=0.41∗0+0.29∗0.9+0.3∗0.1+0∗0+0.41∗0+0.3∗0+0∗0+0.1∗0
S e c o n d : c o m p u t e m a s s 函数 Second:compute\quad mass函数 Second:computemass函数
m 12 ( A ) = 1 K ∗ [ m 1 ( A ) ∗ m 2 ( A ) + m 1 ( A ) ∗ m 2 ( A , C ) + m 2 ( A ) ∗ m 1 ( A , C ) ] = 1 K ∗ [ 0.41 ∗ 0 + 0.41 ∗ 0 + 0 ∗ 0 ] \begin{align*} m_{12}(A) = \frac{1}{K}*[m_{1}(A)*m_{2}(A)+m_{1}(A)*m_{2}(A,C)+m_{2}(A)*m_{1}(A,C)]\\=\frac{1}{K}*[0.41*0+0.41*0+0*0]\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad \end{align*} m12(A)=K1∗[m1(A)∗m2(A)+m1(A)∗m2(A,C)+m2(A)∗m1(A,C)]=K1∗[0.41∗0+0.41∗0+0∗0]
m 12 ( B ) 、 m 12 ( C ) 、 m 12 ( A , C ) 计算同理,然后两两计算,得到最终的融合结果。 m_{12}(B)、 m_{12}(C)、 m_{12}(A,C)计算同理,然后两两计算,得到最终的融合结果。 m12(B)、m12(C)、m12(A,C)计算同理,然后两两计算,得到最终的融合结果。
- 下面直接看代码实现过程:
import numpy as np
np.set_printoptions(precision=8)
def DS_cal(mat:np.ndarray): # 输入mat是 证据-事件矩阵# 计算两两证据融合的结果,直到全部融合# 思路:计算m1和m2的融合结果m12,把m12的值赋值给m2,然后计算m2和m3,得到的值赋给m3,...,依次直至计算到最后一列i = 0while i<mat.shape[1]-1:K = np.round(sum(mat[:,i]*mat[:,i+1]) + (mat[:,i][0]+mat[:,i][2]) * mat[:,i+1][3] + (mat[:,i+1][0]+mat[:,i+1][2]) * mat[:,i][3],8)mat[:,i+1][0] = mat[:,i][0] * mat[:,i+1][0] + mat[:,i][0] * mat[:,i+1][3] + mat[:,i][3] * mat[:,i+1][0]mat[:,i+1][1] = mat[:,i][1] * mat[:,i+1][1]mat[:,i+1][2] = mat[:,i][2] * mat[:,i+1][2] + mat[:,i][2] * mat[:,i+1][3] + mat[:,i][3] * mat[:,i+1][2]mat[:,i+1][3] = mat[:,i][3] * mat[:,i+1][3]mat[:,i+1] = mat[:,i+1] / K# print(mat[:,i+1])i+=1return mat[:,-1]mat = np.array([[0.41,0.29,0.3,0], [0,0.9,0.1,0], [0.58,0.07,0,0.35],[0.55,0.1,0,0.35],[0.6,0.1,0,0.3]],dtype=np.float64)
mat = mat.T
print(np.round(DS_cal(mat),4))>>>[0. 0.1422 0.8578 0. ]
对比论文中结果,计算无误。
二、论文提出的方法的计算过程
- 该方法的计算流程:
- 具体计算过程:
1、构造相关矩阵,并对其进行修正。
- 计算两两证据之间的相关系数 r i j r_{ij} rij,得到构成证据体的相关性矩阵 S S S:
- 修正的相关系数 r ~ i j \tilde{r}_{ij} r~ij 和修正的相关矩阵 S ~ \tilde{S} S~ 为:
- 代码:
import numpy as np
mat = np.array([[0.41,0.29,0.3,0], [0,0.9,0.1,0], [0.58,0.07,0,0.35],[0.55,0.1,0,0.35],[0.6,0.1,0,0.3]])
S = np.zeros((mat.shape[0],mat.shape[0]))
D = np.zeros((mat.shape[0],mat.shape[0]))
def r_(x):return 1/ (1+np.exp(-5*x))
for i in range(S.shape[0]):for j in range(S.shape[1]):value = round(r_(np.corrcoef(mat[i],mat[j])[0][1]) ,4) # 填充的值S[i, j] = valueS[j, i] = value
print(S)
- 结果:
2、计算两个BBA之间的证据距离,并构造evidence distance matrix D(证据距离矩阵)。
- 两个证据之间的 J o u s s e l m e Jousselme Jousselme 距离为:
注意:上面式子中的D不同于要构造的证据距离矩阵D。
这里的D中的元素计算公式为:
其中, ∣ . ∣ \begin{vmatrix}.\end{vmatrix} . 表示集合中元素的个数。
因此,这里的 D D D为:
计算如下: - 代码如下:
def d_(a,b,Distance):return np.sqrt(0.5 * (a-b) @ Distance @ (a-b).T)for i in range(D.shape[0]):for j in range(D.shape[1]):value = round(d_(mat[i],mat[j],Distance=np.array([[1,0,0,0.5],[0,1,0,0],[0,0,1,0.5],[0.5,0,0.5,1]])),4) # 填充的值# print(value)D[i, j] = valueD[j, i] = value
- 结果
3、计算证据 m i m_{i} mi和其他证据之间的距离
- 计算公式为:
- 代码:
# 考虑到D的主对角元素全部为0,因此直接按列元素求和即可
distance_m = np.sum(D,axis=1)
print(distance_m)>>>array([1.5449, 2.9284, 1.2311, 1.1761, 1.1945])
论文中给出的结果中 d 5 d_{5} d5的数值为1.1944,应该是写错了。如果个人理解有误。欢迎指正。🍳
4、计算证据 m i m_{i} mi 的可信度水平 C r d Crd Crd,并作归一化 C r d ~ \widetilde{Crd} Crd
- 计算公式:
- 代码:
## 计算crd
Crd = list(range(S.shape[0]))
Crd_ = []
bbb = 0
for i in range(S.shape[0]):bbb += np.sqrt(np.sum(np.power(S[i] , 2)) - S[i][i]**2)
for i in range(S.shape[0]):aaa = np.sqrt(np.sum(np.power(S[i] , 2)) - S[i][i]**2)Crd[i] = aaa / bbb / distance_m[i]
for i in range(len(Crd)):Crd_.append(round(Crd[i] / sum(Crd),4))
print(Crd_)
- 结果:
5、计算证据 m i m_{i} mi 的信息熵 Q Q Q
- 计算公式:
当 ∣ A ∣ = 1 |A|=1 ∣A∣=1时,可写成:
- 代码:
## 计算Q
Q = []
count_elements = [1,1,1,2] #包含在子集A中的元素的个数
for i in range(S.shape[0]):qqq = 0index = 0for j in mat[i]:if j == 0:logj = 0else:logj = np.log2(j * np.exp((count_elements[index] - 1)/ 3) / (2**count_elements[index] - 1))qqq += j * logjindex+=1Q.append(round(-qqq, 4))
print(Q)
- 结果:
6、计算证据 m i m_{i} mi 的信息量 I V IV IV,并做归一化 I V ~ \widetilde{IV} IV
- 计算公式:
- 代码:
IV_ = []
IV = np.exp(Q)
for i in IV:IV_.append(round(i/sum(IV),4))
print(IV_)
- 结果:
7、计算证据 m i m_{i} mi 的权重因子 W W W,并做归一化 W ~ \widetilde{W} W
- 计算公式:
- 代码:
## 计算W_
W = []
W_ = []
for i in range(len(Crd_)):W.append(float(Crd_[i] * float(IV_[i])))
for i in W:W_.append(round(i/sum(W),4))
print(W_)
- 结果:
8、得到 weighted average evidence (加权平均证据)
- 计算公式:
- 代码:
## 计算WAE(m)
M = []
for i in range(mat.shape[1]):M.append(round((sum((mat[:,i]) * np.array(W_))),4))
print(M)
- 结果:
- 注意:这里论文中给出的值应该是有误的,如果按照论文中给出加权平均证据的值计算,是得不到最终的结果的。大家也可以尝试一下,如果有误,请指正。
9、替换成新的加权平均证据,按照前文的DS融合规则进行融合。
- 代码:
mat = np.array([[0.5401, 0.1356, 0.0499, 0.2744], [0.5401, 0.1356, 0.0499, 0.2744], [0.5401, 0.1356, 0.0499, 0.2744],[0.5401, 0.1356, 0.0499, 0.2744],[0.5401, 0.1356, 0.0499, 0.2744]],dtype=np.float64)
mat = mat.T
print(np.round(DS_cal(mat),4))
- 结果:
与论文中给出的结果一致:
完整代码:写成函数的形式
import numpy as npdef r_(x):return 1/ (1+np.exp(-5*x)) def d_(a,b,Distance):return np.sqrt(0.5 * (a-b) @ Distance @ (a-b).T)def Weight_average_evidence(mat,Distance):S = np.zeros((mat.shape[0],mat.shape[0]))D = np.zeros((mat.shape[0],mat.shape[0]))for i in range(S.shape[0]):for j in range(S.shape[1]):value = round(r_(np.corrcoef(mat[i],mat[j])[0][1]) ,4) # 填充的值S[i, j] = valueS[j, i] = valuefor i in range(D.shape[0]):for j in range(D.shape[1]):value = round(d_(mat[i],mat[j],Distance=Distance),4) # 填充的值# print(value)D[i, j] = valueD[j, i] = valuedistance_m = np.sum(D,axis=1)## 计算crdCrd = list(range(S.shape[0]))Crd_ = []bbb = 0for i in range(S.shape[0]):bbb += np.sqrt(np.sum(np.power(S[i] , 2)) - S[i][i]**2) for i in range(S.shape[0]):aaa = np.sqrt(np.sum(np.power(S[i] , 2)) - S[i][i]**2)Crd[i] = aaa / bbb / distance_m[i]for i in range(len(Crd)):Crd_.append(round(Crd[i] / sum(Crd),4))## 计算QQ = []count_elements = [1,1,1,2] #包含在子集A中的元素的个数 for i in range(S.shape[0]):qqq = 0index = 0for j in mat[i]:if j == 0:logj = 0else:logj = np.log2(j * np.exp((count_elements[index] - 1)/ 3) / (2**count_elements[index] - 1))qqq += j * logjindex+=1Q.append(round(-qqq, 4))## 计算IV_IV_ = []IV = np.exp(Q)for i in IV:IV_.append(round(i/sum(IV),4))## 计算W_W = []W_ = []for i in range(len(Crd_)):W.append(float(Crd_[i] * float(IV_[i])))for i in W:W_.append(round(i/sum(W),4))## 计算WAE(m)M = []for i in range(mat.shape[1]):M.append(round((sum((mat[:,i]) * np.array(W_))),4))return M
Weight_average_evidence(mat=np.array([[0.41,0.29,0.3,0], [0,0.9,0.1,0], [0.58,0.07,0,0.35],[0.55,0.1,0,0.35],[0.6,0.1,0,0.3]]),Distance=np.array([[1,0,0,0.5],[0,1,0,0],[0,0,1,0.5],[0.5,0,0.5,1]]))
总结
- 1.本文给出了一个基于DS理论融合规则计算多个证据融合结果的Python代码。
- 2.对论文《A new combination method based on Pearson coefficient and information entropy for multi-sens》中计算多传感器数据融合的方法和步骤作了比较详细的介绍。
- 觉得有帮助的话,给个赞吧🐱🏍🐱🏍🐱🏍
这篇关于论文阅读——《A new combination method based on Pearson coefficient and information entropy for multi-sens》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!