【问题标题】:Establish location-affinity between two users from their geotags?从他们的地理标签中建立两个用户之间的位置相似性?
【发布时间】:2018-03-06 08:50:10
【问题描述】:

想法。 我想构建一个类似的函数:

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”是点(lat,lng)user_a 已经过。
  • 绿色的“X”是点(lat, lng)user_b 已经过。
  • 蓝色区域代表重叠。

问题。 是否有任何已知的算法可以根据两个用户的地图点列表建立亲和力(我认为这取决于重叠区域)? 如果没有,我应该搜索哪些关键字?

附加。 我正在尝试使用 Spark 构建 Python 函数。有没有集成?

谢谢。

【问题讨论】:

  • 每个用户积分列表中有多少积分?

标签: python dictionary apache-spark tags geotagging


【解决方案1】:

这样的事情怎么样:

首先,我们使用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 来避免被零除)。这会导致不同的行为:

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

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2019-03-25
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多