论文学习笔记

RCML

RCML的融合方法,A,B视图融合后仍能保持原来的性质,验证代码如下:

import numpy as np


def generate_numbers(k):
    # 生成 k-1 个非负随机数(b)
    b = np.random.rand(k - 1)
    b = np.abs(b)  # 确保所有 b 都是非负数
    total_b = np.sum(b)

    # 生成一个非负随机数(u)
    u = np.random.rand()
    u = max(0, u)  # 确保 u 是非负数

    # 将 u 添加到 b 中,使得所有 b 的和再加上 u 等于 1
    total_sum = total_b + u
    if total_sum != 1:
        scale_factor = 1 / total_sum
        b *= scale_factor
        u *= scale_factor

    # 返回 b 和 u
    return b, u


# 测试生成数字
k = 5  # 设置数字的数量
bA, uA = generate_numbers(k+1)
SA=k/uA
alphaA=SA*bA+1
print("SA:",SA)
print("数字 bA 和 uA 的总和:", np.sum(bA) + uA)
print("wA的参数:")
print("生成的数字 bA:", bA)
print("生成的数字 uA:", uA)
print("alphaA",alphaA)



bB, uB = generate_numbers(k+1)
SB=k/uB
alphaB=SB*bB+1
print("SB:",SB)
print("数字 bB 和 uB 的总和:", np.sum(bB) + uB)
print("wB的参数:")
print("生成的数字 bB:", bB)
print("生成的数字 uB:", uB)
print("alphaB",alphaB)


#A,B融合后
bAB=(bA*uB+bB*uA)/(uA+uB)

uAB=2*uA*uB/(uA+uB)

alphaAB=(alphaA+alphaB)/2

print("wAB的参数:")
print("生成的数字 bAB:", bAB)
print("生成的数字 uAB:", uAB)
print("alphaAB",alphaAB)

#验证性质
print("数字 bAB 和 uAB 的总和:", np.sum(bAB) + uAB)

SAB=k/uAB
print("SAB:",SAB)
alphaAB1=SAB*bAB+1
print("alphaAB1",alphaAB1)

代码运行结果如下图:
在这里插入图片描述

只是从结果的角度证明了这个结论,暂时没有数学推导,先放着吧hhh。

2024/4/26补充:
在这里插入图片描述

TMC

TMC的融合方法

在这里插入图片描述
和在这里插入图片描述融合公式为:
在这里插入图片描述
在这里插入图片描述
容易发现白色和棕色方格之和为1,且C为白色方格之和,1-C为棕色方格之和

思路:上述融合规则描述的是两个观点W1和W2的融合,而当有W1,W2,W3时,则需要先使用W_new=W1 “+” W2(此“+”为融合的意思),再计算W_end=W_new “+” W3,再W1,W2,W3的出现顺序不同时,按照这样的规则融合得出的最后的W_end的参数似乎都不相同。
因此,参考上图中,将W1,W2的参数画成2维概率论网格的思路,W1,W2,W3可以画成下图所示:
在这里插入图片描述
得出一个由W1=(b11,b12,b13,u1);W2=(b21,b22,b23,u2);W3=(b31,b32,b33,u3)确定的三维概率论空间,容易发现这个大正方体的体积为1,其简要证明如下:
在这里插入图片描述
类比TMC中融合公式可以写出一次性将W1,W2,W3融合的公式Function(W1,W2,W3)为:

图中符号说明:上标为视图号(1<=v<=V),下标为类别号(1<=k<=N)
在这里插入图片描述
在这里插入图片描述
1.先代码验证一下这样一次性将W1,W2,W3,W4,W5融合后是否满足基本性质。

import random
print("\n")
import random

def generate_numbers(n):
    numbers = [random.random() for _ in range(n)]
    total = sum(numbers)
    normalized_numbers = [x / total for x in numbers]
    return normalized_numbers

V = 5
K = 5
dt = [generate_numbers(K+1) for _ in range(V)]

# #dt[0]=[0.1,0.2,0.2,0.3,0.2,0.00000000000001]
# dt[0]=[0.01,0.02,0.03,0.02,0.02,0.9]
# dt[1]=[0.01,0.02,0.03,0.04,0.1,0.8]
# dt[2]=[0.01,0.02,0.03,0.04,0.1,0.8]
# dt[3]=[0.01,0.02,0.03,0.02,0.02,0.9]
# dt[4]=[0.01,0.02,0.03,0.04,0.1,0.8]

for i in range(1, V+1):
    print(f"视图{i}得出的观点:" + ", ".join(["{:.12f}".format(x) for x in dt[i-1]]))

def cal_1c(dt):
    res = 0
    for k in range(K):
        temp = 1
        for v in range(V):
            temp *= dt[v][k]
        res += temp

    uu = 1
    for v in range(V):
        uu *= dt[v][K]
    res += uu

    for v in range(V):
        temp = uu / dt[v][K]
        sum = 0
        for k in range(K):
            sum += dt[v][k]
        temp *= sum
        res += temp
    return res

c1 = cal_1c(dt)
print(c1)

def cal_uu(dt):
    uu=1
    for v in range(V):
        uu*=dt[v][K]
    return uu
