37. Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
商品ごとのスコアの合計とノルムを計算
SELECT
item
, SUM(score) AS sum
, SQRT(SUM(score)) AS norm
FROM
ratings
GROUP BY item
;
item sum norm
商品X 5 2.2360…
商品X 4 2
商品X 9 3
38. Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
ウィンドウ関数を⽤いて、ノルムでベクト
ルの値を割り算
SELECT
user
, item
, SQRT(SUM(score)
OVER(PARTITION BY item))
AS norm
, score / SQRT(SUM(score)
OVER(PARTITION BY item))
AS nscore
FROM
ratings
;
user item norm nsocre
ユーザA 商品X 2.2360… 0.4472…
ユーザC 商品X 2.2360… 0.4472…
ユーザE 商品X 2.2360… 0.4472…
ユーザG 商品X 2.2360… 0.4472…
ユーザI 商品X 2.2360… 0.4472…
ユーザA 商品Y 2 0.5
ユーザC 商品Y 2 0.5
ユーザE 商品Y 2 0.5
…
…
…
…
39. Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
WITH
norm_ratings AS (
SELECT user, item
, score / SQRT(SUM(score)
OVER(PARTITION BY item)) AS nscore
FROM ratings
)
SELECT
r1.item AS target
, r2.item AS recommend
, SUM(r1.nscore*r2.nscore) AS score
FROM
norm_ratings AS r1
JOIN
norm_ratings AS r2
ON r1.user = r2.user
GROUP BY
r1.item, r2.item
;
正規化したベクトルで内積計算
item1 item2 score
商品X 商品X 1
商品X 商品Y 0.8944…
商品X 商品Z 0.7453…
商品Y 商品X 0.8944…
商品Y 商品Y 1
商品Y 商品Z 0.6666…
商品Z 商品X 0.7453…
商品Z 商品Y 0.6666…
…
…
…