特異値分解(SVD)

Pythonでつくるレコメンデーションエンジン

Rob O'Callaghan

Director of Data

SVD の役割

スパースな長方行列

Pythonでつくるレコメンデーションエンジン

SVD の役割

スパースな長方行列と最初の因子

Pythonでつくるレコメンデーションエンジン

SVD の役割

スパースな長方行列と2つの因子

Pythonでつくるレコメンデーションエンジン

SVD の役割

スパースな長方行列とその因子

Pythonでつくるレコメンデーションエンジン

データの前処理

print(book_ratings_df.shape)
(220, 500)
avg_ratings = book_ratings_df.mean(axis=1)

print(avg_ratings)
array([[4.5 ],
       [3.5],
       [2.5],
       [3.5],
        ... 
       [2.2]])
Pythonでつくるレコメンデーションエンジン

データの前処理

user_ratings_pivot_centered = user_ratings_df.sub(avg_ratings, axis=0)
user_ratings_df.fillna(0, inplace=True)

print(user_ratings_df)
          The Great Gatsby    The Catcher in the Rye    Fifty Shades of Grey                    
User_233               0.0                       0.0                     0.0
User_651               0.0                       0.5                    -0.5
User_965               0.5                      -0.5                     0.0
     ...               ...                       ...                     ...
Pythonでつくるレコメンデーションエンジン

SVD の適用

from scipy.sparse.linalg import svds

U, sigma, Vt = svds(user_ratings_pivot_centered)
print(U.shape)
(610, 6)
print(Vt.shape)
(6, 1000)
Pythonでつくるレコメンデーションエンジン

SVD の適用

print(sigma)
[3.0, 4.8, -12.6, -3.8, 8.2, 7.3]
sigma = np.diag(sigma)
print(sigma)
array([   3.0    ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ],
       [  0.     ,   4.8    ,   0.     ,   0.     ,   0.     ,   0.     ],
       [  0.     ,   0.     , -12.6    ,   0.     ,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,  -3.8    ,   0.     ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ,   8.2    ,   0.     ],
       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   7.3    ]),
Pythonでつくるレコメンデーションエンジン

最終行列の取得

SVD で得られた3つの因子行列

Pythonでつくるレコメンデーションエンジン

最終行列の取得

SVD で得られた3つの因子行列

Pythonでつくるレコメンデーションエンジン

最終行列の取得

SVD で得られた3つの因子行列

Pythonでつくるレコメンデーションエンジン

最終行列の取得

SVD の3因子行列とその積

Pythonでつくるレコメンデーションエンジン

Python で積を計算する

recalculated_ratings =        np.dot(U, sigma)     

Pythonでつくるレコメンデーションエンジン

Python で積を計算する

recalculated_ratings = np.dot(np.dot(U, sigma), Vt)
print(recalculated_ratings)
[[  0.1      -0.9       -3.6.     ...   ]
 [ -2.3       0.5       -0.5      ...   ]
 [  0.5      -0.5        2.0      ...   ]
 [ ...        ...        ...      ...   ]]
Pythonでつくるレコメンデーションエンジン

平均を戻す

recalculated_ratings = recalculated_ratings + avg_ratings.values.reshape(-1, 1)
print(recalculated_ratings)
[[  4.6       3.6        0.9      ...   ]
 [  1.8       4.0        3.0      ...   ]
 [  3.0       2.0        4.5      ...   ]
 [ ...        ...        ...      ...   ]]
print(book_ratings_df)
[[  5.0       4.0         NA      ...   ]
 [   NA       4.0        3.0      ...   ]
 [  3.0       2.0         NA      ...   ]
 [ ...        ...        ...      ...   ]]
Pythonでつくるレコメンデーションエンジン

練習しましょう!

Pythonでつくるレコメンデーションエンジン

Preparing Video For Download...