如何像 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 解决方案?
有两个答案:
- 您可以使用交叉连接执行此操作,并以编程方式构建一个查询来计算距离函数,或者使用当前处于封闭 alpha 版本中的用户定义函数功能。
请谨慎使用大型数据集的交叉连接。 Cross Joins 做 N^2 工作,并且可以生成 N^2 输出。两个只有一百万行的小表的交叉连接会产生一万亿行输出。交叉连接 20 亿行表会生成连续的输出行。
如果您确实对大型数据集进行交叉联接,则应尝试进行预聚合或过滤以减少实际需要联接的行数。
在 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 解决方案?
有两个答案:
- 您可以使用交叉连接执行此操作,并以编程方式构建一个查询来计算距离函数,或者使用当前处于封闭 alpha 版本中的用户定义函数功能。
请谨慎使用大型数据集的交叉连接。 Cross Joins 做 N^2 工作,并且可以生成 N^2 输出。两个只有一百万行的小表的交叉连接会产生一万亿行输出。交叉连接 20 亿行表会生成连续的输出行。
如果您确实对大型数据集进行交叉联接,则应尝试进行预聚合或过滤以减少实际需要联接的行数。