Porównywanie wszystkich filmów naraz
Wyznaczanie podobieństwa Jaccarda między dwoma pojedynczymi filmami w zbiorze danych sprawdza się w małych analizach, ale na większych zbiorach danych może być zbyt wolne, by generować rekomendacje w rozsądnym czasie.
W tym ćwiczeniu wyznaczysz podobieństwa między wszystkimi filmami i zapiszesz je w DataFrame, aby móc szybko i wygodnie je przeglądać.
Do obliczania podobieństw między wierszami DataFrame można przejść przez wszystkie pary i wyliczyć je osobno – znacznie wydajniej jest jednak skorzystać z funkcji pdist() (odległości parami) z biblioteki scipy.
Wynik można przekształcić do pożądanego prostokątnego kształtu za pomocą funkcji squareform() z tej samej biblioteki. Ponieważ zależy ci na wartościach podobieństwa, a nie odległości, odejmij otrzymane wartości od 1.
movie_cross_table zostało ponownie wczytane.
To ćwiczenie jest częścią kursu
Budowanie systemów rekomendacji w Pythonie
Instrukcje do ćwiczenia
- Oblicz miary odległości Jaccarda między wszystkimi filmami i przypisz wyniki do zmiennej
jaccard_similarity_array. - Utwórz DataFrame z
jaccard_similarity_array, używającmovie_genre_df.indexjako indeksu wierszy i kolumn. - Wyświetl 5 pierwszych wierszy DataFrame i przeanalizuj wartości podobieństwa.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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())