始める無料で始める

すべての映画を一度に比較する

データセット内の任意の2本の映画について Jaccard 類似度を求めるのは小規模な分析には有効ですが、大規模データではレコメンドに時間がかかることがあります。

この演習では、すべての映画同士の類似度を計算し、すばやく参照できるように DataFrame に保存します。

DataFrame の各行どうしの類似度を求める場合、全ペアを走査して個別に計算することもできますが、scipypdist()(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())
コードを編集して実行