如何像 MATLAB 中的 pdist 一样在 Google BigQuery 中创建相似度矩阵?

How to create similarity matrix in Google BigQuery like pdist in MATLAB?

在 MATLAB 和 Python (scipy) 中,有一个函数 (pdist) 将 return 给定矩阵的每一行之间的成对距离。

因此对于 BigQuery 中的 table:

A = user1 | 0 0 |
    user2 | 0 3 |
    user3 | 4 0 |

应该return

              user1 user2 user3
dist = user1 |  0      3     4   | 
       user2 |  3      0     5   | 
       user3 |  4      5     0   | 

或一些变体(可能没有对角线,只有矩阵的上半部分或下半部分,因为它们是多余的。)

作为列的对也是acceptable(方法(到目前为止我的猜测)是使用自连接,但我不确定如何遍历所有列 - 例如我有 ~3000 列)。这个解决方案看起来像:

dist = |user1  user2  3 | 
       |user1  user3  4 | 
       |user2  user3  5 |

另外,作为用户之间的距离度量,我不一定只想要欧几里德距离作为示例,而是任何一般距离。其中一个距离是

sum(min(user1_d, user2_d) / diff(user1_d - user2_d)) for all d dimensions between the two users.

有没有人为此找到 Google BigQuery 解决方案?

有两个答案:

  1. 您可以使用交叉连接执行此操作,并以编程方式构建一个查询来计算距离函数,或者使用当前处于封闭 alpha 版本中的用户定义函数功能。
  2. 请谨慎使用大型数据集的交叉连接。 Cross Joins 做 N^2 工作,并且可以生成 N^2 输出。两个只有一百万行的小表的交叉连接会产生一万亿行输出。交叉连接 20 亿行表会生成连续的输出行。

    如果您确实对大型数据集进行交叉联接,则应尝试进行预聚合或过滤以减少实际需要联接的行数。