Косинусное сходство между парой массивов в Bigquery - PullRequest
0 голосов
/ 26 декабря 2018

Я создал таблицу, в которой есть пара идентификаторов и координат для каждого из них, чтобы я мог рассчитать попарно сходство косинусов между ними.

Таблица выглядит следующим образом enter image description here

Количество измерений для координат в настоящее время составляет 128, но оно может варьироваться.Но числовые измерения для пары ID всегда одинаковы в одной и той же таблице.

coord1 и coord2 - это повторяющиеся поля (массивы) со значениями с плавающей запятой.

Есть лиспособ вычисления косинусного сходства между ними?

Мой ожидаемый результат будет иметь три столбца, id1, id2 и cosine_similarity.

1 Ответ

0 голосов
/ 26 декабря 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id1, id2, ( 
  SELECT 
    SUM(value1 * value2)/ 
    SQRT(SUM(value1 * value1))/ 
    SQRT(SUM(value2 * value2))
  FROM UNNEST(coord1) value1 WITH OFFSET pos1 
  JOIN UNNEST(coord2) value2 WITH OFFSET pos2 
  ON pos1 = pos2
  ) cosine_similarity
FROM `project.dataset.table`  

ниже приведен фиктивный пример для игры с

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id1, [1.0, 2.0, 3.0, 4.0] coord1, 2 id2, [1.0, 2.0, 3.0, 4.0] coord2 UNION ALL
  SELECT 3, [2.0, 0.0, 1.0, 1.0, 0, 2.0, 1.0, 1.0], 4, [2.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0]
)
SELECT id1, id2, ( 
  SELECT 
    SUM(value1 * value2)/
    SQRT(SUM(value1 * value1))/ 
    SQRT(SUM(value2 * value2))
  FROM UNNEST(coord1) value1 WITH OFFSET pos1 
  JOIN UNNEST(coord2) value2 WITH OFFSET pos2 
  ON pos1 = pos2
  ) cosine_similarity
FROM `project.dataset.table`  

с результатом

Row id1 id2 cosine_similarity    
1   1   2   1.0  
2   3   4   0.8215838362577491   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...