利用机器学习算法中sklean库中KNN、高效分析地图位置点的关系。其中KNN模块中主要使用ball-tree数据结构模型,提高运算效率完成各类距离关系分析。k-近邻算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票决定。
一、计算经纬度间的距离
经纬度计算有测地距离、大圆距离和欧几里得距离,其中测地距离使用地球椭圆模型,大圆距离使用地球未圆形模型、欧几里得直接计算两点间直线距离,精度依次降低但是(随着计算复杂度降低)运算速度依次增加。Geopy可以用 geodesic distance 或 great-circle distance ,默认测地线距离作为函数
geopy.distance.distance
geodesic distance 地表两点之间的最短路径的距离。 有许多类型的椭球体模型,哪一个模型最精确取决于你的点在地球上的位置。默认值是WGS-84椭球体,它是全局最精确的。geopy还包括 distance.ELLIPSOIDS 字典: model major (km) minor (km) flattening ELLIPSOIDS = {‘WGS-84’: (6378.137, 6356.7523142, 1 / 298.257223563), ‘GRS-80’: (6378.137, 6356.7523141, 1 / 298.257222101), ‘Airy (1830)’: (6377.563396, 6356.256909, 1 / 299.3249646), ‘Intl 1924’: (6378.388, 6356.911946, 1 / 297.0), ‘Clarke (1880)’: (6378.249145, 6356.51486955, 1 / 293.465), ‘GRS-67’: (6378.1600, 6356.774719, 1 / 298.25), }
大圆距离( great_circle )使用地球的球形模型,使用国际大地测量学和地球物理学联合会定义的平均地球半径,(2)a + b) /3=6371.0087714150598公里,约6371.009公里(WGS-84),误差高达0.5%。半径值存储在 distance.EARTH_RADIUS ,因此可以对其进行自定义(但是,它应该始终以公里为单位)。
欧几里得距离 使用scipy通过numpy可以高效计算欧几里得距离。
from scipy.spatial.distance import cdist
lonlat1=data_lonlat_1[['lat_1','lon_1']]
lonlat2=data_lonlat_2[['lat_2','lon_2']]
distance=cdist(lonlat1,lonlat2,metric='euclidean')
1、计算任意两个点的距离
利用Geopy库计算测地距离,地球模型使用默认值WGS-84椭球体。语句d=distance.distance(old, new).m 的m(代表米)可以改为km。
def dis_N(xlon,xlat,ylon,ylat):
old=(xlat,xlon)
new=(ylat,ylon)
d=distance.distance(old, new).m
s=round(float(d),2)
return s
2、计算numpy数组的距离。
注意事项:
1、Geopy库的经纬度输入先lat后lon,为了适配数据源中最常见的 经度—纬度 数据结构调整了输入元组中的顺序为 old=(o[1],o[0])。
2、为了适配机器学习中常用的numpy数据,通过以下数据转化数据格式
data_jwd=data[[“经度”,“纬度”]]
#转为numpy 数组
data_p = data_jwd.values
距离函数
def disN(o,n):
# Geopy库先lat后lon
old=(o[1],o[0])
new=(n[1],n[0])
d=distance.distance(old, new).m
s=round(float(d),2)
return s
二、计算距离m内个所有的点。
代码如下
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors
from geopy import distance
pd.options.mode.chained_assignment = None
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] =