Pyspark 上两点之间的欧几里德距离

时间:2021-02-20 05:29:38

标签: python apache-spark pyspark k-means euclidean-distance

我在 pyspark 中定义了一个函数来计算我的质心和我拥有的一堆点之间的欧几里德距离。

def dist(x):
  b = {'d1':distance.euclidean((6,8),x),'d2':distance.euclidean((1,2),x),'d3':distance.euclidean((5,5),x)}
  def get_key(val):
    for key, value in b.items():
      if val == value:
        return key
  print(get_key(min(b.values())))

我的观点如下

数据 = [(3.023, 5.138), (3.075, 4.989), (2.321, 5.35), (3.328, 4.944), (3.195, 5.186)]

我的目标是将所有这些点输入到我的函数中,并获得每个点的最近距离。我期望的输出的假设示例有点像这样

[((3.023, 5.138),d1),
 ((3.075, 4.989),d1),
 ((2.321, 5.35),d2),
 ((3.328, 4.944),d1),
 ((3.195, 5.186),d3)]

当我将单个点输入到这个函数中时,它工作得很好,但是,当我尝试使用 lambda 函数对多个点执行此操作时,我得到的不是质心而是质心。

data.map(lambda x:(x,dist((x)))).take(5)

(1) Spark Jobs
Out[17]: [((3.023, 5.138), None),
 ((3.075, 4.989), None),
 ((2.321, 5.35), None),
 ((3.328, 4.944), None),
 ((3.195, 5.186), None)]

我在这里做错了什么?希望得到一些帮助。

1 个答案:

答案 0 :(得分:2)

您的函数 x=0, y=0; x=0, y=1; x=0, y=2. 不返回任何内容。它调用 var TestMap = new Map([ [1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,1,1,1,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,1,0,1], [1,0,0,0,0,0,0,1,0,1], [1,0,0,0,0,0,0,1,0,1], [1,1,1,1,1,1,1,1,1,1] ]); 函数,该函数不返回任何内容。自然地,它打印 this.data[x][y];

dist 更改为 print,我怀疑您会更快乐。