Notebook: Calc_Nearest_Businesses
当给出用户的地理坐标(纬度,精度)时,如何快速获取到离该用户最近的商店?
KNN(K Nearest Neighbors)算法跟我们的需求有点像,都涉及到求离某一点最近的点,只不过它一般是用来基于这些最近的点,投票决定该点的类别。咋看起来,KNN 不能满足我们的需求,但仔细一想,KNN 跟我们的需求本质上是一样的,都需要计算距离(多种定义,常见的是欧氏距离)。当我们查找到离用户最远距离为 D 的所有商店时,K 这个值也就确定了;当我们找到 K 个最近的点时,离用户最远的距离 D 也就确定了。
所以,接下来我们就用 KNN 算法来解决我们的问题。
不过,这里还有一个问题就是用户和商店(Business)的地理坐标都是经纬度,直接计算直线距离是不行的,而且这些经纬度能够传入到 KNN 算法中计算。这些处理我们在后文中进行说明。
KNN 算法简要说明
KNN 算法算是一个比较简单算法,它没有显示的学习过程,也很容易理解。例如,对于下图:
链接
中央的绿色点是待分类点(分为蓝色方形或红色三角形),当:
- K = 3 时,距离绿色点最近的 3 个点中有 2 个是红色三角形,1 个是蓝色方形,所以该绿色点被分为红色三角形类别
- K = 5 时,距离绿色点最近的 5 个点中有 2 个是红色三角形,3 个是蓝色方形,所以该绿色点被分为蓝色方形类别
- 其余以此类推
虽然该算法简单,但高效
计算就不是一件容易的事了。简单拿一个点跟所有点都计算一次距离在大数据情况下是不大可行的。对此,KNN 使用 KD 树来解决这个问题。关于 KD 树详细可参考博客 KD 树算法之思路篇、KD 树算法之详细篇。下文也将使用 KD 树来查找离用户最近的商店。