Apache spark 如何计算10^8以上数据中任意两个元素之间的距离,以便使用spark对它们进行聚类?

Apache spark 如何计算10^8以上数据中任意两个元素之间的距离,以便使用spark对它们进行聚类?,apache-spark,machine-learning,apache-spark-mllib,hierarchical-clustering,bigdata,Apache Spark,Machine Learning,Apache Spark Mllib,Hierarchical Clustering,Bigdata,我在elasticSearch中存储了超过10^8条记录。现在我想通过编写分层算法或使用基于spark MLlib的PIC对它们进行聚类。 然而,我不能使用像K-means这样的高效算法,因为每个记录都是以 {mainID:[subId1,subId2,subId3,...]} 这显然不是欧几里得空间。 我需要计算每对记录的距离,我想这需要很长时间(10^8*10^8)。我知道spark中的笛卡尔积可以做这样的计算,但是会出现重复的像(mainID1,mainID2)和(mainID2,

我在elasticSearch中存储了超过10^8条记录。现在我想通过编写分层算法或使用基于spark MLlib的PIC对它们进行聚类。
然而,我不能使用像K-means这样的高效算法,因为每个记录都是以

{mainID:[subId1,subId2,subId3,...]}   
这显然不是欧几里得空间。 我需要计算每对记录的距离,我想这需要很长时间(10^8*10^8)。我知道spark中的笛卡尔积可以做这样的计算,但是会出现重复的像(mainID1,mainID2)和(mainID2,mainID1),这不适合PIC

有谁知道更好的方法来对这些记录进行聚类吗?或者有什么方法可以删除笛卡尔乘积结果RDD中的重复项


非常感谢

首先,不要使用完全笛卡尔积:

select where a.MainID > b.MainID
这并没有降低复杂性,但它确实节省了大约2倍的生成时间

这样说,考虑你的数据“形状”,并选择相应的聚类算法。K-均值、HC和PIC有三种不同的应用。我敢肯定,你已经知道K-means了

PIC基本上发现了距离分布的差距。这对于定义良好的集合(清晰的边界)非常有用,即使这些集合彼此卷曲或嵌套。然而,如果你有一个连接点的卷须(像一个长而细的哑铃),PIC不会将明显的簇分开

HC对于这样的集合是很好的,并且通常是一个很好的算法。大多数HC算法对密度有“理解”,并且倾向于给出符合人类认知解释的聚类。然而,HC的速度往往较慢


<>我强烈建议你考虑一个“种子”算法:选择你的点的随机子集,也许

sqrt(size) * dim
点,size是点的数量(10^8),dim是维度的数量。例如,您的示例有5个维度,因此随机选取5*10^4个点。单独运行第一次迭代,识别质心(K-means)、特征向量(PIC)或初始层次(HC)。使用这些“种子”值,现在可以使用2-3个参数来描述每个候选簇。根据3个参数对剩余的10^8-5*10^4点进行分类要快得多,是O(大小)时间,而不是O(大小^2)


这会让你朝着有用的方向发展吗?

你的问题不是很清楚,你能举个简单的例子吗。实际上,我的最终目标是从给定搜索查询的记录集中挑选出不同的记录,因为记录集中有太多相似的记录:(.所以我想先对它们进行聚类,然后从不同的聚类中挑选出来。你们知道一开始更好的方法来区分它们吗?你们认为哪一部分不清楚?我来举个例子。非常感谢!记录形式就像{'a':[1,2,3,4,5]},{'b':[1,2,3,6,8]},{'c':[3,5,7]}。我想根据值([1,2,3,4,5])对它们进行聚类。注意列表中的数字只是ID。因此我必须计算任意两个记录之间的距离。现在我有超过10^8个这样的记录。我不知道如何进行聚类。我知道的是使用笛卡尔积,但这成本太高,会形成重复的记录,这意味着我不会计算相同的距离wice((a,b)和(b,a))。PIC API只允许同一距离作为输入显示一次。什么是PIC?请给出完整的示例,什么是输入,聚类后应该输出什么,很难假设和回答。