DS证据理论的Python实现源代码

科技   2024-12-11 17:30   新加坡  

一、DS证据理论的Python实现

1. 功能描述

  • 输入

    • 类别数量 (M) 及其名称。
    • 证据源数量 (N)。
    • 每个证据源的BPA,用户需输入每个子集及其对应的质量值。
  • 处理

    • 使用Dempster组合规则融合所有证据源的BPA。
    • 处理冲突(即子集交集为空的情况),并进行归一化。
  • 输出

    • 最终融合后的BPA,显示每个子集的质量值。

2. 代码说明

  1. 函数 get_user_input

  • 获取用户输入的类别数量 (M) 及其名称。
  • 获取证据源数量 (N)。
  • 对于每个证据源,用户需输入其非零子集数量,并依次输入每个子集及其对应的质量值。
  • 检查每个证据源的质量总和是否为1,若不为1,则提示错误并终止程序。
  • 函数 combine_bpa

    • 接受两个BPA字典 bpa1bpa2
    • 计算所有子集的交集,并根据Dempster组合规则累加质量。
    • 对组合后的BPA进行归一化,返回新的BPA字典。
  • 函数 print_bpa

    • 打印当前BPA的分配情况。

    3. 使用示例

    假设我们有一个三分类问题,类别为 (A)、(B)、(C),有三个证据源,具体BPA如下:

    • 证据源1

      • (A): 0.6
      • (B): 0.3
      • (\Theta) (全体): 0.1
    • 证据源2

      • (B): 0.5
      • (C): 0.4
      • (\Theta): 0.1
    • 证据源3

      • (A): 0.2
      • (C): 0.5
      • (\Theta): 0.3

    运行步骤

    3.1. 输入类别数量和名称

    请输入类别数量 M: 3
    请输入 3 个类别的名称(用逗号分隔,例如 A,B,C):
    A,B,C

    3.2. 输入证据源数量

    请输入证据源数量 N: 3

    3.3. 输入每个证据源的BPA

    • 证据源1

      请输入第 1 个证据源的BPA:
        请输入该证据源的非零子集数量: 3
          请输入第 1 个子集(例如 A 或 Theta 表示全体): A
          请输入子集 A 的质量值: 0.6
          请输入第 2 个子集(例如 A 或 Theta 表示全体): B
          请输入子集 B 的质量值: 0.3
          请输入第 3 个子集(例如 A 或 Theta 表示全体): Theta
          请输入子集 Theta 的质量值: 0.1
    • 证据源2

      请输入第 2 个证据源的BPA:
        请输入该证据源的非零子集数量: 3
          请输入第 1 个子集(例如 A 或 Theta 表示全体): B
          请输入子集 B 的质量值: 0.5
          请输入第 2 个子集(例如 A 或 Theta 表示全体): C
          请输入子集 C 的质量值: 0.4
          请输入第 3 个子集(例如 A 或 Theta 表示全体): Theta
          请输入子集 Theta 的质量值: 0.1
    • 证据源3

      请输入第 3 个证据源的BPA:
        请输入该证据源的非零子集数量: 3
          请输入第 1 个子集(例如 A 或 Theta 表示全体): A
          请输入子集 A 的质量值: 0.2
          请输入第 2 个子集(例如 A 或 Theta 表示全体): C
          请输入子集 C 的质量值: 0.5
          请输入第 3 个子集(例如 A 或 Theta 表示全体): Theta
          请输入子集 Theta 的质量值: 0.3

    3.4. 程序输出

    程序将依次显示每次融合后的BPA,最终输出融合后的结果:

    === Dempster-Shafer证据理论融合程序 ===
    请输入类别数量 M: 3
    请输入 3 个类别的名称(用逗号分隔,例如 A,B,C):
    A,B,C
    请输入证据源数量 N: 3

    请输入第 1 个证据源的BPA:
      请输入该证据源的非零子集数量: 3
        请输入第 1 个子集(例如 A 或 Theta 表示全体): A
        请输入子集 A 的质量值: 0.6
        请输入第 2 个子集(例如 A 或 Theta 表示全体): B
        请输入子集 B 的质量值: 0.3
        请输入第 3 个子集(例如 A 或 Theta 表示全体): Theta
        请输入子集 Theta 的质量值: 0.1

    初始融合的证据源1的BPA:

      子集 A: 0.6000
      子集 B: 0.3000
      子集 Theta: 0.1000

    正在融合证据源 2...
    证据源 2 的BPA:

      子集 B: 0.5000
      子集 C: 0.4000
      子集 Theta: 0.1000

    融合后的BPA(融合到证据源 2):

      子集 B: 0.6765
      子集 A: 0.1765
      子集 C: 0.1176
      子集 Theta: 0.0294

    正在融合证据源 3...
    证据源 3 的BPA:

      子集 A: 0.2000
      子集 C: 0.5000
      子集 Theta: 0.3000

    融合后的BPA(融合到证据源 3):

      子集 A: 0.2270
      子集 B: 0.4895
      子集 C: 0.2620
      子集 Theta: 0.0210

    === 最终融合结果 ===

      子集 A: 0.2270
      子集 B: 0.4895
      子集 C: 0.2620
      子集 Theta: 0.0210

    4. 代码运行说明

    4.1. 启动程序

    • 将上述代码保存为 ds_evidence.py
    • 在终端或命令行中运行 python ds_evidence.py

    4.2. 输入数据

    • 按照提示输入类别数量、类别名称、证据源数量及每个证据源的BPA。

    4.3. 查看结果

    控我所思VS制之以衡
    专注于控制理论、控制工程、数学、运筹、算法等方面的经验积累与分享
     最新文章