张量元素与向量乘积的求和

2024-04-26 10:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为高阶(d=4)因式分解机编写python代码,该机器返回y的标量结果

Factorization machine for degree 4 problem

其中x是长度为n的向量,v是长度为n的向量,w是大小为n×n的上三角矩阵,t是大小为n×n×n×n的秩4张量。最简单的实现仅适用于每个索引上的循环:

for i in range(0,len(x)):
    for j in range(0,len(x)):
        for k in range(0,len(x)):
            for l in range(0,len(x)):
                y += t[i,j,k,l] * x[i] * x[j] * x[k] * x[l]

前两项易于计算:

y = u @ x + x @ v @ x.T

我的问题-有没有比嵌套for循环更好的方法来计算张量和?(目前正在pytorch中寻找可能的解决方案)


2条回答

谢谢你swag2198

(c * x[:, None, None, None] * x[None, :, None, None] * x[None, None, :, None] * x[None, None, None, :]).sum()

在对x和t的伪值进行测试时,返回与for循环相同的结果

这似乎非常适合^{}

>>> torch.einsum('ijkl,i,j,k,l->', t, *(x,)*4)

在展开形式中,它看起来像torch.einsum('ijkl,i,j,k,l->', t, x, x, x, x),并计算由四个for循环定义的值:

for i, j, k, l in cartesian_prod:
    y += t[i,j,k,l] * x[i] * x[j] * x[k] * x[l]

其中cartesian_prod是笛卡尔积:range(len(x))^4

相关问题 更多 >