すべての映画を一度に比較する
データセット内の任意の2本の映画について Jaccard 類似度を求めるのは小規模な分析には有効ですが、大規模データではレコメンドに時間がかかることがあります。
この演習では、すべての映画同士の類似度を計算し、すばやく参照できるように DataFrame に保存します。
DataFrame の各行どうしの類似度を求める場合、全ペアを走査して個別に計算することもできますが、scipy の pdist()(pairwise distance)関数を使う方が効率的です。
同じライブラリの squareform() を使えば、これを所望の長方形の形に整形できます。距離ではなく類似度が欲しいので、値を 1 から引いて変換しましょう。
movie_cross_table はあらかじめ読み込まれています。
この演習はコースの一部です
Pythonでつくるレコメンデーションエンジン
演習の手順
- すべての映画間の Jaccard 距離を求め、結果を
jaccard_similarity_arrayに代入します。 jaccard_similarity_arrayから DataFrame を作成し、行・列のラベルにはmovie_genre_df.indexを使用します。- DataFrame の先頭5行を表示し、類似度スコアを確認します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Import functions from scipy
from scipy.spatial.distance import pdist, squareform
# Calculate all pairwise distances
jaccard_distances = ____(movie_cross_table.values, metric='____')
# Convert the distances to a square matrix
jaccard_similarity_array = 1 - ____(____)
# Wrap the array in a pandas DataFrame
jaccard_similarity_df = pd.____(jaccard_similarity_array, ____=movie_cross_table.index, ____=movie_cross_table.index)
# Print the top 5 rows of the DataFrame
print(jaccard_similarity_df.head())