Python:删除多个for循环以提高计算速度(以l2为中心)

2024-06-23 20:04:31 发布

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

我需要计算的公式如下:

enter image description here

(其中,nexp是样本点的数量,ndv是这种情况下设计变量的数量)

问题是,如果我使用三个for循环来计算右边的第三个项,那么对于大数据量来说,它显然太慢了(我有大小为(390625 x 1000)的数据)

我已经成功地将循环减少到只有一个,但是,对于如此庞大的数据,计算速度仍然不够快(到目前为止,我管理的代码是:

def CL2(x):
    '''Centered L2 discrepancy'''    
    nexp, ndv = x.shape

    term3 = 0
    term2 = np.sum(np.prod(1. + np.abs(x - 0.5)/2 - np.abs(x - 0.5)**2/2, axis = 1))        
    for i in range(nexp):
        term3 = term3 + np.sum(np.prod(1. + np.abs(x[i,:] - 0.5)/2 + np.abs(x - 0.5)/2 - np.abs(x[i,:] - x)/2, axis = 1))
    CL2 = (13/12)**ndv - (2*term2 - term3/nexp)/nexp    

    return CL2

似乎循环中的计算太复杂了。我也尝试过使用三维矩阵(通过广播),但它甚至比以前更慢,因为矩阵的大小越来越大。你知道吗

不管有多少for循环来计算这个方程,但我真的需要它足够快,至少比现在快。你知道吗

我找不到任何替代品numpy.prod公司这可能是计算时间过长的原因。你知道吗


Tags: 数据for数量np矩阵prodabs公式
1条回答
网友
1楼 · 发布于 2024-06-23 20:04:31

你可以通过介绍

 y_ik = 1/2 (x_ik - 1/2)

双倍和中的项变成

1 + |y_ik| + |y_jk| - |y_ik - y_jk|

如果yik和yjk的符号是相反的,那么这等于1,所以我们可以去掉所有这些项。如果符号相同,则等于

1 + 2 min(|y_ik|, |y_jk|)

这也比原来的术语简单。你知道吗

注意到另一个和中的项相等

(1 + 2 |y_ik|) (1 - |y_ik|)

我们可以通过预计算节省一点点

z_ik = 1 + 2 |y_ik| = 1 + |x_ik - 1/2|

(缺点:我们仍然需要记住Yu-ik的标志)

双倍和中的项变成

min(z_ik, z_jk)

如果yïik和yïjk的符号相同,如果符号不同,可以省略。你知道吗

另一笔款项中的条款变成

1/2 z_ik (3 - z_ik)

相关问题 更多 >

    热门问题