我需要计算的公式如下:
(其中,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公司这可能是计算时间过长的原因。你知道吗
你可以通过介绍
双倍和中的项变成
如果yik和yjk的符号是相反的,那么这等于1,所以我们可以去掉所有这些项。如果符号相同,则等于
这也比原来的术语简单。你知道吗
注意到另一个和中的项相等
我们可以通过预计算节省一点点
(缺点:我们仍然需要记住Yu-ik的标志)
双倍和中的项变成
如果yïik和yïjk的符号相同,如果符号不同,可以省略。你知道吗
另一笔款项中的条款变成
相关问题 更多 >
编程相关推荐