用theano计算两组天空位置的天文距离
Calculate astronomical distance of two set of sky position with theano
我想计算两个不同集合中所有点之间的 angular distance,类似于 scipy
的 cdist
,但使用不同的距离算法并使用 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()
而不是 *
。
我已经解决了这个问题:只需将赤经和赤纬从度数转换为弧度即可。现在,该方法起作用了。
我想计算两个不同集合中所有点之间的 angular distance,类似于 scipy
的 cdist
,但使用不同的距离算法并使用 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()
而不是 *
。
我已经解决了这个问题:只需将赤经和赤纬从度数转换为弧度即可。现在,该方法起作用了。