Python 如何使用scikit中的haversine distance使用DistanceMetrix.pairwise()

Python 如何使用scikit中的haversine distance使用DistanceMetrix.pairwise(),python,scikit-learn,Python,Scikit Learn,如何使用sklearn库中的haversine成对函数获得以公里为单位的距离?查看示例中从scikit learn返回的数字是不正确的,这让我相信我没有正确地调用它 示例代码: from math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): """ Calculate the great circle distance between two points on

如何使用sklearn库中的haversine成对函数获得以公里为单位的距离?查看示例中从scikit learn返回的数字是不正确的,这让我相信我没有正确地调用它

示例代码:

from math import radians, cos, sin, asin, sqrt

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')

paris = (48.8566, 2.3522)
lyon = (45.7640, 4.8357)

hdist = haversine(paris[1],paris[0], lyon[1], lyon[0])
skdist = dist.pairwise([paris], [lyon]) * 6371

# Returns: The distance between Paris and Lyon is 391km. sklearn=17766km
"The distance between Paris and Lyon is {0:.3g}km. sklearn={1:.5g}km".format(hdist, skdist[0][0])
从sklearn文档:

请注意,哈弗森距离度量需要以下格式的数据: [纬度、经度],输入和输出均以 弧度

因此,在应用该函数之前,请将纬度和经度转换为弧度:

 skdist = dist.pairwise(np.radians([paris]), np.radians([lyon])) * 6371