PySpark中向量间夹角的点积计算

bgtovc5b  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(214)

我尝试在Databricks中使用PySpark计算两个向量之间的Angular 。这在Python中是一个相当琐碎的任务,但我似乎无法在Pyspark中创建一个有效的方法,主要的阻塞点是点积的计算。
由于我无法在Pyspark中计算点积,我选择使用numpy函数在UDF中实现我的方法,但结果没有我希望的那么快。我希望任何关于如何使用更多PySpark本身而不是依赖于numpy来实现这一点的输入。

  1. import pandas as pd
  2. import numpy as np
  3. @udf("float")
  4. def calculateAngle(x1, y1, x2, y2, x3, y3):
  5. a = np.array([x1,y1])
  6. b = np.array([x2,y2])
  7. c = np.array([x3,y3])
  8. ba = a - b
  9. bc = c - b
  10. cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
  11. returnValue = np.degrees(np.arccos(cosine_angle))
  12. return returnValue.item()
  13. data = {'x1':1.23, 'y1':3.23, 'x2':1.25, 'y2':3.2, 'x3':1.3, 'y3':2.8,}
  14. df = pd.DataFrame(data, index=[0])
  15. df = spark.createDataFrame(df)
  16. df=df.withColumn("angle", calculateAngle('x1', 'y1', 'x2', 'y2', 'x3', 'y3'))
  17. df=df.toPandas()
  18. df

字符串

py49o6xq

py49o6xq1#

Python UDF很慢:Spark functions vs UDF performance?。2维向量之间的Angular 计算可以用Spark表示:

  1. from pyspark.sql import Column
  2. from pyspark.sql import functions as F
  3. data = {'a1': 0, 'a2': 1, 'b1': 0, 'b2': 0, 'c1': 1, 'c2': 1}
  4. _vals = [tuple(v for k, v in data.items())]
  5. _schema = [k for k, v in data.items()]
  6. df = spark.createDataFrame(_vals, _schema)
  7. ba1 = F.col('a1') - F.col('b1')
  8. ba2 = F.col('a2') - F.col('b2')
  9. bc1 = F.col('c1') - F.col('b1')
  10. bc2 = F.col('c2') - F.col('b2')
  11. dot_product = ba1 * bc1 + ba2 * bc2
  12. ba_length = F.sqrt((ba1 ** 2) + (ba2 ** 2))
  13. bc_length = F.sqrt((bc1 ** 2) + (bc2 ** 2))
  14. angle = F.acos(dot_product / (ba_length * bc_length))
  15. df = df.withColumns({
  16. 'angle_radians': angle,
  17. 'angle_degrees': F.degrees(angle),
  18. })
  19. df.show()
  20. # +---+---+---+---+---+---+------------------+-----------------+
  21. # | a1| a2| b1| b2| c1| c2| angle_radians| angle_degrees|
  22. # +---+---+---+---+---+---+------------------+-----------------+
  23. # | 0| 1| 0| 0| 1| 1|0.7853981633974484|45.00000000000001|
  24. # +---+---+---+---+---+---+------------------+-----------------+

字符串

展开查看全部

相关问题