给出10亿条记录,其中包含以下信息:
ID x1 x2 x3 ... x100
1 0.1 0.12 1.3 ... -2.00
2 -1 1.2 2 ... 3
...
对于上述每个ID,我想根据其向量(x1,x2,...,x100)的欧几里得距离找到最接近的10个ID。
什么是最好的计算方式?
最佳答案
对所有记录与所有记录进行强力比较是一场失败的战斗。我的建议是寻求k-最近邻居算法的现成实现,例如scikit-learn
提供的算法,然后广播所得的索引和距离数组,并进一步研究。
在这种情况下的步骤将是:
1-按照Bryce的建议对特征进行向量化,并让您的向量化方法返回一个浮点数列表(或numpy数组),该浮点数包含与特征数相同的元素
2-使您的scikit-learn nn适合您的数据:
nbrs = NearestNeighbors(n_neighbors=10, algorithm='auto').fit(vectorized_data)
3-在向量化数据上运行经过训练的算法(在您的情况下,训练和查询数据是相同的)
distances, indices = nbrs.kneighbors(qpa)
第2步和第3步将在您的pyspark节点上运行,在这种情况下无法并行执行。您将需要在此节点上有足够的内存。以我的150万条记录和4个功能为例,它花了一两秒钟。
在我们能很好地实现NN Spark 之前,我想我们将不得不坚持这些变通办法。如果您想尝试新的东西,那就去http://spark-packages.org/package/saurfang/spark-knn
关于apache-spark - 如何使用Spark查找10亿条记录的最近邻居?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012059/