通过地理标记在两个用户之间建立位置关联?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过地理标记在两个用户之间建立位置关联?相关的知识,希望对你有一定的参考价值。
想法。我想建立一个像这样的函数:
location_affinity(user_a, user_b)
在两个用户之间建立位置关联。特别是,此函数将返回0(无亲和力)和1(最大亲和力)之间的浮点数,表示user_a与user_b已经存在的位置对应的位置。例如:如果user_a总是和user_b一起停留并跟随他到他去的每个地方,我期待结果为“1”。如果user_a远离user_b并且它们之间甚至没有彼此接近,那么我期待结果为“0”。
数据。每个用户都有一个他曾经去过的点(纬度,经度)列表,这些点已经从用户的Facebook地理标记中提取出来。想象一下:IMAGE
- 红色“X”是user_a的点(lat,lng)。
- 绿色“X”是user_b的点(lat,lng)。
- 蓝色区域代表重叠。
问题。是否有任何已知的算法,基于两个用户的地图点列表,可以建立亲和力(我收集它取决于重叠区域)?如果没有,我应该搜索哪些关键字?
额外。我正在尝试使用Spark构建Python函数。有任何集成吗?
谢谢。
这样的事情怎么样:
首先,我们使用scipy.spatial.distance.cdist
来确定从user_a
到user_b
的每个点的每个点之间的距离,以找到每个点的最近点。然后我们使用指数函数以指数方式抑制更高的距离。常数c
确定这种抑制的大小,较小意味着大距离具有更高的抑制(您需要将其缩放以在实际单位中有意义)。然后我们只看一下该指标的平均值。
import numpy as np
from scipy.spatial.distance import cdist
def affinity(user_a, user_b, c=0.1):
dists = cdist(user_a, user_b)
return (np.exp(-dists.min(axis=0)/c)).mean()
这有一个很好的属性,如果两组点完全相等,它返回1
。
user_a = np.random.rand(1000, 2)
user_b1 = np.random.rand(1000, 2)
user_b2 = user_a.copy()
print(affinity(user_a, user_b1))
# 0.85169834916
print(affinity(user_b1, user_a))
# 0.856871315902
print(affinity(user_a, user_b2))
# 1.0
不过,它有一个小问题,如上所示。此功能不对称。但是,我们可以通过平等地考虑两者来使其对称:
def affinity(user_a, user_b, c=0.1):
dists = cdist(user_a, user_b)
min_dists = dists.min(axis=0), dists.min(axis=1)
return np.concatenate([np.exp(-x/c) for x in min_dists]).mean()
print(affinity(user_a, user_b1, 0.01))
# 0.271448093071
print(affinity(user_b1, user_a, 0.01))
# 0.271448093071
print(affinity(user_a, user_b2, 0.01))
# 1.0
当然,您可以使用许多不同的指标来确定较大距离的衰减。在这里我选择了exp(-x)
,但你也可以使用1 - tanh(x)
或tanh(1/(x+epsilon))
(如果两点完全相同,则需要epsilon来避免零除以)。这会导致不同的行为:
实际上,你可以使用1 - 任何函数定义in this post。
以上是关于通过地理标记在两个用户之间建立位置关联?的主要内容,如果未能解决你的问题,请参考以下文章