【问题标题】:How to create similarity matrix in Google BigQuery like pdist in MATLAB?如何在 Google BigQuery 中创建相似度矩阵,如 MATLAB 中的 pdist?
【发布时间】:2015-04-09 23:53:36
【问题描述】:

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

所以对于 BigQuery 中的表:

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

应该返回

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

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

作为列的对也是可以接受的(方法(到目前为止我的猜测)是使用自连接,但我不确定如何遍历所有列 - 例如我有 ~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 解决方案吗?

【问题讨论】:

    标签: sql matrix google-bigquery similarity self-join


    【解决方案1】:

    有两个答案:

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

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

    【讨论】:

    • 我仍然不清楚 BigQuery 中推荐的按行聚合以便在发生交叉连接后获得成对相似度分数的过程。你对这一点有什么建议吗?我的想法是使用第三方转置表格,然后上传,使列操作变成行操作。我不想输入每个列名,因为有 2000 个,而且每次都不同。
    • 您可以在 BigQuery 中转置表,但需要编写大型查询。无需手动编写查询 - 如果您需要代码,请添加一个新问题(我发现了一个真正了不起的证明,这个空白太窄而无法包含)
    • 这里为您添加了一个新问题:stackoverflow.com/questions/29565007/…
    猜你喜欢
    • 2011-05-09
    • 2022-01-12
    • 2013-08-28
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2021-01-09
    • 2017-06-13
    相关资源
    最近更新 更多