通过地理标记在两个用户之间建立位置关联?

问题描述 投票:1回答:1

想法。我想建立一个像这样的函数:

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函数。有任何集成吗?

谢谢。

python dictionary apache-spark tags geotagging
1个回答
0
投票

这样的事情怎么样:

首先,我们使用scipy.spatial.distance.cdist来确定从user_auser_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来避免零除以)。这会导致不同的行为:enter image description here

实际上,你可以使用1 - 任何函数定义in this post

© www.soinside.com 2019 - 2024. All rights reserved.