从他们的地理标签建立两个用户之间的位置亲和力?
Establish location-affinity between two users from their geotags?
想法。
我想构建一个像这样的函数:
location_affinity(user_a, user_b)
这在两个用户之间建立了位置亲和力。特别是,此函数将 return 一个介于 0(无亲和力)和 1(最大亲和力)之间的浮点数,指示 user_a 与 user_b 的位置相对应的位置。例如:如果 user_a 总是和 user_b 在一起并跟随他到他去的每个地方,我期待结果为“1”。如果 user_a 住在离 user_b 很远的地方,而且他们从来没有彼此靠近过,我希望结果是“0”。
数据。
每个用户都有一个他去过的点(纬度、经度)列表,这些点已经从用户的 Facebook 地理标签中提取出来。
想象一下:IMAGE
- 红色 "X"s 是点(lat, lng) user_a 已经.
- 绿色"X"s是点(纬度,经度)user_b已经。
- 蓝色区域代表重叠。
问题。
是否有任何已知算法可以根据两个用户的地图点列表建立亲和力(我收集的依赖于重叠区域)?
如果没有,我应该搜索哪些关键字?
额外的。
我正在尝试使用 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()
这有好处属性如果两组点完全相等,则returns1
.
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
当然,您可以使用许多不同的指标来确定更大距离的 fall-off。这里我选择了 exp(-x)
,但您也可以使用 1 - tanh(x)
或 tanh(1/(x+epsilon))
(如果两点完全相同,则需要 epsilon 以避免被零除)。这导致不同的行为:
实际上,您可以使用 1 - 定义的任何函数 in this post。
想法。 我想构建一个像这样的函数:
location_affinity(user_a, user_b)
这在两个用户之间建立了位置亲和力。特别是,此函数将 return 一个介于 0(无亲和力)和 1(最大亲和力)之间的浮点数,指示 user_a 与 user_b 的位置相对应的位置。例如:如果 user_a 总是和 user_b 在一起并跟随他到他去的每个地方,我期待结果为“1”。如果 user_a 住在离 user_b 很远的地方,而且他们从来没有彼此靠近过,我希望结果是“0”。
数据。 每个用户都有一个他去过的点(纬度、经度)列表,这些点已经从用户的 Facebook 地理标签中提取出来。 想象一下:IMAGE
- 红色 "X"s 是点(lat, lng) user_a 已经.
- 绿色"X"s是点(纬度,经度)user_b已经。
- 蓝色区域代表重叠。
问题。 是否有任何已知算法可以根据两个用户的地图点列表建立亲和力(我收集的依赖于重叠区域)? 如果没有,我应该搜索哪些关键字?
额外的。 我正在尝试使用 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()
这有好处属性如果两组点完全相等,则returns1
.
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
当然,您可以使用许多不同的指标来确定更大距离的 fall-off。这里我选择了 exp(-x)
,但您也可以使用 1 - tanh(x)
或 tanh(1/(x+epsilon))
(如果两点完全相同,则需要 epsilon 以避免被零除)。这导致不同的行为:
实际上,您可以使用 1 - 定义的任何函数 in this post。