用theano计算两组天空位置的天文距离

Calculate astronomical distance of two set of sky position with theano

我想计算两个不同集合中所有点之间的 angular distance,类似于 scipycdist,但使用不同的距离算法并使用 theano。赤经 (ra) 在 (0,2pi) 和赤纬 (dec) 在 (-pi/2, pi/2) 的两个源之间的 angular 距离是:

theta = arccos(sin(dec1)*sin(dec2)+cos(dec1)*cos(dec2)*cos(ra1-ra2))

假设 X 是一个由 N 个源组成的矩阵,它们的位置为 (ra, dec):

#RA     DEC 
54.29   -35.19  
54.62   -35.45
...

W 是另一组来源 M 不同的来源。我如何确定所有 X 个源与所有 W 个源的 angular 分离?

欧氏距离的启发:

edist = T.sqrt((X ** 2).sum(1).reshape((X.shape[0], 1)) + (W ** 2).sum(1).reshape((1, W.shape[0])) - 2 * X.dot(W.T))

我试过:

d = T.arccos(\
T.sin(X.reshape((X.shape[0], 1, -1))[...,1])*T.sin(W.reshape((1, W.shape[0], -1))[..., 1])+\
T.cos(X.reshape((X.shape[0], 1, -1))[...,1])*T.cos(W.reshape((1, W.shape[0], -1))[..., 1])*\
T.cos(X.reshape((X.shape[0], 1, -1))[...,0] -W.reshape((1, W.shape[0], -1))[...,0]))

结果 d 矩阵的形状为 (N, M) 而不是 (N, M, 2),因为我希望在第三个轴上求和;此外,数值结果是错误的(我将其与面向天文学的软件 TOPCAT 进行了比较。有什么建议吗?

您需要按部分调试表达式 - 首先计算 sin(dec1) 并确保获得正确的形状和正确的数值结果。然后与 sin(dec2) 相乘,依此类推,直到得到完整的 arccos 表达式。

您的代码可能存在错误的一个想法是使用 * 进行乘法 - 如果您想乘以矩阵,您应该使用 T.multiply() 而不是 *

我已经解决了这个问题:只需将赤经和赤纬从度数转换为弧度即可。现在,该方法起作用了。