D-S证据融合(Dempster组合规则)——Python3代码实现

该博客介绍了如何使用Python实现Dempster-Shafer证据理论中的概率证据融合,并计算冲突因子。通过`py_intersect`函数计算两个字符串的交集,然后在Dempster融合规则下,对两个证据源的信度进行融合,得到融合后的信度和冲突因子k。示例中展示了具体的融合过程和结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import numpy as np


def py_intersect(string_1, string_2):
    """
    :param string_1: 字符串
    :param string_2: 字符串
    :return: 两字符串的交集
    """
    result = ''
    for char in string_1:
        if char in string_2 and char not in result:
            result += char
    return result


def dempster(mp1, mp2, P):
    """
    :param mp1: 证据源1,numpy数组,存储信度
    :param mp2: 证据源2,numpy数组,存储信度
    :param P: 辨识框架
    :return: 返回融合信度和冲突因子
    """
    l = len(P)  # 幂集长度
    mp = np.zeros((1, l), 'float64')  # 初始化最终结果mp
    k_matrix = np.zeros((l, l))  # 冲突因子乘子
    for k in range(l):
        tmp = P[k]
        f_matrix = np.zeros((l, l))  # 融合乘子
        for i in range(l):
            for j in range(l):
                tmp_ij = py_intersect(P[i], P[j])  # 有无交集
                if not tmp_ij:  # 若空集
                    k_matrix[i][j] = 1
                if tmp_ij == tmp:  # 若交集等于P[k]
                    f_matrix[i][j] = 1
        mp[0][k] = sum(sum(np.dot(mp1.T, mp2) * f_matrix))
    k = sum(sum(np.dot(mp1.T, mp2) * k_matrix))
    mp = mp / (1 - k)
    return mp, k


m1 = np.array([[0.3243, 0, 0, 0, 0, 0, 0.6857]])
m2 = np.array([[0, 0, 0.4696, 0, 0, 0.3054, 0.2250]])

P = ['S', 'E', 'V', 'SE', 'SV', 'EV', 'SEV']

mp, k = dempster(m1, m2, P)
print(f'融合后信度为{mp}')
print(f'冲突因子k = {k}')

### 实现Dempster-Shafer理论的Python代码 为了处理来自不同源的数据融合问题,特别是当数据可能存在冲突时,可以采用Dempster-Shafer证据理论来评估不确定性。下面是一个简单的例子,展示了如何利用此理论计算特征的信任程度。 #### 定义基本概率赋值(BPA) ```python def define_bpa(elements, values): """ 创建一个字典形式的基础概率分配 参数: elements (list): 命题集合中的元素列表 values (list of float): 对应于各元素的概率值 返回: dict: 键为命题组合,值为基础概率分配的结果 """ bpa = {} total_prob = sum(values) if abs(total_prob - 1.0) > 1e-6: raise ValueError("基础概率总和应该等于1") for element, value in zip(elements, values): bpa[frozenset([element])] = value # 添加空集的情况 bpa[frozenset()] = 0.0 return bpa ``` #### 计算信任函数Belief Function 和似真函数 Plausibility Function ```python import itertools def calculate_bel_pl(bpa, hypothesis_set): """ 给定一组假设,返回其对应的信念函数(Bel)和似然函数(Pl) 参数: bpa (dict): 各个命题组合作为其键的基本概率分配表 hypothesis_set (set or frozenset): 考虑的一系列假设组成的集合 返回: tuple(float,float): 第一个是belief function,第二个是plausibility function. """ bel_value = pl_value = 0. all_subsets = [] for i in range(len(hypothesis_set)+1): all_subsets.extend(itertools.combinations(hypothesis_set,i)) for subset in map(frozenset,all_subsets): m_subset = bpa.get(subset, 0.) if not set.isdisjoint(subset,hypothesis_set): bel_value += m_subset if len(set.intersection(subset,hypothesis_set))>0 : pl_value+=m_subset return round(bel_value,4),round(pl_value,4) ``` #### 应用于具体场景的例子 考虑给定的地图更新情况,其中`p=7`次观测报告存在某个标志物而`q=3`次未发现它: ```python if __name__ == "__main__": p_times_seen = 7 q_times_not_seen = 3 total_observations = p_times_seen + q_times_not_seen seen_propability = p_times_seen / total_observations unseen_probability = q_times_not_seen / total_observations # 构建bpa bpa = define_bpa(['seen', 'unseen'], [seen_propability, unseen_probability]) # 测试对于'存在'这一假设下的bel与pl belief, plausibility = calculate_bel_pl(bpa, {'seen'}) print(f"Bel(seen)={belief}, Pl(seen)={plausibility}") ``` 上述程序片段定义了两个主要功能——构建基本概率分配以及基于这些分配计算特定假设的信任度和支持度。最后部分提供了一个具体的实例应用,即根据提供的观测次数比例创建相应的BPA,并据此求解目标对象存在的可能性范围[^2]。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值