首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在查询radius-BallTree sklearn,radians,km中引入电台?

如何在查询radius-BallTree sklearn,radians,km中引入电台?
EN

Stack Overflow用户
提问于 2020-07-28 02:20:18
回答 1查看 624关注 0票数 2

我正在处理纬度和经度数据。我之所以使用BallTree,是因为我在数据集中有很多行(32000行)。如果我用半正弦距离构建树:

代码语言:javascript
复制
'''' model_BTree = BallTree(np.array(points_sec_rad),metric='haversine') ''''

并且我将纬度和经度转换为弧度单位,如何将query_radius (max_dist_rad)应用于我想要定位的点?我使用了0.150米作为半径,但我不确定是否应该使用弧度的近似值。

代码语言:javascript
复制
''''ind_BTree,dist_BTree = model_BTree.query_radius(np.array(points_loc_rad), r=max_dist_rad, return_distance = True, sort_results=True) ''''

另外,我如何限制无线电中邻居的数量?谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-07-28 19:10:16

编辑:包含工作代码和说明的示例

可视化应用haversine距离所发生的事情的最好方法是,可视化所有的great circle距离都是在一个小乒乓球上测量的。

如果你想在更大的球体上应用query_radius(),比如地球,你需要将大地公里/英里转换回单位乒乓球。假设你想要100英里,你需要除以地球半径以英里为单位。query_radius()的输出需要通过乘法再次转换回英里/公里。

假设我们在Pandas中有以下城镇和博物馆数据:

代码语言:javascript
复制
import pandas as pd
import numpy as np

from sklearn.neighbors import BallTree
代码语言:javascript
复制
towns = pd.DataFrame({
    "name" : ["Merry Hill", "Spring Valley", "Nesconset"],
    "lat" : [36.01, 41.32, 40.84],
    "long" : [-76.7, -89.20, -73.15]
})

museum = pd.DataFrame({
    "name" : ["Motte Historical Car Museum, Menifee", "Crocker Art Museum, Sacramento", "World Chess Hall Of Fame, St.Louis", "National Atomic Testing Museum, Las", "National Air and Space Museum, Washington", "The Metropolitan Museum of Art", "Museum of the American Military Family & Learning Center"],
    "lat" : [33.743511, 38.576942, 38.644302, 36.114269, 38.887806, 40.778965, 35.083359],
    "long" : [-117.165161, -121.504997, -90.261154, -115.148315, -77.019844, -73.962311, -106.381531]
})

然后,我们需要将经度/经度对提取为numpy数组

代码语言:javascript
复制
places_gps = towns[["lat", "long"]].values
museum_gps = museum[["lat", "long"]].values

现在,我们可以使用以下命令创建球树

代码语言:javascript
复制
places_radians =  np.radians(places_gps)
museum_radians = np.radians(museum_gps)

tree = BallTree(museum_radians, leaf_size=15, metric='haversine')

同样,假设这个小球只有一个乒乓球的大小。要将它们用于更大/更小的球体,我们需要乘/除。

比如说我想要100英里内的所有博物馆;

代码语言:javascript
复制
distance_in_miles = 100
earth_radius_in_miles = 3958.8
    
radius = distance_in_miles / earth_radius_in_miles

现在,我可以应用query_radius(),并记住返回的距离需要转换回英里。这里的distances是单位球面上的大圆距离,我们的乒乓球。

代码语言:javascript
复制
is_within, distances = tree.query_radius(places_radians, r=radius, count_only=False, return_distance=True) 

所以我们

代码语言:javascript
复制
distances_in_miles = distances * earth_radius_in_miles

让我们检查一下输出,我们可以看到distances_in_miles

代码语言:javascript
复制
array([array([], dtype=float64), array([], dtype=float64),
       array([42.68960475])], dtype=object)

这意味着'Nesconset‘应该离’大都会艺术博物馆‘小于100英里,而这个距离大约是42.689英里。请注意,实际上只返回了最后一个数组(Nesconset)的距离,并且在is_within的帮助下,我们在5中找到了博物馆的索引,这是museum.name[5],“大都会艺术博物馆”。

根据检查方法的不同,它不会精确到42.689英里,但用谷歌地图快速检查一下,就会确认它在这个范围内。地球根本不是一个完美的球体,所以会有误差。

就像我最初的帖子一样,忘记应用校正因子、交换经度/纬度值或公里/米很容易出错。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63121268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档