有没有更快的方法用高斯函数计算同一矩阵中元素之间的距离?
Is there a faster way to calculate the distance between elements in the same matrix with a Gaussian function?
从形状为 7000 x 2 的 M 矩阵开始,我计算以下数量:
我按以下方式进行(方差西格玛是任意的):
W = np.zeros((M.shape[0], M.shape[0]))
elements_sum_by_i = np.zeros((M.shape[0]))
for i in range (0,M.shape[0]):
#normalization
for k in range (0, M.shape[0]):
elements_sum_by_i[k] = math.exp(-(np.linalg.norm(M[i,:] - M[k,:])**2)/(2*sigma**2))
sum_by_i = sum(elements_sum_by_i)
#calculation
for j in range (0,M.shape[0]):
W[i,j] = (math.exp(-(np.linalg.norm(M[i,:] - M[j,:]))**2/(2*sigma**2)))/(sum_by_i)
问题是它真的很慢(大约需要30分钟)。有没有更快的方法来进行此计算?
也许您可以从以下评论中提取一些想法:
1) 计算Log(W[i,j]) 简化公式,指数消失,处理应该更快。
2) 取它的指数:Exp(Log(W{i,j])) == W[i,j]
3) 将变量用于迭代内的常量值,例如 sigma = 2*sigma**2,您可以在迭代外开始计算。
重要的是,在进行任何更改之前,请记住结果,以便您的新开发可以在您已经知道的最终矩阵结果上进行测试,我想,这是正确的。
祝你好运。
从形状为 7000 x 2 的 M 矩阵开始,我计算以下数量:
我按以下方式进行(方差西格玛是任意的):
W = np.zeros((M.shape[0], M.shape[0]))
elements_sum_by_i = np.zeros((M.shape[0]))
for i in range (0,M.shape[0]):
#normalization
for k in range (0, M.shape[0]):
elements_sum_by_i[k] = math.exp(-(np.linalg.norm(M[i,:] - M[k,:])**2)/(2*sigma**2))
sum_by_i = sum(elements_sum_by_i)
#calculation
for j in range (0,M.shape[0]):
W[i,j] = (math.exp(-(np.linalg.norm(M[i,:] - M[j,:]))**2/(2*sigma**2)))/(sum_by_i)
问题是它真的很慢(大约需要30分钟)。有没有更快的方法来进行此计算?
也许您可以从以下评论中提取一些想法:
1) 计算Log(W[i,j]) 简化公式,指数消失,处理应该更快。
2) 取它的指数:Exp(Log(W{i,j])) == W[i,j]
3) 将变量用于迭代内的常量值,例如 sigma = 2*sigma**2,您可以在迭代外开始计算。
重要的是,在进行任何更改之前,请记住结果,以便您的新开发可以在您已经知道的最终矩阵结果上进行测试,我想,这是正确的。
祝你好运。