uu=cal_uu(dt)
print(uu)

def cal_u(dt):
    return cal_uu(dt)/c1

def cal_b(dt,uu,c1):
    b=[]
    for k in range(K):
        sum=0
        bbk=1
        for v in range(V):
            bbk*=dt[v][k]
        sum+=bbk

        for v in range(V):
            sum+=dt[v][k]*uu/dt[v][K]

        sum/=c1

        b.append(sum)
    return b

endb=cal_b(dt,uu,c1)
endu=cal_u(dt)
print(endb)
print(endu)

checksum=sum(endb)+endu
print(checksum)


在这里插入图片描述

发现sum(b)+u=1

2.再验证是否满足TMC文中这四个性质:
(1) 当两个观点都具有高不确定性(u1和u2都很大)时,最终的分类必须有低置信度(bk较小);
(2) 当两个观点都具有低不确定性(u1和u2都很小)时,最终的分类可能有高置信度(bk较大);
(3) 当只有一个观点具有低不确定性(只有u1或u2较大)时,最终的分类只取决于置信度高的观点;
(4) 当两个观点的意见冲突时,C和u都会相应增加。

数学太弱了,没怎么证明出来,简单用代码结果验证一下:
(1)
在这里插入图片描述
W1,W2,W3,W4,W5的u都很大,最后得出的b很小
(2)
在这里插入图片描述
W1,W2,W3,W4,W5的u都很小时,得出的b很大
(3)
在这里插入图片描述
只有W1的u很小,其他的u都很大时,最终的b和W1的b很像
(4)
什么是冲突我忘了,看看书再搞这个hhh。

🤡🤡🤡了!

BCF的融合方法:
在这里插入图片描述
它在证据层面的融合等价于:
在这里插入图片描述
然后用e1,e2,e3换几个顺序就发现,e_end都一样
结论:BCF的二元融合操作符满足结合律,顺序不影响最终结果!

代码验证了一下,BCF在123,132等顺序下,以及使用我自己推到的公式的结果:

import numpy as np

K=10
def e2w(e):
    e_sum=e.sum()
    w=e/(e_sum+K)
    w=np.append(w,K/(e_sum+K))
    return w

def w2e(w):
    u=w[K]
    e=K*w/u
    e=e[:-1]
    return e

e1=np.random.randint(1,100,K)
e2=np.random.randint(1,100,K)
e3=np.random.randint(1,100,K)

w1=e2w(e1)
w2=e2w(e2)
w3=e2w(e3)

print('w1',w1)
print('w2',w2)
print('w3',w3)

def cal_C(w1,w2):
    b1=w1[:-1]
    u1=w1[K]
    b2=w2[:-1]
    u2=w2[K]
    b1b2=b1*b2
    C_complement=b1b2.sum()+u1*b2.sum()+u2*b1.sum()+u1*u2
    C=1-C_complement
    return C

def BCF(w1,w2):
    C=cal_C(w1,w2)
    b1 = w1[:-1]
    u1 = w1[K]
    b2 = w2[:-1]
    u2 = w2[K]

    b=(b1*b2+b1*u2+b2*u1)/(1-C)
    u=u1*u2/(1-C)
    w=b
    w=np.append(w,u)
    return w

def BCF_e(e1,e2):
    e=e1+e2+e1*e2/K
    return e

def experiment(w1,w2,w3):
    w=BCF(w1,w2)
    w=BCF(w,w3)
    return w

print('123',BCF(BCF(w1,w2),w3))
#print(e2w(BCF_e(BCF_e(e1,e2),e3)))
print('132',BCF(BCF(w1,w3),w2))
print('213',BCF(BCF(w2,w1),w3))
print('231',BCF(BCF(w2,w3),w1))
print('312',BCF(BCF(w3,w1),w2))
print('321',BCF(BCF(w3,w2),w1))
#一模一样!BCF不受顺序影响!

def cal_C1(w1,w2,w3):
    b1 = w1[:-1]
    u1 = w1[K]
    b2 = w2[:-1]
    u2 = w2[K]
    b3 = w3[:-1]
    u3 = w3[K]

    u_pai=u1*u2*u3
    b_pai=b1*b2*b3
    C_complement=b_pai.sum()+u_pai+u_pai/u1*b1.sum()+u_pai/u2*b2.sum()+u_pai/u3*b3.sum()
    C=1-C_complement
    return C

def BCFall(w1,w2,w3):
    C1=cal_C1(w1,w2,w3)
    b1 = w1[:-1]
    u1 = w1[K]
    b2 = w2[:-1]
    u2 = w2[K]
    b3 = w3[:-1]
    u3 = w3[K]
    u_pai=u1*u2*u3
    b=(b1*b2*b3+b1*u_pai/u1+b2*u_pai/u2+b3*u_pai/u3)/(1-C1)
    u=(u_pai)/(1-C1)

    w = b
    w = np.append(w, u)
    return w

w_end=BCFall(w1,w2,w3)
print('我的公式w_end',w_end)

在这里插入图片描述
如上图所示,123,132,213,231,312,321结果都一样,但是和我的公式的结果不一样。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值