Repository: rposhala/Recommender-System-on-MovieLens-dataset Branch: main Commit: 7e9b1dce2acf Files: 6 Total size: 1.0 MB Directory structure: gitextract_6b3qicba/ ├── Images/ │ └── .gitkeep ├── Item_based_Collaborative_Recommender_System_using_KNN.ipynb ├── Knowledge_based_Recommender_System.ipynb ├── README.md ├── Recommender_System_using_SVD.ipynb └── Recommender_System_using_Softmax_DNN.ipynb ================================================ FILE CONTENTS ================================================ ================================================ FILE: Images/.gitkeep ================================================ ================================================ FILE: Item_based_Collaborative_Recommender_System_using_KNN.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Item-based-Collaborative-Recommender-System-using-KNN.ipynb", "provenance": [], "collapsed_sections": [ "jVJu1rsTx0F3" ], "authorship_tag": "ABX9TyM1K937XEBtUiFWogHB4DtZ", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "metadata": { "id": "bwSPLalV6Rca" }, "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from scipy.sparse import csr_matrix\n", "from sklearn.neighbors import NearestNeighbors" ], "execution_count": 113, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "HKw5H628aSY9" }, "source": [ "DATASET_LINK='http://files.grouplens.org/datasets/movielens/ml-100k.zip'" ], "execution_count": 114, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "gavevc8waXW_", "outputId": "138b5e41-3605-4838-f1f7-9eac9315c9c6", "colab": { "base_uri": "https://localhost:8080/", "height": 67 } }, "source": [ "!wget -nc http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "!unzip -n ml-100k.zip" ], "execution_count": 115, "outputs": [ { "output_type": "stream", "text": [ "File ‘ml-100k.zip’ already there; not retrieving.\n", "\n", "Archive: ml-100k.zip\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "d4WNkFXcauZ3" }, "source": [ "## Loading MovieLens dataset" ] }, { "cell_type": "markdown", "metadata": { "id": "3jZ7lU8RafYz" }, "source": [ "Loading u.info -- The number of users, items, and ratings in the u data set." ] }, { "cell_type": "code", "metadata": { "id": "dEj5ZJQzaX-7", "outputId": "b73df5ec-cf04-491f-ad79-e2b9a8c26b16", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "overall_stats = pd.read_csv('ml-100k/u.info', header=None)\n", "print(\"Details of users, items and ratings involved in the loaded movielens dataset: \",list(overall_stats[0]))" ], "execution_count": 116, "outputs": [ { "output_type": "stream", "text": [ "Details of users, items and ratings involved in the loaded movielens dataset: ['943 users', '1682 items', '100000 ratings']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "aFzpbJ_Hap8V" }, "source": [ "Loading u.data -- The full u data set, 100000 ratings by 943 users on 1682 items.\n", "\n", "---\n", "\n", "\n", "\n", " Each user has rated at least 20 movies. Users and items are\n", " numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of \n", "\t user id | item id | rating | timestamp. \n", " The time stamps are unix seconds since 1/1/1970 UTC " ] }, { "cell_type": "code", "metadata": { "id": "NXg9Sj7ralr4", "outputId": "0c8ac301-e92f-4682-df49-9c21c137dcd0", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "## same item id is same as movie id, item id column is renamed as movie id\n", "column_names1 = ['user id','movie id','rating','timestamp']\n", "dataset = pd.read_csv('ml-100k/u.data', sep='\\t',header=None,names=column_names1)\n", "dataset.head() " ], "execution_count": 117, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestamp
01962423881250949
11863023891717742
2223771878887116
3244512880606923
41663461886397596
\n", "
" ], "text/plain": [ " user id movie id rating timestamp\n", "0 196 242 3 881250949\n", "1 186 302 3 891717742\n", "2 22 377 1 878887116\n", "3 244 51 2 880606923\n", "4 166 346 1 886397596" ] }, "metadata": { "tags": [] }, "execution_count": 117 } ] }, { "cell_type": "code", "metadata": { "id": "M2lYi6toa9tA", "outputId": "01b6797c-12cf-479f-fc6e-1889e088e8af", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "len(dataset), max(dataset['movie id']),min(dataset['movie id'])" ], "execution_count": 118, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(100000, 1682, 1)" ] }, "metadata": { "tags": [] }, "execution_count": 118 } ] }, { "cell_type": "markdown", "metadata": { "id": "9C9qVRfcbE0k" }, "source": [ "Loading u.item -- Information about the items (movies); this is a tab separated\n", "\n", " list of\n", " movie id | movie title | release date | video release date |\n", " IMDb URL | unknown | Action | Adventure | Animation |\n", " Children's | Comedy | Crime | Documentary | Drama | Fantasy |\n", " Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi |\n", " Thriller | War | Western |\n", " The last 19 fields are the genres, a 1 indicates the movie\n", " is of that genre, a 0 indicates it is not; movies can be in\n", " several genres at once.\n", " The movie ids are the ones used in the u.data data set.\n" ] }, { "cell_type": "code", "metadata": { "id": "ZaMNuf9fbA0V", "outputId": "d0d0ced1-9bfb-404a-d0d4-e168cddc6ea0", "colab": { "base_uri": "https://localhost:8080/", "height": 420 } }, "source": [ "d = 'movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western'\n", "column_names2 = d.split(' | ')\n", "column_names2" ], "execution_count": 119, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['movie id',\n", " 'movie title',\n", " 'release date',\n", " 'video release date',\n", " 'IMDb URL',\n", " 'unknown',\n", " 'Action',\n", " 'Adventure',\n", " 'Animation',\n", " 'Children',\n", " 'Comedy',\n", " 'Crime',\n", " 'Documentary',\n", " 'Drama',\n", " 'Fantasy',\n", " 'Film-Noir',\n", " 'Horror',\n", " 'Musical',\n", " 'Mystery',\n", " 'Romance',\n", " 'Sci-Fi',\n", " 'Thriller',\n", " 'War',\n", " 'Western']" ] }, "metadata": { "tags": [] }, "execution_count": 119 } ] }, { "cell_type": "code", "metadata": { "id": "Cv_sboAHbMp7", "outputId": "db4cb56c-afa3-4ad4-bef6-fd6937eaddf1", "colab": { "base_uri": "https://localhost:8080/", "height": 758 } }, "source": [ "items_dataset = pd.read_csv('ml-100k/u.item', sep='|',header=None,names=column_names2,encoding='latin-1')\n", "items_dataset" ], "execution_count": 120, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie titlerelease datevideo release dateIMDb URLunknownActionAdventureAnimationChildrenComedyCrimeDocumentaryDramaFantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...0001110000000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...0110000000000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...0000000000000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...0100010010000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)0000001010000000100
...........................................................................
16771678Mat' i syn (1997)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?Mat%27+i+syn+...0000000010000000000
16781679B. Monkey (1998)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?B%2E+Monkey+(...0000000000000010100
16791680Sliding Doors (1998)01-Jan-1998NaNhttp://us.imdb.com/Title?Sliding+Doors+(1998)0000000010000010000
16801681You So Crazy (1994)01-Jan-1994NaNhttp://us.imdb.com/M/title-exact?You%20So%20Cr...0000010000000000000
16811682Scream of Stone (Schrei aus Stein) (1991)08-Mar-1996NaNhttp://us.imdb.com/M/title-exact?Schrei%20aus%...0000000010000000000
\n", "

1682 rows × 24 columns

\n", "
" ], "text/plain": [ " movie id movie title ... War Western\n", "0 1 Toy Story (1995) ... 0 0\n", "1 2 GoldenEye (1995) ... 0 0\n", "2 3 Four Rooms (1995) ... 0 0\n", "3 4 Get Shorty (1995) ... 0 0\n", "4 5 Copycat (1995) ... 0 0\n", "... ... ... ... .. ...\n", "1677 1678 Mat' i syn (1997) ... 0 0\n", "1678 1679 B. Monkey (1998) ... 0 0\n", "1679 1680 Sliding Doors (1998) ... 0 0\n", "1680 1681 You So Crazy (1994) ... 0 0\n", "1681 1682 Scream of Stone (Schrei aus Stein) (1991) ... 0 0\n", "\n", "[1682 rows x 24 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 120 } ] }, { "cell_type": "code", "metadata": { "id": "VFhUx9zsbQpD", "outputId": "d6bf0a5a-4dd8-4923-9b91-c50a04bef417", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "movie_dataset = items_dataset[['movie id','movie title']]\n", "movie_dataset.head()" ], "execution_count": 121, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie title
01Toy Story (1995)
12GoldenEye (1995)
23Four Rooms (1995)
34Get Shorty (1995)
45Copycat (1995)
\n", "
" ], "text/plain": [ " movie id movie title\n", "0 1 Toy Story (1995)\n", "1 2 GoldenEye (1995)\n", "2 3 Four Rooms (1995)\n", "3 4 Get Shorty (1995)\n", "4 5 Copycat (1995)" ] }, "metadata": { "tags": [] }, "execution_count": 121 } ] }, { "cell_type": "markdown", "metadata": { "id": "Wr2cmp5impC7" }, "source": [ "Looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column" ] }, { "cell_type": "code", "metadata": { "id": "iIwj68LWGeQX", "outputId": "1df25549-276e-49fc-950f-139f79f493e2", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "## looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column\n", "len(items_dataset.groupby(by=column_names2[1:])),len(items_dataset)" ], "execution_count": 122, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1664, 1682)" ] }, "metadata": { "tags": [] }, "execution_count": 122 } ] }, { "cell_type": "markdown", "metadata": { "id": "AfBNIWO7mqjc" }, "source": [ "We can see there are 18 extra movie id's for already mapped movie title and the same duplicate movie id is assigned to the user in the user-item dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "nwdvxUdkbiPK" }, "source": [ "## Merging required datasets" ] }, { "cell_type": "code", "metadata": { "id": "-fKazhqFbcAq", "outputId": "636990d0-c78b-4b1e-f269-dec12c317de3", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "merged_dataset = pd.merge(dataset, movie_dataset, how='inner', on='movie id')\n", "merged_dataset.head()" ], "execution_count": 123, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
01962423881250949Kolya (1996)
1632423875747190Kolya (1996)
22262425883888671Kolya (1996)
31542423879138235Kolya (1996)
43062425876503793Kolya (1996)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "0 196 242 3 881250949 Kolya (1996)\n", "1 63 242 3 875747190 Kolya (1996)\n", "2 226 242 5 883888671 Kolya (1996)\n", "3 154 242 3 879138235 Kolya (1996)\n", "4 306 242 5 876503793 Kolya (1996)" ] }, "metadata": { "tags": [] }, "execution_count": 123 } ] }, { "cell_type": "markdown", "metadata": { "id": "ELmLkEQBnxv1" }, "source": [ "A dataset is created from the existing merged dataset by grouping the unique user id and movie title combination and the ratings by a user to the same movie in different instances (timestamps) are averaged and stored in the new dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "zd2jR0cFouee" }, "source": [ "Example of a multiple rating scenario by an user to a specific movie:" ] }, { "cell_type": "code", "metadata": { "id": "HQ6owSOikYMq", "outputId": "496ac596-719b-4ad3-bf8f-79cae6e0e88d", "colab": { "base_uri": "https://localhost:8080/", "height": 106 } }, "source": [ "merged_dataset[(merged_dataset['movie title'] == 'Chasing Amy (1997)') & (merged_dataset['user id'] == 894)]" ], "execution_count": 124, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
48008942464882404137Chasing Amy (1997)
223408942683879896041Chasing Amy (1997)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "4800 894 246 4 882404137 Chasing Amy (1997)\n", "22340 894 268 3 879896041 Chasing Amy (1997)" ] }, "metadata": { "tags": [] }, "execution_count": 124 } ] }, { "cell_type": "code", "metadata": { "id": "p5XS_3dPhCVb", "outputId": "f122409a-556b-4dd7-eeb0-1c98b280c81d", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset = merged_dataset.groupby(by=['user id','movie title'], as_index=False).agg({\"rating\":\"mean\"})\n", "\n", "refined_dataset.head()" ], "execution_count": 125, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titlerating
01101 Dalmatians (1996)2.0
1112 Angry Men (1957)5.0
2120,000 Leagues Under the Sea (1954)3.0
312001: A Space Odyssey (1968)4.0
41Abyss, The (1989)3.0
\n", "
" ], "text/plain": [ " user id movie title rating\n", "0 1 101 Dalmatians (1996) 2.0\n", "1 1 12 Angry Men (1957) 5.0\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0\n", "3 1 2001: A Space Odyssey (1968) 4.0\n", "4 1 Abyss, The (1989) 3.0" ] }, "metadata": { "tags": [] }, "execution_count": 125 } ] }, { "cell_type": "markdown", "metadata": { "id": "W_HNZ2j9dP5O" }, "source": [ "## Exploratory data analysis\n", "\n", "* Plot the counts of each rating\n", "* Plot rating frequency of each movie" ] }, { "cell_type": "markdown", "metadata": { "id": "i_cInoHOrk4o" }, "source": [ "**Plot the counts of each rating**\n", "\n", "we first need to get the counts of each rating from ratings data" ] }, { "cell_type": "code", "metadata": { "id": "qkoNLoyabl42", "outputId": "e71b61e0-1106-4cc1-f4af-b4cbce4d6400", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "# num_users = len(refined_dataset.rating.unique())\n", "# num_items = len(refined_dataset.movieId.unique())\n", "num_users = len(refined_dataset['user id'].value_counts())\n", "num_items = len(refined_dataset['movie title'].value_counts())\n", "print('Unique number of users in the dataset: {}'.format(num_users))\n", "print('Unique number of movies in the dataset: {}'.format(num_items))\n" ], "execution_count": 126, "outputs": [ { "output_type": "stream", "text": [ "Unique number of users in the dataset: 943\n", "Unique number of movies in the dataset: 1664\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Ea3fORd-r24Z", "outputId": "1aed76ea-4851-436e-943a-1eb45473905b", "colab": { "base_uri": "https://localhost:8080/", "height": 343 } }, "source": [ "rating_count_df = pd.DataFrame(refined_dataset.groupby(['rating']).size(), columns=['count'])\n", "rating_count_df" ], "execution_count": 127, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
rating
1.06083
1.53
2.011334
2.56
3.027060
3.519
4.034042
4.516
5.021130
\n", "
" ], "text/plain": [ " count\n", "rating \n", "1.0 6083\n", "1.5 3\n", "2.0 11334\n", "2.5 6\n", "3.0 27060\n", "3.5 19\n", "4.0 34042\n", "4.5 16\n", "5.0 21130" ] }, "metadata": { "tags": [] }, "execution_count": 127 } ] }, { "cell_type": "code", "metadata": { "id": "BbcBMiiC0GIl", "outputId": "b777075a-17f1-44a5-d239-808d729274a4", "colab": { "base_uri": "https://localhost:8080/", "height": 539 } }, "source": [ "ax = rating_count_df.reset_index().rename(columns={'index': 'rating score'}).plot('rating','count', 'bar',\n", " figsize=(12, 8),\n", " title='Count for Each Rating Score',\n", " fontsize=12)\n", "\n", "ax.set_xlabel(\"movie rating score\")\n", "ax.set_ylabel(\"number of ratings\")" ], "execution_count": 128, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, 'number of ratings')" ] }, "metadata": { "tags": [] }, "execution_count": 128 }, { "output_type": "display_data", "data": { "image/png": "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jq/rNOA0gIULF9amHZ0kSZIGMffNF2/R/V333mdt0f1tilNOOYWXvvSl3O9+99vsfU317RJnMvEc87FQvF1VraQ35WVBX/sCYGm3vLS/LcmO3T6XDtBXkiRJ08zZZ5/NAQccwIIFC3jZy17Gddddx9Oe9jQOOOAADj30UH7yk58AcMwxx/Cv//qv9/SbPbs3GePyyy/nqU99Ki984QuZN28eRx11FFXFqaeeyg033MAhhxzCIYccstl1Di2YJ3lAkiOSzE4yI8kzgJcAX0xyUJJHJNkuyW7AqcDlVTU2BeVs4IQku3QXdR4LnNm1XQg8OsnhSWYBbweWVNW1A/SVJEnSNLJ06VJOOukkvvSlL7F48WL+7u/+jje84Q0cffTRLFmyhKOOOorjjz9+0v18+9vf5pRTTuG73/0uP/rRj7jyyis5/vjjedCDHsRll13GZZddttm1DnPEvIDXANcDK4EPAH9SVRcBDwUuoTfF5L/ozTt/SV/fd9C7oHMZ8GXg5LHbHVbVcuBw4N3dfg8CjhikryRJkqaXL33pS7zoRS9i9913B2DXXXfl61//OkceeSQAL3vZy7jiiism3c/jH/949t57b7bbbjsOPPBArrvuui1e69DmmHcB+inraTsXOHcDfdcBr+heE7VfCsxbT9sG+0qSJEkTmTlzJnfffTcAd999N7fffvs9bTvssMM9yzNmzODOOyd6FM/mmeo55pIkSdKUedrTnsb555/PihW951v+4he/4IlPfCL/8i//AsA555zDwQcfDMDcuXO56qqrALjooou44447Jt3/nDlzWL16wvuMbLQpuSuLJEmSNArz58/nrW99K095ylOYMWMGv/3bv83f//3f8/KXv5yTTz6ZPfbYg49//OMAHHvssTzvec9jwYIFHHbYYey4446T7v+4447jsMMOu2eu+eZIlXcJhN7tEhctWjT5hpIkSRrINddcwyMf+chRlzEyEx1/kquqauFE2zuVRZIkSWqAwVySJElqgMFckiRJaoAXf0qSpM2ypR+zviW08Kh29VQVSUZdxpTblOs4HTGXJEnSUMyaNYsVK1ZsUkjdmlUVK1asYNasWRvVzxFzSZIkDcXee+/N9ddfz/Lly0ddypSbNWsWe++990b1MZhLkiRpKLbffnse8pCHjLqMrYZTWSRJkqQGGMwlSZKkBhjMJUmSpAYY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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "zM7NoOXG1vYU" }, "source": [ "We can see that number of 1.5, 2.5, 3.5, 4.5 ratings by the users are comparitively negligible." ] }, { "cell_type": "markdown", "metadata": { "id": "cXYlt0OFxP1z" }, "source": [ "Ratings for the movies not seen by a user is by default considered as 0. Lets calculate and add it to the existing dataframe." ] }, { "cell_type": "code", "metadata": { "id": "lgyPInMAwQAv", "outputId": "10191306-986d-469f-dd46-5be593208c7f", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "total_count = num_items * num_users\n", "zero_count = total_count-refined_dataset.shape[0]\n", "zero_count" ], "execution_count": 129, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1469459" ] }, "metadata": { "tags": [] }, "execution_count": 129 } ] }, { "cell_type": "code", "metadata": { "id": "avyj8_8ewjA_", "outputId": "8e6b1763-1ea6-45ed-e86c-8ec1216e1fe4", "colab": { "base_uri": "https://localhost:8080/", "height": 343 } }, "source": [ "# append counts of zero rating to df_ratings_cnt\n", "rating_count_df = rating_count_df.append(\n", " pd.DataFrame({'count': zero_count}, index=[0.0]),\n", " verify_integrity=True,\n", ").sort_index()\n", "rating_count_df" ], "execution_count": 130, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
0.01469459
1.06083
1.53
2.011334
2.56
3.027060
3.519
4.034042
4.516
5.021130
\n", "
" ], "text/plain": [ " count\n", "0.0 1469459\n", "1.0 6083\n", "1.5 3\n", "2.0 11334\n", "2.5 6\n", "3.0 27060\n", "3.5 19\n", "4.0 34042\n", "4.5 16\n", "5.0 21130" ] }, "metadata": { "tags": [] }, "execution_count": 130 } ] }, { "cell_type": "markdown", "metadata": { "id": "Ofd8LQcVxvYA" }, "source": [ "Number of times no rating was given (forged as 0 in this case) is a lot more than other ratings." ] }, { "cell_type": "markdown", "metadata": { "id": "f7ngnrerysBV" }, "source": [ "So let's take log transform for count values and then we can plot them to compare" ] }, { "cell_type": "code", "metadata": { "id": "ACZx4jhKxtGH", "outputId": "43772624-dd68-4665-dab7-776df6fb0200", "colab": { "base_uri": "https://localhost:8080/", "height": 343 } }, "source": [ "# add log count\n", "rating_count_df['log_count'] = np.log(rating_count_df['count'])\n", "rating_count_df" ], "execution_count": 131, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countlog_count
0.0146945914.200405
1.060838.713253
1.531.098612
2.0113349.335562
2.561.791759
3.02706010.205812
3.5192.944439
4.03404210.435350
4.5162.772589
5.0211309.958449
\n", "
" ], "text/plain": [ " count log_count\n", "0.0 1469459 14.200405\n", "1.0 6083 8.713253\n", "1.5 3 1.098612\n", "2.0 11334 9.335562\n", "2.5 6 1.791759\n", "3.0 27060 10.205812\n", "3.5 19 2.944439\n", "4.0 34042 10.435350\n", "4.5 16 2.772589\n", "5.0 21130 9.958449" ] }, "metadata": { "tags": [] }, "execution_count": 131 } ] }, { "cell_type": "code", "metadata": { "id": "J2LE9usIy1Mz", "outputId": "b0bd7926-7d36-4e9d-ec5b-f9f090ef228d", "colab": { "base_uri": "https://localhost:8080/", "height": 343 } }, "source": [ "rating_count_df = rating_count_df.reset_index().rename(columns={'index': 'rating score'})\n", "rating_count_df" ], "execution_count": 132, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating scorecountlog_count
00.0146945914.200405
11.060838.713253
21.531.098612
32.0113349.335562
42.561.791759
53.02706010.205812
63.5192.944439
74.03404210.435350
84.5162.772589
95.0211309.958449
\n", "
" ], "text/plain": [ " rating score count log_count\n", "0 0.0 1469459 14.200405\n", "1 1.0 6083 8.713253\n", "2 1.5 3 1.098612\n", "3 2.0 11334 9.335562\n", "4 2.5 6 1.791759\n", "5 3.0 27060 10.205812\n", "6 3.5 19 2.944439\n", "7 4.0 34042 10.435350\n", "8 4.5 16 2.772589\n", "9 5.0 21130 9.958449" ] }, "metadata": { "tags": [] }, "execution_count": 132 } ] }, { "cell_type": "code", "metadata": { "id": "vb5wAmR4zg7s", "outputId": "8b822e7a-4e99-460e-e78f-2e4fa97bf9af", "colab": { "base_uri": "https://localhost:8080/", "height": 539 } }, "source": [ "ax = rating_count_df.plot('rating score', 'log_count', 'bar', figsize=(12, 8),\n", " title='Count for Each Rating Score (in Log Scale)',\n", " logy=True,\n", " fontsize=12,)\n", "\n", "ax.set_xlabel(\"movie rating score\")\n", "ax.set_ylabel(\"number of ratings\")" ], "execution_count": 133, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, 'number of ratings')" ] }, "metadata": { "tags": [] }, "execution_count": 133 }, { "output_type": "display_data", "data": { "image/png": "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XWTZWrs+yRP79/zvdJ/3cRv4vrNqrV2c5Mx04enf0100eWm6YQk3ZfUhBx/r/7u8qjZmOrcXpBvnuzzdz/Gk9MNRZnFdut77H6QbTvCOJEe01lb9nF+UblzvN5NclW6Melp3MeqbkvxLuuB4/3QXts6qtXZ+klekuwj0p+kuvHvJOj7DcUlesEbP8e3xvCQ/H3l8d13nWn++/Va6oTvX9vt9Mmtvx58leWe68+aadOOvn9Va+14/ZOTQdL3KP0hyebqpGZPuQuB90/3l4vQkJ6/jM7w73YW0/1FV16e7iHL0H38vSBfAgTlSqw8VA2Ahqu6mMN9srf3JpGvZEFX1z+kuODxlvTvPg6r6UpL3tdb+cdK1rKmq7p5u6sKHttbWNU4duB2Ea4AFqKr2T/KTJJcleVK6v1D8emvtaxMtbMpU1WPSzWhyTWZ6he/XD5cBFiCzhQAsTPdIN7zgLumGIBwhWG+UB6Ubl33HJN9L8mzBGhY2PdcAADAQFzQCAMBAhGsAABjIZjPm+q53vWtbunTppMsAAGAz95WvfOWa1trdZtu22YTrpUuX5vzzz590GQAAbOaqaq03YjIsBAAABiJcAwDAQIRrAAAYyGYz5hoAYKH75S9/mcsvvzw33eQO90NYvHhxdt5552y11VZjv0a4BgDYTFx++eXZfvvts3Tp0lTVpMuZaq21LF++PJdffnl23XXXsV9nWAgAwGbipptuyl3uchfBegBVlbvc5S4b/FcA4RoAYDMiWA9nY9pSuAYAgIEYcw0AsJlaevTpgx5v2bFPXe8+2223XW644YZB33cunXLKKXngAx+YPffcc5Dj6bkGAGDBOuWUU/L1r399sOMJ1wAADK61lqOOOiq/9mu/lr322isnnXRSkmTlypU58sgjs/vuu+eJT3xinvKUp+TjH//4Wo9z3nnn5ZGPfGT23nvvHHDAAbn++utz00035aUvfWn22muvPPShD83nPve5JMnxxx+fV7/61be99pBDDsnnP//5JF2P+hvf+MbsvffeecQjHpErr7wy55xzTk499dQcddRR2WefffLd7373dn9uw0IAABjcySefnAsuuCAXXnhhrrnmmuy///559KMfnbPPPjvLli3L17/+9Vx11VXZY4898rKXvWzWY9x888057LDDctJJJ2X//ffPddddl2233Tbvfve7U1W5+OKL881vfjNPetKTcumll66znhtvvDGPeMQj8ra3vS1/+Id/mPe///055phj8rSnPS2HHHJInv3sZw/yufVcAwAwuLPOOivPe97zsuWWW2annXbKYx7zmJx33nk566yz8pznPCdbbLFF7nGPe+Rxj3vcWo/xrW99K/e85z2z//77J0l22GGHLFq0KGeddVZe+MIXJkl233333Pe+911vuN56661zyCGHJEke9rCHZdmyZcN80DUI1wAAbBYWLVqUlStX3rY8Okf1VlttddvUeltuuWVuueWWOalBuAYAYHAHHXRQTjrppNx66625+uqrc+aZZ+aAAw7IgQcemH/5l3/JypUrc+WVV942Jno2D3rQg3LFFVfkvPPOS5Jcf/31ueWWW3LQQQflhBNOSJJceuml+cEPfpAHPehBWbp0aS644IKsXLkyP/zhD/PlL395vXVuv/32uf766wf5zIkx1wAAm61xps6bK8985jNz7rnnZu+9905V5R3veEfucY975FnPelY++9nPZs8998x97nOf7LvvvlmyZMmsx9h6661z0kkn5TWveU1+/vOfZ9ttt80ZZ5yRI488MkcccUT22muvLFq0KMcff3y22WabHHjggdl1112z5557Zo899si+++673jqf+9zn5hWveEXe85735OMf/3juf//7367PXa2123WATcV+++3Xzj///EmXAQAwMd/4xjeyxx57TLqM9brhhhuy3XbbZfny5TnggANy9tln5x73uMeky5rVbG1aVV9pre032/56rgEAmFeHHHJIrr322tx8881505vetMkG640hXI8Y+i5GG2OSf74BAJgPs42zfuYzn5nLLrtstXVvf/vbc/DBB89TVcMQrgEAmLhPfOITky5hEGYLAQDYjGwu19NtCjamLYVrAIDNxOLFi7N8+XIBewCttSxfvjyLFy/eoNcZFgIAsJnYeeedc/nll+fqq6+edCmbhcWLF2fnnXfeoNcI1wAAm4mtttoqu+6666TLWNAMCwEAgIEI1wAAMBDhGgAABiJcAwDAQIRrAAAYiHANAAADEa4BAGAgwjUAAAxEuAYAgIEI1wAAMBDhGgAABiJcAwDAQIRrAAAYiHANAAADEa4BAGAgwjUAAAxEuAYAgIEI1wAAMBDhGgAABiJcAwDAQIRrAAAYiHANAAADEa4BAGAgwjUAAAxEuAYAgIEI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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "J5oRl9LZ2KiW" }, "source": [ "We have already observed from the before bar plot that ratings 3 and 4 are given in more numbers by the users. Even the above graph suggests the same.\n", "\n", " Take away from this plot is by the number of missing ratings, we can estimate the level of sparsity in the matrix we are going to form. " ] }, { "cell_type": "markdown", "metadata": { "id": "ezYrpsCM2LC7" }, "source": [ "**Plot rating frequency of all movies**" ] }, { "cell_type": "code", "metadata": { "id": "YqfWKYCEz782", "outputId": "93b3ac8c-a39f-44e5-9c2f-39ce2d9b6b55", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset.head()" ], "execution_count": 134, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titlerating
01101 Dalmatians (1996)2.0
1112 Angry Men (1957)5.0
2120,000 Leagues Under the Sea (1954)3.0
312001: A Space Odyssey (1968)4.0
41Abyss, The (1989)3.0
\n", "
" ], "text/plain": [ " user id movie title rating\n", "0 1 101 Dalmatians (1996) 2.0\n", "1 1 12 Angry Men (1957) 5.0\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0\n", "3 1 2001: A Space Odyssey (1968) 4.0\n", "4 1 Abyss, The (1989) 3.0" ] }, "metadata": { "tags": [] }, "execution_count": 134 } ] }, { "cell_type": "code", "metadata": { "id": "oTe-A4D156Ry", "outputId": "f64f656a-b218-4ab1-95a3-e01641fbe434", "colab": { "base_uri": "https://localhost:8080/", "height": 225 } }, "source": [ "# get rating frequency\n", "movies_count_df = pd.DataFrame(refined_dataset.groupby('movie title').size(), columns=['count'])\n", "movies_count_df.head()" ], "execution_count": 135, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
movie title
'Til There Was You (1997)9
1-900 (1994)5
101 Dalmatians (1996)109
12 Angry Men (1957)125
187 (1997)41
\n", "
" ], "text/plain": [ " count\n", "movie title \n", "'Til There Was You (1997) 9\n", "1-900 (1994) 5\n", "101 Dalmatians (1996) 109\n", "12 Angry Men (1957) 125\n", "187 (1997) 41" ] }, "metadata": { "tags": [] }, "execution_count": 135 } ] }, { "cell_type": "code", "metadata": { "id": "2PZxHmrq6MTz", "outputId": "e2b555d2-c2f9-44db-de48-8e57efe3e4c5", "colab": { "base_uri": "https://localhost:8080/", "height": 533 } }, "source": [ "# plot rating frequency of all movies\n", "ax = movies_count_df \\\n", " .sort_values('count', ascending=False) \\\n", " .reset_index(drop=True) \\\n", " .plot(\n", " figsize=(12, 8),\n", " title='Rating Frequency of All Movies',\n", " fontsize=12\n", " )\n", "ax.set_xlabel(\"movie Id\")\n", "ax.set_ylabel(\"number of ratings\")" ], "execution_count": 136, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, 'number of ratings')" ] }, "metadata": { "tags": [] }, "execution_count": 136 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "PyCcV_0j6yUw" }, "source": [ "**As the size of MovieLens dataset picked for this project is small. There is no need of removing rarely rated movies or users who has given rating for fewer movies.**\n", "\n", "**Also because the dataset considered is small, we do not see the long-tail property which will be the scenario with the distribution of ratings.**\n", "\n", "*If the dataset is larger, then* (this can be referred when we do similar kind of tasks with a larger dataset, just for future reference)\n", "\n", "The distribution of ratings among movies often satisfies a property in real-world settings, which is referred to as the long-tail property. According to this property, only a small fraction of the items are rated frequently. Such items are referred to as popular items. The vast majority of items are rated rarely. This results in a highly skewed distribution of the underlying ratings." ] }, { "cell_type": "markdown", "metadata": { "id": "PZD27ZLM8IN7" }, "source": [ "# Training KNN model to build item-based collaborative Recommender System." ] }, { "cell_type": "markdown", "metadata": { "id": "5omV7GyNTITK" }, "source": [ "**Reshaping the dataframe**\n", "\n", "We need to transform (reshape in this case) the data in such a way that each row of the dataframe represents a movie and each column represents a different user. So we want the data to be [movies, users] array if movie is the subject where similar movies must be found and [users, movies] array for reverse.\n", "\n", "To reshape the dataframe, we will pivot the dataframe to the wide format with movies as rows and users as columns. As we know that not all users watch all the movies, we can expect a lot of missing values. We will have to fill those missing observations with 0s since we are going to perform linear algebra operations (calculating distances between vectors). \n", "\n", "Finally, we transform the values of the dataframe into a scipy sparse matrix for most efficient calculations.\n", "\n", "This dataframe is then fed into a KNN model." ] }, { "cell_type": "markdown", "metadata": { "id": "IyvX84Lm6ToE" }, "source": [ "## Movie Recommendation using KNN with Input as **User id**, Number of similar users should the model pick and Number of movies you want to get recommended:" ] }, { "cell_type": "markdown", "metadata": { "id": "3qJCE3l3f2mY" }, "source": [ "1. Reshaping model in such a way that each user has n-dimensional rating space where n is total number of movies\n", "\n", " We will train the KNN model inorder to find the closely matching similar users to the user we give as input and we recommend the top movies which would interest the input user." ] }, { "cell_type": "code", "metadata": { "id": "pVjDfpRvWVhw", "outputId": "d4e854fb-2020-4c7e-88c4-57b2e5d638cb", "colab": { "base_uri": "https://localhost:8080/", "height": 391 } }, "source": [ "# pivot and create movie-user matrix\n", "user_to_movie_df = refined_dataset.pivot(\n", " index='user id',\n", " columns='movie title',\n", " values='rating').fillna(0)\n", "\n", "user_to_movie_df.head()" ], "execution_count": 138, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie title'Til There Was You (1997)1-900 (1994)101 Dalmatians (1996)12 Angry Men (1957)187 (1997)2 Days in the Valley (1996)20,000 Leagues Under the Sea (1954)2001: A Space Odyssey (1968)3 Ninjas: High Noon At Mega Mountain (1998)39 Steps, The (1935)8 1/2 (1963)8 Heads in a Duffel Bag (1997)8 Seconds (1994)A Chef in Love (1996)Above the Rim (1994)Absolute Power (1997)Abyss, The (1989)Ace Ventura: Pet Detective (1994)Ace Ventura: When Nature Calls (1995)Across the Sea of Time (1995)Addams Family Values (1993)Addicted to Love (1997)Addiction, The (1995)Adventures of Pinocchio, The (1996)Adventures of Priscilla, Queen of the Desert, The (1994)Adventures of Robin Hood, The (1938)Affair to Remember, An (1957)African Queen, The (1951)Afterglow (1997)Age of Innocence, The (1993)Aiqing wansui (1994)Air Bud (1997)Air Force One (1997)Air Up There, The (1994)Airheads (1994)Akira (1988)Aladdin (1992)Aladdin and the King of Thieves (1996)Alaska (1996)Albino Alligator (1996)...Whole Wide World, The (1996)Widows' Peak (1994)Wife, The (1995)Wild America (1997)Wild Bill (1995)Wild Bunch, The (1969)Wild Reeds (1994)Wild Things (1998)William Shakespeare's Romeo and Juliet (1996)Willy Wonka and the Chocolate Factory (1971)Window to Paris (1994)Wings of Courage (1995)Wings of Desire (1987)Wings of the Dove, The (1997)Winnie the Pooh and the Blustery Day (1968)Winter Guest, The (1997)Wishmaster (1997)With Honors (1994)Withnail and I (1987)Witness (1985)Wizard of Oz, The (1939)Wolf (1994)Woman in Question, The (1950)Women, The (1939)Wonderful, Horrible Life of Leni Riefenstahl, The (1993)Wonderland (1997)Wooden Man's Bride, The (Wu Kui) (1994)World of Apu, The (Apur Sansar) (1959)Wrong Trousers, The (1993)Wyatt Earp (1994)Yankee Zulu (1994)Year of the Horse (1997)You So Crazy (1994)Young Frankenstein (1974)Young Guns (1988)Young Guns II (1990)Young Poisoner's Handbook, The (1995)Zeus and Roxanne (1997)unknownÁ köldum klaka (Cold Fever) (1994)
user id
10.00.02.05.00.00.03.04.00.00.00.00.00.00.00.00.03.03.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.04.04.00.00.00.0...0.00.00.00.00.00.00.00.00.04.00.00.00.00.00.00.00.00.00.00.04.00.00.00.00.00.00.00.05.00.00.00.00.05.03.00.00.00.04.00.0
20.00.00.00.00.00.00.00.01.00.00.00.00.00.00.03.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.04.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
30.00.00.00.02.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.02.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
40.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
50.00.02.00.00.00.00.04.00.00.00.00.00.00.00.00.00.00.01.00.02.00.00.00.05.00.00.00.00.03.00.00.00.00.00.00.04.04.00.00.0...0.00.00.00.00.00.00.00.01.03.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.00.00.04.00.00.00.00.04.00.0
\n", "

5 rows × 1664 columns

\n", "
" ], "text/plain": [ "movie title 'Til There Was You (1997) ... Á köldum klaka (Cold Fever) (1994)\n", "user id ... \n", "1 0.0 ... 0.0\n", "2 0.0 ... 0.0\n", "3 0.0 ... 0.0\n", "4 0.0 ... 0.0\n", "5 0.0 ... 0.0\n", "\n", "[5 rows x 1664 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 138 } ] }, { "cell_type": "code", "metadata": { "id": "NzGiLk_P6ZPU", "outputId": "ce7e1849-a29d-456b-9eb7-a17190231787", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "# transform matrix to scipy sparse matrix\n", "user_to_movie_sparse_df = csr_matrix(user_to_movie_df.values)\n", "user_to_movie_sparse_df" ], "execution_count": 139, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "<943x1664 sparse matrix of type ''\n", "\twith 99693 stored elements in Compressed Sparse Row format>" ] }, "metadata": { "tags": [] }, "execution_count": 139 } ] }, { "cell_type": "markdown", "metadata": { "id": "_lmFFozScX9B" }, "source": [ "**Fitting K-Nearest Neighbours model to the scipy sparse matrix:**" ] }, { "cell_type": "code", "metadata": { "id": "T-C_KVvkglZZ", "outputId": "fa672186-a2c4-478a-9e26-5a8d9eaa8334", "colab": { "base_uri": "https://localhost:8080/", "height": 67 } }, "source": [ "knn_model = NearestNeighbors(metric='cosine', algorithm='brute')\n", "knn_model.fit(user_to_movie_sparse_df)" ], "execution_count": 140, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "NearestNeighbors(algorithm='brute', leaf_size=30, metric='cosine',\n", " metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n", " radius=1.0)" ] }, "metadata": { "tags": [] }, "execution_count": 140 } ] }, { "cell_type": "code", "metadata": { "id": "GznTZhlIcPCI" }, "source": [ "## function to find top n similar users of the given input user \n", "def get_similar_users(user, n = 5):\n", " ## input to this function is the user and number of top similar users you want.\n", "\n", " knn_input = np.asarray([user_to_movie_df.values[user-1]]) #.reshape(1,-1)\n", " # knn_input = user_to_movie_df.iloc[0,:].values.reshape(1,-1)\n", " distances, indices = knn_model.kneighbors(knn_input, n_neighbors=n+1)\n", " \n", " print(\"Top\",n,\"users who are very much similar to the User-\",user, \"are: \")\n", " print(\" \")\n", " for i in range(1,len(distances[0])):\n", " print(i,\". User:\", indices[0][i]+1, \"separated by distance of\",distances[0][i])\n", " return indices.flatten()[1:] + 1, distances.flatten()[1:]\n" ], "execution_count": 141, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "UzD2cOe361JX" }, "source": [ "**Specify User id and Number of similar users we want to consider here**" ] }, { "cell_type": "code", "metadata": { "id": "ZAc5xnl2mZp3", "outputId": "9f9a1dd7-2877-4cdc-fd5f-e6282ac42a3e", "colab": { "base_uri": "https://localhost:8080/", "height": 319 } }, "source": [ "from pprint import pprint\n", "user_id = 778\n", "print(\" Few of movies seen by the User:\")\n", "pprint(list(refined_dataset[refined_dataset['user id'] == user_id]['movie title'])[:10])\n", "similar_user_list, distance_list = get_similar_users(user_id,5)" ], "execution_count": 142, "outputs": [ { "output_type": "stream", "text": [ " Few of movies seen by the User:\n", "['Amityville Horror, The (1979)',\n", " 'Angels in the Outfield (1994)',\n", " 'Apocalypse Now (1979)',\n", " 'Apollo 13 (1995)',\n", " 'Austin Powers: International Man of Mystery (1997)',\n", " 'Babe (1995)',\n", " 'Back to the Future (1985)',\n", " 'Blues Brothers, The (1980)',\n", " 'Chasing Amy (1997)',\n", " 'Clerks (1994)']\n", "Top 5 users who are very much similar to the User- 778 are: \n", " \n", "1 . User: 124 separated by distance of 0.4586649429539592\n", "2 . User: 933 separated by distance of 0.5581959868865324\n", "3 . User: 56 separated by distance of 0.5858413112292744\n", "4 . User: 738 separated by distance of 0.5916272517988691\n", "5 . User: 653 separated by distance of 0.5991479757406326\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "LDtU_DkCqLl6" }, "source": [ "**With the help of the KNN model built, we could get desired number of top similar users.**\n", "\n", "**Now we will have to pick the top movies to recommend.**\n", "\n", "**One way would be by taking the average of the existing ratings given by the similar users and picking the top 10 or 15 movies to recommend to our current user.**\n", "\n", "**But I feel recommendation would be more effective if we define weights to ratings by each similar user based on the thier distance from the input user. Defining these weights would give us the accurate recommendations by eliminating the chance of decision manipulation by the users who are relatively very far from the input user.**" ] }, { "cell_type": "code", "metadata": { "id": "3JNvsjkzhXj4", "outputId": "d8f1e6b9-9d26-4415-8ad9-f5b4b5049aec", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "similar_user_list, distance_list" ], "execution_count": 143, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([124, 933, 56, 738, 653]),\n", " array([0.45866494, 0.55819599, 0.58584131, 0.59162725, 0.59914798]))" ] }, "metadata": { "tags": [] }, "execution_count": 143 } ] }, { "cell_type": "code", "metadata": { "id": "7de9PUuitY5p", "outputId": "360455f1-412d-4b07-ed51-c704da2d788c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "weightage_list = distance_list/np.sum(distance_list)\n", "weightage_list" ], "execution_count": 144, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0.16419139, 0.19982119, 0.20971757, 0.2117888 , 0.21448105])" ] }, "metadata": { "tags": [] }, "execution_count": 144 } ] }, { "cell_type": "markdown", "metadata": { "id": "lCX18TkDtnz8" }, "source": [ "Getting ratings of all movies by derived similar users" ] }, { "cell_type": "code", "metadata": { "id": "VEh6O0oAtv_F", "outputId": "140cf5f4-a9fb-47a7-8365-6fab2d732462", "colab": { "base_uri": "https://localhost:8080/", "height": 101 } }, "source": [ "mov_rtngs_sim_users = user_to_movie_df.values[similar_user_list]\n", "mov_rtngs_sim_users" ], "execution_count": 145, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 2., ..., 0., 0., 0.],\n", " [0., 0., 3., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]])" ] }, "metadata": { "tags": [] }, "execution_count": 145 } ] }, { "cell_type": "code", "metadata": { "id": "nhty6LqMur17", "outputId": "d49cf83a-3e2c-4092-c477-77f81b285735", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "movies_list = user_to_movie_df.columns\n", "movies_list" ], "execution_count": 146, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Index([''Til There Was You (1997)', '1-900 (1994)', '101 Dalmatians (1996)',\n", " '12 Angry Men (1957)', '187 (1997)', '2 Days in the Valley (1996)',\n", " '20,000 Leagues Under the Sea (1954)', '2001: A Space Odyssey (1968)',\n", " '3 Ninjas: High Noon At Mega Mountain (1998)', '39 Steps, The (1935)',\n", " ...\n", " 'Yankee Zulu (1994)', 'Year of the Horse (1997)', 'You So Crazy (1994)',\n", " 'Young Frankenstein (1974)', 'Young Guns (1988)',\n", " 'Young Guns II (1990)', 'Young Poisoner's Handbook, The (1995)',\n", " 'Zeus and Roxanne (1997)', 'unknown',\n", " 'Á köldum klaka (Cold Fever) (1994)'],\n", " dtype='object', name='movie title', length=1664)" ] }, "metadata": { "tags": [] }, "execution_count": 146 } ] }, { "cell_type": "code", "metadata": { "id": "c_nwkKwhvQ7Y", "outputId": "bed4129d-df39-4742-8906-b24469f36cbf", "colab": { "base_uri": "https://localhost:8080/", "height": 67 } }, "source": [ "print(\"Weightage list shape:\", len(weightage_list))\n", "print(\"mov_rtngs_sim_users shape:\", mov_rtngs_sim_users.shape)\n", "print(\"Number of movies:\", len(movies_list))" ], "execution_count": 147, "outputs": [ { "output_type": "stream", "text": [ "Weightage list shape: 5\n", "mov_rtngs_sim_users shape: (5, 1664)\n", "Number of movies: 1664\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "oMgSULlTx71x" }, "source": [ "**Broadcasting weightage matrix to similar user rating matrix. so that it gets compatible for matrix operations**" ] }, { "cell_type": "code", "metadata": { "id": "0WF66O37x7WH", "outputId": "8f6b8c87-d797-4485-8468-48b6802439d1", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "weightage_list = weightage_list[:,np.newaxis] + np.zeros(len(movies_list))\n", "weightage_list.shape" ], "execution_count": 148, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(5, 1664)" ] }, "metadata": { "tags": [] }, "execution_count": 148 } ] }, { "cell_type": "code", "metadata": { "id": "RI6iizTIx7SO", "outputId": "e31a105c-d826-4928-ec93-15cf58e2cd42", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "new_rating_matrix = weightage_list*mov_rtngs_sim_users\n", "mean_rating_list = new_rating_matrix.sum(axis =0)\n", "mean_rating_list" ], "execution_count": 149, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0. , 0. , 1.02879509, ..., 0. , 0. ,\n", " 0. ])" ] }, "metadata": { "tags": [] }, "execution_count": 149 } ] }, { "cell_type": "code", "metadata": { "id": "jasA8xEWu3Sj" }, "source": [ "from pprint import pprint\n", "def recommend_movies(n):\n", " n = min(len(mean_rating_list),n)\n", " # print(np.argsort(mean_rating_list)[::-1][:n])\n", " pprint(list(movies_list[np.argsort(mean_rating_list)[::-1][:n]]))\n", "\n" ], "execution_count": 150, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "4ix_nK1I33WS", "outputId": "64cfee5b-3f39-4616-81f3-d7a044706504", "colab": { "base_uri": "https://localhost:8080/", "height": 202 } }, "source": [ "print(\"Movies recommended based on similar users are: \")\n", "recommend_movies(10)" ], "execution_count": 151, "outputs": [ { "output_type": "stream", "text": [ "Movies recommended based on similar users are: \n", "['Star Wars (1977)',\n", " 'Terminator, The (1984)',\n", " \"Schindler's List (1993)\",\n", " 'Fugitive, The (1993)',\n", " 'Forrest Gump (1994)',\n", " 'Princess Bride, The (1987)',\n", " 'Empire Strikes Back, The (1980)',\n", " 'Pulp Fiction (1994)',\n", " 'Die Hard (1988)',\n", " 'Monty Python and the Holy Grail (1974)']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "MZh3ID7NgwD7" }, "source": [ "It had been observed that, this recommendation system built can be made more efficient as it has few drawbacks.\n", "\n", "**Drawbacks:**\n", "\n", "**1.** But this recommendation system has a drawback, it also **recommends movies which are already seen by the given input User.**\n", "\n", "**2.** And also there is a possibility of recommending the **movies which are not at all seen by any of the similar users.**" ] }, { "cell_type": "markdown", "metadata": { "id": "cMOC4pKzkKiQ" }, "source": [ "**Above drawbacks are addressed and a new recommender system with modification is built**\n", "\n", "Below function is defined to remove the movies which are already seen the current user and not at all seen by any of the similar users." ] }, { "cell_type": "code", "metadata": { "id": "cC5fgG3-iXei" }, "source": [ "\n", "def filtered_movie_recommendations(n):\n", " \n", " first_zero_index = np.where(mean_rating_list == 0)[0][-1]\n", " sortd_index = np.argsort(mean_rating_list)[::-1]\n", " sortd_index = sortd_index[:list(sortd_index).index(first_zero_index)]\n", " n = min(len(sortd_index),n)\n", " movies_watched = list(refined_dataset[refined_dataset['user id'] == user_id]['movie title'])\n", " filtered_movie_list = list(movies_list[sortd_index])\n", " count = 0\n", " final_movie_list = []\n", " for i in filtered_movie_list:\n", " if i not in movies_watched:\n", " count+=1\n", " final_movie_list.append(i)\n", " if count == n:\n", " break\n", " if count == 0:\n", " print(\"There are no movies left which are not seen by the input users and seen by similar users. May be increasing the number of similar users who are to be considered may give a chance of suggesting an unseen good movie.\")\n", " else:\n", " pprint(final_movie_list)\n" ], "execution_count": 152, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "hhk_3V2QyeNz", "outputId": "d47981dd-3691-4255-a783-7b8fb2ce5d03", "colab": { "base_uri": "https://localhost:8080/", "height": 185 } }, "source": [ "filtered_movie_recommendations(10)" ], "execution_count": 153, "outputs": [ { "output_type": "stream", "text": [ "['Star Wars (1977)',\n", " \"Schindler's List (1993)\",\n", " 'Princess Bride, The (1987)',\n", " 'Empire Strikes Back, The (1980)',\n", " 'Return of the Jedi (1983)',\n", " 'Fargo (1996)',\n", " 'Dances with Wolves (1990)',\n", " 'Toy Story (1995)',\n", " 'Braveheart (1995)',\n", " 'Star Trek: First Contact (1996)']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "MI7T25n6ZOEf" }, "source": [ "Coding up all of the above individual cells into a function.\n", "\n", "Giving Input as **User id, Number of similar Users to be considered, Number of top movie we want to recommend**" ] }, { "cell_type": "code", "metadata": { "id": "GQ4UfrTM33hF" }, "source": [ "from pprint import pprint\n", "\n", "def recommender_system(user_id, n_similar_users, n_movies): #, user_to_movie_df, knn_model):\n", " \n", " print(\"Movie seen by the User:\")\n", " pprint(list(refined_dataset[refined_dataset['user id'] == user_id]['movie title']))\n", " print(\"\")\n", "\n", " # def get_similar_users(user, user_to_movie_df, knn_model, n = 5):\n", " def get_similar_users(user, n = 5):\n", " \n", " knn_input = np.asarray([user_to_movie_df.values[user-1]])\n", " \n", " distances, indices = knn_model.kneighbors(knn_input, n_neighbors=n+1)\n", " \n", " print(\"Top\",n,\"users who are very much similar to the User-\",user, \"are: \")\n", " print(\" \")\n", "\n", " for i in range(1,len(distances[0])):\n", " print(i,\". User:\", indices[0][i]+1, \"separated by distance of\",distances[0][i])\n", " print(\"\")\n", " return indices.flatten()[1:] + 1, distances.flatten()[1:]\n", "\n", "\n", " def filtered_movie_recommendations(n = 10):\n", " \n", " first_zero_index = np.where(mean_rating_list == 0)[0][-1]\n", " sortd_index = np.argsort(mean_rating_list)[::-1]\n", " sortd_index = sortd_index[:list(sortd_index).index(first_zero_index)]\n", " n = min(len(sortd_index),n)\n", " movies_watched = list(refined_dataset[refined_dataset['user id'] == user_id]['movie title'])\n", " filtered_movie_list = list(movies_list[sortd_index])\n", " count = 0\n", " final_movie_list = []\n", " for i in filtered_movie_list:\n", " if i not in movies_watched:\n", " count+=1\n", " final_movie_list.append(i)\n", " if count == n:\n", " break\n", " if count == 0:\n", " print(\"There are no movies left which are not seen by the input users and seen by similar users. May be increasing the number of similar users who are to be considered may give a chance of suggesting an unseen good movie.\")\n", " else:\n", " pprint(final_movie_list)\n", "\n", " similar_user_list, distance_list = get_similar_users(user_id,n_similar_users)\n", " weightage_list = distance_list/np.sum(distance_list)\n", " mov_rtngs_sim_users = user_to_movie_df.values[similar_user_list]\n", " movies_list = user_to_movie_df.columns\n", " weightage_list = weightage_list[:,np.newaxis] + np.zeros(len(movies_list))\n", " new_rating_matrix = weightage_list*mov_rtngs_sim_users\n", " mean_rating_list = new_rating_matrix.sum(axis =0)\n", " print(\"\")\n", " print(\"Movies recommended based on similar users are: \")\n", " print(\"\")\n", " filtered_movie_recommendations(n_movies)" ], "execution_count": 233, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ZhQI_qBL33dj", "outputId": "fae03002-e4c8-46d9-b4ef-e5f0bcdb1781", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "print(\"Enter user id\")\n", "user_id= int(input())\n", "print(\"number of similar users to be considered\")\n", "sim_users = int(input())\n", "print(\"Enter number of movies to be recommended:\")\n", "n_movies = int(input())\n", "recommender_system(user_id,sim_users,n_movies)\n", "# recommender_system(300, 15,15)" ], "execution_count": 234, "outputs": [ { "output_type": "stream", "text": [ "Enter user id\n", "307\n", "number of similar users to be considered\n", "15\n", "Enter number of movies to be recommended:\n", "15\n", "Movie seen by the User:\n", "['12 Angry Men (1957)',\n", " '2001: A Space Odyssey (1968)',\n", " 'Abyss, The (1989)',\n", " 'Alien (1979)',\n", " 'Apollo 13 (1995)',\n", " 'Back to the Future (1985)',\n", " 'Barbarella (1968)',\n", " 'Batman (1989)',\n", " 'Beauty and the Beast (1991)',\n", " 'Blade Runner (1982)',\n", " 'Blues Brothers, The (1980)',\n", " 'Boot, Das (1981)',\n", " 'Brady Bunch Movie, The (1995)',\n", " 'Braveheart (1995)',\n", " 'Brazil (1985)',\n", " 'Casablanca (1942)',\n", " 'Close Shave, A (1995)',\n", " 'Contact (1997)',\n", " 'Crying Game, The (1992)',\n", " 'Dead Poets Society (1989)',\n", " 'Dial M for Murder (1954)',\n", " 'Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb (1963)',\n", " 'Dragonheart (1996)',\n", " 'E.T. the Extra-Terrestrial (1982)',\n", " 'Empire Strikes Back, The (1980)',\n", " 'English Patient, The (1996)',\n", " 'Englishman Who Went Up a Hill, But Came Down a Mountain, The (1995)',\n", " 'Escape from L.A. (1996)',\n", " 'Fargo (1996)',\n", " 'Fast, Cheap & Out of Control (1997)',\n", " 'Field of Dreams (1989)',\n", " 'Fish Called Wanda, A (1988)',\n", " 'Four Weddings and a Funeral (1994)',\n", " 'Fried Green Tomatoes (1991)',\n", " 'Full Monty, The (1997)',\n", " 'Gandhi (1982)',\n", " 'Ghost (1990)',\n", " 'Graduate, The (1967)',\n", " 'Grand Day Out, A (1992)',\n", " 'Grumpier Old Men (1995)',\n", " 'Harold and Maude (1971)',\n", " 'Heathers (1989)',\n", " 'Heavy Metal (1981)',\n", " 'Highlander (1986)',\n", " 'Home Alone (1990)',\n", " 'How to Make an American Quilt (1995)',\n", " 'Hudsucker Proxy, The (1994)',\n", " 'Hunt for Red October, The (1990)',\n", " 'Independence Day (ID4) (1996)',\n", " 'Indiana Jones and the Last Crusade (1989)',\n", " 'Jurassic Park (1993)',\n", " 'Koyaanisqatsi (1983)',\n", " 'Lawnmower Man, The (1992)',\n", " 'Lawrence of Arabia (1962)',\n", " 'Like Water For Chocolate (Como agua para chocolate) (1992)',\n", " 'Lion King, The (1994)',\n", " 'Mary Poppins (1964)',\n", " 'Mask, The (1994)',\n", " \"McHale's Navy (1997)\",\n", " 'Men in Black (1997)',\n", " \"Microcosmos: Le peuple de l'herbe (1996)\",\n", " 'Monty Python and the Holy Grail (1974)',\n", " \"Monty Python's Life of Brian (1979)\",\n", " 'Mrs. Doubtfire (1993)',\n", " 'Much Ado About Nothing (1993)',\n", " 'Muppet Treasure Island (1996)',\n", " 'My Left Foot (1989)',\n", " 'My Life as a Dog (Mitt liv som hund) (1985)',\n", " 'Mystery Science Theater 3000: The Movie (1996)',\n", " 'Nightmare Before Christmas, The (1993)',\n", " 'Pink Floyd - The Wall (1982)',\n", " 'Pretty Woman (1990)',\n", " 'Princess Bride, The (1987)',\n", " 'Psycho (1960)',\n", " 'Pulp Fiction (1994)',\n", " 'Raiders of the Lost Ark (1981)',\n", " 'Real Genius (1985)',\n", " 'Return of the Jedi (1983)',\n", " 'Return of the Pink Panther, The (1974)',\n", " 'Right Stuff, The (1983)',\n", " 'Road to Wellville, The (1994)',\n", " 'Robin Hood: Men in Tights (1993)',\n", " 'Rumble in the Bronx (1995)',\n", " 'Secret of Roan Inish, The (1994)',\n", " 'Sex, Lies, and Videotape (1989)',\n", " 'Shadowlands (1993)',\n", " 'Shawshank Redemption, The (1994)',\n", " 'Shining, The (1980)',\n", " 'Sneakers (1992)',\n", " 'Snow White and the Seven Dwarfs (1937)',\n", " 'Sound of Music, The (1965)',\n", " 'Stand by Me (1986)',\n", " 'Star Trek III: The Search for Spock (1984)',\n", " 'Star Trek IV: The Voyage Home (1986)',\n", " 'Star Trek V: The Final Frontier (1989)',\n", " 'Star Trek VI: The Undiscovered Country (1991)',\n", " 'Star Trek: First Contact (1996)',\n", " 'Star Trek: Generations (1994)',\n", " 'Star Trek: The Motion Picture (1979)',\n", " 'Star Trek: The Wrath of Khan (1982)',\n", " 'Star Wars (1977)',\n", " 'Stargate (1994)',\n", " 'Tank Girl (1995)',\n", " 'Terminator, The (1984)',\n", " 'This Is Spinal Tap (1984)',\n", " 'Titanic (1997)',\n", " 'To Kill a Mockingbird (1962)',\n", " 'Top Gun (1986)',\n", " 'Toy Story (1995)',\n", " 'Wallace & Gromit: The Best of Aardman Animation (1996)',\n", " 'Wizard of Oz, The (1939)',\n", " 'Wrong Trousers, The (1993)']\n", "\n", "Top 15 users who are very much similar to the User- 307 are: \n", " \n", "1 . User: 70 separated by distance of 0.4560883724650484\n", "2 . User: 738 separated by distance of 0.4846662001127756\n", "3 . User: 922 separated by distance of 0.503221313979523\n", "4 . User: 407 separated by distance of 0.5038250337403114\n", "5 . User: 514 separated by distance of 0.5060750098353226\n", "6 . User: 44 separated by distance of 0.5160506271876224\n", "7 . User: 660 separated by distance of 0.5165826487301209\n", "8 . User: 5 separated by distance of 0.5211146313938015\n", "9 . User: 457 separated by distance of 0.5309167131718452\n", "10 . User: 23 separated by distance of 0.5316197783536492\n", "11 . User: 843 separated by distance of 0.5324703658288387\n", "12 . User: 64 separated by distance of 0.53318921205275\n", "13 . User: 198 separated by distance of 0.535682894616484\n", "14 . User: 815 separated by distance of 0.5416036160331636\n", "15 . User: 95 separated by distance of 0.5468066886836396\n", "\n", "\n", "Movies recommended based on similar users are: \n", "\n", "[\"Schindler's List (1993)\",\n", " 'Liar Liar (1997)',\n", " 'When Harry Met Sally... (1989)',\n", " 'Leaving Las Vegas (1995)',\n", " 'Silence of the Lambs, The (1991)',\n", " 'Dead Man Walking (1995)',\n", " 'Trainspotting (1996)',\n", " 'Forrest Gump (1994)',\n", " 'Scream (1996)',\n", " 'Twelve Monkeys (1995)',\n", " 'Jerry Maguire (1996)',\n", " 'Raising Arizona (1987)',\n", " 'Godfather, The (1972)',\n", " 'Rock, The (1996)',\n", " 'Fugitive, The (1993)']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "9i5m2wO4iQUW" }, "source": [ "## Movie Recommendation using KNN with Input as **Movie Name** and Number of movies you want to get recommended:" ] }, { "cell_type": "markdown", "metadata": { "id": "XaQLSI1ni_qS" }, "source": [ "2. Reshaping model in such a way that each movie has n-dimensional rating space where n is total number of users who could rate.\n", "\n", " We will train the KNN model inorder to find the closely matching similar movies to the movie we give as input and we recommend the top movies which would more closely align to the movie we have given." ] }, { "cell_type": "code", "metadata": { "id": "pKgkHLCN33ZT", "outputId": "9b3ac3a7-2436-47ef-f6a6-fb39fc62c515", "colab": { "base_uri": "https://localhost:8080/", "height": 391 } }, "source": [ "# pivot and create movie-user matrix\n", "movie_to_user_df = refined_dataset.pivot(\n", " index='movie title',\n", " columns='user id',\n", " values='rating').fillna(0)\n", "\n", "movie_to_user_df.head()" ], "execution_count": 157, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user id12345678910111213141516171819202122232425262728293031323334353637383940...904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
movie title
'Til There Was You (1997)0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
1-900 (1994)0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
101 Dalmatians (1996)2.00.00.00.02.00.00.00.00.00.00.00.02.00.03.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.0...0.00.00.05.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.02.00.02.00.00.02.04.00.00.00.00.00.0
12 Angry Men (1957)5.00.00.00.00.04.04.00.00.05.00.00.04.00.00.05.00.03.00.00.00.00.00.05.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.05.00.00.00.00.00.00.00.05.00.00.00.00.00.00.00.00.00.00.00.0
187 (1997)0.00.02.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.04.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", "

5 rows × 943 columns

\n", "
" ], "text/plain": [ "user id 1 2 3 4 5 ... 939 940 941 942 943\n", "movie title ... \n", "'Til There Was You (1997) 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", "1-900 (1994) 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", "101 Dalmatians (1996) 2.0 0.0 0.0 0.0 2.0 ... 0.0 0.0 0.0 0.0 0.0\n", "12 Angry Men (1957) 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", "187 (1997) 0.0 0.0 2.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0\n", "\n", "[5 rows x 943 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 157 } ] }, { "cell_type": "code", "metadata": { "id": "Y_ZM14b_33S1", "outputId": "d915467f-0982-453d-d90c-bb6f52f163be", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "# transform matrix to scipy sparse matrix\n", "movie_to_user_sparse_df = csr_matrix(movie_to_user_df.values)\n", "movie_to_user_sparse_df" ], "execution_count": 158, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "<1664x943 sparse matrix of type ''\n", "\twith 99693 stored elements in Compressed Sparse Row format>" ] }, "metadata": { "tags": [] }, "execution_count": 158 } ] }, { "cell_type": "markdown", "metadata": { "id": "WrE3OE3xAstv" }, "source": [ "Extracting movie names into a list:" ] }, { "cell_type": "code", "metadata": { "id": "C3fjBBBs9tNw", "outputId": "b2b9a713-d213-483f-84ce-9af538b806de", "colab": { "base_uri": "https://localhost:8080/", "height": 185 } }, "source": [ "movies_list = list(movie_to_user_df.index)\n", "movies_list[:10]" ], "execution_count": 184, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[\"'Til There Was You (1997)\",\n", " '1-900 (1994)',\n", " '101 Dalmatians (1996)',\n", " '12 Angry Men (1957)',\n", " '187 (1997)',\n", " '2 Days in the Valley (1996)',\n", " '20,000 Leagues Under the Sea (1954)',\n", " '2001: A Space Odyssey (1968)',\n", " '3 Ninjas: High Noon At Mega Mountain (1998)',\n", " '39 Steps, The (1935)']" ] }, "metadata": { "tags": [] }, "execution_count": 184 } ] }, { "cell_type": "markdown", "metadata": { "id": "-t97ADCYAxXy" }, "source": [ "Creating a dictionary with movie name as key and its index from the list as value:" ] }, { "cell_type": "code", "metadata": { "id": "5ewuTcPCAdw2", "outputId": "b6d31f07-b3e6-4dcb-9e7b-560d48239246", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "movie_dict = {movie : index for index, movie in enumerate(movies_list)}\n", "print(movie_dict)" ], "execution_count": 186, "outputs": [ { "output_type": "stream", "text": [ "{\"'Til There Was You (1997)\": 0, '1-900 (1994)': 1, '101 Dalmatians (1996)': 2, '12 Angry Men (1957)': 3, '187 (1997)': 4, '2 Days in the Valley (1996)': 5, '20,000 Leagues Under the Sea (1954)': 6, '2001: A Space Odyssey (1968)': 7, '3 Ninjas: High Noon At Mega Mountain (1998)': 8, '39 Steps, The (1935)': 9, '8 1/2 (1963)': 10, '8 Heads in a Duffel Bag (1997)': 11, '8 Seconds (1994)': 12, 'A Chef in Love (1996)': 13, 'Above the Rim (1994)': 14, 'Absolute Power (1997)': 15, 'Abyss, The (1989)': 16, 'Ace Ventura: Pet Detective (1994)': 17,.............., 'You So Crazy (1994)': 1656, 'Young Frankenstein (1974)': 1657, 'Young Guns (1988)': 1658, 'Young Guns II (1990)': 1659, \"Young Poisoner's Handbook, The (1995)\": 1660, 'Zeus and Roxanne (1997)': 1661, 'unknown': 1662, 'Á köldum klaka (Cold Fever) (1994)': 1663}\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "d3o8f5RPLqkY" }, "source": [ "case_insensitive_movies_list = [i.lower() for i in movies_list]" ], "execution_count": 211, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "TzI5h6UapJLS" }, "source": [ "Fitting a KNN model:" ] }, { "cell_type": "code", "metadata": { "id": "HH5XdKjBpIsQ", "outputId": "937c7c7b-adea-4472-9ea9-d27e09688caf", "colab": { "base_uri": "https://localhost:8080/", "height": 67 } }, "source": [ "knn_movie_model = NearestNeighbors(metric='cosine', algorithm='brute')\n", "knn_movie_model.fit(movie_to_user_sparse_df)\n" ], "execution_count": 159, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "NearestNeighbors(algorithm='brute', leaf_size=30, metric='cosine',\n", " metric_params=None, n_jobs=None, n_neighbors=5, p=2,\n", " radius=1.0)" ] }, "metadata": { "tags": [] }, "execution_count": 159 } ] }, { "cell_type": "code", "metadata": { "id": "yE70fQ9bqGiH" }, "source": [ "## function to find top n similar users of the given input user \n", "def get_similar_movies(movie, n = 10):\n", " ## input to this function is the movie and number of top similar movies you want.\n", " index = movie_dict[movie]\n", " knn_input = np.asarray([movie_to_user_df.values[index]])\n", " n = min(len(movies_list)-1,n)\n", " distances, indices = knn_movie_model.kneighbors(knn_input, n_neighbors=n+1)\n", " \n", " print(\"Top\",n,\"movies which are very much similar to the Movie-\",movie, \"are: \")\n", " print(\" \")\n", " for i in range(1,len(distances[0])):\n", " print(movies_list[indices[0][i]])\n", " \n" ], "execution_count": 198, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "2swG-7i8VcDh" }, "source": [ "Testing the recommender system with basic input with the movie names\n" ] }, { "cell_type": "code", "metadata": { "id": "KTElQKhe33Rg", "outputId": "44bc712a-096d-4ca2-d099-035cc2c5c7fc", "colab": { "base_uri": "https://localhost:8080/", "height": 302 } }, "source": [ "from pprint import pprint\n", "movie_name = '101 Dalmatians (1996)'\n", "\n", "get_similar_movies(movie_name,15)" ], "execution_count": 199, "outputs": [ { "output_type": "stream", "text": [ "Top 15 movies which are very much similar to the Movie- 101 Dalmatians (1996) are: \n", " \n", "Jack (1996)\n", "Twister (1996)\n", "Willy Wonka and the Chocolate Factory (1971)\n", "Independence Day (ID4) (1996)\n", "Toy Story (1995)\n", "Father of the Bride Part II (1995)\n", "Hunchback of Notre Dame, The (1996)\n", "Lion King, The (1994)\n", "Mrs. Doubtfire (1993)\n", "Jungle Book, The (1994)\n", "Grumpier Old Men (1995)\n", "Mission: Impossible (1996)\n", "Mr. Holland's Opus (1995)\n", "Homeward Bound II: Lost in San Francisco (1996)\n", "Dragonheart (1996)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "LIGky82kuQxF" }, "source": [ "**Dynamically suggesting** movie name from the existing movie corpus we have, based on the user input using try and except architecture." ] }, { "cell_type": "markdown", "metadata": { "id": "eJus19K5VpkG" }, "source": [ "Defining a function which outputs movie names as suggestion when the user mis spells the movie name. **User might have intended to type any of these movie names.**" ] }, { "cell_type": "code", "metadata": { "id": "AXKHWqLVI1w5" }, "source": [ "# function which takes input and returns suggestions for the user\n", "\n", "def get_possible_movies(movie):\n", "\n", " temp = ''\n", " possible_movies = case_insensitive_movies_list.copy()\n", " for i in movie :\n", " out = []\n", " temp += i\n", " for j in possible_movies:\n", " if temp in j:\n", " out.append(j)\n", " if len(out) == 0:\n", " return possible_movies\n", " out.sort()\n", " possible_movies = out.copy()\n", "\n", " return possible_movies" ], "execution_count": 220, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "UM1yfFMNW-T7" }, "source": [ "This function provides user with **movie name suggestions if movie name is mis-spelled** or **Recommends similar movies to the input movie** if the movie name is valid." ] }, { "cell_type": "code", "metadata": { "id": "TW1wNb-tuOWL" }, "source": [ "class invalid(Exception):\n", " pass\n", "\n", "def spell_correction():\n", " \n", " try:\n", "\n", " movie_name = input(\"Enter the Movie name: \")\n", " movie_name_lower = movie_name.lower()\n", " if movie_name_lower not in case_insensitive_movies_list :\n", " raise invalid\n", " else :\n", " # movies_list[case_insensitive_country_names.index(movie_name_lower)]\n", " num_recom = int(input(\"Enter Number of movie recommendations needed: \"))\n", " get_similar_movies(movies_list[case_insensitive_movies_list.index(movie_name_lower)],num_recom)\n", "\n", " except invalid:\n", "\n", " possible_movies = get_possible_movies(movie_name_lower)\n", "\n", " if len(possible_movies) == len(movies_list) :\n", " print(\"Movie name entered is does not exist in the list \")\n", " else :\n", " indices = [case_insensitive_movies_list.index(i) for i in possible_movies]\n", " print(\"Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions :\\n\",[movies_list[i] for i in indices])\n", " spell_correction()\n" ], "execution_count": 223, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "0_J8X0l_33PE", "outputId": "0d2f0aaa-fa93-4fd3-a249-8815e5b089b1", "colab": { "base_uri": "https://localhost:8080/", "height": 406 } }, "source": [ "spell_correction()" ], "execution_count": 236, "outputs": [ { "output_type": "stream", "text": [ "Enter the Movie name: back\n", "Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions :\n", " ['Back to the Future (1985)', 'Backbeat (1993)', 'Best of the Best 3: No Turning Back (1995)', 'Empire Strikes Back, The (1980)', 'Hunchback of Notre Dame, The (1996)', 'Switchback (1997)']\n", "Enter the Movie name: Empire Strikes Back, The (1980)\n", "Enter Number of movie recommendations needed: 15\n", "Top 15 movies which are very much similar to the Movie- Empire Strikes Back, The (1980) are: \n", " \n", "Raiders of the Lost Ark (1981)\n", "Indiana Jones and the Last Crusade (1989)\n", "Back to the Future (1985)\n", "Star Wars (1977)\n", "Terminator, The (1984)\n", "Return of the Jedi (1983)\n", "Terminator 2: Judgment Day (1991)\n", "Princess Bride, The (1987)\n", "Jurassic Park (1993)\n", "Fugitive, The (1993)\n", "Silence of the Lambs, The (1991)\n", "E.T. the Extra-Terrestrial (1982)\n", "Star Trek: The Wrath of Khan (1982)\n", "Alien (1979)\n", "Blade Runner (1982)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "nRarT70-aRTg" }, "source": [ "Observation on above built KNN Recommender System:\n", "\n", "An interesting observation would be that the above KNN model for movies recommends movies that are produced in very similar years of the input movie. However, the cosine distance of all those recommendations are observed to be actually quite small. This might be because there are too many zero values in our movie-user matrix. With too many zero values in our data, the data sparsity becomes a real issue for KNN model and the distance in KNN model starts to fall apart. So I'd like to dig deeper and look closer inside our data." ] }, { "cell_type": "markdown", "metadata": { "id": "fi1AOjkPaWAp" }, "source": [ "\n", "Let's now look at how sparse the movie-user matrix is by calculating percentage of zero values in the data." ] }, { "cell_type": "code", "metadata": { "id": "MK0JWPnQ33My", "outputId": "484bff9d-cc8f-4b7a-a227-a33967d12bbe", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# calcuate total number of entries in the movie-user matrix\n", "num_entries = movie_to_user_df.shape[0] * movie_to_user_df.shape[1]\n", "# calculate total number of entries with zero values\n", "num_zeros = (movie_to_user_df==0).sum(axis=1).sum()\n", "# calculate ratio of number of zeros to number of entries\n", "ratio_zeros = num_zeros / num_entries\n", "print('There is about {:.2%} of ratings in our data is missing'.format(ratio_zeros))" ], "execution_count": 228, "outputs": [ { "output_type": "stream", "text": [ "There is about 93.65% of ratings in our data is missing\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "_xe7IF4LiWLv" }, "source": [ "This result confirms the above hypothesis. The vast majority of entries in our data is zero. This explains why the distance between similar items or opposite items are both pretty large.\n", "\n", "So, lets try out deep learning models and Natural Language Processing techniques in the next segment of this project." ] }, { "cell_type": "code", "metadata": { "id": "cpybAavhiz41" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "jVJu1rsTx0F3" }, "source": [ "# Rough Work" ] }, { "cell_type": "code", "metadata": { "id": "ZZXpqM8lhzoe", "outputId": "c5310c5c-4d59-4d7a-ceb0-e7ac5ca19709", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "d = np.asarray([2,4,4,8,2])\n", "d = d/np.sum(d)\n", "d" ], "execution_count": 119, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0.1, 0.2, 0.2, 0.4, 0.1])" ] }, "metadata": { "tags": [] }, "execution_count": 119 } ] }, { "cell_type": "code", "metadata": { "id": "ayT0tFP1iSvt", "outputId": "a5f9bb70-506f-4e88-e0e2-02debadc1ac1", "colab": { "base_uri": "https://localhost:8080/", "height": 101 } }, "source": [ "e = np.asarray([[10,20,30],[30,40,20],[50,30,10],[40,30,10],[30,20,50]])\n", "e" ], "execution_count": 120, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[10, 20, 30],\n", " [30, 40, 20],\n", " [50, 30, 10],\n", " [40, 30, 10],\n", " [30, 20, 50]])" ] }, "metadata": { "tags": [] }, "execution_count": 120 } ] }, { "cell_type": "code", "metadata": { "id": "8F95Ey9HtclY", "outputId": "aff99e60-ab97-4b6e-8c06-9da136c2a103", "colab": { "base_uri": "https://localhost:8080/", "height": 84 } }, "source": [ "x = np.arange(4)\n", "xx = x.reshape(4,1)\n", "y = np.ones(5)\n", "xx+y, y.shape, xx.shape" ], "execution_count": 116, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([[1., 1., 1., 1., 1.],\n", " [2., 2., 2., 2., 2.],\n", " [3., 3., 3., 3., 3.],\n", " [4., 4., 4., 4., 4.]]), (5,), (4, 1))" ] }, "metadata": { "tags": [] }, "execution_count": 116 } ] }, { "cell_type": "code", "metadata": { "id": "xLyZGIO3wmjM", "outputId": "6f8b3e74-7a85-4cc2-e9ea-a42547a4906d", "colab": { "base_uri": "https://localhost:8080/", "height": 101 } }, "source": [ "d = d[:,np.newaxis] + np.zeros(3)\n", "d" ], "execution_count": 121, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0.1, 0.1, 0.1],\n", " [0.2, 0.2, 0.2],\n", " [0.2, 0.2, 0.2],\n", " [0.4, 0.4, 0.4],\n", " [0.1, 0.1, 0.1]])" ] }, "metadata": { "tags": [] }, "execution_count": 121 } ] }, { "cell_type": "code", "metadata": { "id": "5SSmgMawwwUf", "outputId": "6f77c167-f3a5-4f9d-efd4-d2b479e5df8a", "colab": { "base_uri": "https://localhost:8080/", "height": 101 } }, "source": [ "f = d * e\n", "f" ], "execution_count": 127, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[ 1., 2., 3.],\n", " [ 6., 8., 4.],\n", " [10., 6., 2.],\n", " [16., 12., 4.],\n", " [ 3., 2., 5.]])" ] }, "metadata": { "tags": [] }, "execution_count": 127 } ] }, { "cell_type": "code", "metadata": { "id": "3WvWb8R1xe1B", "outputId": "1fe7e6d7-8069-4873-a4fc-c76882084749", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "f.sum(axis=0)" ], "execution_count": 131, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([36., 30., 18.])" ] }, "metadata": { "tags": [] }, "execution_count": 131 } ] }, { "cell_type": "code", "metadata": { "id": "wV0Enmh_zEb9", "outputId": "02b143b2-d213-451d-bdd1-eaec4d85376a", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "q = e.mean(axis=0)\n", "q" ], "execution_count": 135, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([32., 28., 24.])" ] }, "metadata": { "tags": [] }, "execution_count": 135 } ] }, { "cell_type": "code", "metadata": { "id": "qmFVYlEuzNt8", "outputId": "20061a5d-209f-4349-fd77-7a79ecfbe38a", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "l = np.asarray([3,7,1,2,8,9,3])\n", "np.argsort(l)[::-1][:4]" ], "execution_count": 157, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([5, 4, 1, 6])" ] }, "metadata": { "tags": [] }, "execution_count": 157 } ] }, { "cell_type": "code", "metadata": { "id": "8AsMXObq3V_w", "outputId": "7535e81d-ad16-4537-e6e6-268ab0c7b091", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "p = np.asarray([3,6,2,8,1,0,6,2,6,0,7,9,5,0])\n", "np.argsort(p)[::-1], np.sort(p)[::-1]" ], "execution_count": 97, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([11, 3, 10, 8, 6, 1, 12, 0, 7, 2, 4, 13, 9, 5]),\n", " array([9, 8, 7, 6, 6, 6, 5, 3, 2, 2, 1, 0, 0, 0]))" ] }, "metadata": { "tags": [] }, "execution_count": 97 } ] }, { "cell_type": "code", "metadata": { "id": "mOR0d1_Llq5m", "outputId": "d0200f5e-a76f-4f36-f4e4-f5079ca7cdfa", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# list(p)[::-1].index(0)\n", "j = np.where(p == 0)[0][-1]\n", "j" ], "execution_count": 98, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "13" ] }, "metadata": { "tags": [] }, "execution_count": 98 } ] }, { "cell_type": "code", "metadata": { "id": "ZopTiksUnhPl", "outputId": "e7b8a57b-5cab-49a7-cd61-8e0377fac752", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "j = np.where(p == 0)[0][-1]\n", "h = np.argsort(p)[::-1]\n", "h[:list(h).index(j)]" ], "execution_count": 99, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([11, 3, 10, 8, 6, 1, 12, 0, 7, 2, 4])" ] }, "metadata": { "tags": [] }, "execution_count": 99 } ] }, { "cell_type": "code", "metadata": { "id": "vgMQdXL-u43G", "outputId": "123edaf0-d199-4ed2-c1ce-c19acc0cfe1d", "colab": { "base_uri": "https://localhost:8080/", "height": 118 } }, "source": [ "f = 'rohith kumar 346'\n", "i = ['hit','ro','rohi','34',' ','itho','ohit']\n", "\n", "for j in i:\n", " if j in f:\n", " print(j)" ], "execution_count": 204, "outputs": [ { "output_type": "stream", "text": [ "hit\n", "ro\n", "rohi\n", "34\n", " \n", "ohit\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "T_3krmlmMSjl", "outputId": "917c6eed-3f31-4901-a084-9598bd0169e8", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "d = [2,3,76,4,7,1]\n", "e = [3,1,7,2]\n", "[d.index(i) for i in e]" ], "execution_count": 208, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[1, 5, 4, 0]" ] }, "metadata": { "tags": [] }, "execution_count": 208 } ] }, { "cell_type": "code", "metadata": { "id": "_DgLG9Y0Tt6A" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] } ================================================ FILE: Knowledge_based_Recommender_System.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Knowledge-based-Recommender-System.ipynb", "provenance": [], "collapsed_sections": [ "IhY_79CI31QH" ], "authorship_tag": "ABX9TyP39AGjke3UKtl3Djg2eY1v", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "metadata": { "id": "I6QppVIb871O" }, "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "#from scipy.sparse import csr_matrix\n", "#from sklearn.neighbors import NearestNeighbors\n", "#from sklearn.model_selection import train_test_split" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "e2b-97_pD3_X" }, "source": [ "## Loading MovieLens rating dataset of size 100k" ] }, { "cell_type": "code", "metadata": { "id": "QBxz0KI-D3Xa" }, "source": [ "DATASET_LINK='http://files.grouplens.org/datasets/movielens/ml-100k.zip'" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OIUrxfX2EXKP" }, "source": [ "## if done in jupyter notebook on a local machine\n", "\n", "# !conda install -c anaconda wget --yes" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "IhxnKWueEfCT", "outputId": "308fba5a-fcb5-4cf0-c529-8eb8c3677730", "colab": { "base_uri": "https://localhost:8080/", "height": 629 } }, "source": [ "!wget -nc http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "!unzip -n ml-100k.zip" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "--2020-10-16 01:11:02-- http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152\n", "Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 4924029 (4.7M) [application/zip]\n", "Saving to: ‘ml-100k.zip’\n", "\n", "ml-100k.zip 100%[===================>] 4.70M 16.3MB/s in 0.3s \n", "\n", "2020-10-16 01:11:02 (16.3 MB/s) - ‘ml-100k.zip’ saved [4924029/4924029]\n", "\n", "Archive: ml-100k.zip\n", " creating: ml-100k/\n", " inflating: ml-100k/allbut.pl \n", " inflating: ml-100k/mku.sh \n", " inflating: ml-100k/README \n", " inflating: ml-100k/u.data \n", " inflating: ml-100k/u.genre \n", " inflating: ml-100k/u.info \n", " inflating: ml-100k/u.item \n", " inflating: ml-100k/u.occupation \n", " inflating: ml-100k/u.user \n", " inflating: ml-100k/u1.base \n", " inflating: ml-100k/u1.test \n", " inflating: ml-100k/u2.base \n", " inflating: ml-100k/u2.test \n", " inflating: ml-100k/u3.base \n", " inflating: ml-100k/u3.test \n", " inflating: ml-100k/u4.base \n", " inflating: ml-100k/u4.test \n", " inflating: ml-100k/u5.base \n", " inflating: ml-100k/u5.test \n", " inflating: ml-100k/ua.base \n", " inflating: ml-100k/ua.test \n", " inflating: ml-100k/ub.base \n", " inflating: ml-100k/ub.test \n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "vpA1EWM-KVoT" }, "source": [ "## u.info -- The number of users, items, and ratings in the u data set." ] }, { "cell_type": "code", "metadata": { "id": "GHDq1-JlEooc", "outputId": "b2004e87-18e6-4224-b4cf-e53895608ba3", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "overall_stats = pd.read_csv('ml-100k/u.info', header=None)\n", "print(\"Details of users, items and ratings involved in the loaded movielens dataset: \",list(overall_stats[0]))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Details of users, items and ratings involved in the loaded movielens dataset: ['943 users', '1682 items', '100000 ratings']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "6kRw5oLJIofy" }, "source": [ "## u.data -- The full u data set, 100000 ratings by 943 users on 1682 items.\n", "\n", " Each user has rated at least 20 movies. Users and items are\n", " numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of \n", "\t user id | item id | rating | timestamp. \n", " The time stamps are unix seconds since 1/1/1970 UTC " ] }, { "cell_type": "code", "metadata": { "id": "bWag-M0KHbKk", "outputId": "b1a73b61-7662-4e5c-ecd1-ec9063d5a4ed", "colab": { "base_uri": "https://localhost:8080/", "height": 204 } }, "source": [ "## same item id is same as movie id, item id column is renamed as movie id\n", "column_names1 = ['user id','movie id','rating','timestamp']\n", "dataset = pd.read_csv('ml-100k/u.data', sep='\\t',header=None,names=column_names1)\n", "dataset.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestamp
01962423881250949
11863023891717742
2223771878887116
3244512880606923
41663461886397596
\n", "
" ], "text/plain": [ " user id movie id rating timestamp\n", "0 196 242 3 881250949\n", "1 186 302 3 891717742\n", "2 22 377 1 878887116\n", "3 244 51 2 880606923\n", "4 166 346 1 886397596" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "code", "metadata": { "id": "uWiCCCZfQrBJ", "outputId": "af7bcc44-3684-41ac-86ab-ba0f864ded05", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "len(dataset), max(dataset['movie id']),min(dataset['movie id'])" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(100000, 1682, 1)" ] }, "metadata": { "tags": [] }, "execution_count": 7 } ] }, { "cell_type": "markdown", "metadata": { "id": "2bVpYrebKvzh" }, "source": [ "## u.item -- Information about the items (movies); this is a tab separated\n", " list of\n", " movie id | movie title | release date | video release date |\n", " IMDb URL | unknown | Action | Adventure | Animation |\n", " Children's | Comedy | Crime | Documentary | Drama | Fantasy |\n", " Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi |\n", " Thriller | War | Western |\n", " The last 19 fields are the genres, a 1 indicates the movie\n", " is of that genre, a 0 indicates it is not; movies can be in\n", " several genres at once.\n", " The movie ids are the ones used in the u.data data set.\n" ] }, { "cell_type": "code", "metadata": { "id": "40FkKuG6M9tS", "outputId": "3d17019f-b479-4dec-fcab-c8387572a376", "colab": { "base_uri": "https://localhost:8080/", "height": 425 } }, "source": [ "d = 'movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western'\n", "column_names2 = d.split(' | ')\n", "column_names2" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['movie id',\n", " 'movie title',\n", " 'release date',\n", " 'video release date',\n", " 'IMDb URL',\n", " 'unknown',\n", " 'Action',\n", " 'Adventure',\n", " 'Animation',\n", " 'Children',\n", " 'Comedy',\n", " 'Crime',\n", " 'Documentary',\n", " 'Drama',\n", " 'Fantasy',\n", " 'Film-Noir',\n", " 'Horror',\n", " 'Musical',\n", " 'Mystery',\n", " 'Romance',\n", " 'Sci-Fi',\n", " 'Thriller',\n", " 'War',\n", " 'Western']" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "code", "metadata": { "id": "rOFkTodrJQIi", "outputId": "c31ed623-7d48-4022-9465-6038fb3f164d", "colab": { "base_uri": "https://localhost:8080/", "height": 779 } }, "source": [ "items_dataset = pd.read_csv('ml-100k/u.item', sep='|',header=None,names=column_names2,encoding='latin-1')\n", "items_dataset" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie titlerelease datevideo release dateIMDb URLunknownActionAdventureAnimationChildrenComedyCrimeDocumentaryDramaFantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...0001110000000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...0110000000000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...0000000000000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...0100010010000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)0000001010000000100
...........................................................................
16771678Mat' i syn (1997)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?Mat%27+i+syn+...0000000010000000000
16781679B. Monkey (1998)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?B%2E+Monkey+(...0000000000000010100
16791680Sliding Doors (1998)01-Jan-1998NaNhttp://us.imdb.com/Title?Sliding+Doors+(1998)0000000010000010000
16801681You So Crazy (1994)01-Jan-1994NaNhttp://us.imdb.com/M/title-exact?You%20So%20Cr...0000010000000000000
16811682Scream of Stone (Schrei aus Stein) (1991)08-Mar-1996NaNhttp://us.imdb.com/M/title-exact?Schrei%20aus%...0000000010000000000
\n", "

1682 rows × 24 columns

\n", "
" ], "text/plain": [ " movie id movie title ... War Western\n", "0 1 Toy Story (1995) ... 0 0\n", "1 2 GoldenEye (1995) ... 0 0\n", "2 3 Four Rooms (1995) ... 0 0\n", "3 4 Get Shorty (1995) ... 0 0\n", "4 5 Copycat (1995) ... 0 0\n", "... ... ... ... .. ...\n", "1677 1678 Mat' i syn (1997) ... 0 0\n", "1678 1679 B. Monkey (1998) ... 0 0\n", "1679 1680 Sliding Doors (1998) ... 0 0\n", "1680 1681 You So Crazy (1994) ... 0 0\n", "1681 1682 Scream of Stone (Schrei aus Stein) (1991) ... 0 0\n", "\n", "[1682 rows x 24 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "code", "metadata": { "id": "7tB4z-ZGNp3O", "outputId": "8e83ce0b-737d-48b5-e4d6-0dccd77d3ab8", "colab": { "base_uri": "https://localhost:8080/", "height": 204 } }, "source": [ "movie_dataset = items_dataset[['movie id','movie title']]\n", "movie_dataset.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie title
01Toy Story (1995)
12GoldenEye (1995)
23Four Rooms (1995)
34Get Shorty (1995)
45Copycat (1995)
\n", "
" ], "text/plain": [ " movie id movie title\n", "0 1 Toy Story (1995)\n", "1 2 GoldenEye (1995)\n", "2 3 Four Rooms (1995)\n", "3 4 Get Shorty (1995)\n", "4 5 Copycat (1995)" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "uKus60hs-axf" }, "source": [ "## Merging required datasets" ] }, { "cell_type": "code", "metadata": { "id": "l3jlxk2aVW9l", "outputId": "64a68706-89ed-4bfc-d08a-b0ddf744a811", "colab": { "base_uri": "https://localhost:8080/", "height": 204 } }, "source": [ "merged_dataset = pd.merge(dataset, movie_dataset, how='inner', on='movie id')\n", "merged_dataset.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
01962423881250949Kolya (1996)
1632423875747190Kolya (1996)
22262425883888671Kolya (1996)
31542423879138235Kolya (1996)
43062425876503793Kolya (1996)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "0 196 242 3 881250949 Kolya (1996)\n", "1 63 242 3 875747190 Kolya (1996)\n", "2 226 242 5 883888671 Kolya (1996)\n", "3 154 242 3 879138235 Kolya (1996)\n", "4 306 242 5 876503793 Kolya (1996)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "code", "metadata": { "id": "UJAxMMi1bmNi", "outputId": "eb33d1fa-2316-4930-cec0-0a53e1c4717f", "colab": { "base_uri": "https://localhost:8080/", "height": 297 } }, "source": [ "merged_dataset.describe()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestamp
count100000.00000100000.000000100000.0000001.000000e+05
mean462.48475425.5301303.5298608.835289e+08
std266.61442330.7983561.1256745.343856e+06
min1.000001.0000001.0000008.747247e+08
25%254.00000175.0000003.0000008.794487e+08
50%447.00000322.0000004.0000008.828269e+08
75%682.00000631.0000004.0000008.882600e+08
max943.000001682.0000005.0000008.932866e+08
\n", "
" ], "text/plain": [ " user id movie id rating timestamp\n", "count 100000.00000 100000.000000 100000.000000 1.000000e+05\n", "mean 462.48475 425.530130 3.529860 8.835289e+08\n", "std 266.61442 330.798356 1.125674 5.343856e+06\n", "min 1.00000 1.000000 1.000000 8.747247e+08\n", "25% 254.00000 175.000000 3.000000 8.794487e+08\n", "50% 447.00000 322.000000 4.000000 8.828269e+08\n", "75% 682.00000 631.000000 4.000000 8.882600e+08\n", "max 943.00000 1682.000000 5.000000 8.932866e+08" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "8qYU51YO-fhs" }, "source": [ "## Data Visualization & Recommendations through Data Analysis for a new user (Content-based & Popularity based Recommender system)" ] }, { "cell_type": "code", "metadata": { "id": "Q_tjBrrjdgOR", "outputId": "acedeec5-43c8-46ac-c2af-64a625676d2f", "colab": { "base_uri": "https://localhost:8080/", "height": 404 } }, "source": [ "merged_dataset['rating'].value_counts(sort=False).plot(kind='bar' ,figsize=(10,6), use_index = True, rot=0)\n", "plt.title('Bar plot of rating frequency')\n", "plt.xlabel('Rating')\n", "plt.ylabel('Number of times a rating was given')\n", "label = list(merged_dataset['rating'].value_counts(sort=False))\n", "r4 = [1,2,3,4,5]\n", "for i in range(len(label)):\n", " plt.text(x = r4[i]-1.2 , y = label[i]+500, s = label[i], size =15)\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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SkqQVOlnn332KW+3ePFifv7zn3PooYfStGlTCgoKarz2bbfdhiQGDhxYIT59+vRKrzds2LCtdt9m1nBk8zUiZmbbpNGjR9OlSxfGjBlD+/btKS4u5uyzz2bJkiUMHTqUjh078sILL1Q45ssvv6RPnz7069evPLZw4UImTZrEYYcdxkEHHcSiRYuqve6iRYsYPnw41a0Ic++997LHHnuUb3fqVOkKgWa2nXMBZ2bbnYcffpj27duXbx9zzDF8/PHHjB49mqFDh9KsWTN69uxZ4Zj777+f9evXc9ZZZ5XHunfvzmeffQbA5ZdfzuTJk6u97tVXX81JJ53EggULqmzTvXt3DjjggNrclpltRzyEambbnfTirUyPHj34+OOPqzxm4sSJ7LHHHhx22GHlsUaNMv9/oS+//DL33XcfI0eO3LJkzcwq4QLOzAx44YUX2HvvvSvdt2rVKqZOncqgQYNqde6IYOjQoVx55ZU1Dokec8wx5OXlUVBQwIgRI9iwYUOtrmlmDZuHUM1su/fkk0/y4IMPMn78+Er3P/jgg6xZs6bWBdxdd93FZ599xuWXX15lmzZt2jBs2DCOOuoomjZtyiOPPMINN9zA4sWLue2222p1XTNruFzAmdl2raSkhLPPPpsBAwZw7rnnVtpm4sSJ7L///hx44IFbfP6VK1dy9dVXc/vtt9O8efMq2/Xo0YMePb5effC4446jWbNmjB49muuuu67SYV8z2355CNXMtlvLli2jX79+7L777tx7772Vtlm6dCn//Oc/K0xe2BK33HILu+22G3369GHFihWsWLGC9evX89VXX7FixYpqh0gHDhzI+vXrefPNN2t1bTNruNwDZ2bbpdLSUk466STWrVvHI488QosWLSptN3nyZNavX1/r4dN3332XmTNnkp+fv9m+/Px8nn32WY488shKj5VU4V8zszIu4Mxsu7N+/XpOP/103n//fWbMmMG3vvWtKttOnDiRQw89lD333LNW1xoxYgSXXnpphdill15KmzZtuPHGG6sdlp08eTKNGzeme/futbq2mTVcLuDMbLtz0UUXUVxczG233cbSpUtZunRp+b4ePXrQrFkzAD7++GOeffZZRo0aVeW5yt799t5771FaWlq+3atXLzp06FDpO93atm1L+/bt6d27d3nswgsvpEOHDhxyyCE0bdqU4uJixo0bx6WX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BebPnw/Axo0badSoEZ9//jk77rgjd911F+eee26N57nmmmsYM2YMK1asoFmzZgAcf/zxfPXVVzz11FPl7U444QRWrVrFc889Vx6LCCQxbtw4hg4dSqa1UV2Q9GpEFG4az2QI9S+SZgB/IPXM3EBSi9qbmZmZZWzTogugR48efPzxx+XbjRrVPDhY1XnWrFnDsmXLAFi7di3Tpk3jjDPOqNBu0KBBvPDCC6xcubI8livDpukyGUJtB+SRevfbMmBJRKzPalZmZma2XXjhhRfYe++9t8p52rZty7e+9S0A/vWvf/HVV1+x7777Vmi33377sXHjRt57771vfM36lPEsVEn7AccD0yTlRUTnbCdnZmZmDdeTTz7Jgw8+yPjx47/ReebMmcMf/vAHrrrqKvLy8gBYvnw5AG3btq3QNj8/v8L+XJXJUlonAUcB3wXaAk8Bz2Y5LzMzM2vASkpKOPvssxkwYMBmz7htieXLl3PaaafRvXt3rrnmmq2X4DYukxf59iVVsN0WER/X1NjMzMysOsuWLaNfv37svvvu3HvvvbU+z5o1axgwYABr165lypQpNG3atHxfWU9b+rNu8HXPW9n+XFXjM3ARMSQiJrl4MzMzs2+qtLSUk046iXXr1vHII4/QokWLWp1nw4YNnH322cyZM4epU6ey8847V9i/55570qRJE+bOnVshPnfuXBo1arRVnrurT5lMYjAzMzP7xtavX8/pp5/O+++/z6OPPlo+4aA2LrroIh599FGmTJnCPvtsvkR7s2bNOProo7n//vsrxCdNmsThhx9OmzZtan3tbUEmQ6hmZmZm39hFF11EcXExt912G0uXLmXp0qXl+3r06EGzZs2YM2cOc+bMYc2aNQDMnDmTVq1a0aFDB3r16gXALbfcwp133snVV19No0aNePHFF8vP061bN1q3bg3AddddR+/evbn00ks55ZRTKC4upri4mEcfrbgi6NSpU/niiy+YNWsWkHqZMMAhhxzC7rvvnr0/yDeQ8Yt8Gwq/yNds++CXweYu/3YNV0FBAR9++GGl++bPn09BQQHDhw/nxhtv3Gx/r169mD59OgC9e/fm6aefrvQ806ZNo3fv3uXbDz74IL/61a94//336dKlC8OHD2fQoEEZ5VXZS4TrWlUv8q2xgJP0FrBpo5XATGBERCzd/Khtlws4s+2Di4Dc5d/O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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "ddCUhcSekW3A" }, "source": [ "We can observe that most of the users have rewarded movies they watched with a 4 star rating and followed by 3 star and 5 star." ] }, { "cell_type": "code", "metadata": { "id": "8JVGzz1rd_Ex" }, "source": [ "avg_highly_rated_movies = merged_dataset.groupby(['movie title']).agg({\"rating\":\"mean\"})['rating'].sort_values(ascending=False)\n", "avg_highly_rated_movies = avg_highly_rated_movies.to_frame()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "QajiCkKfq5Bi", "outputId": "3f5c2a6d-4655-458f-8ad9-e2e0c5306cda", "colab": { "base_uri": "https://localhost:8080/", "height": 700 } }, "source": [ "avg_highly_rated_movies.head(20)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
movie title
Marlene Dietrich: Shadow and Light (1996)5.000000
Prefontaine (1997)5.000000
Santa with Muscles (1996)5.000000
Star Kid (1997)5.000000
Someone Else's America (1995)5.000000
Entertaining Angels: The Dorothy Day Story (1996)5.000000
Saint of Fort Washington, The (1993)5.000000
Great Day in Harlem, A (1994)5.000000
They Made Me a Criminal (1939)5.000000
Aiqing wansui (1994)5.000000
Pather Panchali (1955)4.625000
Anna (1996)4.500000
Everest (1998)4.500000
Maya Lin: A Strong Clear Vision (1994)4.500000
Some Mother's Son (1996)4.500000
Close Shave, A (1995)4.491071
Schindler's List (1993)4.466443
Wrong Trousers, The (1993)4.466102
Casablanca (1942)4.456790
Wallace & Gromit: The Best of Aardman Animation (1996)4.447761
\n", "
" ], "text/plain": [ " rating\n", "movie title \n", "Marlene Dietrich: Shadow and Light (1996) 5.000000\n", "Prefontaine (1997) 5.000000\n", "Santa with Muscles (1996) 5.000000\n", "Star Kid (1997) 5.000000\n", "Someone Else's America (1995) 5.000000\n", "Entertaining Angels: The Dorothy Day Story (1996) 5.000000\n", "Saint of Fort Washington, The (1993) 5.000000\n", "Great Day in Harlem, A (1994) 5.000000\n", "They Made Me a Criminal (1939) 5.000000\n", "Aiqing wansui (1994) 5.000000\n", "Pather Panchali (1955) 4.625000\n", "Anna (1996) 4.500000\n", "Everest (1998) 4.500000\n", "Maya Lin: A Strong Clear Vision (1994) 4.500000\n", "Some Mother's Son (1996) 4.500000\n", "Close Shave, A (1995) 4.491071\n", "Schindler's List (1993) 4.466443\n", "Wrong Trousers, The (1993) 4.466102\n", "Casablanca (1942) 4.456790\n", "Wallace & Gromit: The Best of Aardman Animation... 4.447761" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "code", "metadata": { "id": "I5U5xzYnsA9e", "outputId": "fd0474ba-4489-468c-e71d-8d875e3533ea", "colab": { "base_uri": "https://localhost:8080/", "height": 119 } }, "source": [ "print(\"Number of movies with 5 star rating on average: \",len(avg_highly_rated_movies[avg_highly_rated_movies['rating'] == 5.0]))\n", "print(\"Number of movies with above 4 star and below 5 star rating on average: \",len(avg_highly_rated_movies[(avg_highly_rated_movies['rating'] >= 4.0) & (avg_highly_rated_movies['rating'] < 5.0)]))\n", "print(\"Number of movies with above 3 star and below 4 star rating on average: \",len(avg_highly_rated_movies[(avg_highly_rated_movies['rating'] >= 3.0) & (avg_highly_rated_movies['rating'] < 4.0)]))\n", "print(\"Number of movies with above 2 star and below 3 star rating on average: \",len(avg_highly_rated_movies[(avg_highly_rated_movies['rating'] >= 2.0) & (avg_highly_rated_movies['rating'] < 3.0)]))\n", "print(\"Number of movies with above 1 star and below 2 star rating on average: \",len(avg_highly_rated_movies[(avg_highly_rated_movies['rating'] >= 1.0) & (avg_highly_rated_movies['rating'] < 2.0)]))\n", "print(\"Number of movies with below 1 star rating on average: \", len(avg_highly_rated_movies[(avg_highly_rated_movies['rating'] < 1.0)]))\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Number of movies with 5 star rating on average: 10\n", "Number of movies with above 4 star and below 5 star rating on average: 163\n", "Number of movies with above 3 star and below 4 star rating on average: 871\n", "Number of movies with above 2 star and below 3 star rating on average: 492\n", "Number of movies with above 1 star and below 2 star rating on average: 128\n", "Number of movies with below 1 star rating on average: 0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "wqDuh9tOwQN1" }, "source": [ "We can look at number of movies between each range of average ratings: \n", "if \n", "rating ==5.0 : 10; \n", "4<= rating <5: 163; \n", "3<= rating <4: 871; \n", "2<= rating <3: 492; \n", "1<= rating <2: 128;\n" ] }, { "cell_type": "code", "metadata": { "id": "7VNSqthl_2kU", "outputId": "ec045f0d-207a-49c2-b98c-ef3ba08754de", "colab": { "base_uri": "https://localhost:8080/", "height": 270 } }, "source": [ "import matplotlib.pyplot as plt\n", "print('Split of movies count based on their overall average rating')\n", "# Pie chart, where the slices will be ordered and plotted counter-clockwise:\n", "labels = '5 star', '4 to 5 star', '3 to 4 star', '2 to 3 star', '1 to 2 star'\n", "sizes = [10, 163, 871, 492, 128]\n", "# explode = (0, 0.1, 0, 0) # only \"explode\" the 2nd slice (i.e. 'Hogs')\n", "\n", "fig1, ax1 = plt.subplots()\n", "ax1.pie(sizes, labels=labels, autopct='%1.1f%%',\n", " shadow=True, startangle=90)\n", "ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.\n", "\n", "plt.show()\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Split of movies count based on their overall average rating\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "id": "zZOCXhY4zhIC" }, "source": [ "avg_highly_rated_movies.reset_index(level=0, inplace=True)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "5wHFoMWfti41", "outputId": "9f9ada96-218c-4811-b20a-dface04ed64b", "colab": { "base_uri": "https://localhost:8080/", "height": 359 } }, "source": [ "avg_highly_rated_movies.columns = ['movie title', 'avg rating']\n", "\n", "avg_highly_rated_movies.head(10)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleavg rating
0Marlene Dietrich: Shadow and Light (1996)5.0
1Prefontaine (1997)5.0
2Santa with Muscles (1996)5.0
3Star Kid (1997)5.0
4Someone Else's America (1995)5.0
5Entertaining Angels: The Dorothy Day Story (1996)5.0
6Saint of Fort Washington, The (1993)5.0
7Great Day in Harlem, A (1994)5.0
8They Made Me a Criminal (1939)5.0
9Aiqing wansui (1994)5.0
\n", "
" ], "text/plain": [ " movie title avg rating\n", "0 Marlene Dietrich: Shadow and Light (1996) 5.0\n", "1 Prefontaine (1997) 5.0\n", "2 Santa with Muscles (1996) 5.0\n", "3 Star Kid (1997) 5.0\n", "4 Someone Else's America (1995) 5.0\n", "5 Entertaining Angels: The Dorothy Day Story (1996) 5.0\n", "6 Saint of Fort Washington, The (1993) 5.0\n", "7 Great Day in Harlem, A (1994) 5.0\n", "8 They Made Me a Criminal (1939) 5.0\n", "9 Aiqing wansui (1994) 5.0" ] }, "metadata": { "tags": [] }, "execution_count": 19 } ] }, { "cell_type": "markdown", "metadata": { "id": "dyYfsNRsz5f5" }, "source": [ "These are the top 10 movies that can be naviely suggested to the new users, **Recommendations based on top average ratings.**\n", "\n", "-----------------------------" ] }, { "cell_type": "code", "metadata": { "id": "Peh1-b6uo01E", "outputId": "00c3f7f6-cee8-4cd9-dd91-6f0b2c94eb3a", "colab": { "base_uri": "https://localhost:8080/", "height": 238 } }, "source": [ "merged_dataset.groupby(['movie title']).agg({\"rating\":\"sum\"})['rating'].sort_values(ascending=False)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "movie title\n", "Star Wars (1977) 2541\n", "Fargo (1996) 2111\n", "Return of the Jedi (1983) 2032\n", "Contact (1997) 1936\n", "Raiders of the Lost Ark (1981) 1786\n", " ... \n", "Leopard Son, The (1996) 1\n", "Liebelei (1933) 1\n", "Bird of Prey (1996) 1\n", "Lotto Land (1995) 1\n", "Daens (1992) 1\n", "Name: rating, Length: 1664, dtype: int64" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "code", "metadata": { "id": "F7ZJn-uKpdWU", "outputId": "e8797c10-4283-4a8a-ec1c-b76a022bbca0", "colab": { "base_uri": "https://localhost:8080/", "height": 421 } }, "source": [ "merged_dataset['movie id'].value_counts(sort=False).plot(kind='bar' ,figsize=(20,6), use_index = True, rot=0)\n", "plt.title('Bar plot of frequency of a movie being watched')\n", "plt.xlabel('Movies')\n", "plt.ylabel('Number of times a user watched that movie')\n" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, 'Number of times a user watched that movie')" ] }, "metadata": { "tags": [] }, "execution_count": 21 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "moiyNVt4qWmN" }, "source": [ "We can see that very few movies were watched by more than 100 out of 943 users.\n", "\n", "--------------------------" ] }, { "cell_type": "code", "metadata": { "id": "RagHlO7Disd8" }, "source": [ "popular_movies = merged_dataset.groupby(['movie title']).agg({\"rating\":\"count\"})['rating'].sort_values(ascending=False)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "DpJbtChW1nHy" }, "source": [ "popular_movies = popular_movies.to_frame()\n", "popular_movies.reset_index(level=0, inplace=True)\n", "popular_movies.columns = ['movie title', 'Number of Users watched']" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "T-EaOu_v2hDo", "outputId": "3adf8cc3-66cd-43a2-b36d-20b991b40aec", "colab": { "base_uri": "https://localhost:8080/", "height": 119 } }, "source": [ "print(\"Number of popular movies with more than 500 viewers: \",len(popular_movies[popular_movies['Number of Users watched'] >= 500]))\n", "print(\"Number of popular movies with more than 400 and less than 500 viewers: \",len(popular_movies[(popular_movies['Number of Users watched'] >= 400) & (popular_movies['Number of Users watched'] < 500)]))\n", "print(\"Number of popular movies with more than 300 and less than 400 viewers: \",len(popular_movies[(popular_movies['Number of Users watched'] >= 300) & (popular_movies['Number of Users watched'] < 400)]))\n", "print(\"Number of popular movies with more than 200 and less than 300 viewers: \",len(popular_movies[(popular_movies['Number of Users watched'] >= 200) & (popular_movies['Number of Users watched'] < 300)]))\n", "print(\"Number of popular movies with more than 100 and less than 200 viewers: \",len(popular_movies[(popular_movies['Number of Users watched'] >= 100) & (popular_movies['Number of Users watched'] < 200)]))\n", "print(\"Number of popular movies with less than 100 viewers: \", len(popular_movies[(popular_movies['Number of Users watched'] < 100)]))\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Number of popular movies with more than 500 viewers: 4\n", "Number of popular movies with more than 400 and less than 500 viewers: 8\n", "Number of popular movies with more than 300 and less than 400 viewers: 22\n", "Number of popular movies with more than 200 and less than 300 viewers: 84\n", "Number of popular movies with more than 100 and less than 200 viewers: 220\n", "Number of popular movies with less than 100 viewers: 1326\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "650SkeJKBspi", "outputId": "fb433772-b7c8-48c4-93e1-9c12f18e6654", "colab": { "base_uri": "https://localhost:8080/", "height": 303 } }, "source": [ "\n", "df = pd.DataFrame({'viewers': [4, 8, 22, 84, 220, 1326]},\n", " index=['500 viewers', '400 to 500 viewers', '300 to 400 viewers', '200 to 300 viewers', '100 to 200 viewers', 'less than 100 viewers'])\n", "plot = df.plot.pie(y='viewers', figsize=(5, 5))\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "b71P43rd3sBA" }, "source": [ "We can consider the movies which have more than 400 viewers as **POPULAR** and there are 12 movies.\n", "\n", "-------------------------" ] }, { "cell_type": "code", "metadata": { "id": "0Fehdsj82DF4", "outputId": "1aa6001c-c53c-477d-fabc-4dd2332d7d1d", "colab": { "base_uri": "https://localhost:8080/", "height": 421 } }, "source": [ "popular_movies[popular_movies['Number of Users watched'] >= 400]" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleNumber of Users watched
0Star Wars (1977)583
1Contact (1997)509
2Fargo (1996)508
3Return of the Jedi (1983)507
4Liar Liar (1997)485
5English Patient, The (1996)481
6Scream (1996)478
7Toy Story (1995)452
8Air Force One (1997)431
9Independence Day (ID4) (1996)429
10Raiders of the Lost Ark (1981)420
11Godfather, The (1972)413
\n", "
" ], "text/plain": [ " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Contact (1997) 509\n", "2 Fargo (1996) 508\n", "3 Return of the Jedi (1983) 507\n", "4 Liar Liar (1997) 485\n", "5 English Patient, The (1996) 481\n", "6 Scream (1996) 478\n", "7 Toy Story (1995) 452\n", "8 Air Force One (1997) 431\n", "9 Independence Day (ID4) (1996) 429\n", "10 Raiders of the Lost Ark (1981) 420\n", "11 Godfather, The (1972) 413" ] }, "metadata": { "tags": [] }, "execution_count": 26 } ] }, { "cell_type": "markdown", "metadata": { "id": "pQcVlaTn4PQj" }, "source": [ "These are the most popular movies which can be recommended to a new user. **Recommendations based on Popularity**\n", "\n", "----------------------------" ] }, { "cell_type": "code", "metadata": { "id": "aHp-8l0i2GRx", "outputId": "24638608-421b-457d-bc3c-031b1f874c4b", "colab": { "base_uri": "https://localhost:8080/", "height": 359 } }, "source": [ "highly_rated_popular_movies = pd.merge(avg_highly_rated_movies, popular_movies, how = 'inner', on='movie title')\n", "highly_rated_popular_movies.head(10)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleavg ratingNumber of Users watched
0Marlene Dietrich: Shadow and Light (1996)5.01
1Prefontaine (1997)5.03
2Santa with Muscles (1996)5.02
3Star Kid (1997)5.03
4Someone Else's America (1995)5.01
5Entertaining Angels: The Dorothy Day Story (1996)5.01
6Saint of Fort Washington, The (1993)5.02
7Great Day in Harlem, A (1994)5.01
8They Made Me a Criminal (1939)5.01
9Aiqing wansui (1994)5.01
\n", "
" ], "text/plain": [ " movie title ... Number of Users watched\n", "0 Marlene Dietrich: Shadow and Light (1996) ... 1\n", "1 Prefontaine (1997) ... 3\n", "2 Santa with Muscles (1996) ... 2\n", "3 Star Kid (1997) ... 3\n", "4 Someone Else's America (1995) ... 1\n", "5 Entertaining Angels: The Dorothy Day Story (1996) ... 1\n", "6 Saint of Fort Washington, The (1993) ... 2\n", "7 Great Day in Harlem, A (1994) ... 1\n", "8 They Made Me a Criminal (1939) ... 1\n", "9 Aiqing wansui (1994) ... 1\n", "\n", "[10 rows x 3 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 27 } ] }, { "cell_type": "code", "metadata": { "id": "F0PXjIWA7Vt1", "outputId": "95e8b529-79c8-4bc6-fd59-534f1601ccbb", "colab": { "base_uri": "https://localhost:8080/", "height": 421 } }, "source": [ "highly_rated_popular_movies[highly_rated_popular_movies['Number of Users watched']>400]" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleavg ratingNumber of Users watched
23Star Wars (1977)4.358491583
34Godfather, The (1972)4.283293413
40Raiders of the Lost Ark (1981)4.252381420
64Fargo (1996)4.155512508
129Return of the Jedi (1983)4.007890507
236Toy Story (1995)3.878319452
292Contact (1997)3.803536509
412English Patient, The (1996)3.656965481
428Air Force One (1997)3.631090431
597Scream (1996)3.441423478
598Independence Day (ID4) (1996)3.438228429
837Liar Liar (1997)3.156701485
\n", "
" ], "text/plain": [ " movie title avg rating Number of Users watched\n", "23 Star Wars (1977) 4.358491 583\n", "34 Godfather, The (1972) 4.283293 413\n", "40 Raiders of the Lost Ark (1981) 4.252381 420\n", "64 Fargo (1996) 4.155512 508\n", "129 Return of the Jedi (1983) 4.007890 507\n", "236 Toy Story (1995) 3.878319 452\n", "292 Contact (1997) 3.803536 509\n", "412 English Patient, The (1996) 3.656965 481\n", "428 Air Force One (1997) 3.631090 431\n", "597 Scream (1996) 3.441423 478\n", "598 Independence Day (ID4) (1996) 3.438228 429\n", "837 Liar Liar (1997) 3.156701 485" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "code", "metadata": { "id": "h7dmoDb-567R", "outputId": "e190d556-15e9-4580-dae0-d3c1111919b7", "colab": { "base_uri": "https://localhost:8080/", "height": 421 } }, "source": [ "highly_rated_popular_movies[(highly_rated_popular_movies['Number of Users watched']>300) & (highly_rated_popular_movies['avg rating']>=4.0)]" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleavg ratingNumber of Users watched
23Star Wars (1977)4.358491583
32Silence of the Lambs, The (1991)4.289744390
34Godfather, The (1972)4.283293413
40Raiders of the Lost Ark (1981)4.252381420
45Titanic (1997)4.245714350
49Empire Strikes Back, The (1980)4.204360367
61Princess Bride, The (1987)4.172840324
64Fargo (1996)4.155512508
98Monty Python and the Holy Grail (1974)4.066456316
101Pulp Fiction (1994)4.060914394
114Fugitive, The (1993)4.044643336
129Return of the Jedi (1983)4.007890507
\n", "
" ], "text/plain": [ " movie title ... Number of Users watched\n", "23 Star Wars (1977) ... 583\n", "32 Silence of the Lambs, The (1991) ... 390\n", "34 Godfather, The (1972) ... 413\n", "40 Raiders of the Lost Ark (1981) ... 420\n", "45 Titanic (1997) ... 350\n", "49 Empire Strikes Back, The (1980) ... 367\n", "61 Princess Bride, The (1987) ... 324\n", "64 Fargo (1996) ... 508\n", "98 Monty Python and the Holy Grail (1974) ... 316\n", "101 Pulp Fiction (1994) ... 394\n", "114 Fugitive, The (1993) ... 336\n", "129 Return of the Jedi (1983) ... 507\n", "\n", "[12 rows x 3 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 29 } ] }, { "cell_type": "markdown", "metadata": { "id": "w-cVM7If7dRZ" }, "source": [ "These movies are the best to suggest to a new user as they are popular and well rated by the users who already watched them. These have rating more than 4 with atleast 300 viewers.\n", "\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", "\n", "----------------------------\n" ] }, { "cell_type": "markdown", "metadata": { "id": "AAvexcTZDUtm" }, "source": [ "## Recommendations based on Movie Genre to a New User." ] }, { "cell_type": "code", "metadata": { "id": "c3sMtrPbEhjk", "outputId": "25f6b200-0ec2-4e07-a33b-ad9af50ca329", "colab": { "base_uri": "https://localhost:8080/", "height": 340 } }, "source": [ "movie_genre_list = column_names2[-19:]\n", "movie_genre_list" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "['unknown',\n", " 'Action',\n", " 'Adventure',\n", " 'Animation',\n", " 'Children',\n", " 'Comedy',\n", " 'Crime',\n", " 'Documentary',\n", " 'Drama',\n", " 'Fantasy',\n", " 'Film-Noir',\n", " 'Horror',\n", " 'Musical',\n", " 'Mystery',\n", " 'Romance',\n", " 'Sci-Fi',\n", " 'Thriller',\n", " 'War',\n", " 'Western']" ] }, "metadata": { "tags": [] }, "execution_count": 30 } ] }, { "cell_type": "code", "metadata": { "id": "AshrvmaNFNwZ", "outputId": "95352581-178d-4758-bc74-72a320da6408", "colab": { "base_uri": "https://localhost:8080/", "height": 387 } }, "source": [ "count = []\n", "for i in movie_genre_list:\n", " # print(i)\n", " genre_based_movies = items_dataset[['movie id','movie title',i]]\n", " genre_based_movies = genre_based_movies[genre_based_movies[i] == 1]\n", " count.append(len(genre_based_movies))\n", " # merged_genre_movies = pd.merge(dataset, genre_based_movies, how='inner', on='movie id')\n", " # star_based_visualization(merged_genre_movies)\n", "df = pd.DataFrame({'Movie genre':movie_genre_list, 'Number of movies':count})\n", "ax = df.plot.bar(x='Movie genre', y='Number of movies', rot=60, figsize=(10, 5))" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAFyCAYAAAA3cJSiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdebxd0/nH8c+T3AzGhIgYEiJENCWCCKWEGCKmaBHUEDFEW2OpobRptbRR1FiUBkGIoWZ+Rc20aKJqiiGUilIxRVEa8vz+eNZxd65I7r1n7XNvbr7v1+u87jn7nHvW3vvs4dlrPWttc3dEREREpHrtWnoGRERERNoKBVYiIiIimSiwEhEREclEgZWIiIhIJgqsRERERDKpa+kZAFhmmWW8d+/eLT0bIiIiIvM1ZcqUt929+9zeaxWBVe/evZk8eXJLz4aIiIjIfJnZq1/1npoCRURERDJRYCUiIiKSiQIrERERkUxaRY6ViIhIazVr1iymT5/OJ5980tKzIjXWuXNnevbsSYcOHRr9PwqsRERE5mH69OksscQS9O7dGzNr6dmRGnF33nnnHaZPn84qq6zS6P9TU6CIiMg8fPLJJ3Tr1k1B1ULGzOjWrVuTayoVWImIiMyHgqqFU3N+dwVWIiIiIpkox0pERKQJeh93W9bve2XcdvP9jJlx5JFHcvrppwNw2mmn8eGHH/Kzn/2s6vL33Xdftt9+e3bZZZeqv2terr32WsaOHctyyy3HvffeW2pZAGPHjmXTTTdlyy23LL2sItVYiYiItHKdOnXi+uuv5+23327pWZnDZ5991ujPjh8/nosuuqgmQRXAz3/+85oHVaDASkREpNWrq6tjzJgxnHHGGV96b9999+W666774vXiiy8OwH333ceQIUMYMWIEffr04bjjjmPixIkMHjyYtdZai5deeumL//nTn/7EoEGDWH311bn11lsB+Pzzzzn66KNZf/31GTBgAL/73e+++N5NNtmEHXfckf79+39pfq666irWWmst1lxzTY499lgggpyHHnqI/fffn6OPPnqOzzd2Pl955RWGDh3KgAED2GKLLfjnP//JzJkzWXnllZk9ezYAH330Eb169WLWrFlzrJcpU6YwZMgQ1ltvPYYNG8Ybb7wBwNlnn03//v0ZMGAAu+++ezN+mS9TU6CIZFFN80hjmkJEFnYHH3wwAwYM4Jhjjmn0//z9739n6tSpLL300vTp04cDDjiAxx57jLPOOotzzjmHM888E4ig5bHHHuOll15i8803Z9q0aVx22WV06dKFv/71r3z66adsvPHGbL311gA8/vjjPP30018ahuBf//oXxx57LFOmTGGppZZi66235sYbb2Ts2LHcc889nHbaaQwaNKhZ83nooYcyatQoRo0axcUXX8xhhx3GjTfeyMCBA7n//vvZfPPNufXWWxk2bNgc407NmjWLQw89lJtuuonu3btz9dVXc8IJJ3DxxRczbtw4/vGPf9CpUyfef//95vwsX6IaKxERkQXAkksuyT777MPZZ5/d6P9Zf/31WX755enUqROrrrrqF4HRWmutxSuvvPLF50aOHEm7du3o27cvffr04bnnnuPOO+/ksssuY+DAgWywwQa88847vPjiiwAMHjx4rmM7/fWvf2WzzTaje/fu1NXVseeee/LAAw9kmc+//OUvfOc73wFg77335qGHHgJgt9124+qrrwZg0qRJ7LbbbnN89/PPP8/TTz/NVlttxcCBAznppJOYPn06AAMGDGDPPffkiiuuoK4uT12TaqxEREQWEEcccQTrrrsuo0eP/mJaXV3dF01hs2fP5n//+98X73Xq1OmL5+3atfvidbt27ebIj2o4rICZ4e6cc845DBs2bI737rvvPhZbbLF8C9WE+ZybHXfckeOPP553332XKVOmMHTo0Dned3e+/vWv85e//OVL/3vbbbfxwAMPcMstt3DyySfz1FNPVR1gqcZKRERkAbH00kszcuRIxo8f/8W03r17M2XKFABuvvlmZs2a1eTvvfbaa5k9ezYvvfQSL7/8Mv369WPYsGGcf/75X3zfCy+8wEcffTTP7xk8eDD3338/b7/9Np9//jlXXXUVQ4YMafL8zM1GG23EpEmTAJg4cSKbbLIJEDll66+/Pocffjjbb7897du3n+P/+vXrx4wZM74IrGbNmsUzzzzD7Nmzee2119h888055ZRTmDlzJh9++GHV86kaKxERkSZo6ZzAo446inPPPfeL1wceeCAjRoxg7bXXZptttmlWbdJKK63E4MGD+eCDD7jgggvo3LkzBxxwAK+88grrrrsu7k737t258cYb5/k9yy+/POPGjWPzzTfH3dluu+0YMWJEk+dnbs455xxGjx7N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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "XS70qUcRIHTc" }, "source": [ "We can see that most of the movies belong to movie genre : **Drama** followed by **Comedy** then **Action, Romance and Thriller**" ] }, { "cell_type": "code", "metadata": { "id": "v6VOyzlHKW69" }, "source": [ "def star_based_visualization(dataframe):\n", " dataframe['rating'].value_counts(sort=False).plot(kind='bar' ,figsize=(10,6), use_index = True, rot=0)\n", " plt.title('Bar plot of rating frequency')\n", " plt.xlabel('Rating')\n", " plt.ylabel('Number of times a rating was given')\n", " # label = list(dataframe['rating'].value_counts(sort=False))\n", " plt.show()\n", " print(\"Total number of users watched this Genre: \",len(dataframe))\n", " print(\" \")\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-lyP4wzTFJ4O" }, "source": [ "def recommendations_genre(genre):\n", " x = genre\n", " print(\"**************************** ****************************** ******************************\")\n", " print(\"**************************** ****** GENRE: \", x,\" ****** ******************************\")\n", " print(\" \")\n", " genre_based_movies = items_dataset[['movie id','movie title',x]]\n", " genre_based_movies = genre_based_movies[genre_based_movies[x] == 1]\n", " merged_genre_movies = pd.merge(dataset, genre_based_movies, how='inner', on='movie id')\n", " # merged_genre_movies.head()\n", "\n", " star_based_visualization(merged_genre_movies)\n", " high_rated_movies = merged_genre_movies.groupby(['movie title']).agg({\"rating\":\"mean\"})['rating'].sort_values(ascending=False)\n", " high_rated_movies = high_rated_movies.to_frame()\n", " print(\"These are the top movies that can be naviely suggested to the new users for the requested movie genre:\", x, \". Recommendations based on top average ratings.\")\n", " print(high_rated_movies.head(10))\n", " print(\"**************************** ****************************** ******************************\")\n", " popular_movies_ingenre = merged_genre_movies.groupby(['movie title']).agg({\"rating\":\"count\"})['rating'].sort_values(ascending=False)\n", " popular_movies_ingenre = popular_movies_ingenre.to_frame()\n", " popular_movies_ingenre.reset_index(level=0, inplace=True)\n", " popular_movies_ingenre.columns = ['movie title', 'Number of Users watched']\n", " print(\"These are the most popular movies which can be recommended to a new user in\",x,\"genre. Recommendations based on Popularity\")\n", " print(popular_movies_ingenre.sort_values('Number of Users watched', ascending=False).head(10))\n", " print(\"**************************** ****************************** ******************************\")\n", " highly_rated_popular_movies = pd.merge(high_rated_movies, popular_movies_ingenre, how = 'inner', on='movie title')\n", " # highly_rated_popular_movies.head(10)\n", " viewer_limit = 300\n", " ratings_limit = 4.0\n", " count = 0\n", " check = 0\n", " while viewer_limit > 0 and ratings_limit > 0:\n", " s = highly_rated_popular_movies[(highly_rated_popular_movies['Number of Users watched']>viewer_limit) & (highly_rated_popular_movies['rating']>=ratings_limit)]\n", " if len(s) < 11:\n", " if check == 0:\n", " viewer_limit -= 50\n", " check = 1\n", " else:\n", " ratings_limit -= 0.5\n", " check = 0\n", " else:\n", " break\n", " print(\"These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\")\n", " print(\"These have rating more than \",ratings_limit,\" with atleast \",viewer_limit ,\" viewers.\")\n", "\n", " print(\"**Recommendations based popularity and rating. These are top rated popular movies**\")\n", " print(s)\n", " print(\"**************************** ****************************** ******************************\")\n", " print(\" \")\n", " print(\" \")\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "BLmjabNKHJe8", "outputId": "fbbc036c-c3d4-4422-ca3c-3b4189797ac2", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "for i in movie_genre_list[1:]:\n", " recommendations_genre(i)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Action ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAGDCAYAAACbcTyoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debhddX3v8fdHBkEQwpAiBjSo1BYn9EbAaq3ClUEQqFXEOkSKje1FxV7vVfRaQdAr9jphba20UOPEIE5RUJsi6vWqQBgEAZEUoRAZImFGUOB7/9i/AzsxJ1mJWefsk/N+Pc9+9lq/vYbvPpvnyYffb/3WSlUhSZKk0fOIyS5AkiRJK2dQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1Sb1L8qkk752gc/1pkuuS3JXkmT2d4xtJ5vZ07L9OclOrf5s+ziFp6jCoSdNAkmuS/Kr9439rkjOT7DjZda1MkkrypN/hEB8E3lhVm1fVReugnmOSfHa4rar2q6r5v+uxV3KujYAPA3u3+m9Z1+eQNLUY1KTp4yVVtTmwPXAT8Pdrc5AkG67Tqta9xwOXddlwBL/LdsAmjFP/CNYrqWcGNWmaqap7gTOAXcbakuyf5KIkd7Rhw2OGPpvderkOT/KfwLdXPGaSFyS5Psk7k/yy9eC9arwakvxlksVJliVZkOSxrf17bZMft96/V6xk30ckeVeSa5PcnOTTSbZM8sgkdwEbtP3/Y5xzV5IjklwFXNXaTmjf+44kFyT549a+L/BO4BWtnh+39u8keX1bfl2S7yf5YOut/HmS/YbOt1OS7yW5M8m/J/mHFXvo2na/D1zZVm9L8u1V1HtAkouT3JbkB0mePnScZya5sJ3vtCSnjg07j9W6kr/Hk9ryI9v3+M82/PpPSTZd4Td+a/u735DksKHjbJrkQ+13ub39TTZtvbdvWuGclyT505X9PpKWZ1CTppkkjwJeAfxoqPlu4LXADGB/4K+THLzCrn8C/CGwzziHfgywLTALmAucmOTJKzn/nsD7gUMY9O5dC5wKUFXPb5s9ow39nbaS87yuvV4IPAHYHPh4Vd3XegzH9n/iOHUCHAzszsNh9XxgV2Br4PPAF5JsUlXfBP43cFqr5xnjHG93BiFrW+DvgJOSpH32eeA8YBvgGOA1KztAVf0MeEpbnVFVe66s3gyuuzsZeEM75ieBBS1kbQx8BfhM+y5fAP5sFX+HFR0P/H77WzyJwW/57qHPHwNs2doPB/4hyVbtsw8C/wX4o3butwEPAvOBV48dIMkz2v5nrkFd0rRlUJOmj68kuQ24HXgR8H/GPqiq71TVpVX1YFVdApzCIJgNO6aq7q6qX63iHH/bAtN3GfxDfMhKtnkVcHJVXVhV9wHvAJ6TZHbH7/Eq4MNVdXVV3dX2P3QNhwXfX1XLxr5LVX22qm6pqvur6kPAI4HfCpmrcG1V/XNVPcAgmGwPbJfkccCzgXdX1a+r6vvAgjU47srqnQd8sqrOraoH2rVy9wF7tNdGwEer6jdVdQaDELpaLVjOA/6mnetOBiH10KHNfgMc2459FnAX8OQkjwD+Ajiyqpa0un7Qft8FwO8n2bkd4zUMgu+v1+LvIE07BjVp+ji4qmYwuAbqjcB3kzwGIMnuSc5JsjTJ7cBfMegdGnbdao5/a1XdPbR+LfDYlWz32PYZAC1s3cKgl6WL5fZvyxsyuL6rq+W+S5L/keSKNmR3G4NeoxW//6rcOLZQVfe0xc1brcuG2n7r3GtR7+OBt7Zhz9tavTu2cz0WWFJVNbT98N9qVWYCjwIuGDruN1v7mFuq6v6h9XsYfM9tGfx39VvDzW2o/TTg1S3QvZJBj5+kDgxq0jTTeju+BDwAPK81f55Bz8eOVbUl8E9AVtx1NYfeKslmQ+uPA36xku1+wSBsAND22QZY0vErLLd/O8/9DCZIdPXQd2nXo72NQe/fVi3M3s7D339133tVbgC2bsPNY9Zmtu1wDdcB76uqGUOvR1XVKe18s4aGXWHw9xlzN4MwBsBYUG9+CfwKeMrQcbccGk5elV8C9wLjDTfPZ9ATuhdwT1X9sMMxJWFQk6adDBwEbAVc0ZofzaDn594kuwF/vpaHf0+SjVv4OYDBNVIrOgU4LMmuSR7JYHjt3Kq6pn1+E4Nrz8ZzCvA37SL9zXn4GrL7V7HPqjyaQdBbCmyY5N3AFkOf3wTMbr1Ba6SqrgUWAce0v8tzgJesZZ1j/hn4q9YLmiSbZTAZ5NHAD9t3eXOSjZK8FNhtaN8fA09pf/tNGFwzN1brg+3YH0nyewBJZiUZ75rE4e/5IIPr5j6c5LFJNkjynPb70oLZg8CHsDdNWiMGNWn6+FoGsyLvAN4HzK2qsdtA/Dfg2CR3Mrh4/PS1OP6NwK0Merw+B/xVVf10xY2q6t+BvwW+yKAH6Iksfx3UMcD8Nvy2smvcTmbwj/33gJ8z6Ml500q26+pbDIb4fsZgmPBelh9qHAubtyS5cC2O/yrgOQyGd9/LYBjwvrUttqoWAX8JfJzB33sxg8kVtOu+XtrWlzGYNPKloX1/BhwL/DuDGaTLzQAF3t6O96Mkd7Ttul6r9z+ASxlcE7cM+ADL/xvzaeBpwG/NeJU0vix/KYMkrbkkLwA+W1U7THYtoy7JacBPq+roCTrfp4Drq+pdE3G+VdTxWmBeVT1vtRtLeog9apLUoyTPTvLEDO7/ti9wEINbaEwb7Rq9/wacONm1SFONQU2S+vUY4DsMbmXxMeCv18WjraaKdo3bUgbX+n1+ksuRphyHPiVJkkaUPWqSJEkjyqAmSZI0otbkkStTxrbbbluzZ8+e7DIkSZJW64ILLvhlVc1c2WfrZVCbPXs2ixYtmuwyJEmSVivJuI96c+hTkiRpRBnUJEmSRpRBTZIkaUQZ1CRJkkaUQU2SJGlEGdQkSZJGlEFNkiRpRBnUJEmSRpRBTZIkaUQZ1CRJkkaUQU2SJGlEGdQkSZJGlEFNkiRpRG042QVIkqan2UedOdkl9Oqa4/ef7BK0HrBHTZIkaUQZ1CRJkkaUQU2SJGlEGdQkSZJGlEFNkiRpRBnUJEmSRpRBTZIkaUQZ1CRJkkaUQU2SJGlEGdQkSZJGlEFNkiRpRBnUJEmSRlSvQS3J3yS5LMlPkpySZJMkOyU5N8niJKcl2bht+8i2vrh9PnvoOO9o7Vcm2afPmiVJkkZFb0EtySzgzcCcqnoqsAFwKPAB4CNV9STgVuDwtsvhwK2t/SNtO5Ls0vZ7CrAv8I9JNuirbkmSpFHR99DnhsCmSTYEHgXcAOwJnNE+nw8c3JYPauu0z/dKktZ+alXdV1U/BxYDu/VctyRJ0qTrLahV1RLgg8B/MghotwMXALdV1f1ts+uBWW15FnBd2/f+tv02w+0r2echSeYlWZRk0dKlS9f9F5IkSZpgfQ59bsWgN2wn4LHAZgyGLntRVSdW1ZyqmjNz5sy+TiNJkjRh+hz6/K/Az6tqaVX9BvgS8FxgRhsKBdgBWNKWlwA7ArTPtwRuGW5fyT6SJEnrrT6D2n8CeyR5VLvWbC/gcuAc4GVtm7nAV9vygrZO+/zbVVWt/dA2K3QnYGfgvB7rliRJGgkbrn6TtVNV5yY5A7gQuB+4CDgROBM4Ncl7W9tJbZeTgM8kWQwsYzDTk6q6LMnpDELe/cARVfVAX3VLkiSNit6CGkBVHQ0cvULz1axk1mZV3Qu8fJzjvA943zovUJIkaYT5ZAJJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEbTnYBkrS2Zh915mSX0Ktrjt9/skuQNMnsUZMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEdVbUEvy5CQXD73uSPKWJFsnWZjkqva+Vds+ST6WZHGSS5I8a+hYc9v2VyWZ21fNkiRJo6S3oFZVV1bVrlW1K/BfgHuALwNHAWdX1c7A2W0dYD9g5/aaB3wCIMnWwNHA7sBuwNFj4U6SJGl9NlFDn3sB/1FV1wIHAfNb+3zg4LZ8EPDpGvgRMCPJ9sA+wMKqWlZVtwILgX0nqG5JkqRJM1FB7VDglLa8XVXd0JZvBLZry7OA64b2ub61jdcuSZK0Xus9qCXZGDgQ+MKKn1VVAbWOzjMvyaIki5YuXbouDilJkjSpJqJHbT/gwqq6qa3f1IY0ae83t/YlwI5D++3Q2sZrX05VnVhVc6pqzsyZM9fxV5AkSZp4ExHUXsnDw54AC4CxmZtzga8Otb+2zf7cA7i9DZF+C9g7yVZtEsHerU2SJGm91uuzPpNsBrwIeMNQ8/HA6UkOB64FDmntZwEvBhYzmCF6GEBVLUtyHHB+2+7YqlrWZ92SJEmjoNegVlV3A9us0HYLg1mgK25bwBHjHOdk4OQ+apQkSRpVPplAkiRpRBnUJEmSRlSnoc8ks4DHD29fVd/rqyhJkiR1CGpJPgC8ArgceKA1F2BQkyRJ6lGXHrWDgSdX1X19FyNJkqSHdblG7Wpgo74LkSRJ0vK69KjdA1yc5GzgoV61qnpzb1VJkiSpU1Bb0F6SJEmaQKsNalU1P8mmwOOq6soJqEmSJEl0uEYtyUuAi4FvtvVdk9jDJkmS1LMukwmOAXYDbgOoqouBJ/RYkyRJkugW1H5TVbev0PZgH8VIkiTpYV0mE1yW5M+BDZLsDLwZ+EG/ZUmSJKlLj9qbgKcwuDXH54Hbgbf0WZQkSZK69aj9QVX9L+B/9V2MJEmSHtalR+1DSa5IclySp/ZekSRJkoAOQa2qXgi8EFgKfDLJpUne1XtlkiRJ01yXHjWq6saq+hjwVwzuqfbuXquSJElSpxve/mGSY5JcCvw9gxmfO/RemSRJ0jTXZTLBycBpwD5V9Yue65EkSVLT5Vmfz5mIQiRJkrS8cYNaktOr6pA25FnDHwFVVU/vvTpJkqRpbFU9ake29wMmohBJkiQtb9ygVlU3tPdrJ64cSZIkjVntNWpJ7mT5oU8YPEZqEfDWqrq6j8IkSZKmuy6zPj8KXM/gOZ8BDgWeCFzIYEboC/oqTpIkaTrrcsPbA6vqk1V1Z1XdUVUnMrhVx2nAVj3XJ0mSNG11CWr3JDkkySPa6xDg3vbZikOikiRJWke6BLVXAa8BbgZuasuvTrIp8MZV7ZhkRpIzkvy0Pdj9OUm2TrIwyVXtfau2bZJ8LMniJJckedbQcea27a9KMnetv60kSdIU0uWh7FdX1UuqatuqmtmWF1fVr6rq+6vZ/QTgm1X1B8AzgCuAo4Czq2pn4Oy2DrAfsHN7zQM+AZBka+BoYHdgN+DosXAnSZK0Puv0UPa1kWRL4PnASQBV9euqug04CJjfNpsPHNyWDwI+XQM/AmYk2R7YB1hYVcuq6lZgIbBvX3VLkiSNit6CGrATsBT41yQXJfmXJJsB243dow24EdiuLc8Crhva//rWNl67JEnSeq3PoLYh8CzgE1X1TOBuHh7mBAbPoWIdTUhIMi/JoiSLli5dui4OKUmSNKlWG9SSHJlki3ax/0lJLkyyd4djXw9cX1XntvUzGAS3m9qQJu395vb5EmDHof13aG3jtS+nqk6sqjlVNWfmzJkdypMkSRptXXrU/qKq7gD2ZnDftNcAx69up6q6EbguyZNb017A5cACYGzm5lzgq215AfDaFgj3AG5vQ6TfAvZOslWbRLB3a5MkSVqvdXkyQdr7i4HPVNVlSbKqHYa8Cfhcko2Bq4HDGITD05McDlwLHNK2PaudYzFwT9uWqlqW5Djg/LbdsVW1rOP5JUmSpqwuQe2CJP/GYHLAO5I8Gniwy8Gr6mJgzko+2msl2xZwxDjHOZnB46okSZKmjS5B7XBgV+DqqronyTa03i5JkiT1Z7VBraoeTPJz4PeTbDIBNUmSJIkOQS3J64EjGcy2vBjYA/ghsGe/pUmSJE1vXWZ9Hgk8G7i2ql4IPBO4rdeqJEmS1Cmo3VtV9wIkeWRV/RR48mr2kSRJ0u+oy2SC65PMAL4CLExyK4PbakiSJKlHXSYT/GlbPCbJOcCWwDd7rUqSJEmdJhMcB3wP+EFVfbf/kiRJkgTdrlG7GnglsCjJeUk+lOSgnuuSJEma9lYb1KrqX6vqL4AXAp8FXt7eJUmS1KMuQ5//AuwC3AT8X+BlwIU91yVJkjTtdRn63AbYgMG905YBv6yq+3utSpIkSd1nfSb5Q2Af4JwkG1TVDn0XJ0mSNJ11Gfo8APhj4PnADODbDIZAJUmS1KMuN7zdl0EwO6GqftFzPZIkSWq6DH2+cSIKkSRJ0vK6TCaQJEnSJDCoSZIkjSiDmiRJ0ojqMuvzUqBWaL4dWAS8t6pu6aMwSZKk6a7LrM9vAA8An2/rhwKPAm4EPgW8pJfKJEmSprkuQe2/VtWzhtYvTXJhVT0ryav7KkySJGm663KN2gZJdhtbSfJsBo+UAvBRUpIkST3p0qP2euDkJJsDAe4AXp9kM+D9fRYnSZI0nXW54e35wNOSbNnWbx/6+PS+CpMkSZruusz6fCTwZ8BsYMMkAFTVsb1WJkmSNM11Gfr8KoPbcVwA3NdvOZIkSRrTJajtUFX79l6JJEmSltMlqP0gydOq6tI1PXiSa4A7GdyH7f6qmpNka+A0BkOp1wCHVNWtGYypngC8GLgHeF1VXdiOMxd4Vzvse6tq/prWIkmS1p3ZR5052SX05prj95/sEh7S5fYczwMuSHJlkkuSXJrkkjU4xwurateqmtPWjwLOrqqdgbPbOsB+wM7tNQ/4BEALdkcDuwO7AUcn2WoNzi9JkjQldelR228dn/Mg4AVteT7wHeDtrf3TVVXAj5LMSLJ923ZhVS0DSLIQ2Bc4ZR3XJUmSNFLG7VFLskVbvHOcVxcF/FuSC5LMa23bVdUNbflGYLu2PAu4bmjf61vbeO2SJEnrtVX1qH0eOIDBbM9icLPbMQU8ocPxn1dVS5L8HrAwyU+HP6yqSrLiA9/XSguC8wAe97jHrYtDSpIkTapxe9Sq6oD2vlNVPaG9j726hDSqakl7vxn4MoNrzG5qQ5q095vb5kuAHYd236G1jde+4rlOrKo5VTVn5syZXcqTJEkaaaudTJDk7C5tK9lmsySPHlsG9gZ+AiwA5rbN5jK4Txut/bUZ2AO4vQ2RfgvYO8lWbRLB3q1NkiRpvTbu0GeSTYBHAdu2gDQ29LkF3a4R2w74cnuSwYbA56vqm0nOB05PcjhwLXBI2/4sBrfmWMzg9hyHAVTVsiTHAee37Y4dm1ggSZK0PlvVNWpvAN4CPJbBdWpjQe0O4OOrO3BVXQ08YyXttwB7raS9gCPGOdbJwMmrO6ckSdL6ZNygVlUnACckeVNV/f0E1iRJkiQ63Eetqv4+yVOBXYBNhto/3WdhkiRJ091qg1qSoxncdHYXBteR7Qd8HzCoSZIk9ajLI6RexuCashur6jAG151t2WtVkiRJ6hTUflVVDwL3t6cV3Mzy9zWTJElSD7o863NRkhnAPzOY/XkX8MNeq5IkSdKqg1oGN0F7f1XdBvxTkm8CW1TVJRNSnSRJ0jS2yqDWnsV5FvC0tn7NRBQlSZKkbteoXZjk2b1XIkmSpOV0uUZtd+BVSa4F7mbwhIKqqqf3WpkkSdI01yWo7dN7FZIkSfotXZ5McO1EFCJJkqTldblGTZIkSZPAoCZJkjSiDGqSJEkjarVBLckeSc5PcleSXyd5IMkdE1GcJEnSdNalR+3jwCuBq4BNgdcD/9BnUZIkSeo49FlVi4ENquqBqvpXYN9+y5IkSVKX+6jdk2Rj4OIkfwfcgNe2SZIk9a5L4HpN2+6NDJ5MsCPwZ30WJUmSpDW74e29wHv6LUeSJEljHMKUJEkaUQY1SZKkEbVGQS3JI5Js0VcxkiRJeliXG95+PskWSTYDfgJcnuR/9l+aJEnS9NalR22XqroDOBj4BrATg5mgkiRJ6lGXoLZRko0YBLUFVfUboPotS5IkSV2C2ieBa4DNgO8leTzgsz4lSZJ6ttqgVlUfq6pZVfXiGrgWeGHXEyTZIMlFSb7e1ndKcm6SxUlOa089IMkj2/ri9vnsoWO8o7VfmWSfNf6WkiRJU1CXyQTbJTkpyTfa+i7A3DU4x5HAFUPrHwA+UlVPAm4FDm/thwO3tvaPtO3Gznco8BQGzxj9xyQbrMH5JUmSpqQuQ5+fAr4FPLat/wx4S5eDJ9kB2B/4l7YeYE/gjLbJfAbXvgEc1NZpn+/Vtj8IOLWq7quqnwOLgd26nF+SJGkq6xLUtq2q04EHAarqfuCBjsf/KPC2sX2BbYDb2jEArgdmteVZwHVD57i9bf9Q+0r2eUiSeUkWJVm0dOnSjuVJkiSNri5B7e4k29BmeibZg0GIWqUkBwA3V9UFv1uJ3VTViVU1p6rmzJw5cyJOKUmS1KvVPpQd+O/AAuCJSf4fMBN4WYf9ngscmOTFwCbAFsAJwIwkG7Zesx2AJW37JcCOwPVJNgS2BG4Zah8zvI8kSdJ6q8uszwuBPwH+CHgD8JSquqTDfu+oqh2qajaDyQDfrqpXAefwcNCbC3y1LS/g4UkKL2vbV2s/tM0K3QnYGTiv4/eTJEmaslbbo9ZmWL4YmN223zsJVfXhtTzn24FTk7wXuAg4qbWfBHwmyWJgGYNwR1VdluR04HLgfuCIqup6jZwkSdKU1WXo82vAvcClPDwpYI1U1XeA77Tlq1nJrM2quhd4+Tj7vw9439qcW5IkaarqEtR2qKqn916JJEmSltNl1uc3kuzdeyWSJElaTpcetR8BX07yCOA3QICqqi16rUySJGma6xLUPgw8B7i0zcKUJEnSBOgy9Hkd8BNDmiRJ0sTq0qN2NfCd9lD2+8Yaf4fbc0iSJKmDLkHt5+21cXtJkiRpAqw2qFXVeyaiEEmSJC1v3KCW5KNV9ZYkX6M9kH1YVR3Ya2WSJEnT3Kp61D7T3j84EYVIkiRpeeMGtaq6oC3uWlUnDH+W5Ejgu30WJkmSNN11uT3H3JW0vW4d1yFJkqQVrOoatVcCfw7slGTB0EePBpb1XZgkSdJ0t6pr1H4A3ABsC3xoqP1O4JI+i5IkSdKqr1G7FriWweOjJEmSNMG6XKMmSZKkSWBQkyRJGlHjBrUkZ7f3D0xcOZIkSRqzqskE2yf5I+DAJKcCGf6wqi7stTJJkqRpblVB7d3A3wI7AB9e4bMC9uyrKEmSJK161ucZwBlJ/raqjpvAmiRJksSqe9QAqKrjkhwIPL81faeqvt5vWZIkSVptUEvyfmA34HOt6cgkf1RV7+y1MmmCzD7qzMkuoVfXHL//ZJcgSVpLqw1qwP4MHsz+IECS+cBFgEFNkiSpR13vozZjaHnLPgqRJEnS8rr0qL0fuCjJOQxu0fF84Kheq5IkSVKnyQSnJPkO8OzW9PaqurHXqiRJktSpR42qugFY0HMtkiRJGtLbsz6TbJLkvCQ/TnJZkve09p2SnJtkcZLTkmzc2h/Z1he3z2cPHesdrf3KJPv0VbMkSdIo6fOh7PcBe1bVM4BdgX2T7AF8APhIVT0JuBU4vG1/OHBra/9I244kuwCHAk8B9gX+MckGPdYtSZI0ElYZ1JJskOSna3PgGrirrW7UXmOPnjqjtc8HDm7LB7V12ud7JUlrP7Wq7quqnwOLGdzXTZIkab22yqBWVQ8AVyZ53NocvAW9i4GbgYXAfwC3VdX9bZPrgVlteRZwXTvv/cDtwDbD7SvZZ/hc85IsSrJo6dKla1OuJEnSSOkymWAr4LIk5wF3jzVW1YGr27EFvV2TzAC+DPzB2hba4VwnAicCzJkzp/o6jyRJ0kTpEtT+9nc9SVXd1u7D9hxgRpINW6/ZDsCSttkSYEfg+iQbMrix7i1D7WOG95EkSVpvrXYyQVV9F7gG2Kgtnw9cuLr9ksxsPWkk2RR4EXAFcA7wsrbZXOCrbXlBW6d9/u2qqtZ+aJsVuhOwM3Bep28nSZI0hXV5KPtfAvOArYEnMrg+7J+AvVaz6/bA/DZD8xHA6VX19SSXA6cmeS+DZ4ae1LY/CfhMksXAMgYzPamqy5KcDlwO3A8c0YZUJUmS1mtdhj6PYDDL8lyAqroqye+tbqequgR45krar2Ylszar6l7g5eMc633A+zrUKkmStN7och+1+6rq12Mr7foxL9aXJEnqWZeg9t0k7wQ2TfIi4AvA1/otS5IkSV2C2lHAUuBS4A3AWcC7+ixKkiRJHa5Rq6oHk8xncI1aAVe22ZiSJEnqUZdZn/szmOX5H0CAnZK8oaq+0XdxkiRJ01mXWZ8fAl5YVYsBkjwROBMwqEmSJPWoyzVqd46FtOZq4M6e6pEkSVIzbo9akpe2xUVJzgJOZ3CN2ssZPJ1AkiRJPVrV0OdLhpZvAv6kLS8FNu2tIkmSJAGrCGpVddhEFiJJkqTldZn1uRPwJmD28PZVdWB/ZUmSJKnLrM+vMHhg+teAB/stR5IkSWO6BLV7q+pjvVciSZKk5XQJaickORr4N+C+scaqurC3qiRJktQpqD0NeA2wJw8PfVZblyRJUk+6BLWXA0+oql/3XYwkSZIe1uXJBD8BZvRdiCRJkpbXpUdtBvDTJOez/DVq3p5DkiSpR12C2tG9VyFJkqTfstqgVlXfnYhCJEmStLwuTya4k8EsT4CNgY2Au6tqiz4LkyRJmu669Kg9emw5SYCDgD36LEqSJEndZn0+pAa+AuzTUz2SJElqugx9vnRo9RHAHODe3iqSJEkS0G3W50uGlu8HrmEw/ClJkqQedblG7bCJKESSJEnLGzeoJXn3Kvarqjquh3okSZLUrKpH7e6VtG0GHA5sAxjUJEmSejTurM+q+tDYCzgR2BQ4DDgVeMLqDpxkxyTnJLk8yWVJjmztWydZmOSq9r5Va0+SjyVZnOSSJM8aOtbctv1VSeb+jt9ZkiRpSljl7TlaqHovcAmD3rdnVdXbq+rmDse+H3hrVe3C4L5rRyTZBUPcODkAAAm0SURBVDgKOLuqdgbObusA+wE7t9c84BNjNTB4jNXuwG7A0WPhTpIkaX02blBL8n+A84E7gadV1TFVdWvXA1fVDVV1YVu+E7gCmMVgxuj8ttl84OC2fBDw6Xavth8BM5Jsz+CebQuralk7/0Jg3zX5kpIkSVPRqnrU3go8FngX8Iskd7TXnUnuWJOTJJkNPBM4F9iuqm5oH90IbNeWZwHXDe12fWsbr33Fc8xLsijJoqVLl65JeZIkSSNp3MkEVbVGTy0YT5LNgS8Cb6mqOwZPoXroHJWkxt15DVTViQyupWPOnDnr5JiSJEmTaZ2EsfEk2YhBSPtcVX2pNd/UhjRp72PXuy0BdhzafYfWNl67JEnSeq23oNYe4H4ScEVVfXjoowXA2MzNucBXh9pf22Z/7gHc3oZIvwXsnWSrNolg79YmSZK0XuvyCKm19VzgNcClSS5ube8EjgdOT3I4cC1wSPvsLODFwGLgHga3AqGqliU5jsHEBoBjq2pZj3VLkiSNhN6CWlV9H8g4H++1ku0LOGKcY50MnLzuqpMkSRp9vV6jJkmSpLVnUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEdXnQ9mnjdlHnTnZJfTqmuP3n+wSJEmaluxRkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJMkSRpRBjVJkqQR1VtQS3JykpuT/GSobeskC5Nc1d63au1J8rEki5NckuRZQ/vMbdtflWRuX/VKkiSNmj571D4F7LtC21HA2VW1M3B2WwfYD9i5veYBn4BBsAOOBnYHdgOOHgt3kiRJ67veglpVfQ9YtkLzQcD8tjwfOHio/dM18CNgRpLtgX2AhVW1rKpuBRby2+FPkiRpvTTR16htV1U3tOUbge3a8izguqHtrm9t47X/liTzkixKsmjp0qXrtmpJkqRJMGmTCaqqgFqHxzuxquZU1ZyZM2euq8NKkiRNmokOaje1IU3a+82tfQmw49B2O7S28dolSZLWexMd1BYAYzM35wJfHWp/bZv9uQdwexsi/Rawd5Kt2iSCvVubJEnSem/Dvg6c5BTgBcC2Sa5nMHvzeOD0JIcD1wKHtM3PAl4MLAbuAQ4DqKplSY4Dzm/bHVtVK05QkCRJWi/1FtSq6pXjfLTXSrYt4IhxjnMycPI6LE2SJGlK8MkEkiRJI8qgJkmSNKIMapIkSSPKoCZJkjSiDGqSJEkjyqAmSZI0ogxqkiRJI8qgJkmSNKIMapIkSSPKoCZJkjSiDGqSJEkjyqAmSZI0ogxqkiRJI8qgJkmSNKIMapIkSSPKoCZJkjSiDGqSJEkjyqAmSZI0ogxqkiRJI8qgJkmSNKIMapIkSSPKoCZJkjSiDGqSJEkjyqAmSZI0ogxqkiRJI8qgJkmSNKIMapIkSSNqygS1JPsmuTLJ4iRHTXY9kiRJfZsSQS3JBsA/APsBuwCvTLLL5FYlSZLUrykR1IDdgMVVdXVV/Ro4FThokmuSJEnq1VQJarOA64bWr29tkiRJ661U1WTXsFpJXgbsW1Wvb+uvAXavqjcObTMPmNdWnwxcOeGFTpxtgV9OdhFaa/5+U5e/3dTm7ze1rc+/3+OraubKPthwoitZS0uAHYfWd2htD6mqE4ETJ7KoyZJkUVXNmew6tHb8/aYuf7upzd9vapuuv99UGfo8H9g5yU5JNgYOBRZMck2SJEm9mhI9alV1f5I3At8CNgBOrqrLJrksSZKkXk2JoAZQVWcBZ012HSNiWgzxrsf8/aYuf7upzd9vapuWv9+UmEwgSZI0HU2Va9QkSZKmHYPaFJLk5CQ3J/nJZNeiNZNkxyTnJLk8yWVJjpzsmtRdkk2SnJfkx+33e89k16Q1k2SDJBcl+fpk16I1k+SaJJcmuTjJosmuZ6I59DmFJHk+cBfw6ap66mTXo+6SbA9sX1UXJnk0cAFwcFVdPsmlqYMkATarqruSbAR8Hziyqn40yaWpoyT/HZgDbFFVB0x2PeouyTXAnKpaX++htkr2qE0hVfU9YNlk16E1V1U3VNWFbflO4Ap8usaUUQN3tdWN2sv/y50ikuwA7A/8y2TXIq0pg5o0wZLMBp4JnDu5lWhNtKGzi4GbgYVV5e83dXwUeBvw4GQXorVSwL8luaA9hWhaMahJEyjJ5sAXgbdU1R2TXY+6q6oHqmpXBk9G2S2Jlx9MAUkOAG6uqgsmuxattedV1bOA/YAj2mVA04ZBTZog7dqmLwKfq6ovTXY9WjtVdRtwDrDvZNeiTp4LHNiuczoV2DPJZye3JK2JqlrS3m8GvgzsNrkVTSyDmjQB2sXoJwFXVNWHJ7serZkkM5PMaMubAi8Cfjq5VamLqnpHVe1QVbMZPH7w21X16kkuSx0l2axNwCLJZsDewLS684FBbQpJcgrwQ+DJSa5Pcvhk16TOngu8hsH/zV/cXi+e7KLU2fbAOUkuYfDs4YVV5W0epP5tB3w/yY+B84Azq+qbk1zThPL2HJIkSSPKHjVJkqQRZVCTJEkaUQY1SZKkEWVQkyRJGlEGNUmSpBFlUJM0rSR5oN0e5SdJvjZ2f7RVbL/r8K1UkhyY5Kj+K5Ukb88haZpJcldVbd6W5wM/q6r3rWL71wFzquqNE1SiJD1kw8kuQJIm0Q+BpwMk2Q04AdgE+BVwGPBz4Fhg0yTPA94PbEoLbkk+BdwBzAEeA7ytqs5I8gjg48CewHXAb4CTq+qMCfxuktYDDn1KmpaSbADsBSxoTT8F/riqngm8G/jfVfXrtnxaVe1aVaet5FDbA88DDgCOb20vBWYDuzB4IsVz+voektZv9qhJmm42TXIxMAu4AljY2rcE5ifZGShgo47H+0pVPQhcnmS71vY84Aut/cYk56y78iVNJ/aoSZpuflVVuwKPBwIc0dqPA86pqqcCL2EwBNrFfUPLWWdVShIGNUnTVFXdA7wZeGuSDRn0qC1pH79uaNM7gUev4eH/H/BnSR7Retle8LtVK2m6MqhJmraq6iLgEuCVwN8B709yEctfFnIOsEu7pccrOh76i8D1wOXAZ4ELgdvXWeGSpg1vzyFJPUiyeVXdlWQb4DzguVV142TXJWlqcTKBJPXj6+1muhsDxxnSJK0Ne9QkSZJGlNeoSZIkjSiDmiRJ0ogyqEmSJI0og5okSdKIMqhJkiSNKIOaJEnSiPr/ZNQIfTnPzs8AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 25589\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Action . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Star Wars (1977) 4.358491\n", "Godfather, The (1972) 4.283293\n", "Raiders of the Lost Ark (1981) 4.252381\n", "Titanic (1997) 4.245714\n", "Empire Strikes Back, The (1980) 4.204360\n", "Boot, Das (1981) 4.203980\n", "Godfather: Part II, The (1974) 4.186603\n", "African Queen, The (1951) 4.184211\n", "Princess Bride, The (1987) 4.172840\n", "Braveheart (1995) 4.151515\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Action genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Return of the Jedi (1983) 507\n", "2 Air Force One (1997) 431\n", "3 Independence Day (ID4) (1996) 429\n", "4 Raiders of the Lost Ark (1981) 420\n", "5 Godfather, The (1972) 413\n", "6 Rock, The (1996) 378\n", "7 Empire Strikes Back, The (1980) 367\n", "8 Star Trek: First Contact (1996) 365\n", "9 Titanic (1997) 350\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 4.0 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Star Wars (1977) 4.358491 583\n", "1 Godfather, The (1972) 4.283293 413\n", "2 Raiders of the Lost Ark (1981) 4.252381 420\n", "3 Titanic (1997) 4.245714 350\n", "4 Empire Strikes Back, The (1980) 4.204360 367\n", "8 Princess Bride, The (1987) 4.172840 324\n", "9 Braveheart (1995) 4.151515 297\n", "11 Fugitive, The (1993) 4.044643 336\n", "12 Alien (1979) 4.034364 291\n", "13 Return of the Jedi (1983) 4.007890 507\n", "14 Terminator 2: Judgment Day (1991) 4.006780 295\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Adventure ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 13753\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Adventure . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Star Kid (1997) 5.000000\n", "Star Wars (1977) 4.358491\n", "Raiders of the Lost Ark (1981) 4.252381\n", "Lawrence of Arabia (1962) 4.231214\n", "Empire Strikes Back, The (1980) 4.204360\n", "African Queen, The (1951) 4.184211\n", "Princess Bride, The (1987) 4.172840\n", "Great Escape, The (1963) 4.104839\n", "Treasure of the Sierra Madre, The (1948) 4.100000\n", "Wizard of Oz, The (1939) 4.077236\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Adventure genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Return of the Jedi (1983) 507\n", "2 Raiders of the Lost Ark (1981) 420\n", "3 Rock, The (1996) 378\n", "4 Empire Strikes Back, The (1980) 367\n", "5 Star Trek: First Contact (1996) 365\n", "6 Mission: Impossible (1996) 344\n", "7 Indiana Jones and the Last Crusade (1989) 331\n", "8 Willy Wonka and the Chocolate Factory (1971) 326\n", "9 Princess Bride, The (1987) 324\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title ... Number of Users watched\n", "1 Star Wars (1977) ... 583\n", "2 Raiders of the Lost Ark (1981) ... 420\n", "4 Empire Strikes Back, The (1980) ... 367\n", "6 Princess Bride, The (1987) ... 324\n", "11 Return of the Jedi (1983) ... 507\n", "15 Indiana Jones and the Last Crusade (1989) ... 331\n", "20 Dances with Wolves (1990) ... 256\n", "23 Men in Black (1997) ... 303\n", "24 Jurassic Park (1993) ... 261\n", "25 Rock, The (1996) ... 378\n", "27 Star Trek: First Contact (1996) ... 365\n", "28 Willy Wonka and the Chocolate Factory (1971) ... 326\n", "\n", "[12 rows x 3 columns]\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Animation ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 3605\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Animation . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Close Shave, A (1995) 4.491071\n", "Wrong Trousers, The (1993) 4.466102\n", "Wallace & Gromit: The Best of Aardman Animation... 4.447761\n", "Faust (1994) 4.200000\n", "Grand Day Out, A (1992) 4.106061\n", "Toy Story (1995) 3.878319\n", "Aladdin (1992) 3.812785\n", "Winnie the Pooh and the Blustery Day (1968) 3.800000\n", "Beauty and the Beast (1991) 3.792079\n", "Lion King, The (1994) 3.781818\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Animation genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Toy Story (1995) 452\n", "1 Lion King, The (1994) 220\n", "2 Aladdin (1992) 219\n", "3 Beauty and the Beast (1991) 202\n", "4 Fantasia (1940) 174\n", "5 Snow White and the Seven Dwarfs (1937) 172\n", "6 Beavis and Butt-head Do America (1996) 156\n", "7 Cinderella (1950) 129\n", "8 Hunchback of Notre Dame, The (1996) 127\n", "9 James and the Giant Peach (1996) 126\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 2.5 with atleast 100 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Close Shave, A (1995) 4.491071 112\n", "1 Wrong Trousers, The (1993) 4.466102 118\n", "5 Toy Story (1995) 3.878319 452\n", "6 Aladdin (1992) 3.812785 219\n", "8 Beauty and the Beast (1991) 3.792079 202\n", "9 Lion King, The (1994) 3.781818 220\n", "10 Fantasia (1940) 3.770115 174\n", "11 Snow White and the Seven Dwarfs (1937) 3.709302 172\n", "12 Pinocchio (1940) 3.673267 101\n", "15 Cinderella (1950) 3.581395 129\n", "17 Dumbo (1941) 3.495935 123\n", "20 Hunchback of Notre Dame, The (1996) 3.377953 127\n", "26 James and the Giant Peach (1996) 3.126984 126\n", "33 Beavis and Butt-head Do America (1996) 2.788462 156\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Children ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 7182\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Children . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Star Kid (1997) 5.000000\n", "Wizard of Oz, The (1939) 4.077236\n", "Babe (1995) 3.995434\n", "Toy Story (1995) 3.878319\n", "E.T. the Extra-Terrestrial (1982) 3.833333\n", "Aladdin (1992) 3.812785\n", "Winnie the Pooh and the Blustery Day (1968) 3.800000\n", "Beauty and the Beast (1991) 3.792079\n", "Lion King, The (1994) 3.781818\n", "Fantasia (1940) 3.770115\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Children genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Toy Story (1995) 452\n", "1 Willy Wonka and the Chocolate Factory (1971) 326\n", "2 E.T. the Extra-Terrestrial (1982) 300\n", "3 Wizard of Oz, The (1939) 246\n", "4 Lion King, The (1994) 220\n", "5 Babe (1995) 219\n", "6 Aladdin (1992) 219\n", "7 Beauty and the Beast (1991) 202\n", "8 Fly Away Home (1996) 180\n", "9 Mary Poppins (1964) 178\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.0 with atleast 150 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title ... Number of Users watched\n", "1 Wizard of Oz, The (1939) ... 246\n", "2 Babe (1995) ... 219\n", "3 Toy Story (1995) ... 452\n", "4 E.T. the Extra-Terrestrial (1982) ... 300\n", "5 Aladdin (1992) ... 219\n", "7 Beauty and the Beast (1991) ... 202\n", "8 Lion King, The (1994) ... 220\n", "9 Fantasia (1940) ... 174\n", "10 Mary Poppins (1964) ... 178\n", "11 Snow White and the Seven Dwarfs (1937) ... 172\n", "15 Willy Wonka and the Chocolate Factory (1971) ... 326\n", "16 Fly Away Home (1996) ... 180\n", "\n", "[12 rows x 3 columns]\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Comedy ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 29832\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Comedy . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Santa with Muscles (1996) 5.000000\n", "Close Shave, A (1995) 4.491071\n", "Wrong Trousers, The (1993) 4.466102\n", "North by Northwest (1959) 4.284916\n", "Shall We Dance? (1996) 4.260870\n", "As Good As It Gets (1997) 4.196429\n", "Cinema Paradiso (1988) 4.173554\n", "Princess Bride, The (1987) 4.172840\n", "Waiting for Guffman (1996) 4.127660\n", "A Chef in Love (1996) 4.125000\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Comedy genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Liar Liar (1997) 485\n", "1 Toy Story (1995) 452\n", "2 Back to the Future (1985) 350\n", "3 Willy Wonka and the Chocolate Factory (1971) 326\n", "4 Princess Bride, The (1987) 324\n", "5 Forrest Gump (1994) 321\n", "6 Monty Python and the Holy Grail (1974) 316\n", "7 Full Monty, The (1997) 315\n", "8 Men in Black (1997) 303\n", "9 Birdcage, The (1996) 293\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title ... Number of Users watched\n", "7 Princess Bride, The (1987) ... 324\n", "14 Monty Python and the Holy Grail (1974) ... 316\n", "45 Full Monty, The (1997) ... 315\n", "49 When Harry Met Sally... (1989) ... 290\n", "55 Toy Story (1995) ... 452\n", "58 Raising Arizona (1987) ... 256\n", "61 Forrest Gump (1994) ... 321\n", "63 Blues Brothers, The (1980) ... 251\n", "64 Back to the Future (1985) ... 350\n", "79 Groundhog Day (1993) ... 280\n", "82 Men in Black (1997) ... 303\n", "102 Four Weddings and a Funeral (1994) ... 251\n", "106 Willy Wonka and the Chocolate Factory (1971) ... 326\n", "\n", "[13 rows x 3 columns]\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Crime ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAGDCAYAAACbcTyoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debRldX3n/feHAhWZFYJMWsSgHYyKPiVqa4zDE0BBQZMoRBGJBpMGg4n9pImtQiRGkxYSjT5GjESMQSBqTBlxIASlbScKRBAQqUZoQIZSZBYU+PYf53fl3KLurV2V2vfsW+f9Wuusu8/v7OF76rAWn/Ub9k5VIUmSpOHZZNIFSJIkac0MapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1Sb1L8pEkf7ZA13ppkmuS3JHkKT1d43NJDuvp3L+f5MZW/yP7uIakxcOgJk2BJFcl+Un7n/+Pk3w2yW6TrmtNklSSX/oPnOLdwFFVtWVVfWsD1HNcko+Nt1XVC6vqlP/ouddwrc2AE4F9Wv0/2tDXkLS4GNSk6fHiqtoS2Am4Efib9TlJkk03aFUb3mOAS7rsOMDvsiPwMOaof4D1SuqZQU2aMlV1N/AJYM+ZtiT7J/lWktvasOFxY58tbb1cr03yf4B/X/2cSZ6b5Nokb07yw9aD98q5akjyu0lWJrk5yfIkO7f2c9su3269f69Yw7GbJHlLkquT3JTko0m2SfLQJHcAS9rx/3uOa1eSI5NcAVzR2t7TvvdtSc5P8qutfT/gzcArWj3fbu1fSvK6tv2aJF9J8u7WW/n9JC8cu97uSc5NcnuSf0vy/tV76Np+jwMub29vSfLv89R7QJILk9yS5KtJnjR2nqckuaBd7/Qkp80MO8/UuoZ/j19q2w9t3+P/tOHXv02y+Wq/8Zvav/v1SQ4fO8/mSU5ov8ut7d9k89Z7+4bVrnlRkpeu6feRNJtBTZoySR4OvAL4+ljzncCrgW2B/YHfT3LQaof+GvDLwL5znPpRwPbALsBhwElJHr+G6z8feCfwcka9e1cDpwFU1XPabk9uQ3+nr+E6r2mv5wG/CGwJvK+q7mk9hjPHP3aOOgEOAp7OA2H1PGAv4BHAqcA/JXlYVX0e+HPg9FbPk+c439MZhaztgb8EPpwk7bNTgW8CjwSOAw5d0wmq6nvAE9rbbavq+WuqN6N5dycDr2/n/CCwvIWshwCfBv6hfZd/An5jnn+H1b0LeFz7t/glRr/l28Y+fxSwTWt/LfD+JNu1z94N/D/Af27X/mPgfuAU4FUzJ0jy5Hb8Z9ehLmlqGdSk6fHpJLcAtwK/DvyPmQ+q6ktVdXFV3V9VFwEfZxTMxh1XVXdW1U/mucZbW2D6MqP/Eb98Dfu8Eji5qi6oqnuAPwGemWRpx+/xSuDEqrqyqu5oxx+8jsOC76yqm2e+S1V9rKp+VFX3VtUJwEOBB4XMeVxdVR+qqvsYBZOdgB2TPBp4GvC2qvppVX0FWL4O511TvUcAH6yqb1TVfW2u3D3AM9prM+Cvq+pnVfUJRiF0rVqwPAL4w3at2xmF1IPHdvsZ8PZ27jOBO4DHJ9kE+B3g6Kq6rtX11fb7Lgcel2SPdo5DGQXfn67Hv4M0dQxq0vQ4qKq2ZTQH6ijgy0keBZDk6UnOSbIqya3A7zHqHRp3zVrO/+OqunPs/dXAzmvYb+f2GQAtbP2IUS9LF7OOb9ubMprf1dWs75Lkvya5rA3Z3cKo12j17z+fG2Y2ququtrllq/XmsbYHXXs96n0M8KY27HlLq3e3dq2dgeuqqsb2H/+3ms8OwMOB88fO+/nWPuNHVXXv2Pu7GH3P7Rn9d/Wg4eY21H468KoW6A5h1OMnqQODmjRlWm/Hp4D7gGe35lMZ9XzsVlXbAH8LZPVD13Lq7ZJsMfb+0cAP1rDfDxiFDQDaMY8Eruv4FWYd365zL6MFEl39/Lu0+Wh/zKj3b7sWZm/lge+/tu89n+uBR7Th5hnrs9p2vIZrgHdU1bZjr4dX1cfb9XYZG3aF0b/PjDsZhTEAZoJ680PgJ8ATxs67zdhw8nx+CNwNzDXcfAqjntAXAHdV1dc6nFMSBjVp6mTkQGA74LLWvBWjnp+7k+wN/PZ6nv5PkzykhZ8DGM2RWt3HgcOT7JXkoYyG175RVVe1z29kNPdsLh8H/rBN0t+SB+aQ3TvPMfPZilHQWwVsmuRtwNZjn98ILG29Qeukqq4GVgDHtX+XZwIvXs86Z3wI+L3WC5okW2S0GGQr4Gvtu/xBks2SvAzYe+zYbwNPaP/2D2M0Z26m1vvbuf8qyS8AJNklyVxzEse/5/2M5s2dmGTnJEuSPLP9vrRgdj9wAvamSevEoCZNj89ktCryNuAdwGFVNXMbiP8CvD3J7Ywmj5+xHue/Afgxox6vfwR+r6q+u/pOVfVvwFuBTzLqAXoss+dBHQec0obf1jTH7WRG/7M/F/g+o56cN6xhv66+wGiI73uMhgnvZvZQ40zY/FGSC9bj/K8EnsloePfPGA0D3rO+xVbVCuB3gfcx+vdeyWhxBW3e18va+5sZLRr51Nix3wPeDvwboxWks1aAAv+tne/rSW5r+3Wdq/dfgYsZzYm7GfgLZv8/5qPAE4EHrXiVNLfMnsogSesuyXOBj1XVrpOuZeiSnA58t6qOXaDrfQS4tqreshDXm6eOVwNHVNWz17qzpJ+zR02SepTkaUkem9H93/YDDmR0C42p0ebo/RfgpEnXIi02BjVJ6tejgC8xupXFe4Hf3xCPtlos2hy3VYzm+p064XKkRcehT0mSpIGyR02SJGmgDGqSJEkDtS6PXFk0tt9++1q6dOmky5AkSVqr888//4dVtcOaPtsog9rSpUtZsWLFpMuQJElaqyRzPurNoU9JkqSBMqhJkiQNlEFNkiRpoAxqkiRJA2VQkyRJGiiDmiRJ0kAZ1CRJkgbKoCZJkjRQBjVJkqSBMqhJkiQNlEFNkiRpoAxqkiRJA2VQkyRJGqhNJ13AxmDpMZ+ddAm9uupd+0+6BEmSppI9apIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaB6C2pJdktyTpJLk1yS5OjWflyS65Jc2F4vGjvmT5KsTHJ5kn3H2vdrbSuTHNNXzZIkSUOyaY/nvhd4U1VdkGQr4PwkZ7XP/qqq3j2+c5I9gYOBJwA7A/+W5HHt4/cDvw5cC5yXZHlVXdpj7ZIkSRPXW1CrquuB69v27UkuA3aZ55ADgdOq6h7g+0lWAnu3z1ZW1ZUASU5r+xrUJEnSRm1B5qglWQo8BfhGazoqyUVJTk6yXWvbBbhm7LBrW9tc7ZIkSRu13oNaki2BTwJvrKrbgA8AjwX2YtTjdsIGus4RSVYkWbFq1aoNcUpJkqSJ6jWoJdmMUUj7x6r6FEBV3VhV91XV/cCHeGB48zpgt7HDd21tc7XPUlUnVdWyqlq2ww47bPgvI0mStMD6XPUZ4MPAZVV14lj7TmO7vRT4TtteDhyc5KFJdgf2AL4JnAfskWT3JA9htOBgeV91S5IkDUWfqz6fBRwKXJzkwtb2ZuCQJHsBBVwFvB6gqi5JcgajRQL3AkdW1X0ASY4CvgAsAU6uqkt6rFuSJGkQ+lz1+RUga/jozHmOeQfwjjW0nznfcZIkSRsjn0wgSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgdq0y05JdgEeM75/VZ3bV1GSJEnqENSS/AXwCuBS4L7WXIBBTZIkqUddetQOAh5fVff0XYwkSZIe0GWO2pXAZn0XIkmSpNm69KjdBVyY5Gzg571qVfUHvVUlSZKkTkFteXtJkiRpAa01qFXVKUk2Bx5dVZcvQE2SJEmiwxy1JC8GLgQ+397vlcQeNkmSpJ51WUxwHLA3cAtAVV0I/GKPNUmSJIluQe1nVXXram3391GMJEmSHtBlMcElSX4bWJJkD+APgK/2W5YkSZK69Ki9AXgCo1tznArcCryxz6IkSZLUrUftP1XVfwf+e9/FSJIk6QFdetROSHJZkuOT/ErvFUmSJAnoENSq6nnA84BVwAeTXJzkLb1XJkmSNOW69KhRVTdU1XuB32N0T7W39VqVJEmSOt3w9peTHJfkYuBvGK343LX3yiRJkqZcl8UEJwOnA/tW1Q96rkeSJElNl2d9PnMhCpEkSdJscwa1JGdU1cvbkGeNfwRUVT2p9+okSZKm2Hw9ake3vwcsRCGSJEmabc6gVlXXt79XL1w5kiRJmrHWOWpJbmf20CeMHiO1AnhTVV3ZR2GSJEnTrsuqz78GrmX0nM8ABwOPBS5gtCL0uX0VJ0mSNM263PD2JVX1waq6vapuq6qTGN2q43Rgu57rkyRJmlpdgtpdSV6eZJP2ejlwd/ts9SFRSZIkbSBdgtorgUOBm4Ab2/arkmwOHNVjbZIkSVOtyw1vrwRePMfHX9mw5UiSJGlGp4eyr48kuyU5J8mlSS5JcnRrf0SSs5Jc0f5u19qT5L1JVia5KMlTx851WNv/iiSH9VWzJEnSkPQW1IB7Gd2+Y0/gGcCRSfYEjgHOrqo9gLPbe4AXAnu01xHAB2AU7IBjgacDewPHzoQ7SZKkjVlvQa2qrq+qC9r27cBlwC7AgcApbbdTgIPa9oHAR2vk68C2SXYC9gXOqqqbq+rHwFnAfn3VLUmSNBRdbnh7NPD3wO3A3wFPAY6pqi92vUiSpe24bwA7zjz1ALgB2LFt7wJcM3bYta1trnZJkjQhS4/57KRL6NVV79p/0iUA3XrUfqeqbgP2YXTftEOBd3W9QJItgU8Cb2zn+bmqKjbQLT6SHJFkRZIVq1at2hCnlCRJmqguQS3t74uAf6iqS8ba5j8w2YxRSPvHqvpUa76xDWnS/t7U2q8Ddhs7fNfWNlf7LFV1UlUtq6plO+ywQ5fyJEmSBq1LUDs/yRcZBbUvJNkKuH9tByUJ8GHgsqo6ceyj5cDMys3DgH8Za391W/35DODWNkT6BWCfJNu1RQT7tDZJkqSNWpdnfb4W2Au4sqruSvJI4PAOxz2L0TDpxUkubG1vZjRsekaS1wJXAy9vn53JKAyuBO6auUZV3ZzkeOC8tt/bq+rmDteXJEla1Lrc8Pb+JN8HHpfkYV1PXFVfYe4h0hesYf8CjpzjXCczegC8JM2yMU9oHspkZkmT02XV5+uAoxnNDbuQ0T3RvgY8v9/SJEmSpluXOWpHA08Drq6q5zG6zcYtvVYlSZKkTkHt7qq6GyDJQ6vqu8Dj+y1LkiRJXRYTXJtkW+DTwFlJfsxoEYAkSZJ61GUxwUvb5nFJzgG2AT7fa1WSJEnqtJjgeOBc4KtV9eX+S5IkSRJ0m6N2JXAIsCLJN5OckOTAnuuSJEmaemsNalX191X1O8DzgI8Bv9X+SpIkqUddhj7/DtgTuBH4n8BvAhf0XJckSdLU6zL0+UhgCaN7p90M/LCq7u21KkmSJHVf9Znkl4F9gXOSLKmqXfsuTpIkaZp1Gfo8APhV4DnAtsC/MxoClSRJUo+63PB2P0bB7D1V9YOe65EkSVLTZejzqIUoRJIkSbN1WUwgSZKkCTCoSZIkDZRBTZIkaaC6rPq8GKjVmm8FVgB/VlU/6qMwSZKkaddl1efngPuAU9v7g4GHAzcAHwFe3EtlkiRJU65LUPt/q+qpY+8vTnJBVT01yav6KkySJGnadZmjtiTJ3jNvkjyN0SOlAHyUlCRJUk+69Ki9Djg5yZZAgNuA1yXZAnhnn8VJkiRNsy43vD0PeGKSbdr7W8c+PqOvwiRJkqZdl1WfDwV+A1gKbJoEgKp6e6+VSZIkTbkuQ5//wuh2HOcD9/RbjiRJkmZ0CWq7VtV+vVciSZKkWbqs+vxqkif2XokkSZJm6dKj9mzgNUm+z2joM0BV1ZN6rUySJGnKdQlqL+y9CkmSJD3InEEtydZVdRtw+wLWI0mSpGa+HrVTgQMYrfYsRkOeMwr4xR7rkiRJmnpzBrWqOqD93X3hypEkSdKMta76THJ2lzZJkiRtWPPNUXsY8HBg+yTb8cDQ59bALgtQmyRJ0lSbb47a64E3Ajszmqc2E9RuA97Xc12SJElTb745au8B3pPkDVX1NwtYkyRJkuhwH7Wq+pskvwLsCTxsrP2jfRYmSZI07dYa1JIcCzyXUVA7k9ENcL8CGNQkSZJ61OVZn78JvAC4oaoOB54MbNNrVZIkSeoU1H5SVfcD9ybZGrgJ2K3fsiRJktTlWZ8rkmwLfIjR6s87gK/1WpUkSZLmD2pJAryzqm4B/jbJ54Gtq+qiBalOkiRpis0b1KqqkpwJPLG9v2ohipIkSVK3OWoXJHla75VIkiRpli5z1J4OvDLJ1cCdjJ5QUFX1pF4rkyRJmnJdgtq+vVchSZKkB1nr0GdVXb2m19qOS3JykpuSfGes7bgk1yW5sL1eNPbZnyRZmeTyJPuOte/X2lYmOWZ9vqQkSdJi1GWO2vr6CLDfGtr/qqr2aq8zAZLsCRwMPKEd8/8nWZJkCfB+Rk9D2BM4pO0rSZK00esy9LlequrcJEs77n4gcFpV3QN8P8lKYO/22cqquhIgyWlt30s3cLmSJEmD02eP2lyOSnJRGxrdrrXtAlwzts+1rW2u9gdJckSSFUlWrFq1qo+6JUmSFtRag1qSZyQ5L8kdSX6a5L4kt63n9T4APBbYC7geOGE9z/MgVXVSVS2rqmU77LDDhjqtJEnSxHTpUXsfcAhwBbA58DpG88bWWVXdWFX3tWeHfogHhjevY/bzQ3dtbXO1S5IkbfQ6DX1W1UpgSQtZf8+aFwmsVZKdxt6+FJhZEbocODjJQ5PsDuwBfBM4D9gjye5JHsJowcHy9bm2JEnSYtNlMcFdLSRdmOQvGQ1Zdhky/TjwXGD7JNcCxwLPTbIXUMBVwOsBquqSJGcwWiRwL3BkVd3XznMU8AVgCXByVV2yTt9QkiRpkeoS1A5lFMyOAv6Q0VDkb6ztoKo6ZA3NH55n/3cA71hD+5nAmR3qlCRJ2qisNaiN3dz2buBP+y1HkiRJMyZxew5JkiR1YFCTJEkaqHUKakk2SbJ1X8VIkiTpAV1Wb56aZOskWzC6ncalSf6//kuTJEmabl161PasqtuAg4DPAbszWgkqSZKkHnUJapsl2YxRUFteVT9jdB80SZIk9ahLUPsgo5vTbgGcm+QxwPo+61OSJEkddbmP2nuB9441XZ3kef2VJEmSJOi2mGDHJB9O8rn2fk/gsN4rkyRJmnJdhj4/wuhZmzu3998D3thXQZIkSRrpEtS2r6ozgPsBqupe4L5eq5IkSVKnoHZnkkfSVnomeQZwa69VSZIkae2LCYA/ApYDj03yv4AdgN/stSpJkiR1WvV5QZJfAx4PBLi83UtNkiRJPVprUEuyBHgRsLTtv08SqurEnmuTJEmaal2GPj8D3A1cTFtQIEmSpP51CWq7VtWTeq9EkiRJs3RZ9fm5JPv0XokkSZJm6dKj9nXgn5NsAvyM0YKCqqqte61MkiRpynUJaicCzwQurqrquR5JkiQ1XYY+rwG+Y0iTJElaWF161K4EvtQeyn7PTKO355AkSepXl6D2/fZ6SHtJkiRpAXR5MsGfLkQhkiRJmm3OoJbkr6vqjUk+Q3sg+7iqekmvlUmSJE25+XrU/qH9ffdCFCJJkqTZ5gxqVXV+29yrqt4z/lmSo4Ev91mYJEnStOtye47D1tD2mg1chyRJklYz3xy1Q4DfBnZPsnzso62Am/suTJIkadrNN0ftq8D1wPbACWPttwMX9VmUJEmS5p+jdjVwNaPHR0mSJGmBdZmjJkmSpAkwqEmSJA3UnEEtydnt718sXDmSJEmaMd9igp2S/GfgJUlOAzL+YVVd0GtlkiRJU26+oPY24K3ArsCJq31WwPP7KkqSJEnzr/r8BPCJJG+tquMXsCZJkiQxf48aAFV1fJKXAM9pTV+qqn/ttyxJkiStddVnkncCRwOXttfRSf6878IkSZKm3Vp71ID9GT2Y/X6AJKcA3wLe3GdhkiRJ067rfdS2Hdvepo9CJEmSNFuXHrV3At9Kcg6jW3Q8Bzim16okSZLUaTHBx5N8CXhaa/pvVXVDr1VJkiSpU48aVXU9sLznWiRJkjTGZ31KkiQNVG9BLcnJSW5K8p2xtkckOSvJFe3vdq09Sd6bZGWSi5I8deyYw9r+VyQ5rK96JUmShmbeoJZkSZLvrue5PwLst1rbMcDZVbUHcDYPLEp4IbBHex0BfKBd/xHAscDTgb2BY2fCnSRJ0sZu3qBWVfcBlyd59LqeuKrOBW5erflA4JS2fQpw0Fj7R2vk68C2SXYC9gXOqqqbq+rHwFk8OPxJkiRtlLosJtgOuCTJN4E7Zxqr6iXrcb0d28IEgBuAHdv2LsA1Y/td29rman+QJEcw6o3j0Y9e51wpSZI0OF2C2lv7uHBVVZLagOc7CTgJYNmyZRvsvJIkSZOy1sUEVfVl4Cpgs7Z9HnDBel7vxjakSft7U2u/DthtbL9dW9tc7ZIkSRu9Lg9l/13gE8AHW9MuwKfX83rLgZmVm4cB/zLW/uq2+vMZwK1tiPQLwD5JtmuLCPZpbZIkSRu9LkOfRzJacfkNgKq6IskvrO2gJB8Hngtsn+RaRqs33wWckeS1wNXAy9vuZwIvAlYCdwGHt2vdnOR4Rr14AG+vqtUXKEiSJG2UugS1e6rqp0kASLIpsNY5YFV1yBwfvWAN+xajQLim85wMnNyhTkmSpI1KlxvefjnJm4HNk/w68E/AZ/otS5IkSV2C2jHAKuBi4PWMhinf0mdRkiRJ6jD0WVX3JzmF0Ry1Ai5vQ5WSJEnq0VqDWpL9gb8F/jcQYPckr6+qz/VdnCRJ0jTrspjgBOB5VbUSIMljgc8CBjVJkqQedZmjdvtMSGuuBG7vqR5JkiQ1c/aoJXlZ21yR5EzgDEZz1H6LB+5rJkmSpJ7MN/T54rHtG4Ffa9urgM17q0iSJEnAPEGtqg5fyEIkSZI0W5dVn7sDbwCWju9fVS/pryxJkiR1WfX5aeDDjJ5GcH+/5UiSJGlGl6B2d1W9t/dKJEmSNEuXoPaeJMcCXwTumWmsqgt6q0qStNFbesxnJ11Cr6561/6TLkEbgS5B7YnAocDzeWDos9p7SZIk9aRLUPst4Ber6qd9FyNJkqQHdHkywXeAbfsuRJIkSbN16VHbFvhukvOYPUfN23NIkiT1qEtQO7b3KiRJkvQgaw1qVfXlhShEkiRJs3V5MsHtjFZ5AjwE2Ay4s6q27rMwSZKkadelR22rme0kAQ4EntFnUZIkSeq26vPnauTTwL491SNJkqSmy9Dny8bebgIsA+7urSJJkiQB3VZ9vnhs+17gKkbDn5IkSepRlzlqhy9EIZIkSZptzqCW5G3zHFdVdXwP9UiSJKmZr0ftzjW0bQG8FngkYFCTJEnq0ZxBrapOmNlOshVwNHA4cBpwwlzHSZIkacOYd45akkcAfwS8EjgFeGpV/XghCpMkSZp2881R+x/Ay4CTgCdW1R0LVpUkSZLmveHtm4CdgbcAP0hyW3vdnuS2hSlPkiRpes03R22dnlogSZKkDcswJkmSNFAGNUmSpIEyqEmSJA2UQU2SJGmgDGqSJEkDZVCTJEkaKIOaJEnSQBnUJEmSBsqgJkmSNFAGNUmSpIEyqEmSJA2UQU2SJGmgDGqSJEkDZVCTJEkaqIkEtSRXJbk4yYVJVrS2RyQ5K8kV7e92rT1J3ptkZZKLkjx1EjVLkiQttEn2qD2vqvaqqmXt/THA2VW1B3B2ew/wQmCP9joC+MCCVypJkjQBQxr6PBA4pW2fAhw01v7RGvk6sG2SnSZRoCRJ0kKaVFAr4ItJzk9yRGvbsaqub9s3ADu27V2Aa8aOvba1zZLkiCQrkqxYtWpVX3VLkiQtmE0ndN1nV9V1SX4BOCvJd8c/rKpKUutywqo6CTgJYNmyZet0rCRJ0hBNpEetqq5rf28C/hnYG7hxZkiz/b2p7X4dsNvY4bu2NkmSpI3agge1JFsk2WpmG9gH+A6wHDis7XYY8C9teznw6rb68xnArWNDpJIkSRutSQx97gj8c5KZ659aVZ9Pch5wRpLXAlcDL2/7nwm8CFgJ3AUcvvAlS5IkLbwFD2pVdSXw5DW0/wh4wRraCzhyAUqTJEkalCHdnkOSJEljDGqSJEkDZVCTJEkaqEndR00ajKXHfHbSJfTqqnftP+kSJEnryR41SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgTKoSZIkDZRBTZIkaaAMapIkSQNlUJMkSRoog5okSdJAGdQkSZIGyqAmSZI0UAY1SZKkgVo0QS3JfkkuT7IyyTGTrkeSJKlviyKoJVkCvB94IbAncEiSPSdblSRJUr8WRVAD9gZWVtWVVfVT4DTgwAnXJEmS1KvFEtR2Aa4Ze39ta5MkSdpopaomXcNaJflNYL+qel17fyjw9Ko6amyfI4Aj2tvHA5cveKELZ3vgh5MuQuvN32/x8rdb3Pz9FreN+aysyAQAAASgSURBVPd7TFXtsKYPNl3oStbTdcBuY+93bW0/V1UnASctZFGTkmRFVS2bdB1aP/5+i5e/3eLm77e4Tevvt1iGPs8D9kiye5KHAAcDyydckyRJUq8WRY9aVd2b5CjgC8AS4OSqumTCZUmSJPVqUQQ1gKo6Ezhz0nUMxFQM8W7E/P0WL3+7xc3fb3Gbyt9vUSwmkCRJmkaLZY6aJEnS1DGoLUJJliT5VpJ/nXQt6i7JyUluSvKdSdeidZfkqiQXJ7kwyYpJ16PukuyW5Jwklya5JMnRk65J3SR5WJJvJvl2++3+dNI1LTSHPhehJH8ELAO2rqoDJl2PuknyHOAO4KNV9SuTrkfrJslVwLKq2ljv47TRSrITsFNVXZBkK+B84KCqunTCpWktkgTYoqruSLIZ8BXg6Kr6+oRLWzD2qC0ySXYF9gf+btK1aN1U1bnAzZOuQ5o2VXV9VV3Qtm8HLsOn2ywKNXJHe7tZe01VD5NBbfH5a+CPgfsnXYg0ZQr4YpLz25NQtAglWQo8BfjGZCtRV226z4XATcBZVTVVv51BbRFJcgBwU1WdP+lapCn07Kp6KvBC4Mg2lK1FJMmWwCeBN1bVbZOuR91U1X1VtRejpxLtnWSqpo4Y1BaXZwEvaXNlTgOen+Rjky1Jmg5VdV37exPwz8Dek61I66LNb/ok8I9V9alJ16N1V1W3AOcA+026loVkUFtEqupPqmrXqlrK6DFa/15Vr5pwWdJGL8kWbRI6SbYA9gFcvbtItAnpHwYuq6oTJ12PukuyQ5Jt2/bmwK8D351sVQvLoCYtkCQfB74GPD7JtUleO+ma1NmOwFeSfBv4JvDZqvr8hGtSd88CDmU0CnFhe71o0kWpk52Ac5JcxOi532dV1VTdmsrbc0iSJA2UPWqSJEkDZVCTJEkaKIOaJEnSQBnUJEmSBsqgJkmSNFAGNUlTJcl97fYM30nymZl7NM2z/17jt3JI8pIkx/RfqSR5ew5JUybJHVW1Zds+BfheVb1jnv1fAyyrqqMWqERJ+rlNJ12AJE3Q14AnASTZG3gP8DDgJ8DhwPeBtwObJ3k28E5gc1pwS/IR4DZgGfAo4I+r6hNJNgHeBzwfuAb4GXByVX1iAb+bpI2AQ5+SplKSJcALgOWt6bvAr1bVU4C3AX9eVT9t26dX1V5VdfoaTrUT8GzgAOBdre1lwFJgT0Z3xH9mX99D0sbNHjVJ02bzJBcCuwCXAWe19m2AU5LsARSwWcfzfbqq7gcuTbJja3s28E+t/YYk52y48iVNE3vUJE2bn1TVXsBjgABHtvbjgXOq6leAFzMaAu3inrHtbLAqJQmDmqQpVVV3AX8AvCnJpox61K5rH79mbNfbga3W8fT/C/iNJJu0Xrbn/seqlTStDGqSplZVfQu4CDgE+EvgnUm+xexpIecAe7Zberyi46k/CVwLXAp8DLgAuHWDFS5panh7DknqQZItq+qOJI8Evgk8q6pumHRdkhYXFxNIUj/+td1M9yHA8YY0SevDHjVJkqSBco6aJEnSQBnUJEmSBsqgJkmSNFAGNUmSpIEyqEmSJA2UQU2SJGmg/i/9O9/AVMGDBQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 8055\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Crime . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "They Made Me a Criminal (1939) 5.000000\n", "Usual Suspects, The (1995) 4.385768\n", "Letter From Death Row, A (1998) 4.333333\n", "Godfather, The (1972) 4.283293\n", "Crossfire (1947) 4.250000\n", "Godfather: Part II, The (1974) 4.186603\n", "L.A. Confidential (1997) 4.161616\n", "Fargo (1996) 4.155512\n", "Laura (1944) 4.100000\n", "Once Were Warriors (1994) 4.064516\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Crime genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Fargo (1996) 508\n", "1 Godfather, The (1972) 413\n", "2 Pulp Fiction (1994) 394\n", "3 L.A. Confidential (1997) 297\n", "4 Usual Suspects, The (1995) 267\n", "5 Sting, The (1973) 241\n", "6 Seven (Se7en) (1995) 236\n", "7 GoodFellas (1990) 226\n", "8 Heat (1995) 223\n", "9 Godfather: Part II, The (1974) 209\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.0 with atleast 200 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "1 Usual Suspects, The (1995) 4.385768 267\n", "3 Godfather, The (1972) 4.283293 413\n", "5 Godfather: Part II, The (1974) 4.186603 209\n", "6 L.A. Confidential (1997) 4.161616 297\n", "7 Fargo (1996) 4.155512 508\n", "10 Pulp Fiction (1994) 4.060914 394\n", "11 Sting, The (1973) 4.058091 241\n", "19 GoodFellas (1990) 3.951327 226\n", "21 Seven (Se7en) (1995) 3.847458 236\n", "31 Heat (1995) 3.569507 223\n", "40 Batman (1989) 3.427861 201\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Documentary ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAGDCAYAAACFuAwbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debQlZX3u8e/DICCz0EFGGwma4ITeFjESA3pVlNEhCFFEgkETUEzMVTQOqDEQI8TxqhiIGGVybgMOiCjXOCC0yChKGALIpAjNICjwu3/sOrDBPqerm1OnTp/6ftbaq2u/u4bfPtu1eHzft95KVSFJkqT+rNR3AZIkSUNnIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFM0rRJ8skk/zhD13phkquS3JbkyR1d46tJ9uvo3H+d5Pqm/g26uIakFYeBTJpDklyR5DfNf+R/neSUJJv3XdeSJKkkf/gQTvE+4OCqWquqfjwN9RyW5NPjbVX1/Ko67qGeewnXWhU4CnhuU/+vpvsaklYsBjJp7tmtqtYCNgauBz60PCdJssq0VjX9HgVc2GbHWfhdNgJWZ5L6Z2G9kjpmIJPmqKq6E/gcsM1EW5Jdkvw4yeJmuO+wsc/mN71WByT5H+BbDz5nkh2TXJ3kLUl+2fTIvWyyGpL8VZJLk9yUZGGSTZr2M5tdftL05r10CceulOStSa5MckOSTyVZN8lqSW4DVm6O/+9Jrl1JDkryc+DnTdsHmu+9OMk5Sf60ad8ZeAvw0qaenzTt307yqmb7lUm+m+R9Te/j5UmeP3a9LZOcmeTWJN9M8pEH97g1+z0GuKR5e3OSb01R765Jzk1yc5LvJXni2HmenGRRc72Tkpw4MVw8UesS/h5/2Gyv1nyP/2mGTT+WZI0H/cZvaP7u1ybZf+w8ayQ5svldbmn+Jms0vbGvfdA1z0vywiX9PpIeyEAmzVFJHg68FPjBWPPtwCuA9YBdgL9OsueDDv0z4I+B501y6kcCGwKbAvsBRyd57BKu/yzgcGAvRr11VwInAlTVM5vdntQM2Z20hOu8snntBDwaWAv4cFXd1fQAThy/1SR1AuwJPI37Q+mPgG2BRwDHA59NsnpVfQ34J+Ckpp4nTXK+pzEKUxsC7wWOSZLms+OBs4ANgMOAfZd0gqr6GfC45u16VfWsJdWb0by4Y4FXN+f8OLCwCVMPA74E/EfzXT4LvHiKv8ODHQE8pvlb/CGj3/LtY58/Eli3aT8A+EiS9ZvP3gf8L+BPmmu/EbgXOA54+cQJkjypOf6UZahLGiwDmTT3fCnJzcAtwHOAf5n4oKq+XVXnV9W9VXUecAKjADbusKq6vap+M8U13tYEo+8w+g/uXkvY52XAsVW1qKruAt4MPD3J/Jbf42XAUVV1WVXd1hy/9zIO5x1eVTdNfJeq+nRV/aqq7q6qI4HVgN8Lk1O4sqo+UVX3MAogGwMbJdkCeCrw9qr6bVV9F1i4DOddUr0HAh+vqh9W1T3NXLa7gO2b16rA+6vqd1X1OUZhc6maAHkg8LfNtW5lFEb3Htvtd8C7mnOfCtwGPDbJSsBfAodU1TVNXd9rft+FwGOSbN2cY19GAfe3y/F3kAbHQCbNPXtW1XqM5igdDHwnySMBkjwtyRlJbkxyC/AaRr09465ayvl/XVW3j72/EthkCftt0nwGQBOqfsWo16SNBxzfbK/CaP5VWw/4Lkn+PsnFzVDbzYx6gR78/ady3cRGVd3RbK7V1HrTWNvvXXs56n0U8IZmuPLmpt7Nm2ttAlxTVTW2//jfairzgIcD54yd92tN+4RfVdXdY+/vYPQ9N2T0v6vfGyZuhshPAl7eBLd9GPXgSWrBQCbNUU3vxReAe4AdmubjGfVkbF5V6wIfA/LgQ5dy6vWTrDn2fgvgF0vY7xeMQgUAzTEbANe0/AoPOL65zt2MblRo677v0swXeyOj3rz1m9B6C/d//6V976lcCzyiGSaesDx3t47XcBXwnqpab+z18Ko6obnepmPDpTD6+0y4nVHoAmAikDd+CfwGeNzYedcdGwaeyi+BO4HJhomPY9Sz+Wzgjqr6fotzSsJAJs1ZGdkDWB+4uGlem1FPzp1JtgP+YjlP/84kD2tCzq6M5jA92AnA/km2TbIao2GxH1bVFc3n1zOaGzaZE4C/bSbLr8X9c7zunuKYqazNKNDdCKyS5O3AOmOfXw/Mb3p3lklVXQmcDRzW/F2eDuy2nHVO+ATwmqZXM0nWzOimjLWB7zff5XVJVk3yImC7sWN/Ajyu+duvzmhO20St9zbn/tckfwCQZNMkk80ZHP+e9zKa13ZUkk2SrJzk6c3vSxPA7gWOxN4xaZkYyKS55ysZ3YW4GHgPsF9VTSyv8DfAu5LcymgS98nLcf7rgF8z6sH6DPCaqvrpg3eqqm8CbwM+z6hHZyseOE/pMOC4ZthsSXPQjmX0H/UzgcsZ9cy8dgn7tfV1RkNzP2M0vHcnDxwinAiVv0qyaDnO/zLg6YyGZf+R0fDdXctbbFWdDfwV8GFGf+9LGd3kQDMv60XN+5sY3bzxhbFjfwa8C/gmozs2H3DHJfCm5nw/SLK42a/tXLq/B85nNGftJuCfeeB/Sz4FPAH4vTtMJU0uD5yCIEmTS7Ij8Omq2qzvWma7JCcBP62qd8zQ9T4JXF1Vb52J601RxyuAA6tqh6XuLOk+9pBJ0jRI8tQkW2W0ftrOwB6MlqYYjGYO3d8AR/ddi7SiMZBJ0vR4JPBtRktEfBD46+l4pNOKopmDdiOjuXjH91yOtMJxyFKSJKln9pBJkiT1zEAmSZLUs2V5BMmss+GGG9b8+fP7LkOSJGmpzjnnnF9W1bwlfbZCB7L58+dz9tln912GJEnSUiWZ9BFnDllKkiT1zEAmSZLUMwOZJElSzwxkkiRJPTOQSZIk9cxAJkmS1DMDmSRJUs8MZJIkST0zkEmSJPXMQCZJktQzA5kkSVLPDGSSJEk9M5BJkiT1bJW+C5AkzW3zDz2l7xI6dcURu/RdguYAe8gkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSetZZIEuyeZIzklyU5MIkhzTthyW5Jsm5zesFY8e8OcmlSS5J8ryuapMkSZpNVunw3HcDb6iqRUnWBs5Jclrz2b9W1fvGd06yDbA38DhgE+CbSR5TVfd0WKMkSVLvOushq6prq2pRs30rcDGw6RSH7AGcWFV3VdXlwKXAdl3VJ0mSNFvMyByyJPOBJwM/bJoOTnJekmOTrN+0bQpcNXbY1SwhwCU5MMnZSc6+8cYbO6xakiRpZnQeyJKsBXweeH1VLQY+CmwFbAtcCxy5LOerqqOrakFVLZg3b9601ytJkjTTOg1kSVZlFMY+U1VfAKiq66vqnqq6F/gE9w9LXgNsPnb4Zk2bJEnSnNblXZYBjgEurqqjxto3HtvthcAFzfZCYO8kqyXZEtgaOKur+iRJkmaLLu+yfAawL3B+knObtrcA+yTZFijgCuDVAFV1YZKTgYsY3aF5kHdYSpKkIegskFXVd4Es4aNTpzjmPcB7uqpJkiRpNnKlfkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknq3SZqckmwKPGt+/qs7sqihJkqQhWWogS/LPwEuBi4B7muYCDGSSJEnToE0P2Z7AY6vqrq6LkSRJGqI2c8guA1btuhBJkqShatNDdgdwbpLTgft6yarqdZ1VJUmSNCBtAtnC5iVJkqQOLDWQVdVxSdYAtqiqS2agJkmSpEFZ6hyyJLsB5wJfa95vm8QeM0mSpGnSZlL/YcB2wM0AVXUu8OgOa5IkSRqUNnPIfldVtyQZb7u3o3okSdIsMv/QU/ouoTNXHLFL3yXcp00guzDJXwArJ9kaeB3wvW7LkiRJGo42Q5avBR7HaMmL44FbgNd3WZQkSdKQtOkh+6Oq+gfgH7ouRpIkaYja9JAdmeTiJO9O8vjOK5IkSRqYpQayqtoJ2Am4Efh4kvOTvLXzyiRJkgaiTQ8ZVXVdVX0QeA2jNcne3mlVkiRJA9JmYdg/TnJYkvOBDzG6w3KzFsdtnuSMJBcluTDJIU37I5KcluTnzb/rN+1J8sEklyY5L8lTHuJ3kyRJWiG06SE7ltGisM+rqh2r6qNVdUOL4+4G3lBV2wDbAwcl2QY4FDi9qrYGTm/eAzwf2Lp5HQh8dNm+iiRJ0oqpzbMsn748J66qa4Frm+1bk1wMbArsAezY7HYc8G3gTU37p6qqgB8kWS/Jxs15JEmS5qxJA1mSk6tqr2aossY/Aqqqntj2IknmA08GfghsNBayrgM2arY3Ba4aO+zqpu0BgSzJgYx60Nhiiy3aliBJkjRrTdVDdkjz764P5QJJ1gI+D7y+qhaPP4KpqipJTXrwElTV0cDRAAsWLFimYyVJkmajSQPZRC9WVV25vCdPsiqjMPaZqvpC03z9xFBkko2Biflo1wCbjx2+WdMmSZI0p7W5y/LWJIsf9LoqyReTPHqK4wIcA1xcVUeNfbQQ2K/Z3g/48lj7K5q7LbcHbnH+mCRJGoI2j056P6P5XMczmj+2N7AVsIjRHZg7TnLcM4B9gfOTnNu0vQU4Ajg5yQHAlcBezWenAi8ALgXuAPZfxu8iSZK0QmoTyHavqieNvT86yblV9aYkb5nsoKr6LqMAtyTPXsL+BRzUoh5JkqQ5pc06ZHck2SvJSs1rL+DO5jMn1UuSJD1EbQLZyxgNPd4AXN9svzzJGsDBHdYmSZI0CG0Whr0M2G2Sj787veVIkiQNT6uHi0uSJKk7BjJJkqSeGcgkSZJ61mZh2EOSrNMs2HpMkkVJnjsTxUmSJA1Bmx6yv6yqxcBzgfUZ3WV5RKdVSZIkDUibQDaxuOsLgP+oqguZfMFXSZIkLaM2geycJN9gFMi+nmRt4N5uy5IkSRqONo9OOgDYFrisqu5IsgE+Z1KSJGnatFkY9t4klwOPSbL6DNQkSZI0KEsNZEleBRwCbAacC2wPfB94VrelSZIkDUObOWSHAE8FrqyqnYAnAzd3WpUkSdKAtAlkd1bVnQBJVquqnwKP7bYsSZKk4Wgzqf/qJOsBXwJOS/Jr4Mpuy5IkSRqONpP6X9hsHpbkDGBd4GudViVJkjQgbSb1vxs4E/heVX2n+5IkSZKGpc0cssuAfYCzk5yV5Mgke3RclyRJ0mAsNZBV1b9X1V8COwGfBv68+VeSJEnToM2Q5b8B2wDXA/8PeAmwqOO6JEmSBqPNkOUGwMqM1h67CfhlVd3daVWSJEkD0vouyyR/DDwPOCPJylW1WdfFSZIkDUGbIctdgT8FngmsB3yL0dClJEmSpkGbhWF3ZhTAPlBVv+i4HkmSpMFpM2R58EwUIkmSNFRtJvVLkiSpQwYySZKknhnIJEmSetbmLsvzgXpQ8y3A2cA/VtWvuihMkiRpKNrcZflV4B7g+Ob93sDDgeuATwK7dVKZJEnSQLQJZP+7qp4y9v78JIuq6ilJXt5VYZIkSUPRZg7Zykm2m3iT5KmMHqUE4COUJEmSHqI2PWSvAo5NshYQYDHwqiRrAod3WZwkSdIQtFkY9kfAE5Ks27y/Zezjk7sqTJIkaSja3GW5GvBiYD6wShIAqupdnVYmSZI0EG2GLL/MaJmLc4C7ui1Hkn7f/ENP6buETl1xxC59lyCpZ20C2WZVtXPnlUiSJA1Um7ssv5fkCZ1XIkmSNFBtesh2AF6Z5HJGQ5YBqqqe2GllkiRJA9EmkD2/8yokSZIGbNJAlmSdqloM3DqD9UiSJA3OVD1kxwO7Mrq7shgNVU4o4NEd1iVJkjQYkwayqtq1+XfLmStHkiRpeJZ6l2WS09u0SZIkaflMNYdsdeDhwIZJ1uf+Ict1gE1noDZJkqRBmGoO2auB1wObMJpHNhHIFgMf7rguSZKkwZhqDtkHgA8keW1VfWgGa5IkSRqUpa5DVlUfSvJ4YBtg9bH2T3VZmCRJ0lC0mdT/DuBDzWsn4L3A7i2OOzbJDUkuGGs7LMk1Sc5tXi8Y++zNSS5NckmS5y3Xt5EkSVoBtXmW5UuAZwPXVdX+wJOAdVsc90lgSQ8l/9eq2rZ5nQqQZBtgb+BxzTH/N8nKLa4hSZK0wmsTyH5TVfcCdydZB7gB2HxpB1XVmcBNLevYAzixqu6qqsuBS4HtWh4rSZK0QmsTyM5Osh7wCUZ3Wy4Cvv8QrnlwkvOaIc31m7ZNgavG9rmaSZbWSHJgkrOTnH3jjTc+hDIkSZJmhykDWZIAh1fVzVX1MeA5wH7N0OXy+CiwFbAtcC1w5LKeoKqOrqoFVbVg3rx5y1mGJEnS7DFlIKuqAk4de39FVZ23vBerquur6p5mCPQT3D8seQ0PHAbdrGmTJEma89oMWS5K8tTpuFiSjcfevhCYuANzIbB3ktWSbAlsDZw1HdeUJEma7Za6DhnwNOBlSa4Ebme0Yn9V1ROnOijJCcCOjB69dDXwDmDHJNsCBVzB6GkAVNWFSU4GLgLuBg6qqnuW6xtJkiStYNoEsuVaE6yq9llC8zFT7P8e4D3Lcy1JkqQVWZuV+q+ciUIkSZKGqs0cMkmSJHXIQCZJktQzA5kkSVLP2jxcfPskP0pyW5LfJrknyeKZKE6SJGkI2vSQfRjYB/g5sAbwKuAjXRYlSZI0JK2GLKvqUmDlZpX9fwd27rYsSZKk4WizDtkdSR4GnJvkvYyeQencM0mSpGnSJljt2+x3MKOV+jcHXtxlUZIkSUOyLAvD3gm8s9tyJEmShsehR0mSpJ4ZyCRJknq2TIEsyUpJ1umqGEmSpCFqszDs8UnWSbImcAFwUZL/031pkiRJw9Cmh2ybqloM7Al8FdiS0Z2XkiRJmgZtAtmqSVZlFMgWVtXvgOq2LEmSpOFoE8g+DlwBrAmcmeRRgM+ylCRJmiZt1iH7IPDBsaYrk+zUXUmSJEnD0mZS/0ZJjkny1eb9NsB+nVcmSZI0EG2GLD8JfB3YpHn/M+D1XRUkSZI0NG0C2YZVdTJwL0BV3Q3c02lVkiRJA9ImkN2eZAOaOyuTbA/c0mlVkiRJA7LUSf3A3wELga2S/BcwD3hJp1VJkiQNSJu7LBcl+TPgsUCAS5q1yCRJkjQNlhrIkqwMvACY3+z/3CRU1VEd1yZJkjQIbYYsvwLcCZxPM7FfkiRJ06dNINusqp7YeSWSJEkD1eYuy68meW7nlUiSJA1Umx6yHwBfTLIS8DtGE/urqtbptDJJkqSBaBPIjgKeDpxfVdVxPZIkSYPTZsjyKuACw5gkSVI32vSQXQZ8u3m4+F0TjS57IUmSND3aBLLLm9fDmpckSZKmUZuV+t85E4VIkiQN1aSBLMn7q+r1Sb5C82DxcVW1e6eVSZIkDcRUPWT/0fz7vpkoRJIkaagmDWRVdU6zuW1VfWD8sySHAN/psjBJkqShaLPsxX5LaHvlNNchSZI0WFPNIdsH+AtgyyQLxz5aG7ip68IkSZKGYqo5ZN8DrgU2BI4ca78VOK/LoiRJkoZkqjlkVwJXMnpskiRJkjrSZg6ZJEmSOmQgkyRJ6tmkgSzJ6c2//zxz5UiSJA3PVJP6N07yJ8DuSU4EMv5hVS3qtDJJkqSBmCqQvR14G7AZcNSDPivgWV0VJUmSNCRT3WX5OeBzSd5WVe+ewZokSZIGZaoeMgCq6t1Jdgee2TR9u6r+s9uyJEmShmOpd1kmORw4BLioeR2S5J9aHHdskhuSXDDW9ogkpyX5efPv+k17knwwyaVJzkvylOX/SpIkSSuWNste7AI8p6qOrapjgZ2BXVsc98lm33GHAqdX1dbA6c17gOcDWzevA4GPtji/JEnSnNB2HbL1xrbXbXNAVZ3J7z/zcg/guGb7OGDPsfZP1cgPgPWSbNyyNkmSpBXaUueQAYcDP05yBqOlL57J/T1by2qjqrq22b4O2KjZ3hS4amy/q5u2a5EkSZrj2kzqPyHJt4GnNk1vqqrrHuqFq6qS1LIel+RARsOabLHFFg+1DEmSpN61GrKsqmuramHzeihh7PqJocjm3xua9muAzcf226xpW1ItR1fVgqpaMG/evIdQiiRJ0uww08+yXAjs12zvB3x5rP0Vzd2W2wO3jA1tSpIkzWlt5pAtlyQnADsCGya5GngHcARwcpIDgCuBvZrdTwVeAFwK3AHs31VdkiRJs82UgSzJysCFVfVHy3riqtpnko+evYR9CzhoWa8hSZI0F0w5ZFlV9wCXJHH2vCRJUkfaDFmuD1yY5Czg9onGqtq9s6okSZIGpE0ge1vnVUiSJA1Ym3XIvpPkUcDWVfXNJA8HVu6+NEmSpGFo83DxvwI+B3y8adoU+FKXRUmSJA1Jm3XIDgKeASwGqKqfA3/QZVGSJElD0iaQ3VVVv514k2QVYJkfeSRJkqQlaxPIvpPkLcAaSZ4DfBb4SrdlSZIkDUebQHYocCNwPvBqRqvqv7XLoiRJkoakzV2W9yY5Dvgho6HKS5qV9SVJkjQNlhrIkuwCfAz4byDAlkleXVVf7bo4SZKkIWizMOyRwE5VdSlAkq2AUwADmSRJ0jRoM4fs1okw1rgMuLWjeiRJkgZn0h6yJC9qNs9OcipwMqM5ZH8O/GgGapMkSRqEqYYsdxvbvh74s2b7RmCNziqSJEkamEkDWVXtP5OFSJIkDVWbuyy3BF4LzB/fv6p2764sSZKk4Whzl+WXgGMYrc5/b7flSJIkDU+bQHZnVX2w80okSZIGqk0g+0CSdwDfAO6aaKyqRZ1VJUmSNCBtAtkTgH2BZ3H/kGU17yVJkvQQtQlkfw48uqp+23UxkiRJQ9Rmpf4LgPW6LkSSJGmo2vSQrQf8NMmPeOAcMpe9kCRJmgZtAtk7Oq9CkiRpwJYayKrqOzNRiCRJ0lC1Wan/VkZ3VQI8DFgVuL2q1umyMEmSpKFo00O29sR2kgB7ANt3WZQkSdKQtLnL8j418iXgeR3VI0mSNDhthixfNPZ2JWABcGdnFUmSJA1Mm7ssdxvbvhu4gtGwpSRJkqZBmzlk+89EIZIkSUM1aSBL8vYpjquqencH9UiSJA3OVD1kty+hbU3gAGADwEAmSZI0DSYNZFV15MR2krWBQ4D9gROBIyc7TpIkSctmyjlkSR4B/B3wMuA44ClV9euZKEySJGkopppD9i/Ai4CjgSdU1W0zVpUkSdKATLUw7BuATYC3Ar9Isrh53Zpk8cyUJ0mSNPdNNYdsmVbxlyRJ0vIxdEmSJPXMQCZJktQzA5kkSVLP2jzLUo35h57SdwmduuKIXfouQZKkQbKHTJIkqWf2kGkw7OGUJM1W9pBJkiT1zEAmSZLUMwOZJElSzwxkkiRJPetlUn+SK4BbgXuAu6tqQZJHACcB84ErgL2q6td91CdJkjST+uwh26mqtq2qBc37Q4HTq2pr4PTmvSRJ0pw3m4Ys9wCOa7aPA/bssRZJkqQZ01cgK+AbSc5JcmDTtlFVXdtsXwds1E9pkiRJM6uvhWF3qKprkvwBcFqSn45/WFWVpJZ0YBPgDgTYYostuq9UkiSpY730kFXVNc2/NwBfBLYDrk+yMUDz7w2THHt0VS2oqgXz5s2bqZIlSZI6M+OBLMmaSdae2AaeC1wALAT2a3bbD/jyTNcmSZLUhz6GLDcCvphk4vrHV9XXkvwIODnJAcCVwF491CZJkjTjZjyQVdVlwJOW0P4r4NkzXY8kSVLfZtOyF5IkSYNkIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJkno26wJZkp2TXJLk0iSH9l2PJElS12ZVIEuyMvAR4PnANsA+SbbptypJkqRuzapABmwHXFpVl1XVb4ETgT16rkmSJKlTsy2QbQpcNfb+6qZNkiRpzkpV9V3DfZK8BNi5ql7VvN8XeFpVHTy2z4HAgc3bxwKXzHihM2dD4Jd9F6Hl5u+34vK3W7H5+6245vpv96iqmrekD1aZ6UqW4hpg87H3mzVt96mqo4GjZ7KoviQ5u6oW9F2Hlo+/34rL327F5u+34hrybzfbhix/BGydZMskDwP2Bhb2XJMkSVKnZlUPWVXdneRg4OvAysCxVXVhz2VJkiR1alYFMoCqOhU4te86ZolBDM3OYf5+Ky5/uxWbv9+Ka7C/3aya1C9JkjREs20OmSRJ0uAYyGahJMcmuSHJBX3XomWTZPMkZyS5KMmFSQ7puya1l2T1JGcl+Unz+72z75q0bJKsnOTHSf6z71q0bJJckeT8JOcmObvvemaaQ5azUJJnArcBn6qqx/ddj9pLsjGwcVUtSrI2cA6wZ1Vd1HNpaiFJgDWr6rYkqwLfBQ6pqh/0XJpaSvJ3wAJgnarate961F6SK4AFVTWX1yGblD1ks1BVnQnc1HcdWnZVdW1VLWq2bwUuxqdNrDBq5Lbm7arNy//XuoJIsj3QtHcAAAM9SURBVBmwC/BvfdciLSsDmdSRJPOBJwM/7LcSLYtmyOtc4AbgtKry91txvB94I3Bv34VouRTwjSTnNE/lGRQDmdSBJGsBnwdeX1WL+65H7VXVPVW1LaMnhWyXxGkDK4AkuwI3VNU5fdei5bZDVT0FeD5wUDN9ZzAMZNI0a+YefR74TFV9oe96tHyq6mbgDGDnvmtRK88Adm/mIZ0IPCvJp/stScuiqq5p/r0B+CKwXb8VzSwDmTSNmknhxwAXV9VRfdejZZNkXpL1mu01gOcAP+23KrVRVW+uqs2qaj6jx+59q6pe3nNZainJms2NUCRZE3guMKiVBgxks1CSE4DvA49NcnWSA/quSa09A9iX0f87P7d5vaDvotTaxsAZSc5j9Gzd06rK5ROk7m0EfDfJT4CzgFOq6ms91zSjXPZCkiSpZ/aQSZIk9cxAJkmS1DMDmSRJUs8MZJIkST0zkEmSJPXMQCZpTkpyT7PsyAVJvjKxvtgU+287vkRJkt2THNp9pZLksheS5qgkt1XVWs32ccDPquo9U+z/SmBBVR08QyVK0n1W6bsASZoB3weeCJBkO+ADwOrAb4D9gcuBdwFrJNkBOBxYgyagJfkksBhYADwSeGNVfS7JSsCHgWcBVwG/A46tqs/N4HeTNAc4ZClpTkuyMvBsYGHT9FPgT6vqycDbgX+qqt822ydV1bZVddISTrUxsAOwK3BE0/YiYD6wDaMnNDy9q+8haW6zh0zSXLVGknOBTYGLgdOa9nWB45JsDRSwasvzfamq7gUuSrJR07YD8Nmm/bokZ0xf+ZKGxB4ySXPVb6pqW+BRQICDmvZ3A2dU1eOB3RgNXbZx19h2pq1KScJAJmmOq6o7gNcBb0iyCqMesmuaj185tuutwNrLePr/Al6cZKWm12zHh1atpKEykEma86rqx8B5wD7Ae4HDk/yYB07bOAPYplkq46UtT/154GrgIuDTwCLglmkrXNJguOyFJD0ESdaqqtuSbACcBTyjqq7ruy5JKxYn9UvSQ/OfzaKzDwPebRiTtDzsIZMkSeqZc8gkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6tn/BxZXTsStEOgLAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 758\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Documentary . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Great Day in Harlem, A (1994) 5.000000\n", "Marlene Dietrich: Shadow and Light (1996) 5.000000\n", "Maya Lin: A Strong Clear Vision (1994) 4.500000\n", "Everest (1998) 4.500000\n", "Hoop Dreams (1994) 4.094017\n", "Paradise Lost: The Child Murders at Robin Hood ... 4.050000\n", "When We Were Kings (1996) 4.045455\n", "Nico Icon (1995) 4.000000\n", "Wonderful, Horrible Life of Leni Riefenstahl, T... 4.000000\n", "Gate of Heavenly Peace, The (1995) 4.000000\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Documentary genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Hoop Dreams (1994) 117\n", "1 Crumb (1994) 81\n", "2 Celluloid Closet, The (1995) 56\n", "3 Looking for Richard (1996) 55\n", "4 Koyaanisqatsi (1983) 53\n", "5 When We Were Kings (1996) 44\n", "6 Thin Blue Line, The (1988) 35\n", "7 Fast, Cheap & Out of Control (1997) 32\n", "8 Paris Is Burning (1990) 27\n", "9 Microcosmos: Le peuple de l'herbe (1996) 24\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 1.5 with atleast 0 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "4 Hoop Dreams (1994) 4.094017 117\n", "13 Celluloid Closet, The (1995) 3.892857 56\n", "16 Crumb (1994) 3.790123 81\n", "20 Looking for Richard (1996) 3.727273 55\n", "23 Koyaanisqatsi (1983) 3.490566 53\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Drama ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 39895\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Drama . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Prefontaine (1997) 5.000000\n", "Entertaining Angels: The Dorothy Day Story (1996) 5.000000\n", "Someone Else's America (1995) 5.000000\n", "They Made Me a Criminal (1939) 5.000000\n", "Aiqing wansui (1994) 5.000000\n", "Saint of Fort Washington, The (1993) 5.000000\n", "Pather Panchali (1955) 4.625000\n", "Some Mother's Son (1996) 4.500000\n", "Anna (1996) 4.500000\n", "Schindler's List (1993) 4.466443\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Drama genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Contact (1997) 509\n", "1 Fargo (1996) 508\n", "2 English Patient, The (1996) 481\n", "3 Godfather, The (1972) 413\n", "4 Pulp Fiction (1994) 394\n", "5 Twelve Monkeys (1995) 392\n", "6 Silence of the Lambs, The (1991) 390\n", "7 Jerry Maguire (1996) 384\n", "8 Chasing Amy (1997) 379\n", "9 Empire Strikes Back, The (1980) 367\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 4.0 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "9 Schindler's List (1993) 4.466443 298\n", "11 Shawshank Redemption, The (1994) 4.445230 283\n", "18 One Flew Over the Cuckoo's Nest (1975) 4.291667 264\n", "19 Silence of the Lambs, The (1991) 4.289744 390\n", "20 Godfather, The (1972) 4.283293 413\n", "24 Titanic (1997) 4.245714 350\n", "26 Empire Strikes Back, The (1980) 4.204360 367\n", "34 Amadeus (1984) 4.163043 276\n", "35 Fargo (1996) 4.155512 508\n", "37 Braveheart (1995) 4.151515 297\n", "54 Pulp Fiction (1994) 4.060914 394\n", "63 Sense and Sensibility (1995) 4.011194 268\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Fantasy ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAGDCAYAAACFuAwbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debQlVX328e9DM8osEGS0UdEEJ/RFhGiMYlSU0VmDiASDJqIYzauYOOCQgEacXVEMRNSgKBpFQY0DyGscm0EQcOggBJBJGZpBUOjf+8fZjZe2+3Z103Wr+9b3s9ZZp2qfOnV+5x7W6oe9d+1KVSFJkqThrDF0AZIkSWNnIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFM0kqT5KNJ3jZDn/X0JJcluTnJI3r6jC8nOainc/9Nkqtb/Zv18RmSVh8GMmkWSXJJkt+0f+SvT3Jqku2GrmtJklSSB9yDU7wTOKyqNqiqc1ZCPUcm+cTUtqp6alWdcE/PvYTPWgt4F/DkVv+vV/ZnSFq9GMik2WefqtoA2Aq4Gnj/ipwkyZortaqV777ABV0OXAW/y5bAuiyl/lWwXkk9M5BJs1RV3QacDOy0qC3JXknOSbKgDfcdOeW1ua3X6pAk/wt8c/FzJnl8ksuT/EOSX7UeuQOWVkOSv04yP8l1SU5JsnVrP7Md8qPWm/fcJbx3jSSvT3JpkmuSfCzJxknWSXIzMKe9/3+W8tmV5GVJfg78vLW9t33vBUnOSvJnrX1P4B+A57Z6ftTaz0jy4rb9oiTfTvLO1vv4iyRPnfJ5OyQ5M8lNSb6e5IOL97i14x4I/LTt3pDkm9PUu3eSc5PckOQ7SR425TyPSHJ2+7yTknxq0XDxolqX8Pd4QNtep32P/23Dph9Kst5iv/Gr29/9yiQHTznPekmOab/Lje1vsl7rjX35Yp95XpKnL+n3kXR3BjJplkpyL+C5wPemNN8CvBDYBNgL+Jsk+y/21j8H/gR4ylJOfR9gc2Ab4CDg2CQPWsLn7wEcBTyHSW/dpcCnAKrqce2wh7chu5OW8Dkvao8nAPcDNgA+UFW3tx7ARe+//1LqBNgfeDS/D6U/BHYG7g2cCHwmybpV9RXgn4GTWj0PX8r5Hs0kTG0OvAM4LknaaycCPwA2A44EDlzSCarqZ8CD2+4mVbXHkurNZF7c8cBL2jk/DJzSwtTawOeBj7fv8hngmdP8HRZ3NPDA9rd4AJPf8o1TXr8PsHFrPwT4YJJN22vvBP4P8Kfts18DLAROAF6w6ARJHt7ef+py1CWNloFMmn0+n+QG4EbgScC/LHqhqs6oqvOramFVnQd8kkkAm+rIqrqlqn4zzWe8oQWjbzH5B/c5SzjmAOD4qjq7qm4HXgfsnmRux+9xAPCuqrq4qm5u73/ecg7nHVVV1y36LlX1iar6dVXdUVXHAOsAfxAmp3FpVX2kqu5kEkC2ArZMsj3wKOCNVfXbqvo2cMpynHdJ9R4KfLiqvl9Vd7a5bLcDu7XHWsB7qup3VXUyk7C5TC1AHgr8Xfusm5iE0edNOex3wFvauU8DbgYelGQN4K+Aw6vqilbXd9rvewrwwCQ7tnMcyCTg/nYF/g7S6BjIpNln/6rahMkcpcOAbyW5D0CSRyc5Pcm1SW4EXsqkt2eqy5Zx/uur6pYp+5cCWy/huK3bawC0UPVrJr0mXdzt/W17TSbzr7q623dJ8vdJLmpDbTcw6QVa/PtP56pFG1V1a9vcoNV63ZS2P/jsFaj3vsCr23DlDa3e7dpnbQ1cUVU15fipf6vpbAHcCzhrynm/0toX+XVV3TFl/1Ym33NzJv9d/cEwcRsiPwl4QQtuz2fSgyepAwOZNEu13ovPAXcCj23NJzLpydiuqjYGPgRk8bcu49SbJll/yv72wC+XcNwvmYQKANp7NgOu6PgV7vb+9jl3MLlQoau7vkubL/YaJr15m7bQeiO///7L+t7TuRK4dxsmXmRFrm6dWsNlwD9V1SZTHveqqk+2z9tmynApTP4+i9zCJHQBsCiQN78CfgM8eMp5N54yDDydXwG3AUsbJj6BSc/mE4Fbq+q7Hc4pCQOZNGtlYj9gU+Ci1rwhk56c25LsCvzlCp7+zUnWbiFnbyZzmBb3SeDgJDsnWYfJsNj3q+qS9vrVTOaGLc0ngb9rk+U34PdzvO6Y5j3T2ZBJoLsWWDPJG4GNprx+NTC39e4sl6q6FJgHHNn+LrsD+6xgnYt8BHhp69VMkvUzuShjQ+C77bu8IslaSZ4B7DrlvT8CHtz+9usymdO2qNaF7dzvTvJHAEm2SbK0OYNTv+dCJvPa3pVk6yRzkuzefl9aAFsIHIO9Y9JyMZBJs88XM7kKcQHwT8BBVbVoeYW/Bd6S5CYmk7g/vQLnvwq4nkkP1n8AL62qnyx+UFV9HXgD8FkmPTr35+7zlI4ETmjDZkuag3Y8k3/UzwR+waRn5uVLOK6rrzIZmvsZk+G927j7EOGiUPnrJGevwPkPAHZnMiz7NibDd7evaLFVNQ/4a+ADTP7e85lc5ECbl/WMtn8dk4s3PjflvT8D3gJ8nckVm3e74hJ4bTvf95IsaMd1nUv398D5TOasXQe8nbv/W/Ix4KHAH1xhKmnpcvcpCJK0dEkeD3yiqrYdupZVXZKTgJ9U1Ztm6PM+ClxeVa+fic+bpo4XAodW1WOXebCku9hDJkkrQZJHJbl/Juun7Qnsx2RpitFoc+j+Fjh26Fqk1Y2BTJJWjvsAZzBZIuJ9wN+sjFs6rS7aHLRrmczFO3HgcqTVjkOWkiRJA7OHTJIkaWAGMkmSpIEtzy1IVjmbb755zZ07d+gyJEmSlumss876VVVtsaTXVutANnfuXObNmzd0GZIkScuUZKm3OHPIUpIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWBrDl2AJC3L3CNOHbqEXl1y9F5DlyBpYPaQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDaz3QJZkTpJzknyp7e+Q5PtJ5ic5KcnarX2dtj+/vT6379okSZJWBTPRQ3Y4cNGU/bcD766qBwDXA4e09kOA61v7u9txkiRJs16vgSzJtsBewL+1/QB7ACe3Q04A9m/b+7V92utPbMdLkiTNan33kL0HeA2wsO1vBtxQVXe0/cuBbdr2NsBlAO31G9vxd5Pk0CTzksy79tpr+6xdkiRpRvQWyJLsDVxTVWetzPNW1bFVtUtV7bLFFluszFNLkiQNYs0ez/0YYN8kTwPWBTYC3gtskmTN1gu2LXBFO/4KYDvg8iRrAhsDv+6xPkmSpFVCbz1kVfW6qtq2quYCzwO+WVUHAKcDz2qHHQR8oW2f0vZpr3+zqqqv+iRJklYVQ6xD9lrgVUnmM5kjdlxrPw7YrLW/CjhigNokSZJmXJ9DlnepqjOAM9r2xcCuSzjmNuDZM1GPJEnSqsSV+iVJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEka2IwseyFJGq+5R5w6dAm9uuTovYYuQbOAPWSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDazTshdJtgHuO/X4qjqzr6IkSZLGZJmBLMnbgecCFwJ3tuYCDGSSJEkrQZcesv2BB1XV7X0XI0mSNEZd5pBdDKzVdyGSJElj1aWH7Fbg3CTfAO7qJauqV/RWlSRJ0oh0CWSntIckSZJ6sMxAVlUnJFkP2L6qfjoDNUmSJI3KMueQJdkHOBf4StvfOYk9ZpIkSStJl0n9RwK7AjcAVNW5wP16rEmSJGlUugSy31XVjYu1LeyjGEmSpDHqMqn/giR/CcxJsiPwCuA7/ZYlSZI0Hl16yF4OPJjJkhcnAjcCr+yzKEmSpDHp0kP2x1X1j8A/9l2MJEnSGHXpITsmyUVJ3prkIb1XJEmSNDLLDGRV9QTgCcC1wIeTnJ/k9b1XJkmSNBJdesioqquq6n3AS5msSfbGXquSJEkakS4Lw/5JkiOTnA+8n8kVltv2XpkkSdJIdJnUfzxwEvCUqvplz/VIkiSNTpd7We4+E4VIkiSN1VIDWZJPV9Vz2lBlTX0JqKp6WO/VSZIkjcB0PWSHt+e9Z6IQSZKksVpqIKuqK9vzpTNXjiRJ0vgscw5Zkpu4+5AlTG6fNA94dVVd3EdhkiRJY9HlKsv3AJczuY9lgOcB9wfOZnIF5uP7Kk6SJGkMuiwMu29VfbiqbqqqBVV1LJMlME4CNu25PkmSpFmvSyC7NclzkqzRHs8BbmuvLT6UKUmSpOXUJZAdABwIXANc3bZfkGQ94LAea5MkSRqFLgvDXgzss5SXv71yy5EkSRqfTjcXlyRJUn8MZJIkSQMzkEmSJA1smYEsyeFJNsrEcUnOTvLkmShOkiRpDLr0kP1VVS0Ansxk3bEDgaN7rUqSJGlEugSytOenAR+vqgumtEmSJOke6hLIzkryX0wC2VeTbAgs7LcsSZKk8ehyL8tDgJ2Bi6vq1iSbAQf3W5YkSdJ4dFkYdmGSXwAPTLLuDNQkSZI0KssMZEleDBwObAucC+wGfBfYo9/SJEmSxqHLHLLDgUcBl1bVE4BHADf0WpUkSdKIdAlkt1XVbQBJ1qmqnwAP6rcsSZKk8egyqf/yJJsAnwe+luR64NJ+y5IkSRqPLpP6n942j0xyOrAx8JVeq5IkSRqRLpP63wqcCXynqr7Vf0mSJEnj0mUO2cXA84F5SX6Q5Jgk+/VclyRJ0mgsM5BV1b9X1V8BTwA+ATy7PUuSJGklWGYgS/JvSb4D/CuTIc5nMbnJ+LLet27rUftRkguSvLm175Dk+0nmJzkpydqtfZ22P7+9PveefDFJkqTVRZchy82AOUzWHrsO+FVV3dHhfbcDe1TVw5ncemnPJLsBbwfeXVUPAK5ncmsm2vP1rf3d7ThJkqRZr8uQ5dOr6tHAO4BNgNOTXN7hfVVVN7fdtdqjmKzwf3JrPwHYv23v1/Zprz8xSbp+EUmSpNVVl6ss9wb+DHgck0D2TeD/dTl5kjnAWcADgA8C/wPcMKWH7XJgm7a9DXAZQFXdkeRGJr1zv+r6ZSRJklZHXRaG3ZNJAHtvVf1yeU5eVXcCO7eFZf8T+OPlL/HukhwKHAqw/fbb39PTSZIkDa7LkOVhVXXS8oaxxc5xA3A6sDuwSZJFQXBb4Iq2fQWwHUB7fWPg10s417FVtUtV7bLFFlusaEmSJEmrjC6T+ldIki1azxhJ1gOeBFzEJJg9qx12EPCFtn1K26e9/s2qqr7qkyRJWlV0GbJcUVsBJ7R5ZGsAn66qLyW5EPhUkrcB5wDHteOPAz6eZD6Tqzmf12NtkiRJq4zeAllVnQc8YgntFwO7LqH9NiaLzkqSJI1Kl6ssz2eyXMVUNwLzgLdV1R/M85IkSVJ3XXrIvgzcCZzY9p8H3Au4CvgosE8vlUmSJI1El0D2F1X1yCn75yc5u6oemeQFfRUmSZI0Fl2uspyT5K45X0kexeRWSgBdbqEkSZKkaXTpIXsxcHySDYAAC4AXJ1kfOKrP4iRJksZgmYGsqn4IPDTJxm3/xikvf7qvwiRJksaiy1WW6wDPBOYCay6633dVvaXXyiRJkkaiy5DlF5gsc3EWcHu/5UiSJI1Pl0C2bVXt2XslkiRJI9XlKsvvJHlo75VIkiSNVJcesscCL0ryCyZDlgGqqh7Wa2WSJEkj0SWQPbX3KiRJkkZsqYEsyUZVtQC4aQbrkSRJGp3peshOBPZmcnVlMRmqXKSA+/VYlyRJ0mgsNZBV1d7teYeZK0eSJGl8lnmVZZJvdGmTJEnSipluDtm6wL2AzZNsyu+HLDcCtpmB2iRJkkZhujlkLwFeCWzNZB7ZokC2APhAz3VJkiSNxnRzyN4LvDfJy6vq/TNYkyRJ0qgscx2yqnp/kocAOwHrTmn/WJ+FSZIkjcUyA1mSNwGPZxLITmOyUOy3AQOZJEnSStDlXpbPAp4IXFVVBwMPBzbutSpJkqQR6RLIflNVC4E7kmwEXANs129ZkiRJ49HlXpbzkmwCfITJ1ZY3A9/ttSpJkqQRmTaQJQlwVFXdAHwoyVeAjarqvBmpTpIkaQSmDWRVVUlOAx7a9i+ZiaIkSZLGpMscsrOTPKr3SiRJkkaqyxyyRwMHJLkUuIXJiv1VVQ/rtTJJkqSR6BLIntJ7FZIkSSPWZaX+S2eiEEmSpLHqModMkiRJPTKQSZIkDcxAJkmSNLBlBrIkuyX5YZKbk/w2yZ1JFsxEcZIkSWPQpYfsA8DzgZ8D6wEvBj7YZ1GSJElj0mnIsqrmA3Oq6s6q+ndgz37LkiRJGo8u65DdmmRt4Nwk7wCuxLlnkiRJK02XYHVgO+4wJiv1bwc8s8+iJEmSxmR5Foa9DXhzv+VIkiSNj0OPkiRJAzOQSZIkDWy5AlmSNZJs1FcxkiRJY9RlYdgTk2yUZH3gx8CFSf5v/6VJkiSNQ5cesp2qagGwP/BlYAcmV15KkiRpJegSyNZKshaTQHZKVf0OqH7LkiRJGo8ugezDwCXA+sCZSe4LeC9LSZKklaTLOmTvA943penSJE/oryRJkqRx6TKpf8skxyX5ctvfCTio98okSZJGosuQ5UeBrwJbt/2fAa/sqyBJkqSx6XJz8c2r6tNJXgdQVXckubPnuqSVbu4Rpw5dQm8uOXqvoUuQJN0DXXrIbkmyGe3KyiS7ATf2WpUkSdKIdOkhexVwCnD/JP8NbAE8q9eqJEmSRqTLVZZnJ/lz4EFAgJ+2tcgkSZK0EiwzkCWZAzwNmNuOf3ISqupdPdcmSZI0Cl2GLL8I3AacDyzstxxJkqTx6RLItq2qh/VeiSRJ0kh1ucryy0me3HslkiRJI9Wlh+x7wH8mWQP4HZOJ/VVVG/VamSRJ0kh0CWTvAnYHzq+q6rkeSZKk0ekyZHkZ8OPlDWNJtktyepILk1yQ5PDWfu8kX0vy8/a8aWtPkvclmZ/kvCSPXP6vI0mStPrp0kN2MXBGu7n47YsaOyx7cQfw6raO2YbAWUm+BrwI+EZVHZ3kCOAI4LXAU4Ed2+PRwL+2Z0mSpFmtSw/ZL4BvAGsDG055TKuqrqyqs9v2TcBFwDbAfsAJ7bATgP3b9n7Ax2rie8AmSbZaju8iSZK0WuqyUv+b7+mHJJkLPAL4PrBlVV3ZXroK2LJtb8NkeHSRy1vblVPaSHIocCjA9ttvf09LkyRJGtxSA1mS91TVK5N8kXZj8amqat8uH5BkA+CzwCurakGSqeeoJMs1N62qjgWOBdhll128yECSJK32push+3h7fueKnjzJWkzC2H9U1eda89VJtqqqK9uQ5DWt/Qpguylv37a1SZIkzWpLnUNWVWe1zZ2r6ltTH8DOyzpxJl1hxwEXLXYBwCnAQW37IOALU9pf2K623A24ccrQpiRJ0qzVZVL/QUtoe1GH9z0GOBDYI8m57fE04GjgSUl+DvxF2wc4jckVnfOBjwB/2+EzJEmSVnvTzSF7PvCXwA5JTpny0obAdcs6cVV9m8mq/kvyxCUcX8DLlnVeSZKk2Wa6OWTfYXKF4+bAMVPabwLO67MoSZKkMVlqIKuqS4FLmdw2SZIkST3pModMkiRJPTKQSZIkDWypgSzJN9rz22euHEmSpPGZblL/Vkn+FNg3yadY7IrJRfeplCRJ0j0zXSB7I/AGJivmv2ux1wrYo6+iJEmSxmS6qyxPBk5O8oaqeusM1iRJkjQq0/WQAVBVb02yL/C41nRGVX2p37IkSZLGY5lXWSY5CjgcuLA9Dk/yz30XJkmSNBbL7CED9mJyg/GFAElOAM4B/qHPwiRJ0rDmHnHq0CX06pKj9xq6hLt0XYdskynbG/dRiCRJ0lh16SE7CjgnyelMlr54HHBEr1VJkiSNSJdJ/Z9McgbwqNb02qq6qteqJEmSRqRLDxlVdSVwSs+1SJIkjZL3spQkSRqYgUySJGlg0wayJHOS/GSmipEkSRqjaQNZVd0J/DTJ9jNUjyRJ0uh0mdS/KXBBkh8AtyxqrKp9e6tKkiRpRLoEsjf0XoUkSdKIdVmH7FtJ7gvsWFVfT3IvYE7/pUmSJI1Dl5uL/zVwMvDh1rQN8Pk+i5IkSRqTLstevAx4DLAAoKp+DvxRn0VJkiSNSZdAdntV/XbRTpI1geqvJEmSpHHpEsi+leQfgPWSPAn4DPDFfsuSJEkajy6B7AjgWuB84CXAacDr+yxKkiRpTLpcZbkwyQnA95kMVf60qhyylCRJWkmWGciS7AV8CPgfIMAOSV5SVV/uuzhJkqQx6LIw7DHAE6pqPkCS+wOnAgYySZKklaDLHLKbFoWx5mLgpp7qkSRJGp2l9pAleUbbnJfkNODTTOaQPRv44QzUJkmSNArTDVnuM2X7auDP2/a1wHq9VSRJkjQySw1kVXXwTBYiSZI0Vl2ustwBeDkwd+rxVbVvf2VJkiSNR5erLD8PHMdkdf6F/ZYjSZI0Pl0C2W1V9b7eK5EkSRqpLoHsvUneBPwXcPuixqo6u7eqJEmSRqRLIHsocCCwB78fsqy2L0mSpHuoSyB7NnC/qvpt38VIkiSNUZeV+n8MbNJ3IZIkSWPVpYdsE+AnSX7I3eeQueyFJEnSStAlkL2p9yokSZJGbJmBrKq+NROFSJIkjVWXlfpvYnJVJcDawFrALVW1UZ+FSZIkjUWXHrINF20nCbAfsFufRUmSJI1Jl6ss71ITnwee0lM9kiRJo9NlyPIZU3bXAHYBbuutIkmSpJHpcpXlPlO27wAuYTJsKUmSpJWgyxyyg2eiEEmSpLFaaiBL8sZp3ldV9dYe6pEkSRqd6XrIbllC2/rAIcBmgIFMkiRpJVhqIKuqYxZtJ9kQOBw4GPgUcMzS3idJkqTlM+0csiT3Bl4FHACcADyyqq6ficJWRXOPOHXoEnp1ydF7DV2CJEmjNN0csn8BngEcCzy0qm6esaokSZJGZLqFYV8NbA28HvhlkgXtcVOSBTNTniRJ0uw33Ryy5VrFX5IkSSvG0CVJkjSw3gJZkuOTXJPkx1Pa7p3ka0l+3p43be1J8r4k85Ocl+SRfdUlSZK0qumzh+yjwJ6LtR0BfKOqdgS+0fYBngrs2B6HAv/aY12SJEmrlN4CWVWdCVy3WPN+TJbPoD3vP6X9YzXxPWCTJFv1VZskSdKqZKbnkG1ZVVe27auALdv2NsBlU467vLX9gSSHJpmXZN61117bX6WSJEkzZLBJ/VVVQK3A+46tql2qapctttiih8okSZJm1kwHsqsXDUW252ta+xXAdlOO27a1SZIkzXozHchOAQ5q2wcBX5jS/sJ2teVuwI1ThjYlSZJmtWnvZXlPJPkk8Hhg8ySXA28CjgY+neQQ4FLgOe3w04CnAfOBW5ncxFySJGkUegtkVfX8pbz0xCUcW8DL+qpFkiRpVeZK/ZIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDWyVCmRJ9kzy0yTzkxwxdD2SJEkzYZUJZEnmAB8EngrsBDw/yU7DViVJktS/VSaQAbsC86vq4qr6LfApYL+Ba5IkSerdqhTItgEum7J/eWuTJEma1VJVQ9cAQJJnAXtW1Yvb/oHAo6vqsMWOOxQ4tO0+CPjpjBY6szYHfjV0EVoh/narN3+/1Zu/3+prtv92962qLZb0wpozXck0rgC2m7K/bWu7m6o6Fjh2pooaUpJ5VbXL0HVo+fnbrd78/VZv/n6rrzH/dqvSkOUPgR2T7JBkbeB5wCkD1yRJktS7VaaHrKruSHIY8FVgDnB8VV0wcFmSJEm9W2UCGUBVnQacNnQdq5BRDM3OUv52qzd/v9Wbv9/qa7S/3SozqV+SJGmsVqU5ZJIkSaNkIFsFJTk+yTVJfjx0LVo+SbZLcnqSC5NckOTwoWtSd0nWTfKDJD9qv9+bh65JyyfJnCTnJPnS0LVo+SS5JMn5Sc5NMm/oemaaQ5aroCSPA24GPlZVDxm6HnWXZCtgq6o6O8mGwFnA/lV14cClqYMkAdavqpuTrAV8Gzi8qr43cGnqKMmrgF2Ajapq76HrUXdJLgF2qarZvA7ZUtlDtgqqqjOB64auQ8uvqq6sqrPb9k3ARXjHidVGTdzcdtdqD/+vdTWRZFtgL+Dfhq5FWl4GMqknSeYCjwC+P2wlWh5tyOtc4Brga1Xl77f6eA/wGmDh0IVohRTwX0nOanflGRUDmdSDJBsAnwVeWVULhq5H3VXVnVW1M5O7heyaxGkDq4EkewPXVNVZQ9eiFfbYqnok8FTgZW36zmgYyKSVrM09+izwH1X1uaHr0YqpqhuA04E9h65FnTwG2OOosncAAAKqSURBVLfNQ/oUsEeSTwxbkpZHVV3Rnq8B/hPYddiKZpaBTFqJ2qTw44CLqupdQ9ej5ZNkiySbtO31gCcBPxm2KnVRVa+rqm2rai6TW+99s6peMHBZ6ijJ+u1CKJKsDzwZGNVKAwayVVCSTwLfBR6U5PIkhwxdkzp7DHAgk/87P7c9njZ0UepsK+D0JOcxub/u16rK5ROk/m0JfDvJj4AfAKdW1VcGrmlGueyFJEnSwOwhkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUzSrJTkzrbsyI+TfHHR+mLTHL/z1CVKkuyb5Ij+K5Ukl72QNEslubmqNmjbJwA/q6p/mub4FwG7VNVhM1SiJN1lzaELkKQZ8F3gYQBJdgXeC6wL/AY4GPgF8BZgvSSPBY4C1qMFtCQfBRYAuwD3AV5TVScnWQP4ALAHcBnwO+D4qjp5Br+bpFnAIUtJs1qSOcATgVNa00+AP6uqRwBvBP65qn7btk+qqp2r6qQlnGor4LHA3sDRre0ZwFxgJyZ3aNi9r+8haXazh0zSbLVeknOBbYCLgK+19o2BE5LsCBSwVsfzfb6qFgIXJtmytT0W+ExrvyrJ6SuvfEljYg+ZpNnqN1W1M3BfIMDLWvtbgdOr6iHAPkyGLru4fcp2VlqVkoSBTNIsV1W3Aq8AXp1kTSY9ZFe0l1805dCbgA2X8/T/DTwzyRqt1+zx96xaSWNlIJM061XVOcB5wPOBdwBHJTmHu0/bOB3YqS2V8dyOp/4scDlwIfAJ4GzgxpVWuKTRcNkLSboHkmxQVTcn2Qz4AfCYqrpq6LokrV6c1C9J98yX2qKzawNvNYxJWhH2kEmSJA3MOWSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDez/A+qW9N7WwgC7AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 1352\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Fantasy . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Star Kid (1997) 5.000000\n", "E.T. the Extra-Terrestrial (1982) 3.833333\n", "Heavenly Creatures (1994) 3.671429\n", "20,000 Leagues Under the Sea (1954) 3.500000\n", "Jumanji (1995) 3.312500\n", "Mask, The (1994) 3.193798\n", "Dragonheart (1996) 3.082278\n", "Warriors of Virtue (1997) 3.000000\n", "FairyTale: A True Story (1997) 2.966667\n", "Escape to Witch Mountain (1975) 2.966667\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Fantasy genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 E.T. the Extra-Terrestrial (1982) 300\n", "1 Nutty Professor, The (1996) 163\n", "2 Dragonheart (1996) 158\n", "3 Mask, The (1994) 129\n", "4 Jumanji (1995) 96\n", "5 Space Jam (1996) 93\n", "6 20,000 Leagues Under the Sea (1954) 72\n", "7 Heavenly Creatures (1994) 70\n", "8 Flubber (1997) 53\n", "9 Indian in the Cupboard, The (1995) 39\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 1.5 with atleast 0 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "1 E.T. the Extra-Terrestrial (1982) 3.833333 300\n", "2 Heavenly Creatures (1994) 3.671429 70\n", "3 20,000 Leagues Under the Sea (1954) 3.500000 72\n", "4 Jumanji (1995) 3.312500 96\n", "5 Mask, The (1994) 3.193798 129\n", "6 Dragonheart (1996) 3.082278 158\n", "10 Nutty Professor, The (1996) 2.914110 163\n", "12 Space Jam (1996) 2.774194 93\n", "13 Flubber (1997) 2.754717 53\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Film-Noir ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAGDCAYAAACFuAwbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de7ilZV3/8feHg4KcBoEQGXBIyaJMpBE1zRR/KQiCmccUkTA6iGHZz8g8kFpihQrZZVKQg4ZAWDoGWoQgP/M4HAQFVEImGDmMHGY4CAh8f3+se8tinNnz7D177Wf2Xu/Xda1rPc+9nsN37cV1zYf7uZ/7SVUhSZKk/mzSdwGSJEnjzkAmSZLUMwOZJElSzwxkkiRJPTOQSZIk9cxAJkmS1DMDmaQZk+SjSd4zS+f69STXJbkzyVNGdI7PJjlsRMf+vSQ3tfp3GMU5JM0dBjJpHklybZIftn/kb0tydpLd+q5rbZJUkidswCH+BjiqqrauqktmoJ5jk3x8uK2qDqiqJRt67LWca3Pg/cDzW/23zPQ5JM0tBjJp/nlRVW0N7ALcBPztdA6SZLMZrWrmPQ74VpcNN8LvsjOwBeuofyOsV9KIGcikeaqq7gHOAvaaaEtyYJJLkqxul/uOHfpsUeu1OiLJ/wKfX/OYSZ6T5Pokb03yg9Yj9+p11ZDkt5NcneTWJEuTPLa1X9g2+UbrzXvFWvbdJMnbkixPcnOSU5Nsl+SRSe4ENm37/886zl1J3pDku8B3W9sJ7XuvTnJRkl9p7fsDbwVe0er5Rmu/IMnr2/Lrknwxyd+03sfvJTlg6Hx7JLkwyR1J/ivJ363Z49a2+xng22319iSfn6Teg5JcmuT2JF9K8otDx3lKkovb+c5IcvrE5eKJWtfy93hCW35k+x7/2y6b/n2SLdf4jd/c/u43JDl86DhbJjm+/S6r2t9ky9Yb+8Y1znlZkl9f2+8j6eEMZNI8leRRwCuArww13wW8FlgAHAj8XpIXr7HrrwI/B7xgHYd+DLAjsCtwGHBSkieu5fz7Ae8FXs6gt245cDpAVT27bfbkdsnujLWc53Xt9Vzgp4GtgQ9V1b2tB3Bi/8evo06AFwNP46FQ+nVgb+DRwGnAvyTZoqo+B/wlcEar58nrON7TGISpHYG/Ak5OkvbZacDXgB2AY4FD13aAqvoO8PNtdUFV7be2ejMYF3cK8DvtmB8BlrYw9QjgU8DH2nf5F+A3Jvk7rOk44Gfa3+IJDH7Ldwx9/hhgu9Z+BPB3SbZvn/0N8EvAL7dzvwV4EFgCvGbiAEme3PY/ewp1SWPLQCbNP59KcjuwCvg14K8nPqiqC6rq8qp6sKouAz7BIIANO7aq7qqqH05yjre3YPQFBv/gvnwt27waOKWqLq6qe4E/BZ6RZFHH7/Fq4P1VdU1V3dn2f+UUL+e9t6punfguVfXxqrqlqu6vquOBRwI/ESYnsbyq/qGqHmAQQHYBdk6yO/BU4B1VdV9VfRFYOoXjrq3eI4GPVNVXq+qBNpbtXuDp7bU58MGq+lFVncUgbK5XC5BHAn/YznUHgzD6yqHNfgS8qx37HOBO4IlJNgF+Czi6qla0ur7Uft+lwM8k2bMd41AGAfe+afwdpLFjIJPmnxdX1QIGY5SOAr6Q5DEASZ6W5PwkK5OsAn6XQW/PsOvWc/zbququofXlwGPXst1j22cAtFB1C4Neky4etn9b3ozB+KuuHvZdkvxxkivbpbbbGfQCrfn9J3PjxEJV3d0Wt2613jrU9hPnnka9jwPe3C5X3t7q3a2d67HAiqqqoe2H/1aT2Ql4FHDR0HE/19on3FJV9w+t383ge+7I4L+rn7hM3C6RnwG8pgW3VzHowZPUgYFMmqda78W/Ag8Az2rNpzHoyditqrYD/h7Imruu59DbJ9lqaH134Ptr2e77DEIFAG2fHYAVHb/Cw/Zv57mfwY0KXf34u7TxYm9h0Ju3fQutq3jo+6/ve0/mBuDR7TLxhOnc3Tpcw3XAX1TVgqHXo6rqE+18uw5dLoXB32fCXQxCFwATgbz5AfBD4OeHjrvd0GXgyfwAuAdY12XiJQx6Np8H3F1VX+5wTEkYyKR5KwOHANsDV7bmbRj05NyTZF/gN6d5+D9P8ogWcg5iMIZpTZ8ADk+yd5JHMrgs9tWqurZ9fhODsWHr8gngD9tg+a15aIzX/ZPsM5ltGAS6lcBmSd4BbDv0+U3Aota7MyVVtRxYBhzb/i7PAF40zTon/APwu61XM0m2yuCmjG2AL7fv8gdJNk/yEmDfoX2/Afx8+9tvwWBM20StD7ZjfyDJTwEk2TXJusYMDn/PBxmMa3t/kscm2TTJM9rvSwtgDwLHY++YNCUGMmn++UwGdyGuBv4COKyqJqZX+H3gXUnuYDCI+8xpHP9G4DYGPVj/DPxuVV215kZV9V/A24FPMujReTwPH6d0LLCkXTZb2xi0Uxj8o34h8D0GPTNvXMt2Xf0Hg0tz32Fwee8eHn6JcCJU3pLk4mkc/9XAMxhcln0Pg8t390632KpaBvw28CEGf++rGdzkQBuX9ZK2fiuDmzf+dWjf7wDvAv6LwR2bD7vjEviTdryvJFndtus6lu6PgcsZjFm7FXgfD/+35FTgScBP3GEqad3y8CEIkrRuSZ4DfLyqFvZdy8YuyRnAVVX1zlk630eB66vqbbNxvknqeC1wZFU9a70bS/oxe8gkaQYkeWqSx2cwf9r+wCEMpqYYG20M3e8DJ/VdizTXGMgkaWY8BriAwRQRJwK/NxOPdJor2hi0lQzG4p3WcznSnOMlS0mSpJ7ZQyZJktQzA5kkSVLPpvIIko3OjjvuWIsWLeq7DEmSpPW66KKLflBVO63tszkdyBYtWsSyZcv6LkOSJGm9kqzzEWdespQkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSerZZn0XIEma3xYdc3bfJYzUtccd2HcJmgfsIZMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnIw1kSRYkOSvJVUmuTPKMJI9Ocm6S77b37du2SXJikquTXJZkn1HWJkmStLEYdQ/ZCcDnqupngScDVwLHAOdV1Z7AeW0d4ABgz/Y6EvjwiGuTJEnaKIwskCXZDng2cDJAVd1XVbcDhwBL2mZLgBe35UOAU2vgK8CCJLuMqj5JkqSNxSh7yPYAVgL/lOSSJP+YZCtg56q6oW1zI7BzW94VuG5o/+tb28MkOTLJsiTLVq5cOcLyJUmSZscoA9lmwD7Ah6vqKcBdPHR5EoCqKqCmctCqOqmqFlfV4p122mnGipUkSerLKAPZ9cD1VfXVtn4Wg4B208SlyPZ+c/t8BbDb0P4LW5skSdK8NrJAVlU3AtcleWJreh5wBbAUOKy1HQZ8ui0vBV7b7rZ8OrBq6NKmJEnSvLXZiI//RuCfkzwCuAY4nEEIPDPJEcBy4OVt23OAFwJXA3e3bSVJkua9kQayqroUWLyWj563lm0LeMMo65EkSdoYOVO/JElSzwxkkiRJPTOQSZIk9cxAJkmS1DMDmSRJUs8MZJIkST0zkEmSJPXMQCZJktQzA5kkSVLPDGSSJEk9M5BJkiT1zEAmSZLUMwOZJElSzzbruwBJkrRxWnTM2X2XMFLXHndg3yX8mD1kkiRJPTOQSZIk9cxAJkmS1DMDmSRJUs8MZJIkST0zkEmSJPXMQCZJktQzA5kkSVLPDGSSJEk9M5BJkiT1rNOjk5LsCjxuePuqunBURUmSJI2T9QayJO8DXgFcATzQmgswkEmSJM2ALj1kLwaeWFX3jroYSZKkcdRlDNk1wOajLkSSJGlcdekhuxu4NMl5wI97yarqD0ZWlSRJ0hjpEsiWtpckSZJGYL2BrKqWJNkS2L2qvj0LNUmSJI2V9Y4hS/Ii4FLgc2197yT2mEmSJM2QLoP6jwX2BW4HqKpLgZ8eYU2SJEljpUsg+1FVrVqj7cFRFCNJkjSOugzq/1aS3wQ2TbIn8AfAl0ZbliRJ0vjo0kP2RuDnGUx5cRqwCnjTKIuSJEkaJ116yH62qv4M+LNRFyNJkjSOuvSQHZ/kyiTvTvILUzl4kmuTXJ7k0iTLWtujk5yb5LvtffvWniQnJrk6yWVJ9pnG95EkSZpz1hvIquq5wHOBlcBHWsB62xTO8dyq2ruqFrf1Y4DzqmpP4Ly2DnAAsGd7HQl8eArnkCRJmrO69JBRVTdW1YnA7zKYk+wdG3DOQ4AlbXkJg4eXT7SfWgNfARYk2WUDziNJkjQndJkY9ueSHJvkcuBvGdxhubDj8Qv4zyQXJTmyte1cVTe05RuBndvyrsB1Q/te39okSZLmtS6D+k8BzgBeUFXfn+Lxn1VVK5L8FHBukquGP6yqSlJTOWALdkcC7L777lMsR5IkaePT5VmWz5juwatqRXu/Ocm/MZjx/6Yku1TVDe2S5M1t8xXAbkO7L2xtax7zJOAkgMWLF08pzEmSJG2M1nnJMsmZ7f3ydtfjxOvyJJet78BJtkqyzcQy8Hzgm8BS4LC22WHAp9vyUuC17W7LpwOrhi5tSpIkzVuT9ZAd3d4Pmuaxdwb+LcnEeU6rqs8l+TpwZpIjgOXAy9v25wAvBK4G7gYOn+Z5JUmS5pR1BrKJ3qmqWj6dA1fVNcCT19J+C/C8tbQX8IbpnEuSJGkuW+8YsiR3MLhbctgqYBnw5ha8JEmSNE1d7rL8IIMpKE4DArwSeDxwMYM7MJ8zquIkSZLGQZeJYQ+uqo9U1R1Vtbrd5fiCqjoD2H7E9UmSJM17XQLZ3UlenmST9no5cE/7zGknJEmSNlCXQPZq4FAG84Xd1JZfk2RL4KgR1iZJkjQWukwMew3wonV8/MWZLUeSJGn8dHq4uCRJkkbHQCZJktQzA5kkSVLP1hvIkhydZNv2jMmTk1yc5PmzUZwkSdI46NJD9ltVtZrBw8G3Z3CX5XEjrUqSJGmMdAlkae8vBD5WVd8aapMkSdIG6hLILkrynwwC2X8k2QZ4cLRlSZIkjY8uz7I8AtgbuKaq7k6yA3D4aMuSJEkaH10mhn0wyfeAn0myxSzUJEmSNFbWG8iSvB44GlgIXAo8HfgysN9oS5MkSRoPXcaQHQ08FVheVc8FngLcPtKqJEmSxkiXQHZPVd0DkOSRVXUV8MTRliVJkjQ+ugzqvz7JAuBTwLlJbgOWj7YsSZKk8dFlUP+vt8Vjk5wPbAd8bqRVSZIkjZEug/rfDVwIfKmqvjD6kiRJksZLlzFk1wCvApYl+VqS45McMuK6JEmSxsZ6A1lV/VNV/RbwXODjwMvauyRJkmZAl0uW/wjsBdwE/D/gpcDFI65LkiRpbHS5ZLkDsCmDucduBX5QVfePtCpJkqQx0vkuyyQ/B7wAOD/JplW1cNTFSZIkjYMulywPAn4FeDawAPg8g0uXkiRJmgFdJobdn0EAO6Gqvj/ieiRJksZOl0uWR81GIZIkSeOqy6B+SZIkjZCBTJIkqWcGMkmSpJ51ucvycqDWaF4FLAPeU1W3jKIwSZKkcdHlLsvPAg8Ap7X1VwKPAm4EPgq8aCSVSZIkjYkugez/VNU+Q+uXJ7m4qvZJ8ppRFSZJkjQuuowh2zTJvhMrSZ7K4FFKAD5CSZIkaQN16SF7PXBKkq2BAKuB1yfZCnjvKIuTJEkaB10mhv068KQk27X1VUMfnzmqwiRJksZFl7ssHwn8BrAI2CwJAFX1ri4nSLIpgzsyV1TVQUn2AE4HdgAuAg6tqvvaeU4Ffgm4BXhFVV071S8kSZI013QZQ/Zp4BAG48XuGnp1dTRw5dD6+4APVNUTgNuAI1r7EcBtrf0DbTtJkqR5r8sYsoVVtf90Dp5kIXAg8BfAH2XQvbYf8JttkyXAscCHGYS+Y1v7WcCHkqSq1pwDTZIkaV7p0kP2pSRPmubxPwi8BXiwre8A3F5VE3dnXg/s2pZ3Ba4DaJ+vattLkiTNa10C2bOAi5J8O8llSS5Pctn6dkpyEHBzVV20wVU+/LhHJlmWZNnKlStn8tCSJEm96HLJ8oBpHvuZwMFJXghsAWwLnAAsSLJZ6wVbCKxo268AdgOuT7IZsB2Dwf0PU1UnAScBLF682MuZkiRpzltnD1mSbdviHet4Taqq/rSqFlbVIgaPW/p8Vb0aOB94advsMAY3DQAsbeu0zz/v+DFJkjQOJushOw04iMHUFMVgUtgJBfz0NM/5J8DpSd4DXAKc3NpPBj6W5GrgVgYhTpIkad5bZyCrqoPa+x4bepKqugC4oC1fA+y7lm3uAV62oeeSJEmaa9Y7qD/JeV3aJEmSND3r7CFLsgXwKGDHJNvz0CXLbXloqgpJkiRtoMnGkP0O8CbgsQzGkU0EstXAh0ZclyRJ0tiYbAzZCcAJSd5YVX87izVJkiSNlfXOQ1ZVf5vkF4C9GMwnNtF+6igLkyRJGhfrDWRJ3gk8h0EgO4fBRLFfBAxkkiRJM6DLo5NeCjwPuLGqDgeezGAWfUmSJM2ALoHsh1X1IHB/m73/ZgaPOJIkSdIM6PIsy2VJFgD/wOBuyzuBL4+0KkmSpDEyaSBLEuC9VXU78PdJPgdsW1WXzUp1kiRJY2DSQFZVleQc4Elt/drZKEqShi065uy+Sxipa487sO8SJPWsyxiyi5M8deSVSJIkjakuY8ieBrw6yXLgLgYz9ldV/eJIK5MkSRoTXQLZC0ZehSRJ0hjrMlP/8tkoRJIkaVx1GUMmSZKkETKQSZIk9cxAJkmS1LP1BrIkT0/y9SR3JrkvyQNJVs9GcZIkSeOgSw/Zh4BXAd8FtgReD/zdKIuSJEkaJ50uWVbV1cCmVfVAVf0TsP9oy5IkSRofXeYhuzvJI4BLk/wVcAOOPZMkSZoxXYLVoW27oxjM1L8b8BujLEqSJGmcTGVi2HuAPx9tOZIkSePHS4+SJEk9M5BJkiT1bEqBLMkmSbYdVTGSJEnjqMvEsKcl2TbJVsA3gSuS/N/RlyZJkjQeuvSQ7VVVq4EXA58F9mBw56UkSZJmQJdAtnmSzRkEsqVV9SOgRluWJEnS+OgSyD4CXAtsBVyY5HGAz7KUJEmaIV3mITsROHGoaXmS546uJEmSpPHSZVD/zklOTvLZtr4XcNjIK5MkSRoTXS5ZfhT4D+Cxbf07wJtGVZAkSdK46RLIdqyqM4EHAarqfuCBkVYlSZI0RroEsruS7EC7szLJ04FVI61KkiRpjKx3UD/wR8BS4PFJ/hvYCXjpSKuSJEkaI13usrw4ya8CTwQCfLvNRSZJkqQZsN5AlmRT4IXAorb985NQVe9fz35bABcCj2z7nVVV70yyB3A6sANwEXBoVd2X5JHAqcAvAbcAr6iqa6f7xSRJkuaKLmPIPgO8jkGA2mbotT73AvtV1ZOBvYH92/iz9wEfqKonALcBR7TtjwBua+0faNtJkiTNe13GkC2sql+c6oGrqoA72+rm7VXAfsBvtvYlwLHAh4FD2jLAWcCHkqQdR5Ikad7q0kP22STPn87Bk2ya5FLgZuBc4H+A29vUGQDXA7u25V2B6+DHU2usYtArt+Yxj0yyLMmylStXTqcsSZKkjUqXQPYV4N+S/DDJ6iR3JOn0LMuqeqCq9gYWAvsCP7sBtU4c86SqWlxVi3faaacNPZwkSVLvugSy9wPPAB5VVdtW1TZVte1UTlJVtwPnt+MsSDJxqXQhsKItrwB2A2ifb8dgcL8kSdK81iWQXQd8c6pjuZLslGRBW94S+DXgSgbBbGIes8OAT7flpTz0jMyXAp93/JgkSRoHXQb1XwNc0B4ufu9E4/qmvQB2AZa0aTM2Ac6sqn9PcgVwepL3AJcAJ7ftTwY+luRq4FbglVP7KpIkSXNTl0D2vfZ6RHt1UlWXAU9ZS/s1DMaTrdl+D/CyrseXJEmaL7rM1P/ns1GIJEnSuFpnIEvywap6U5LP0B4sPqyqDh5pZZIkSWNish6yj7X3v5mNQiRJksbVOgNZVV3UFveuqhOGP0tyNPCFURYmSZI0LrpMe3HYWtpeN8N1SJIkja3JxpC9isEzJ/dIsnToo20YTEshSZKkGTDZGLIvATcAOwLHD7XfAVw2yqIkSZLGyWRjyJYDyxk87kiSJEkj0mUMmSRJkkbIQCZJktSzdQayJOe19/fNXjmSJEnjZ7JB/bsk+WXg4CSnAxn+sKouHmllkiRJY2KyQPYO4O3AQuD9a3xWwH6jKkqSJGmcTHaX5VnAWUneXlXvnsWaJEmSxspkPWQAVNW7kxwMPLs1XVBV/z7asiRJksbHeu+yTPJe4GjgivY6OslfjrowSZKkcbHeHjLgQAYPGH8QIMkS4BLgraMsTJIkaVx0nYdswdDydqMoRJIkaVx16SF7L3BJkvMZTH3xbOCYkVYlSZI0RroM6v9EkguAp7amP6mqG0dalSRJ0hjp0kNGVd0ALB1xLZIkSWPJZ1lKkiT1zEAmSZLUs0kDWZJNk1w1W8VIkiSNo0kDWVU9AHw7ye6zVI8kSdLY6TKof3vgW0m+Btw10VhVB4+sKkmSpDHSJZC9feRVSJIkjbEu85B9IcnjgD2r6r+SPArYdPSlSZIkjYcuDxf/beAs4COtaVfgU6MsSpIkaZx0mfbiDcAzgdUAVfVd4KdGWZQkSdI46RLI7q2q+yZWkmwG1OhKkiRJGi9dAtkXkrwV2DLJrwH/AnxmtGVJkiSNjy6B7BhgJXA58DvAOcDbRlmUJEnSOOlyl+WDSZYAX2VwqfLbVeUlS0mSpBmy3kCW5EDg74H/AQLskeR3quqzoy5OkiRpHHSZGPZ44LlVdTVAkscDZwMGMkmSpBnQZQzZHRNhrLkGuGNE9UiSJI2ddfaQJXlJW1yW5BzgTAZjyF4GfH0WapMkSRoLk/WQvai9tgBuAn4VeA6DOy63XN+Bk+yW5PwkVyT5VpKjW/ujk5yb5LvtffvWniQnJrk6yWVJ9tnA7yZJkjQnrLOHrKoO38Bj3w+8uaouTrINcFGSc4HXAedV1XFJjmEwrcafAAcAe7bX04APt3dJkqR5rctdlnsAbwQWDW9fVQdPtl9V3QDc0JbvSHIlg+dgHsKgpw1gCXABg0B2CHBqm1LjK0kWJNmlHUeSJGne6nKX5aeAkxnMzv/gdE6SZBHwFAZzme08FLJuBHZuy7sC1w3tdn1re1ggS3IkcCTA7rvvPp1yJEmSNipdAtk9VXXidE+QZGvgk8Cbqmp1kh9/VlWVZEqTzFbVScBJAIsXL3aCWkmSNOd1CWQnJHkn8J/AvRONVXXx+nZMsjmDMPbPVfWvrfmmiUuRSXYBbm7tK4DdhnZf2NokSZLmtS6B7EnAocB+PHTJstr6OmXQFXYycGVVvX/oo6XAYcBx7f3TQ+1HJTmdwWD+VY4fkyRJ46BLIHsZ8NNVdd8Uj/1MBkHu8iSXtra3MghiZyY5AlgOvLx9dg7wQuBq4G5gQ+/ylCRJmhO6BLJvAgt46NJiJ1X1RQbPvlyb561l+wLeMJVzSJIkzQddAtkC4KokX+fhY8gmnfZCkiRJ3XQJZO8ceRWSJEljbL2BrKq+MBuFSJIkjasuM/XfweCuSoBHAJsDd1XVtqMsTJIkaVx06SHbZmK5TWVxCPD0URYlSZI0TjaZysY18CngBSOqR5Ikaex0uWT5kqHVTYDFwD0jq0iSJGnMdLnL8kVDy/cD1zK4bClJkqQZ0GUMmTPmS5IkjdA6A1mSd0yyX1XVu0dQjyRJ0tiZrIfsrrW0bQUcAewAGMgkSZJmwDoDWVUdP7GcZBvgaAYP/D4dOH5d+0mSJGlqJh1DluTRwB8BrwaWAPtU1W2zUZgkSdK4mGwM2V8DLwFOAp5UVXfOWlWSJEljZLKJYd8MPBZ4G/D9JKvb644kq2enPEmSpPlvsjFkU5rFX5IkSdNj6JIkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcjC2RJTklyc5JvDrU9Osm5Sb7b3rdv7UlyYpKrk1yWZJ9R1SVJkrSxGWUP2UeB/ddoOwY4r6r2BM5r6wAHAHu215HAh0dYlyRJ0kZlZIGsqi4Ebl2j+RBgSVteArx4qP3UGvgKsCDJLqOqTZIkaWMy22PIdq6qG9ryjcDObXlX4Lqh7a5vbT8hyZFJliVZtnLlytFVKkmSNEs26+vEVVVJahr7nQScBLB48eIp76/xteiYs/suYWSuPe7AvkuQJG2A2e4hu2niUmR7v7m1rwB2G9puYWuTJEma92Y7kC0FDmvLhwGfHmp/bbvb8unAqqFLm5IkSfPayC5ZJvkE8BxgxyTXA+8EjgPOTHIEsBx4edv8HOCFwNXA3cDho6pLkiRpYzOyQFZVr1rHR89by7YFvGFUtUiSJG3MnKlfkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJkqSeGcgkSZJ6ZiCTJEnqmYFMkiSpZwYySZKknhnIJEmSemYgkyRJ6pmBTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSerZZn0XMJcsOubsvksYqWuPO7DvEiRJGkv2kEmSJPXMQCZJktQzA5kkSVLPDGSSJEk9M5BJkiT1zEAmSZLUMwOZJElSzwxkkiRJPTOQSZIk9cxAJkmS1DMDmSRJUs8MZJIkST0zkEmSJPXMQCZJktQzA5kkSVLPDGSSJEk926gCWZL9k3w7ydVJjum7HkmSpNmw0QSyJJsCfyntpCEAAAULSURBVAccAOwFvCrJXv1WJUmSNHobTSAD9gWurqprquo+4HTgkJ5rkiRJGrmNKZDtClw3tH59a5MkSZrXUlV91wBAkpcC+1fV69v6ocDTquqoNbY7EjiyrT4R+PasFjq7dgR+0HcRmhZ/u7nN329u8/ebu+b7b/e4qtppbR9sNtuVTGIFsNvQ+sLW9jBVdRJw0mwV1acky6pqcd91aOr87eY2f7+5zd9v7hrn325jumT5dWDPJHskeQTwSmBpzzVJkiSN3EbTQ1ZV9yc5CvgPYFPglKr6Vs9lSZIkjdxGE8gAquoc4Jy+69iIjMWl2XnK325u8/eb2/z95q6x/e02mkH9kiRJ42pjGkMmSZI0lgxkG6EkpyS5Ock3+65FU5NktyTnJ7kiybeSHN13TeouyRZJvpbkG+33+/O+a9LUJNk0ySVJ/r3vWjQ1Sa5NcnmSS5Ms67ue2eYly41QkmcDdwKnVtUv9F2PukuyC7BLVV2cZBvgIuDFVXVFz6WpgyQBtqqqO5NsDnwROLqqvtJzaeooyR8Bi4Ftq+qgvutRd0muBRZX1Xyeh2yd7CHbCFXVhcCtfdehqauqG6rq4rZ8B3AlPnFizqiBO9vq5u3l/7XOEUkWAgcC/9h3LdJUGcikEUmyCHgK8NV+K9FUtEtelwI3A+dWlb/f3PFB4C3Ag30Xomkp4D+TXNSeyjNWDGTSCCTZGvgk8KaqWt13Pequqh6oqr0ZPC1k3yQOG5gDkhwE3FxVF/Vdi6btWVW1D3AA8IY2fGdsGMikGdbGHn0S+Oeq+te+69H0VNXtwPnA/n3Xok6eCRzcxiGdDuyX5OP9lqSpqKoV7f1m4N+AffutaHYZyKQZ1AaFnwxcWVXv77seTU2SnZIsaMtbAr8GXNVvVeqiqv60qhZW1SIGj977fFW9puey1FGSrdqNUCTZCng+MFYzDRjINkJJPgF8GXhikuuTHNF3TersmcChDP7v/NL2emHfRamzXYDzk1zG4Pm651aV0ydIo7cz8MUk3wC+BpxdVZ/ruaZZ5bQXkiRJPbOHTJIkqWcGMkmSpJ4ZyCRJknpmIJMkSeqZgUySJKlnBjJJ81KSB9q0I99M8pmJ+cUm2X7v4SlKkhyc5JjRVypJTnshaZ5KcmdVbd2WlwDfqaq/mGT71wGLq+qoWSpRkn5ss74LkKRZ8GXgFwGS7AucAGwB/BA4HPge8C5gyyTPAt4LbEkLaEk+CqwGFgOPAd5SVWcl2QT4ELAfcB3wI+CUqjprFr+bpHnAS5aS5rUkmwLPA5a2pquAX6mqpwDvAP6yqu5ry2dU1d5VdcZaDrUL8CzgIOC41vYSYBGwF4MnNDxjVN9D0vxmD5mk+WrLJJcCuwJXAue29u2AJUn2BArYvOPxPlVVDwJXJNm5tT0L+JfWfmOS82eufEnjxB4ySfPVD6tqb+BxQIA3tPZ3A+dX1S8AL2Jw6bKLe4eWM2NVShIGMknzXFXdDfwB8OYkmzHoIVvRPn7d0KZ3ANtM8fD/DfxGkk1ar9lzNqxaSePKQCZp3quqS4DLgFcBfwW8N8klPHzYxvnAXm2qjFd0PPQngeuBK4CPAxcDq2ascEljw2kvJGkDJNm6qu5MsgPwNeCZVXVj33VJmlsc1C9JG+bf26SzjwDebRiTNB32kEmSJPXMMWSSJEk9M5BJkiT1zEAmSZLUMwOZJElSzwxkkiRJPTOQSZIk9ez/A9FC3bjZC4DlAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 1733\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Film-Noir . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Manchurian Candidate, The (1962) 4.259542\n", "Crossfire (1947) 4.250000\n", "Maltese Falcon, The (1941) 4.210145\n", "Sunset Blvd. (1950) 4.200000\n", "L.A. Confidential (1997) 4.161616\n", "Blade Runner (1982) 4.138182\n", "Chinatown (1974) 4.136054\n", "Notorious (1946) 4.115385\n", "Laura (1944) 4.100000\n", "Big Sleep, The (1946) 4.027397\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Film-Noir genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 L.A. Confidential (1997) 297\n", "1 Blade Runner (1982) 275\n", "2 Chinatown (1974) 147\n", "3 Maltese Falcon, The (1941) 138\n", "4 Manchurian Candidate, The (1962) 131\n", "5 Grifters, The (1990) 89\n", "6 Cape Fear (1962) 86\n", "7 Mulholland Falls (1996) 82\n", "8 Big Sleep, The (1946) 73\n", "9 Hoodlum (1997) 73\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 2.0 with atleast 50 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Manchurian Candidate, The (1962) 4.259542 131\n", "2 Maltese Falcon, The (1941) 4.210145 138\n", "3 Sunset Blvd. (1950) 4.200000 65\n", "4 L.A. Confidential (1997) 4.161616 297\n", "5 Blade Runner (1982) 4.138182 275\n", "6 Chinatown (1974) 4.136054 147\n", "7 Notorious (1946) 4.115385 52\n", "9 Big Sleep, The (1946) 4.027397 73\n", "14 Cape Fear (1962) 3.523256 86\n", "16 Grifters, The (1990) 3.483146 89\n", "17 Devil in a Blue Dress (1995) 3.385965 57\n", "19 Hoodlum (1997) 2.931507 73\n", "20 Mulholland Falls (1996) 2.878049 82\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Horror ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 5317\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Horror . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Psycho (1960) 4.100418\n", "Alien (1979) 4.034364\n", "Young Frankenstein (1974) 3.945000\n", "Braindead (1992) 3.857143\n", "Shining, The (1980) 3.825243\n", "Birds, The (1963) 3.808642\n", "Jaws (1975) 3.775000\n", "Night Flier (1997) 3.714286\n", "Bride of Frankenstein (1935) 3.608696\n", "Nosferatu (Nosferatu, eine Symphonie des Grauen... 3.555556\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Horror genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Scream (1996) 478\n", "1 Alien (1979) 291\n", "2 Jaws (1975) 280\n", "3 Psycho (1960) 239\n", "4 Shining, The (1980) 206\n", "5 Young Frankenstein (1974) 200\n", "6 Devil's Advocate, The (1997) 188\n", "7 Birds, The (1963) 162\n", "8 Interview with the Vampire (1994) 137\n", "9 Alien: Resurrection (1997) 124\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 2.5 with atleast 100 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Psycho (1960) 4.100418 239\n", "1 Alien (1979) 4.034364 291\n", "2 Young Frankenstein (1974) 3.945000 200\n", "4 Shining, The (1980) 3.825243 206\n", "5 Birds, The (1963) 3.808642 162\n", "6 Jaws (1975) 3.775000 280\n", "12 Devil's Advocate, The (1997) 3.515957 188\n", "13 Carrie (1976) 3.504132 121\n", "15 Scream (1996) 3.441423 478\n", "16 Army of Darkness (1993) 3.431034 116\n", "21 Frighteners, The (1996) 3.234783 115\n", "22 Scream 2 (1997) 3.216981 106\n", "24 Interview with the Vampire (1994) 3.182482 137\n", "25 Nightmare on Elm Street, A (1984) 3.171171 111\n", "26 Bram Stoker's Dracula (1992) 3.158333 120\n", "28 Craft, The (1996) 3.115385 104\n", "29 Alien: Resurrection (1997) 3.096774 124\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Musical ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 4954\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Musical . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Wizard of Oz, The (1939) 4.077236\n", "Top Hat (1935) 4.047619\n", "Damsel in Distress, A (1937) 4.000000\n", "Singin' in the Rain (1952) 3.992701\n", "This Is Spinal Tap (1984) 3.905759\n", "Gay Divorcee, The (1934) 3.866667\n", "Blues Brothers, The (1980) 3.836653\n", "My Fair Lady (1964) 3.816000\n", "Aladdin (1992) 3.812785\n", "Beauty and the Beast (1991) 3.792079\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Musical genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Evita (1996) 259\n", "1 Blues Brothers, The (1980) 251\n", "2 Wizard of Oz, The (1939) 246\n", "3 Sound of Music, The (1965) 222\n", "4 Lion King, The (1994) 220\n", "5 Aladdin (1992) 219\n", "6 Beauty and the Beast (1991) 202\n", "7 This Is Spinal Tap (1984) 191\n", "8 Mary Poppins (1964) 178\n", "9 Fantasia (1940) 174\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.0 with atleast 150 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Wizard of Oz, The (1939) 4.077236 246\n", "4 This Is Spinal Tap (1984) 3.905759 191\n", "6 Blues Brothers, The (1980) 3.836653 251\n", "8 Aladdin (1992) 3.812785 219\n", "9 Beauty and the Beast (1991) 3.792079 202\n", "10 Lion King, The (1994) 3.781818 220\n", "11 Fantasia (1940) 3.770115 174\n", "12 Sound of Music, The (1965) 3.765766 222\n", "14 Mary Poppins (1964) 3.724719 178\n", "16 Snow White and the Seven Dwarfs (1937) 3.709302 172\n", "35 Grease (1978) 3.347059 170\n", "38 Everyone Says I Love You (1996) 3.273810 168\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Mystery ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 5245\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Mystery . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Rear Window (1954) 4.387560\n", "Third Man, The (1949) 4.333333\n", "Vertigo (1958) 4.251397\n", "Maltese Falcon, The (1941) 4.210145\n", "Amadeus (1984) 4.163043\n", "L.A. Confidential (1997) 4.161616\n", "Thin Man, The (1934) 4.150000\n", "Chinatown (1974) 4.136054\n", "Laura (1944) 4.100000\n", "Arsenic and Old Lace (1944) 4.078261\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Mystery genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Mission: Impossible (1996) 344\n", "1 L.A. Confidential (1997) 297\n", "2 Conspiracy Theory (1997) 295\n", "3 Amadeus (1984) 276\n", "4 2001: A Space Odyssey (1968) 259\n", "5 Game, The (1997) 251\n", "6 Murder at 1600 (1997) 218\n", "7 Rear Window (1954) 209\n", "8 Devil's Advocate, The (1997) 188\n", "9 Lone Star (1996) 187\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.0 with atleast 150 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Rear Window (1954) 4.387560 209\n", "2 Vertigo (1958) 4.251397 179\n", "4 Amadeus (1984) 4.163043 276\n", "5 L.A. Confidential (1997) 4.161616 297\n", "10 Lone Star (1996) 4.053476 187\n", "14 2001: A Space Odyssey (1968) 3.969112 259\n", "23 Game, The (1997) 3.593625 251\n", "27 Devil's Advocate, The (1997) 3.515957 188\n", "28 Conspiracy Theory (1997) 3.423729 295\n", "31 Cop Land (1997) 3.377143 175\n", "36 Mission: Impossible (1996) 3.313953 344\n", "43 Murder at 1600 (1997) 3.087156 218\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Romance ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAGDCAYAAACbcTyoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de7hddX3n8feHmyK3cMkgBjCo1BarIhNBR2sVRi6iQK2i1kuk2NgOWpzaseioIGjFTr2gdqy0UKNWAbFqVJSmiDqOooSLICCSIgwgl2i4IyjwnT/278BOzDlZOc0+Z52c9+t59rPX+u11+e6zeZ58+P3Wb61UFZIkSeqfjaa7AEmSJK2ZQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJmnkknwiybun6Fx/kOS6JHcledqIzvG1JAtHdOw/S3Jzq3/7UZxD0sxhUJNmgSTXJPll+8f/1iRfTbLLdNe1JkkqyRP+A4f4W+ANVbVlVV20Huo5Lsmnh9uq6qCqWvwfPfYazrUp8AFg/1b/L9b3OSTNLAY1afZ4UVVtCewE3Ax8ZDIHSbLJeq1q/XsscFmXDXv4XXYEHsk49fewXkkjZlCTZpmquhc4E9hjrC3JwUkuSnJHGzY8buiz+a2X68gk/w/4xurHTPLcJNcneVuSn7cevFeOV0OSP0myPMnKJEuSPKa1f7tt8sPW+/eyNey7UZK3J7k2yS1JPplkmySPSHIXsHHb/9/HOXclOSrJVcBVre2k9r3vSHJBkt9r7QcCbwNe1ur5YWv/ZpLXteXXJvlOkr9tvZU/TXLQ0Pl2S/LtJHcm+bckf7d6D13b7reAK9vqbUm+MUG9L0xycZLbknw3yVOGjvO0JBe2852e5LSxYeexWtfw93hCW35E+x7/rw2//n2SzVf7jd/c/u43Jjli6DibJ3l/+11ub3+TzVvv7RtXO+clSf5gTb+PpFUZ1KRZJsmjgJcB5w013w28BpgDHAz8WZLDVtv194HfAQ4Y59CPBnYA5gELgZOTPHEN598XeC9wOIPevWuB0wCq6jlts6e2ob/T13Ce17bX84DHAVsCH62q+1qP4dj+jx+nToDDgH14OKyeD+wJbAd8BvhckkdW1deBvwZOb/U8dZzj7cMgZO0A/A1wSpK0zz4D/ADYHjgOePWaDlBVPwGe1FbnVNW+a6o3g+vuTgVe3475cWBJC1mbAV8EPtW+y+eAP5zg77C6E4Hfan+LJzD4Ld859PmjgW1a+5HA3yXZtn32t8B/Bv5LO/dbgAeBxcCrxg6Q5Klt/6+uQ13SrGVQk2aPLya5DbgdeD7wv8Y+qKpvVtWlVfVgVV0CfJZBMBt2XFXdXVW/nOAc72iB6VsM/iE+fA3bvBI4taourKr7gLcCz0wyv+P3eCXwgaq6uqruavu/fB2HBd9bVSvHvktVfbqqflFV91fV+4FHAL8RMidwbVX9Q1U9wCCY7ATsmGRX4OnAO6vqV1X1HWDJOhx3TfUuAj5eVd+vqgfatXL3Ac9or02BD1XVr6vqTAYhdK1asFwE/Pd2rjsZhNSXD232a+D4duyzgLuAJybZCPhj4OiquqHV9d32+y4BfivJ7u0Yr2YQfH81ib+DNOsY1KTZ47CqmsPgGqg3AN9K8miAJPskOTfJiiS3A3/KoHdo2HVrOf6tVXX30Pq1wGPWsN1j2mcAtLD1Cwa9LF2ssn9b3oTB9V1drfJdkvxlkivakN1tDHqNVv/+E7lpbKGq7mmLW7ZaVw61/ca5J1HvY4E3t2HP21q9u7RzPQa4oapqaPvhv9VE5gKPAi4YOu7XW/uYX1TV/UPr9zD4njsw+O/qN4ab21D76cCrWqB7BYMeP0kdGNSkWab1dvwL8ADw7Nb8GQY9H7tU1TbA3wNZfde1HHrbJFsMre8K/GwN2/2MQdgAoO2zPXBDx6+wyv7tPPczmCDR1UPfpV2P9hYGvX/btjB7Ow9//7V974ncCGzXhpvHTGa27XAN1wHvqao5Q69HVdVn2/nmDQ27wuDvM+ZuBmEMgLGg3vwc+CXwpKHjbjM0nDyRnwP3AuMNNy9m0BO6H3BPVX2vwzElYVCTZp0MHApsC1zRmrdi0PNzb5K9gT+a5OHflWSzFn5eyOAaqdV9FjgiyZ5JHsFgeO37VXVN+/xmBteejeezwH9vF+lvycPXkN0/wT4T2YpB0FsBbJLkncDWQ5/fDMxvvUHrpKquBZYBx7W/yzOBF02yzjH/APxp6wVNki0ymAyyFfC99l3+PMmmSV4M7D207w+BJ7W//SMZXDM3VuuD7dgfTPKfAJLMSzLeNYnD3/NBBtfNfSDJY5JsnOSZ7felBbMHgfdjb5q0Tgxq0uzx5QxmRd4BvAdYWFVjt4H4b8DxSe5kcPH4GZM4/k3ArQx6vP4Z+NOq+vHqG1XVvwHvAD7PoAfo8ax6HdRxwOI2/Lama9xOZfCP/beBnzLoyXnjGrbr6mwGQ3w/YTBMeC+rDjWOhc1fJLlwEsd/JfBMBsO772YwDHjfZIutqmXAnwAfZfD3Xs5gcgXtuq8Xt/WVDCaN/MvQvj8Bjgf+jcEM0lVmgAJ/1Y53XpI72nZdr9X7S+BSBtfErQTex6r/xnwSeDLwGzNeJY0vq17KIEnrLslzgU9X1c7TXUvfJTkd+HFVHTtF5/sEcH1VvX0qzjdBHa8BFlXVs9e6saSH2KMmSSOU5OlJHp/B/d8OBA5lcAuNWaNdo/ffgJOnuxZppjGoSdJoPRr4JoNbWXwY+LP18WirmaJd47aCwbV+n5nmcqQZx6FPSZKknrJHTZIkqacMapIkST21Lo9cmTF22GGHmj9//nSXIUmStFYXXHDBz6tq7po+2yCD2vz581m2bNl0lyFJkrRWScZ91JtDn5IkST1lUJMkSeopg5okSVJPGdQkSZJ6amRBLckTk1w89LojyZuSbJdkaZKr2vu2bfsk+XCS5UkuSbLX0LEWtu2vSrJwVDVLkiT1yciCWlVdWVV7VtWewH8G7gG+ABwDnFNVuwPntHWAg4Dd22sR8DGAJNsBxwL7AHsDx46FO0mSpA3ZVA197gf8e1Vdy+CBxItb+2LgsLZ8KPDJGjgPmJNkJ+AAYGlVrayqW4GlwIFTVLckSdK0maqg9nLgs215x6q6sS3fBOzYlucB1w3tc31rG69dkiRpgzbyoJZkM+AQ4HOrf1aDJ8Kvl6fCJ1mUZFmSZStWrFgfh5QkSZpWU9GjdhBwYVXd3NZvbkOatPdbWvsNwC5D++3c2sZrX0VVnVxVC6pqwdy5a3wKgyRJ0owyFUHtFTw87AmwBBibubkQ+NJQ+2va7M9nALe3IdKzgf2TbNsmEezf2iRJkjZoI33WZ5ItgOcDrx9qPhE4I8mRwLXA4a39LOAFwHIGM0SPAKiqlUlOAM5v2x1fVStHWbckSVIfZHCZ2IZlwYIF5UPZJUnSTJDkgqpasKbPRtqjJknSeOYf89XpLmGkrjnx4OkuQRsAHyElSZLUUwY1SZKknjKoSZIk9ZRBTZIkqacMapIkST1lUJMkSeopg5okSVJPGdQkSZJ6yqAmSZLUUwY1SZKknjKoSZIk9ZRBTZIkqacMapIkST1lUJMkSeopg5okSVJPGdQkSZJ6yqAmSZLUUwY1SZKknjKoSZIk9ZRBTZIkqacMapIkST1lUJMkSeopg5okSVJPGdQkSZJ6yqAmSZLUUwY1SZKknjKoSZIk9ZRBTZIkqacMapIkST1lUJMkSeopg5okSVJPGdQkSZJ6yqAmSZLUUwY1SZKknjKoSZIk9ZRBTZIkqadGGtSSzElyZpIfJ7kiyTOTbJdkaZKr2vu2bdsk+XCS5UkuSbLX0HEWtu2vSrJwlDVLkiT1xah71E4Cvl5Vvw08FbgCOAY4p6p2B85p6wAHAbu31yLgYwBJtgOOBfYB9gaOHQt3kiRJG7KRBbUk2wDPAU4BqKpfVdVtwKHA4rbZYuCwtnwo8MkaOA+Yk2Qn4ABgaVWtrKpbgaXAgaOqW5IkqS9G2aO2G7AC+KckFyX5xyRbADtW1Y1tm5uAHdvyPOC6of2vb23jta8iyaIky5IsW7FixXr+KpIkSVNvlEFtE2Av4GNV9TTgbh4e5gSgqgqo9XGyqjq5qhZU1YK5c+euj0NKkiRNq1EGteuB66vq+239TAbB7eY2pEl7v6V9fgOwy9D+O7e28dolSZI2aCMLalV1E3Bdkie2pv2Ay4ElwNjMzYXAl9ryEuA1bfbnM4Db2xDp2cD+SbZtkwj2b22SJEkbtE1GfPw3Av+cZDPgauAIBuHwjCRHAtcCh7dtzwJeACwH7mnbUlUrk5wAnN+2O76qVo64bkmSpGk30qBWVRcDC9bw0X5r2LaAo8Y5zqnAqeu3OkmSpH7zyQSSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ7apMtGSeYBjx3evqq+PaqiJEmS1CGoJXkf8DLgcuCB1lyAQU2SJGmEuvSoHQY8saruG3UxkiRJeliXa9SuBjYddSGSJElaVZcetXuAi5OcAzzUq1ZVfz6yqiRJktQpqC1pL0mSJE2htQa1qlqcZHNg16q6cgpqkiRJEh2uUUvyIuBi4Ottfc8k9rBJkiSNWJfJBMcBewO3AVTVxcDjRliTJEmS6BbUfl1Vt6/W9uAoipEkSdLDukwmuCzJHwEbJ9kd+HPgu6MtS5IkSV161N4IPInBrTk+A9wOvGmURUmSJKlbj9pvV9X/BP7nqIuRJEnSw7r0qL0/yRVJTkjyuyOvSJIkSUCHoFZVzwOeB6wAPp7k0iRvH3llkiRJs1yXHjWq6qaq+jDwpwzuqfbOkVYlSZKkTje8/Z0kxyW5FPgIgxmfO4+8MkmSpFmuy2SCU4HTgQOq6mcjrkeSJElNl2d9PnMqCpEkSdKqxg1qSc6oqsPbkGcNfwRUVT1l5NVJkiTNYhP1qB3d3l84FYVIkiRpVeMGtaq6sb1fO3XlSJIkacxar1FLcierDn3C4DFSy4A3V9XVE+x7DXAn8ABwf1UtSLIdg8kJ84FrgMOr6tYkAU4CXgDcA7y2qi5sx1kIjN277d1VtbjrF5S04Zp/zFenu4SRuubEg6e7BEnTrMt91D4E/A9gHoPbcvwlg2d+nsZgRujaPK+q9qyqBW39GOCcqtodOKetAxwE7N5ei4CPAbRgdyywD7A3cGySbTucV5IkaUbrEtQOqaqPV9WdVXVHVZ3M4FYdpwOTCUyHAmM9YouBw4baP1kD5wFzkuwEHAAsraqVVXUrsBQ4cBLnlSRJmlG6BLV7khyeZKP2Ohy4t322+pDo6gr41yQXJFnU2nYcu/4NuAnYsS3PA64b2vf61jZe+yqSLEqyLMmyFStWdPhakiRJ/dYlqL0SeDVwC3BzW35Vks2BN6xl32dX1V4MhjWPSvKc4Q+rqlh72Oukqk6uqgVVtWDu3Lnr45CSJEnTqssNb68GXjTOx99Zy743tPdbknyBwTVmNyfZqapubEObt7TNbwB2Gdp959Z2A/Dc1dq/uba6JUmSZrpOD2WfjCRbJNlqbBnYH/gRsARY2DZbCHypLS8BXpOBZwC3tyHSs4H9k2zbJhHs39okSZI2aF2e9TlZOwJfGNx1g02Az1TV15OcD5yR5EjgWuDwtv1ZDG7NsZzB7TmOAKiqlUlOAM5v2x1fVStHWLckSVIvjCyotSHTp66h/RfAfmtoL+CocY51Kt1uBSJJkrTBWOvQZ5Kjk2zdhiRPSXJhkv2nojhJkqTZrMs1an9cVXcwuDZsWwazPk8caVWSJEnqFNTS3l8AfKqqLhtqkyRJ0oh0CWoXJPlXBkHt7DaT88HRliVJkqQukwmOBPYErq6qe5JsT5uRKUmSpNHpcsPbB5P8FPitJI+cgpokSZJEh6CW5HXA0QyeCHAx8Azge8C+oy1NkiRpdutyjdrRwNOBa6vqecDTgNtGWpUkSZI6BbV7q+pegCSPqKofA08cbVmSJEnqMpng+iRzgC8CS5PcyuDRT5IkSRqhLpMJ/qAtHpfkXGAb4OsjrUqSJEmdJhOcAHwb+G5VfWv0JUmSJAm6XaN2NfAKYFmSHyR5f5JDR1yXJEnSrLfWoFZV/1RVfww8D/g08NL2LkmSpBHqMvT5j8AewM3A/wFeAlw44rokSVKPzT/mq9Ndwshcc+LB013CQ7oMfW4PbMzg3mkrgZ9X1f0jrUqSJEndZ30m+R3gAODcJBtX1c6jLk6SJGk26zL0+ULg94DnAHOAbzAYApUkSdIIdbnh7YEMgtlJVfWzEdcjSZKkpsvQ5xumohBJkiStqstkAkmSJE0Dg5okSVJPGdQkSZJ6qsusz0uBWq35dmAZ8O6q+sUoCpMkSZrtusz6/BrwAPCZtv5y4FHATcAngBeNpDJJkqRZrktQ+69VtdfQ+qVJLqyqvZK8alSFSZIkzXZdrlHbOMneYytJns7gkVIAPkpKkiRpRLr0qL0OODXJlkCAO4DXJdkCeO8oi5MkSZrNutzw9nzgyUm2aeu3D318xqgKkyRJmu26zPp8BPCHwHxgkyQAVNXxI61MkiRplusy9PklBrfjuAC4b7TlSJIkaUyXoLZzVR048kokSZK0ii6zPr+b5Mkjr0SSJEmr6NKj9mzgtUl+ymDoM0BV1VNGWpkkSdIs1yWoHTTyKiRJkvQbxg1qSbauqjuAO6ewHkmSJDUTXaM29mzPCxg8gP2CodeyridIsnGSi5J8pa3vluT7SZYnOT3JZq39EW19eft8/tAx3trar0xywDp9Q0mSpBlq3KBWVS9s77tV1ePa+9jrcetwjqOBK4bW3wd8sKqeANwKHNnajwRube0fbNuRZA8GD4J/EnAg8L+TbIwkSdIGbq2zPpOc06VtnH13Bg4G/rGtB9gXOLNtshg4rC0f2tZpn+/Xtj8UOK2q7quqnwLLgYeePSpJkrShmugatUcCjwJ2SLItg9meAFsD8zoe/0PAW4Ct2vr2wG1VNfYw9+uHjjUPuA6gqu5Pcnvbfh5w3tAxh/cZrncRsAhg11137VieJElSf03Uo/Z6Btej/TarXp/2JeCjaztwkhcCt1TVBeuhzrWqqpOrakFVLZg7d+5UnFKSJGmkxu1Rq6qTgJOSvLGqPjKJYz8LOCTJC4BHMuiJOwmYk2ST1qu2M3BD2/4GYBfg+iSbANsAvxhqHzO8jyRJ0gZrrdeoVdVHkvxuksOTvGbs1WG/t1bVzlU1n8FkgG9U1SuBc4GXtM0WMuihA1jS1mmff6OqqrW/vM0K3Q3YHfjBOnxHSZKkGWmtN7xNcizwXGAP4CwGN8D9DvDJSZ7zr4DTkrwbuAg4pbWfAnwqyXJgJYNwR1VdluQM4HLgfuCoqnpgkueWJEmaMbo8meAlwFOBi6rqiCQ7Ap9el5NU1TeBb7blq1nDrM2quhd46Tj7vwd4z7qcU5Ikaabr8lD2X1bVg8D9SbYGbmHVa8YkSZI0Al161JYlmQP8A4NZn3cB3xtpVZIkSZo4qLUbzr63qm4D/j7J14Gtq+qSKalOkiRpFpswqFVVJTkLeHJbv2YqipIkSVK3a9QuTPL0kVciSZKkVXS5Rm0f4JVJrgXuZvAoqaqqp4y0MkmSpFmuS1A7YORVSJIk6TesNahV1bVTUYgkSZJW1eUaNUmSJE0Dg5okSVJPGdQkSZJ6aq1BLckzkpyf5K4kv0ryQJI7pqI4SZKk2axLj9pHgVcAVwGbA68D/m6URUmSJKnj0GdVLQc2rqoHquqfgANHW5YkSZK63EftniSbARcn+RvgRry2TZIkaeS6BK5Xt+3ewODJBLsAfzjKoiRJkrRuN7y9F3jXaMuRJEnSGIcwJUmSesqgJkmS1FPrFNSSbJRk61EVI0mSpId1ueHtZ5JsnWQL4EfA5Un+x+hLkyRJmt269KjtUVV3AIcBXwN2YzATVJIkSSPUJahtmmRTBkFtSVX9GqjRliVJkqQuQe3jwDXAFsC3kzwW8FmfkiRJI9blPmofBj481HRtkueNriRJkiRBt8kEOyY5JcnX2voewMKRVyZJkjTLdRn6/ARwNvCYtv4T4E2jKkiSJEkDXYLaDlV1BvAgQFXdDzww0qokSZLUKajdnWR72kzPJM8Abh9pVZIkSVr7ZALgL4AlwOOT/F9gLvCSkVYlSZKkTrM+L0zy+8ATgQBXtnupSZIkaYTWGtSSbAy8AJjftt8/CVX1gRHXJkmSNKt1Gfr8MnAvcCltQoEkSZJGr0tQ27mqnjLySiRJkrSKLrM+v5Zk/5FXIkmSpFV06VE7D/hCko2AXzOYUFBVtfVIK5MkSZrluvSofQB4JvCoqtq6qrbqEtKSPDLJD5L8MMllSd7V2ndL8v0ky5OcnmSz1v6Itr68fT5/6Fhvbe1XJjlgUt9UkiRphukS1K4DflRVtY7Hvg/Yt6qeCuwJHNhulvs+4INV9QTgVuDItv2RwK2t/YNtu7Fni74ceBJwIPC/20xUSZKkDVqXoHY18M3Wq/UXY6+17VQDd7XVTdurgH2BM1v7YuCwtnxoW6d9vl+StPbTquq+qvopsBzYu0PdkiRJM1qXoPZT4BxgM2CroddaJdk4ycXALcBS4N+B29rzQgGuB+a15XkMeu/Gnid6O7D9cPsa9hk+16Iky5IsW7FiRZfyJEmSeq3LkwneNdmDV9UDwJ5J5gBfAH57ssfqcK6TgZMBFixYsK7DtJIkSb0zblBL8qGqelOSL9MeyD6sqg7pepKqui3JuQwmJcxJsknrNdsZuKFtdgOwC3B9kk2AbYBfDLWPGd5HkiRpgzVRj9qn2vvfTubASeYCv24hbXPg+QwmCJzL4KHupwELgS+1XZa09e+1z79RVZVkCfCZJB8AHgPsDvxgMjVJkiTNJOMGtaq6oC3uWVUnDX+W5GjgW2s59k7A4jZDcyPgjKr6SpLLgdOSvBu4CDilbX8K8Kkky4GVDGZ6UlWXJTkDuBy4HziqDalKkiRt0Lrc8HYhcNJqba9dQ9sqquoS4GlraL+aNczarKp7gZeOc6z3AO/pUKskSdIGY6Jr1F4B/BGwWxt+HLMVgx4vSZIkjdBEPWrfBW4EdgDeP9R+J3DJKIuSJEnSxNeoXQtcy2CmpiRJkqZYlxveSpIkaRoY1CRJknpq3KCW5Jz2/r6pK0eSJEljJppMsFOS/wIckuQ0IMMfVtWFI61MkiRplpsoqL0TeAeDRzZ9YLXPCth3VEVJkiRp4lmfZwJnJnlHVZ0whTVJkiSJDk8mqKoTkhwCPKc1fbOqvjLasiRJkrTWWZ9J3gsczeBZm5cDRyf561EXJkmSNNt1edbnwQwezP4gQJLFDB6m/rZRFiZJkjTbdb2P2pyh5W1GUYgkSZJW1aVH7b3ARUnOZXCLjucAx4y0KkmSJHWaTPDZJN8Ent6a/qqqbhppVZIkSerUo0ZV3QgsGXEtkiRJGuKzPiVJknrKoCZJktRTEwa1JBsn+fFUFSNJkqSHTRjUquoB4Moku05RPZIkSWq6TCbYFrgsyQ+Au8caq+qQkVUlSZKkTkHtHSOvQpIkSb+hy33UvpXkscDuVfVvSR4FbDz60iRJkma3Lg9l/xPgTODjrWke8MVRFiVJkqRut+c4CngWcAdAVV0F/KdRFiVJkqRuQe2+qvrV2EqSTYAaXUmSJEmCbkHtW0neBmye5PnA54Avj7YsSZIkdQlqxwArgEuB1wNnAW8fZVGSJEnqNuvzwSSLge8zGPK8sqoc+pQkSRqxtQa1JAcDfw/8OxBgtySvr6qvjbo4SZKk2azLDW/fDzyvqpYDJHk88FXAoCZJkjRCXa5Ru3MspDVXA3eOqB5JkiQ14/aoJXlxW1yW5CzgDAbXqL0UOH8KapMkSZrVJhr6fNHQ8s3A77flFcDmI6tIkiRJwARBraqOmMpCJEmStKousz53A94IzB/evqoOGV1ZkiRJ6jKZ4IvANcBHGMwAHXtNKMkuSc5NcnmSy5Ic3dq3S7I0yVXtfdvWniQfTrI8ySVJ9ho61sK2/VVJFk7ie0qSJM04XW7PcW9VfXgSx74feHNVXZhkK+CCJEuB1wLnVNWJSY5h8OSDvwIOAnZvr32AjwH7JNkOOBZYwGAywwVJllTVrZOoSZIkacbo0qN2UpJjkzwzyV5jr7XtVFU3VtWFbflO4ApgHnAosLhtthg4rC0fCnyyBs4D5iTZCTgAWFpVK1s4WwocuC5fUpIkaSbq0qP2ZODVwL7Ag62t2nonSeYDT2PwGKodq+rG9tFNwI5teR5w3dBu17e28dql9WL+MV+d7hJG6poTD57uEiRJk9QlqL0UeFxV/WoyJ0iyJfB54E1VdUeShz6rqkqyXp4bmmQRsAhg1113XR+HlCRJmlZdhj5/BMyZzMGTbMogpP1zVf1La765DWnS3m9p7TcAuwztvnNrG699FVV1clUtqKoFc+fOnUy5kiRJvdIlqM0Bfpzk7CRLxl5r2ymDrrNTgCuq6gNDHy0BxmZuLgS+NNT+mjb78xnA7W2I9Gxg/yTbthmi+7c2SZKkDVqXoc9jJ3nsZzG4tu3SJBe3trcBJwJnJDkSuBY4vH12FvACYDlwD3AEQFWtTHICDz+26viqWjnJmiRJkmaMtQa1qvrWZA5cVd8BMs7H+61h+wKOGudYpwKnTqYOSZKkmarLkwnuZDDLE2AzYFPg7qraepSFSZIkzXZdetS2Gltu150dCjxjlEVJkiSp22SCh7Sb0X6RwU1oJUmSNEJdhj5fPLS6EYNHOd07sookSZIEdJv1+aKh5fsZPKD90JFUI0mSpId0uUbtiKkoRJIkSasaN6gleecE+1VVnTCCeiRJktRM1KN29xratgCOBLYHDGqSJEkjNG5Qq6r3jy0n2Qo4msHTAk4D3j/efpIkSVo/JrxGLcl2wF8ArwQWA3tV1a1TUZgkSdJsN9E1av8LeDFwMvDkqrpryqqSJEnShDe8fTPwGODtwM+S3NFedya5Y2rKkyRJmr0mukZtnZ5aIEmSpPXLMCZJktRTBgsHL7gAAAgmSURBVDVJkqSeMqhJkiT1lEFNkiSppwxqkiRJPWVQkyRJ6imDmiRJUk8Z1CRJknrKoCZJktRTBjVJkqSeMqhJkiT1lEFNkiSppwxqkiRJPWVQkyRJ6imDmiRJUk8Z1CRJknrKoCZJktRTBjVJkqSeMqhJkiT1lEFNkiSppwxqkiRJPWVQkyRJ6imDmiRJUk+NLKglOTXJLUl+NNS2XZKlSa5q79u29iT5cJLlSS5JstfQPgvb9lclWTiqeiVJkvpmlD1qnwAOXK3tGOCcqtodOKetAxwE7N5ei4CPwSDYAccC+wB7A8eOhTtJkqQN3ciCWlV9G1i5WvOhwOK2vBg4bKj9kzVwHjAnyU7AAcDSqlpZVbcCS/nN8CdJkrRBmupr1Hasqhvb8k3Ajm15HnDd0HbXt7bx2iVJkjZ40zaZoKoKqPV1vCSLkixLsmzFihXr67CSJEnTZqqD2s1tSJP2fktrvwHYZWi7nVvbeO2/oapOrqoFVbVg7ty5671wSZKkqbbJFJ9vCbAQOLG9f2mo/Q1JTmMwceD2qroxydnAXw9NINgfeOsU17xW84/56nSXMFLXnHjwdJcgSdKsNLKgluSzwHOBHZJcz2D25onAGUmOBK4FDm+bnwW8AFgO3AMcAVBVK5OcAJzftju+qlafoCBJkrRBGllQq6pXjPPRfmvYtoCjxjnOqcCp67E0SZKkGcEnE0iSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqqRkT1JIcmOTKJMuTHDPd9UiSJI3ajAhqSTYG/g44CNgDeEWSPaa3KkmSpNGaEUEN2BtYXlVXV9WvgNOAQ6e5JkmSpJGaKUFtHnDd0Pr1rU2SJGmDlaqa7hrWKslLgAOr6nVt/dXAPlX1hqFtFgGL2uoTgSunvNCpswPw8+kuQpPm7zdz+dvNbP5+M9uG/Ps9tqrmrumDTaa6kkm6AdhlaH3n1vaQqjoZOHkqi5ouSZZV1YLprkOT4+83c/nbzWz+fjPbbP39ZsrQ5/nA7kl2S7IZ8HJgyTTXJEmSNFIzoketqu5P8gbgbGBj4NSqumyay5IkSRqpGRHUAKrqLOCs6a6jJ2bFEO8GzN9v5vK3m9n8/Wa2Wfn7zYjJBJIkSbPRTLlGTZIkadYxqM0gSU5NckuSH013LVo3SXZJcm6Sy5NcluTo6a5J3SV5ZJIfJPlh+/3eNd01ad0k2TjJRUm+Mt21aN0kuSbJpUkuTrJsuuuZag59ziBJngPcBXyyqn53uutRd0l2AnaqqguTbAVcABxWVZdPc2nqIEmALarqriSbAt8Bjq6q86a5NHWU5C+ABcDWVfXC6a5H3SW5BlhQVRvqPdQmZI/aDFJV3wZWTncdWndVdWNVXdiW7wSuwKdrzBg1cFdb3bS9/L/cGSLJzsDBwD9Ody3SujKoSVMsyXzgacD3p7cSrYs2dHYxcAuwtKr8/WaODwFvAR6c7kI0KQX8a5IL2lOIZhWDmjSFkmwJfB54U1XdMd31qLuqeqCq9mTwZJS9k3j5wQyQ5IXALVV1wXTXokl7dlXtBRwEHNUuA5o1DGrSFGnXNn0e+Oeq+pfprkeTU1W3AecCB053LerkWcAh7Tqn04B9k3x6ekvSuqiqG9r7LcAXgL2nt6KpZVCTpkC7GP0U4Iqq+sB016N1k2RukjlteXPg+cCPp7cqdVFVb62qnatqPoPHD36jql41zWWpoyRbtAlYJNkC2B+YVXc+MKjNIEk+C3wPeGKS65McOd01qbNnAa9m8H/zF7fXC6a7KHW2E3BukksYPHt4aVV5mwdp9HYEvpPkh8APgK9W1denuaYp5e05JEmSesoeNUmSpJ4yqEmSJPWUQU2SJKmnDGqSJEk9ZVCTJEnqKYOapFklyQPt9ig/SvLlsfujTbD9nsO3UklySJJjRl+pJHl7DkmzTJK7qmrLtrwY+ElVvWeC7V8LLKiqN0xRiZL0kE2muwBJmkbfA54CkGRv4CTgkcAvgSOAnwLHA5sneTbwXmBzWnBL8gngDmAB8GjgLVV1ZpKNgI8C+wLXAb8GTq2qM6fwu0naADj0KWlWSrIxsB+wpDX9GPi9qnoa8E7gr6vqV2359Kras6pOX8OhdgKeDbwQOLG1vRiYD+zB4IkUzxzV95C0YbNHTdJss3mSi4F5wBXA0ta+DbA4ye5AAZt2PN4Xq+pB4PIkO7a2ZwOfa+03JTl3/ZUvaTaxR03SbPPLqtoTeCwQ4KjWfgJwblX9LvAiBkOgXdw3tJz1VqUkYVCTNEtV1T3AnwNvTrIJgx61G9rHrx3a9E5gq3U8/P8F/jDJRq2X7bn/sWolzVYGNUmzVlVdBFwCvAL4G+C9SS5i1ctCzgX2aLf0eFnHQ38euB64HPg0cCFw+3orXNKs4e05JGkEkmxZVXcl2R74AfCsqrppuuuSNLM4mUCSRuMr7Wa6mwEnGNIkTYY9apIkST3lNWqSJEk9ZVCTJEnqKYOaJElSTxnUJEmSesqgJkmS1FMGNUmSpJ76/wGqTWQlpVKxAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 19461\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Romance . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Casablanca (1942) 4.456790\n", "Star Wars (1977) 4.358491\n", "Titanic (1997) 4.245714\n", "Empire Strikes Back, The (1980) 4.204360\n", "Affair to Remember, An (1957) 4.192308\n", "African Queen, The (1951) 4.184211\n", "Cinema Paradiso (1988) 4.173554\n", "Princess Bride, The (1987) 4.172840\n", "Notorious (1946) 4.115385\n", "Philadelphia Story, The (1940) 4.115385\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Romance genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Return of the Jedi (1983) 507\n", "2 English Patient, The (1996) 481\n", "3 Jerry Maguire (1996) 384\n", "4 Chasing Amy (1997) 379\n", "5 Empire Strikes Back, The (1980) 367\n", "6 Titanic (1997) 350\n", "7 Princess Bride, The (1987) 324\n", "8 Forrest Gump (1994) 321\n", "9 Saint, The (1997) 316\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "1 Star Wars (1977) 4.358491 583\n", "2 Titanic (1997) 4.245714 350\n", "3 Empire Strikes Back, The (1980) 4.204360 367\n", "7 Princess Bride, The (1987) 4.172840 324\n", "19 Sense and Sensibility (1995) 4.011194 268\n", "20 Return of the Jedi (1983) 4.007890 507\n", "40 When Harry Met Sally... (1989) 3.910345 290\n", "44 Forrest Gump (1994) 3.853583 321\n", "45 Chasing Amy (1997) 3.839050 379\n", "54 Groundhog Day (1993) 3.764286 280\n", "60 Jerry Maguire (1996) 3.710938 384\n", "64 Leaving Las Vegas (1995) 3.697987 298\n", "67 Four Weddings and a Funeral (1994) 3.661355 251\n", "69 English Patient, The (1996) 3.656965 481\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Sci-Fi ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 12730\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Sci-Fi . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Star Kid (1997) 5.000000\n", "Star Wars (1977) 4.358491\n", "Dr. Strangelove or: How I Learned to Stop Worry... 4.252577\n", "Empire Strikes Back, The (1980) 4.204360\n", "Blade Runner (1982) 4.138182\n", "Alien (1979) 4.034364\n", "Return of the Jedi (1983) 4.007890\n", "Terminator 2: Judgment Day (1991) 4.006780\n", "2001: A Space Odyssey (1968) 3.969112\n", "Aliens (1986) 3.947183\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Sci-Fi genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Contact (1997) 509\n", "2 Return of the Jedi (1983) 507\n", "3 Independence Day (ID4) (1996) 429\n", "4 Twelve Monkeys (1995) 392\n", "5 Empire Strikes Back, The (1980) 367\n", "6 Star Trek: First Contact (1996) 365\n", "7 Back to the Future (1985) 350\n", "8 Men in Black (1997) 303\n", "9 Terminator, The (1984) 301\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "1 Star Wars (1977) 4.358491 583\n", "3 Empire Strikes Back, The (1980) 4.204360 367\n", "4 Blade Runner (1982) 4.138182 275\n", "5 Alien (1979) 4.034364 291\n", "6 Return of the Jedi (1983) 4.007890 507\n", "7 Terminator 2: Judgment Day (1991) 4.006780 295\n", "8 2001: A Space Odyssey (1968) 3.969112 259\n", "9 Aliens (1986) 3.947183 284\n", "11 Terminator, The (1984) 3.933555 301\n", "15 Back to the Future (1985) 3.834286 350\n", "16 E.T. the Extra-Terrestrial (1982) 3.833333 300\n", "19 Contact (1997) 3.803536 509\n", "20 Twelve Monkeys (1995) 3.798469 392\n", "23 Men in Black (1997) 3.745875 303\n", "24 Jurassic Park (1993) 3.720307 261\n", "25 Star Trek: First Contact (1996) 3.660274 365\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Thriller ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 21872\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Thriller . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Close Shave, A (1995) 4.491071\n", "Rear Window (1954) 4.387560\n", "Usual Suspects, The (1995) 4.385768\n", "Third Man, The (1949) 4.333333\n", "Some Folks Call It a Sling Blade (1993) 4.292683\n", "Silence of the Lambs, The (1991) 4.289744\n", "North by Northwest (1959) 4.284916\n", "Manchurian Candidate, The (1962) 4.259542\n", "Vertigo (1958) 4.251397\n", "Innocents, The (1961) 4.250000\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Thriller genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Fargo (1996) 508\n", "1 Scream (1996) 478\n", "2 Air Force One (1997) 431\n", "3 Silence of the Lambs, The (1991) 390\n", "4 Rock, The (1996) 378\n", "5 Fugitive, The (1993) 336\n", "6 Saint, The (1997) 316\n", "7 Terminator, The (1984) 301\n", "8 L.A. Confidential (1997) 297\n", "9 Conspiracy Theory (1997) 295\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 250 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "2 Usual Suspects, The (1995) 4.385768 267\n", "5 Silence of the Lambs, The (1991) 4.289744 390\n", "11 L.A. Confidential (1997) 4.161616 297\n", "12 Fargo (1996) 4.155512 508\n", "20 Fugitive, The (1993) 4.044643 336\n", "21 Alien (1979) 4.034364 291\n", "24 Terminator 2: Judgment Day (1991) 4.006780 295\n", "34 2001: A Space Odyssey (1968) 3.969112 259\n", "36 Aliens (1986) 3.947183 284\n", "37 Terminator, The (1984) 3.933555 301\n", "39 Apollo 13 (1995) 3.931159 276\n", "54 Rock, The (1996) 3.693122 378\n", "58 Ransom (1996) 3.644195 267\n", "59 Air Force One (1997) 3.631090 431\n", "65 Game, The (1997) 3.593625 251\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: War ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 9398\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: War . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "Schindler's List (1993) 4.466443\n", "Casablanca (1942) 4.456790\n", "Star Wars (1977) 4.358491\n", "Dr. Strangelove or: How I Learned to Stop Worry... 4.252577\n", "Lawrence of Arabia (1962) 4.231214\n", "Paths of Glory (1957) 4.212121\n", "Empire Strikes Back, The (1980) 4.204360\n", "Boot, Das (1981) 4.203980\n", "African Queen, The (1951) 4.184211\n", "Bridge on the River Kwai, The (1957) 4.175758\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in War genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Star Wars (1977) 583\n", "1 Return of the Jedi (1983) 507\n", "2 English Patient, The (1996) 481\n", "3 Independence Day (ID4) (1996) 429\n", "4 Empire Strikes Back, The (1980) 367\n", "5 Forrest Gump (1994) 321\n", "6 Schindler's List (1993) 298\n", "7 Braveheart (1995) 297\n", "8 Aliens (1986) 284\n", "9 Casablanca (1942) 243\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 3.5 with atleast 200 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title rating Number of Users watched\n", "0 Schindler's List (1993) 4.466443 298\n", "1 Casablanca (1942) 4.456790 243\n", "2 Star Wars (1977) 4.358491 583\n", "6 Empire Strikes Back, The (1980) 4.204360 367\n", "7 Boot, Das (1981) 4.203980 201\n", "10 Braveheart (1995) 4.151515 297\n", "16 Apocalypse Now (1979) 4.045249 221\n", "17 Return of the Jedi (1983) 4.007890 507\n", "21 Aliens (1986) 3.947183 284\n", "22 M*A*S*H (1970) 3.912621 206\n", "24 Forrest Gump (1994) 3.853583 321\n", "32 English Patient, The (1996) 3.656965 481\n", "36 Courage Under Fire (1996) 3.610860 221\n", "**************************** ****************************** ******************************\n", " \n", " \n", "**************************** ****************************** ******************************\n", "**************************** ****** GENRE: Western ****** ******************************\n", " \n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAGDCAYAAACFuAwbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3debQlZX3v//eHSZCpETqINNiohIRERW6LcDUG4adhEohR1DggwbTJBYNX81PidUBNIuYGI8QslQRiE4OAGLUNaEIQ9OdV1GYQlEEJwoUOk0zNICjw/f1RdWDTdp+u7j516vTZ79dae+2qp2pXfffZrNUfnnrqqVQVkiRJGs56QxcgSZI07gxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmaMkk+neTPp+lcv5vkxiT3JXleT+f4SpLDezr2Hye5ta1/6z7OIWndYSCTZpEk1yf5WfuP/F1Jzkmyw9B1rUiSSvKstTjEXwNHV9VmVXXpFNRzXJLPjLZV1f5VtWhtj72Cc20IfBR4WVv/HVN9DknrFgOZNPu8vKo2A7YDbgX+dk0OkmSDKa1q6j0d+GGXHWfgd9kW2JiV1D8D65XUMwOZNEtV1YPA2cCuE21JDkxyaZJl7eW+40a2zW97rY5M8n+Bry1/zCR7J7kpybuT/LTtkXvdympI8odJrk1yZ5LFSZ7Wtn+j3eX7bW/eq1fw2fWSvCfJDUluS3Jaki2TPCnJfcD67ef/cyXnriRHJfkx8OO27cT2ey9LcnGS32rb9wPeDby6ref7bfuFSd7cLr8pyTeT/HXb+/iTJPuPnG+nJN9Icm+S/0jyd8v3uLX7/SpwTbt6d5KvTVLvQUkuS3J3km8lec7IcZ6X5JL2fGcmOWPicvFErSv4ezyrXX5S+z3+b3vZ9JNJNlnuN35H+3e/OckRI8fZJMkJ7e9yT/s32aTtjX3rcue8PMnvruj3kfREBjJplkryZODVwEUjzfcDbwTmAAcCf5zk0OU++tvArwO/s5JDPxXYBtgeOBw4OckuKzj/PsCHgcNoeutuAM4AqKoXt7s9t71kd+YKzvOm9vUS4BnAZsDHq+qhtgdw4vPPXEmdAIcCL+DxUPo9YDfgKcDpwOeSbFxVXwX+Ejizree5KzneC2jC1DbAXwGnJEm77XTgu8DWwHHAG1Z0gKr6EfAb7eqcqtpnRfWmGRd3KvCW9pifAha3YWoj4IvAP7Xf5XPA703yd1je8cCvtn+LZ9H8lu8b2f5UYMu2/Ujg75Js1W77a+C/Af+9Pfc7gUeBRcDrJw6Q5Lnt589ZjbqksWUgk2afLya5G7gHeCnwvyc2VNWFVXVFVT1aVZcDn6UJYKOOq6r7q+pnk5zjvW0w+jrNP7iHrWCf1wGnVtUlVfUQ8GfAXknmd/werwM+WlXXVdV97edfs5qX8z5cVXdOfJeq+kxV3VFVD1fVCcCTgF8Kk5O4oar+vqoeoQkg2wHbJtkReD7wvqr6eVV9E1i8GsddUb0LgU9V1Xeq6pF2LNtDwJ7ta0PgY1X1i6o6myZsrlIbIBcC/7M91700YfQ1I7v9Avhge+xzgfuAXZKsB/wBcExVLW3r+lb7+y4GfjXJzu0x3kATcH++Bn8HaewYyKTZ59CqmkMzRulo4OtJngqQ5AVJLkhye5J7gD+i6e0ZdeMqjn9XVd0/sn4D8LQV7Pe0dhsAbai6g6bXpIsnfL5d3oBm/FVXT/guSf40yVXtpba7aXqBlv/+k7llYqGqHmgXN2trvXOk7ZfOvQb1Ph14R3u58u623h3acz0NWFpVNbL/6N9qMnOBJwMXjxz3q237hDuq6uGR9Qdovuc2NP9d/dJl4vYS+ZnA69vg9lqaHjxJHRjIpFmq7b34F+AR4EVt8+k0PRk7VNWWwCeBLP/RVRx6qySbjqzvCPzXCvb7L5pQAUD7ma2BpR2/whM+357nYZobFbp67Lu048XeSdObt1UbWu/h8e+/qu89mZuBp7SXiSesyd2tozXcCPxFVc0ZeT25qj7bnm/7kcul0Px9JtxPE7oAmAjkrZ8CPwN+Y+S4W45cBp7MT4EHgZVdJl5E07O5L/BAVX27wzElYSCTZq00DgG2Aq5qmzen6cl5MMkewO+v4eE/kGSjNuQcRDOGaXmfBY5IsluSJ9FcFvtOVV3fbr+VZmzYynwW+J/tYPnNeHyM18OTfGYym9MEutuBDZK8D9hiZPutwPy2d2e1VNUNwBLguPbvshfw8jWsc8LfA3/U9momyaZpbsrYHPh2+13+JMmGSV4B7DHy2e8Dv9H+7TemGdM2Ueuj7bH/JsmvACTZPsnKxgyOfs9Haca1fTTJ05Ksn2Sv9velDWCPAidg75i0Wgxk0uzz5TR3IS4D/gI4vKomplf4H8AHk9xLM4j7rDU4/i3AXTQ9WP8M/FFVXb38TlX1H8B7gc/T9Og8kyeOUzoOWNReNlvRGLRTaf5R/wbwE5qembeuYL+u/o3m0tyPaC7vPcgTLxFOhMo7klyyBsd/HbAXzWXZP6e5fPfQmhZbVUuAPwQ+TvP3vpbmJgfacVmvaNfvpLl5419GPvsj4IPAf9DcsfmEOy6Bd7XHuyjJsna/rmPp/hS4gmbM2p3AR3jivyWnAc8GfukOU0krlycOQZCklUuyN/CZqpo3dC0zXZIzgaur6v3TdL5PAzdV1Xum43yT1PFGYGFVvWiVO0t6jD1kkjQFkjw/yTPTzJ+2H3AIzdQUY6MdQ/c/gJOHrkVa1xjIJGlqPBW4kGaKiJOAP56KRzqtK9oxaLfTjMU7feBypHWOlywlSZIG1lsPWZJd0jzyY+K1LMnbkjwlyXlJfty+b9XunyQnpXnMyuVJdu+rNkmSpJmkt0BWVddU1W5VtRvNYzYeAL4AHAucX1U7A+e36wD7Azu3r4XAJ/qqTZIkaSZZnUeQrI19gf+sqhvaeZH2btsX0Yy5eBfNANjT2pmnL0oyJ8l2VXXzyg66zTbb1Pz583stXJIkaSpcfPHFP62quSvaNl2B7DU0kzwCbDsSsm7h8cegbM8T5wS6qW17QiBLspCmB40dd9yRJUuW9FWzJEnSlEmy0kec9X6XZZKNgINZwUzebW/Yat1VUFUnV9WCqlowd+4KQ6YkSdI6ZTqmvdgfuKSqJp4/d2uS7QDa99va9qU88dlv8+j+zDtJkqR11nQEstfy+OVKaB5sfHi7fDjwpZH2N7Z3W+4J3DPZ+DFJkqTZotcxZEk2BV4KvGWk+XjgrCRH0jxPbuIZducCB9A8X+0B4Ig+a5MkSZopeg1kVXU/sPVybXfQ3HW5/L4FHNVnPZIkSTORj06SJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgbW68SwkiTNP/acoUvo1fXHHzh0CZoF7CGTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBtZrIEsyJ8nZSa5OclWSvZI8Jcl5SX7cvm/V7pskJyW5NsnlSXbvszZJkqSZou8eshOBr1bVrwHPBa4CjgXOr6qdgfPbdYD9gZ3b10LgEz3XJkmSNCP0FsiSbAm8GDgFoKp+XlV3A4cAi9rdFgGHtsuHAKdV4yJgTpLt+qpPkiRppuizh2wn4HbgH5NcmuQfkmwKbFtVN7f73AJs2y5vD9w48vmb2jZJkqRZrc9AtgGwO/CJqnoecD+PX54EoKoKqNU5aJKFSZYkWXL77bdPWbGSJElD6TOQ3QTcVFXfadfPpglot05cimzfb2u3LwV2GPn8vLbtCarq5KpaUFUL5s6d21vxkiRJ06W3QFZVtwA3JtmlbdoXuBJYDBzeth0OfKldXgy8sb3bck/gnpFLm5IkSbPWBj0f/63APyfZCLgOOIImBJ6V5EjgBuCwdt9zgQOAa4EH2n0lSZJmvV4DWVVdBixYwaZ9V7BvAUf1WY8kSdJM5Ez9kiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNbIMuOyXZHnj66P5V9Y2+ipKkUfOPPWfoEnp1/fEHDl2CpIGtMpAl+QjwauBK4JG2uQADmSRJ0hTo0kN2KLBLVT3UdzGSJEnjqMsYsuuADfsuRJIkaVx16SF7ALgsyfnAY71kVfUnvVUlSZI0RroEssXtS5IkST1YZSCrqkVJNgF2rKprpqEmSZKksbLKMWRJXg5cBny1Xd8tiT1mkiRJU6TLoP7jgD2AuwGq6jLgGT3WJEmSNFa6BLJfVNU9y7U92kcxkiRJ46jLoP4fJvl9YP0kOwN/Anyr37IkSZLGR5cesrcCv0Ez5cXpwD3A2/osSpIkaZx06SH7tar6X8D/6rsYSZKkcdSlh+yEJFcl+VCS3+y9IkmSpDGzykBWVS8BXgLcDnwqyRVJ3tN7ZZIkSWOiSw8ZVXVLVZ0E/BHNnGTv67UqSZKkMdJlYthfT3JckiuAv6W5w3Jel4Mnub7tUbssyZK27SlJzkvy4/Z9q7Y9SU5Kcm2Sy5PsvhbfS5IkaZ3RpYfsVJpJYX+nqvauqk9U1W2rcY6XVNVuVbWgXT8WOL+qdgbOb9cB9gd2bl8LgU+sxjkkSZLWWV2eZbnXFJ/zEGDvdnkRcCHwrrb9tKoq4KIkc5JsV1U3T/H5JUmSZpSVBrIkZ1XVYe2lyhrdBFRVPafD8Qv49yQFfKqqTga2HQlZtwDbtsvbAzeOfPamtu0JgSzJQpoeNHbccccOJUiSJM1sk/WQHdO+H7QWx39RVS1N8ivAeUmuHt1YVdWGtc7aUHcywIIFC1brs5IkSTPRSgPZRC9WVd2wpgevqqXt+21JvkDzkPJbJy5FJtkOmBiPthTYYeTj89o2SZKkWa3LXZb3Jlm23OvGJF9I8oxJPrdpks0nloGXAT8AFgOHt7sdDnypXV4MvLG923JP4B7Hj0mSpHHQ5dFJH6MZz3U6zfix1wDPBC6huQNz75V8blvgC0kmznN6VX01yfeAs5IcCdwAHNbufy5wAHAt8ABwxBp8H0mSpHVOl0B2cFU9d2T95CSXVdW7krx7ZR+qquuA566g/Q5g3xW0F3BUh3okSZJmlS7zkD2Q5LAk67Wvw4AH220OqpckSVpLXQLZ64A30Ay+v7Vdfn2STYCje6xNkiRpLHSZGPY64OUr2fzNqS1HkiRp/HR6uLgkSZL6YyCTJEkamIFMkiRpYF0mhj0myRbthK2nJLkkycumozhJkqRx0KWH7A+qahnNTPtb0dxleXyvVUmSJI2RLoEs7fsBwD9V1Q9H2iRJkrSWugSyi5P8O00g+7f2+ZSP9luWJEnS+Ojy6KQjgd2A66rqgSRb43MmJUmSpkyXiWEfTfIT4FeTbDwNNUmSJI2VVQayJG8GjgHmAZcBewLfBvbptzRJkqTx0GUM2THA84EbquolwPOAu3utSpIkaYx0CWQPVtWDAEmeVFVXA7v0W5YkSdL46DKo/6Ykc4AvAucluQu4od+yJEmSxkeXQf2/2y4el+QCYEvgq71WJUmSNEa6DOr/EPAN4FtV9fX+S5IkSRovXcaQXQe8FliS5LtJTkhySM91SZIkjY1VBrKq+seq+gPgJcBngFe175IkSZoCXS5Z/gOwK3Ar8P8BrwQu6bkuSZKksdHlkuXWwPo0c4/dCfy0qh7utSpJkqQx0vkuyyS/DvwOcEGS9atqXt/FSZIkjYMulywPAn4LeDEwB/gazaVLSZIkTYEuE8PuRxPATqyq/+q5HkmSpLHT5ZLl0dNRiCRJ0rjqMqhfkiRJPTKQSZIkDcxAJkmSNLAud1leAdRyzfcAS4A/r6o7+ihMkiRpXHS5y/IrwCPA6e36a4AnA7cAnwZe3ktlkiRJY6JLIPt/qmr3kfUrklxSVbsneX1fhUmSJI2LLmPI1k+yx8RKkufTPEoJwEcoSZIkraUuPWRvBk5NshkQYBnw5iSbAh/uszhJkqRx0GVi2O8Bz06yZbt+z8jms/oqTJIkaVx0ucvyScDvAfOBDZIAUFUf7LUySZKkMdHlkuWXaKa5uBh4qN9yJEmSxk+XQDavqvZb0xMkWZ9mzrKlVXVQkp2AM4CtaULeG6rq521P3GnAfwPuAF5dVdev6XklSZLWFV3usvxWkmevxTmOAa4aWf8I8DdV9SzgLuDItv1I4K62/W/a/SRJkma9LoHsRcDFSa5JcnmSK5Jc3uXgSeYBBwL/0K4H2Ac4u91lEXBou3xIu067fd9MDFiTJEmaxbpcstx/LY7/MeCdwObt+tbA3VU1MX/ZTcD27fL2wI0AVfVwknva/X86esAkC4GFADvuuONalCZJkjQzrLSHLMkW7eK9K3lNKslBwG1VdfEU1PmYqjq5qhZU1YK5c+dO5aElSZIGMVkP2enAQTQD74tmUtgJBTxjFcd+IXBwkgOAjYEtgBOBOUk2aHvJ5gFL2/2XAjsANyXZANiSZnC/JEnSrLbSQFZVB7XvO63Jgavqz4A/A0iyN/CnVfW6JJ8DXklzp+XhNNNqACxu17/dbv9aVdWanFuSJK29+ceeM3QJvbr++AOHLuExqxzUn+T8Lm2r4V3A25NcSzNG7JS2/RRg67b97cCxa3EOSZKkdcZKe8iSbAw8GdgmyVY8fslyCx4fiN9JVV0IXNguXwfssYJ9HgRetTrHlSRJmg0mG0P2FuBtwNNoxpFNBLJlwMd7rkuSJGlsTDaG7ETgxCRvraq/ncaaJEmSxsoq5yGrqr9N8pvArjR3S060n9ZnYZIkSeNilYEsyfuBvWkC2bk0E8V+k+a5k5IkSVpLXR6d9EpgX+CWqjoCeC7NHGGSJEmaAl0C2c+q6lHg4Xb2/ttoJnCVJEnSFOjyLMslSeYAf09zt+V9NJO3SpIkaQpMGsiSBPhwVd0NfDLJV4EtquryaalOkiRpDEwayKqqkpwLPLtdv346ipIkSRonXcaQXZLk+b1XIkmSNKa6jCF7AfC6JDcA99PM2F9V9ZxeK5MkSRoTXQLZ7/RehSRJ0hjrMlP/DdNRiCRJ0rjqMoZMkiRJPTKQSZIkDcxAJkmSNLBVBrIkeyb5XpL7kvw8ySNJlk1HcZIkSeOgSw/Zx4HXAj8GNgHeDPxdn0VJkiSNk06XLKvqWmD9qnqkqv4R2K/fsiRJksZHl3nIHkiyEXBZkr8CbsaxZ5IkSVOmS7B6Q7vf0TQz9e8A/F6fRUmSJI2T1ZkY9kHgA/2WI0mSNH689ChJkjQwA5kkSdLAViuQJVkvyRZ9FSNJkjSOukwMe3qSLZJsCvwAuDLJ/9t/aZIkSeOhSw/ZrlW1DDgU+AqwE82dl5IkSZoCXQLZhkk2pAlki6vqF0D1W5YkSdL46BLIPgVcD2wKfCPJ0wGfZSlJkjRFusxDdhJw0kjTDUle0l9JkiRJ46XLoP5tk5yS5Cvt+q7A4b1XJkmSNCa6XLL8NPBvwNPa9R8Bb+urIEmSpHHTJZBtU1VnAY8CVNXDwCO9ViVJkjRGugSy+5NsTXtnZZI9gXt6rUqSJGmMrHJQP/B2YDHwzCT/B5gLvLLXqiRJksZIl7ssL0ny28AuQIBr2rnIJEmSNAVWGciSrA8cAMxv939ZEqrqoz3XJkmSNBa6jCH7MvAmYGtg85HXpJJsnOS7Sb6f5IdJPtC275TkO0muTXJmko3a9ie169e22+ev4XeSJElap3QZQzavqp6zBsd+CNinqu5rH730zXYus7cDf1NVZyT5JHAk8In2/a6qelaS1wAfAV69BueVJElap3TpIftKkpet7oGrcV+7umH7KmAf4Oy2fRHNMzIBDmnXabfvmySre15JkqR1TZdAdhHwhSQ/S7Isyb1JOj3LMsn6SS4DbgPOA/4TuLudywzgJmD7dnl74EZ4bK6ze2guk0qSJM1qXQLZR4G9gCdX1RZVtXlVbdHl4FX1SFXtBswD9gB+bc1LbSRZmGRJkiW333772h5OkiRpcF0C2Y3AD6qq1vQkVXU3cAFNsJuTZGLs2jxgabu8FNgBoN2+JXDHCo51clUtqKoFc+fOXdOSJEmSZowug/qvAy5sB+Q/NNG4qmkvkswFflFVdyfZBHgpzUD9C2gmlj2D5iHlX2o/srhd/3a7/WtrEwIlSZLWFV0C2U/a10btq6vtgEXtPGbrAWdV1b8muRI4I8mfA5cCp7T7nwL8U5JrgTuB16zGuSRJktZZXWbq/8CaHLiqLgeet4L262jGky3f/iDwqjU5lyRJ0rpspYEsyceq6m1Jvkz7YPFRVXVwr5VJkiSNicl6yP6pff/r6ShEkiRpXK00kFXVxe3iblV14ui2JMcAX++zMEmSpHHRZdqLw1fQ9qYprkOSJGlsTTaG7LXA7wM7JVk8smlzmrsgJUmSNAUmG0P2LeBmYBvghJH2e4HL+yxKkiRpnEw2huwG4Aaa2fUlSZLUky5jyCRJktQjA5kkSdLAVhrIkpzfvn9k+sqRJEkaP5MN6t8uyX8HDk5yBpDRjVV1Sa+VSZIkjYnJAtn7gPcC84CPLretgH36KkqSJGmcTHaX5dnA2UneW1UfmsaaJEmSxspkPWQAVNWHkhwMvLhturCq/rXfsiRJksbHKu+yTPJh4BjgyvZ1TJK/7LswSZKkcbHKHjLgQJoHjD8KkGQRcCnw7j4LkyRJGhdd5yGbM7K8ZR+FSJIkjasuPWQfBi5NcgHN1BcvBo7ttSpJkqQx0mVQ/2eTXAg8v216V1Xd0mtVkiRJY6RLDxlVdTOwuOdaJEmSxpLPspQkSRqYgUySJGlgkwayJOsnuXq6ipEkSRpHkwayqnoEuCbJjtNUjyRJ0tjpMqh/K+CHSb4L3D/RWFUH91aVJEnSGOkSyN7bexWSJEljrMs8ZF9P8nRg56r6jyRPBtbvvzRJkqTx0OXh4n8InA18qm3aHvhin0VJkiSNky7TXhwFvBBYBlBVPwZ+pc+iJEmSxkmXQPZQVf18YiXJBkD1V5IkSdJ46RLIvp7k3cAmSV4KfA74cr9lSZIkjY8ugexY4HbgCuAtwLnAe/osSpIkaZx0ucvy0SSLgO/QXKq8pqq8ZClJkjRFVhnIkhwIfBL4TyDATkneUlVf6bs4SZKkcdBlYtgTgJdU1bUASZ4JnAMYyCRJkqZAlzFk906EsdZ1wL091SNJkjR2VtpDluQV7eKSJOcCZ9GMIXsV8L1pqE2SJGksTHbJ8uUjy7cCv90u3w5s0ltFkiRJY2algayqjlibAyfZATgN2JamZ+3kqjoxyVOAM4H5wPXAYVV1V5IAJwIHAA8Ab6qqS9amBkmSpHVBl7ssdwLeShOgHtu/qg5exUcfBt5RVZck2Ry4OMl5wJuA86vq+CTH0sxz9i5gf2Dn9vUC4BPtuyRJ0qzW5S7LLwKn0MzO/2jXA1fVzcDN7fK9Sa6ieTD5IcDe7W6LgAtpAtkhwGntHGcXJZmTZLv2OJIkSbNWl0D2YFWdtDYnSTIfeB7N5LLbjoSsW2guaUIT1m4c+dhNbdsTAlmShcBCgB133HFtypIkSZoRukx7cWKS9yfZK8nuE6+uJ0iyGfB54G1VtWx0W9sbtlqz/lfVyVW1oKoWzJ07d3U+KkmSNCN16SF7NvAGYB8ev2RZ7fqkkmxIE8b+uar+pW2+deJSZJLtgNva9qXADiMfn9e2SZIkzWpdAtmrgGdU1c9X58DtXZOnAFdV1UdHNi0GDgeOb9+/NNJ+dJIzaAbz3+P4MUmSNA66BLIfAHN4vCerqxfS9KxdkeSytu3dNEHsrCRHAjcAh7XbzqWZ8uJammkv1mraDUmSpHVFl0A2B7g6yfeAhyYaVzXtRVV9k+Zh5Cuy7wr2L+CoDvVIkiTNKl0C2ft7r0KSJGmMrTKQVdXXp6MQSZKkcdVlpv57eXxqio2ADYH7q2qLPguTJEkaF116yDafWG7vnDwE2LPPoiRJksZJlzFkj2kH3n8xyftpnkEprTPmH3vO0CX05vrjDxy6BEnSWuhyyfIVI6vrAQuAB3urSJIkacx06SF7+cjyw8D1NJctJUmSNAW6jCFzglZJkqQerTSQJXnfJJ+rqvpQD/VIkiSNncl6yO5fQdumwJHA1oCBTJIkaQqsNJBV1QkTy0k2B46heb7kGcAJK/ucJEmSVs+kY8iSPAV4O/A6YBGwe1XdNR2FSZIkjYvJxpD9b+AVwMnAs6vqvmmrSpIkaYysN8m2dwBPA94D/FeSZe3r3iTLpqc8SZKk2W+yMWSThTVJkiRNEUOXJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkDM5BJkiQNzEAmSZI0MAOZJEnSwAxkkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmSJA3MQCZJkjQwA5kkSdLADGSSJEkD6y2QJTk1yW1JfjDS9pQk5yX5cfu+VdueJCcluTbJ5Ul276suSZKkmabPHrJPA/st13YscH5V7Qyc364D7A/s3L4WAp/osS5JkqQZpbdAVlXfAO5crvkQYFG7vAg4dKT9tGpcBMxJsl1ftUmSJM0k0z2GbNuqurldvgXYtl3eHrhxZL+b2rZfkmRhkiVJltx+++39VSpJkjRNBhvUX1UF1Bp87uSqWlBVC+bOndtDZZIkSdNrugPZrROXItv329r2pcAOI/vNa9skSZJmvekOZIuBw9vlw4EvjbS/sb3bck/gnpFLm5IkSbPaBn0dOMlngb2BbZLcBLwfOB44K8mRwA3AYe3u5wIHANcCDwBH9DGvhi4AAAY9SURBVFWXJEnSTNNbIKuq165k074r2LeAo/qqRZIkaSZzpn5JkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWC9TQw7G80/9pyhS+jV9ccfOHQJkiSNJXvIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIEZyCRJkgZmIJMkSRqYgUySJGlgBjJJkqSBGcgkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGpiBTJIkaWAGMkmSpIHNqECWZL8k1yS5NsmxQ9cjSZI0HWZMIEuyPvB3wP7ArsBrk+w6bFWSJEn9mzGBDNgDuLaqrquqnwNnAIcMXJMkSVLvZlIg2x64cWT9prZNkiRpVktVDV0DAEleCexXVW9u198AvKCqjl5uv4XAwnZ1F+CaaS10em0D/HToIrRG/O3Wbf5+6zZ/v3XXbP/tnl5Vc1e0YYPprmQSS4EdRtbntW1PUFUnAydPV1FDSrKkqhYMXYdWn7/dus3fb93m77fuGuffbiZdsvwesHOSnZJsBLwGWDxwTZIkSb2bMT1kVfVwkqOBfwPWB06tqh8OXJYkSVLvZkwgA6iqc4Fzh65jBhmLS7OzlL/dus3fb93m77fuGtvfbsYM6pckSRpXM2kMmSRJ0lgykM1ASU5NcluSHwxdi1ZPkh2SXJDkyiQ/THLM0DWpuyQbJ/luku+3v98Hhq5JqyfJ+kkuTfKvQ9ei1ZPk+iRXJLksyZKh65luXrKcgZK8GLgPOK2qfnPoetRdku2A7arqkiSbAxcDh1bVlQOXpg6SBNi0qu5LsiHwTeCYqrpo4NLUUZK3AwuALarqoKHrUXdJrgcWVNVsnodspewhm4Gq6hvAnUPXodVXVTdX1SXt8r3AVfjEiXVGNe5rVzdsX/5f6zoiyTzgQOAfhq5FWl0GMqknSeYDzwO+M2wlWh3tJa/LgNuA86rK32/d8THgncCjQxeiNVLAvye5uH0qz1gxkEk9SLIZ8HngbVW1bOh61F1VPVJVu9E8LWSPJA4bWAckOQi4raouHroWrbEXVdXuwP7AUe3wnbFhIJOmWDv26PPAP1fVvwxdj9ZMVd0NXADsN3Qt6uSFwMHtOKQzgH2SfGbYkrQ6qmpp+34b8AVgj2Erml4GMmkKtYPCTwGuqqqPDl2PVk+SuUnmtMubAC8Frh62KnVRVX9WVfOqaj7No/e+VlWvH7gsdZRk0/ZGKJJsCrwMGKuZBgxkM1CSzwLfBnZJclOSI4euSZ29EHgDzf+dX9a+Dhi6KHW2HXBBkstpnq97XlU5fYLUv22Bbyb5PvBd4Jyq+urANU0rp72QJEkamD1kkiRJAzOQSZIkDcxAJkmSNDADmSRJ0sAMZJIkSQMzkEmalZI80k478oMkX56YX2yS/XcbnaIkycFJju2/Ukly2gtJs1SS+6pqs3Z5EfCjqvqLSfZ/E7Cgqo6ephIl6TEbDF2AJE2DbwPPAUiyB3AisDHwM+AI4CfAB4FNkrwI+DCwCW1AS/JpYBmwAHgq8M6qOjvJesDHgX2AG4FfAKdW1dnT+N0kzQJespQ0qyVZH9gXWNw2XQ38VlU9D3gf8JdV9fN2+cyq2q2qzlzBobYDXgQcBBzftr0CmA/sSvOEhr36+h6SZjd7yCTNVpskuQzYHrgKOK9t3xJYlGRnoIANOx7vi1X1KHBlkm3bthcBn2vbb0lywdSVL2mc2EMmabb6WVXtBjwdCHBU2/4h4IKq+k3g5TSXLrt4aGQ5U1alJGEgkzTLVdUDwJ8A70iyAU0P2dJ285tGdr0X2Hw1D/9/gN9Lsl7ba7b32lUraVwZyCTNelV1KXA58Frgr4APJ7mUJw7buADYtZ0q49UdD/154CbgSuAzwCXAPVNWuKSx4bQXkrQWkmxWVfcl2Rr4LvDCqrpl6LokrVsc1C9Ja+df20lnNwI+ZBiTtCbsIZMkSRqYY8gkSZIGZiCTJEkamIFMkiRpYAYySZKkgRnIJEmSBmYgkyRJGtj/D1d9TZ3wVAf8AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 1854\n", " \n", "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Western . Recommendations based on top average ratings.\n", " rating\n", "movie title \n", "High Noon (1952) 4.102273\n", "Wild Bunch, The (1969) 4.023256\n", "Butch Cassidy and the Sundance Kid (1969) 3.949074\n", "Magnificent Seven, The (1954) 3.942149\n", "Once Upon a Time in the West (1969) 3.868421\n", "Unforgiven (1992) 3.868132\n", "Good, The Bad and The Ugly, The (1966) 3.861314\n", "Dead Man (1995) 3.823529\n", "Dances with Wolves (1990) 3.792969\n", "Tombstone (1993) 3.666667\n", "**************************** ****************************** ******************************\n", "These are the most popular movies which can be recommended to a new user in Western genre. Recommendations based on Popularity\n", " movie title Number of Users watched\n", "0 Dances with Wolves (1990) 256\n", "1 Butch Cassidy and the Sundance Kid (1969) 216\n", "2 Unforgiven (1992) 182\n", "3 Good, The Bad and The Ugly, The (1966) 137\n", "4 Maverick (1994) 128\n", "5 Magnificent Seven, The (1954) 121\n", "6 Tombstone (1993) 108\n", "7 Young Guns (1988) 101\n", "8 High Noon (1952) 88\n", "9 Legends of the Fall (1994) 81\n", "**************************** ****************************** ******************************\n", "These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them.\n", "These have rating more than 2.0 with atleast 50 viewers.\n", "**Recommendations based popularity and rating. These are top rated popular movies**\n", " movie title ... Number of Users watched\n", "0 High Noon (1952) ... 88\n", "2 Butch Cassidy and the Sundance Kid (1969) ... 216\n", "3 Magnificent Seven, The (1954) ... 121\n", "5 Unforgiven (1992) ... 182\n", "6 Good, The Bad and The Ugly, The (1966) ... 137\n", "8 Dances with Wolves (1990) ... 256\n", "9 Tombstone (1993) ... 108\n", "10 Maverick (1994) ... 128\n", "11 Legends of the Fall (1994) ... 81\n", "13 Young Guns (1988) ... 101\n", "21 Last Man Standing (1996) ... 53\n", "\n", "[11 rows x 3 columns]\n", "**************************** ****************************** ******************************\n", " \n", " \n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "xMcFJgHlXGuR" }, "source": [ "We can see rating frequency plot, movie recommendation based on only high ratings, only popularity and high rated popular movie for each movie genre separately." ] }, { "cell_type": "code", "metadata": { "id": "aneLfqrtXFk9" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IhY_79CI31QH" }, "source": [ "# Rough Work" ] }, { "cell_type": "code", "metadata": { "id": "5lmhc7hi6Mvb", "outputId": "49870b24-c0ca-420f-ad7e-355e51694032", "colab": { "base_uri": "https://localhost:8080/", "height": 204 } }, "source": [ "x = 'Western'\n", "genre_based_movies = items_dataset[['movie id','movie title',x]]\n", "genre_based_movies = genre_based_movies[genre_based_movies[x] == 1]\n", "merged_genre_movies = pd.merge(dataset, genre_based_movies, how='inner', on='movie id')\n", "merged_genre_movies.head()\n" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie titleWestern
0244512880606923Legends of the Fall (1994)1
185512879454782Legends of the Fall (1994)1
2201512884140751Legends of the Fall (1994)1
3198513884208455Legends of the Fall (1994)1
4330515876546753Legends of the Fall (1994)1
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title Western\n", "0 244 51 2 880606923 Legends of the Fall (1994) 1\n", "1 85 51 2 879454782 Legends of the Fall (1994) 1\n", "2 201 51 2 884140751 Legends of the Fall (1994) 1\n", "3 198 51 3 884208455 Legends of the Fall (1994) 1\n", "4 330 51 5 876546753 Legends of the Fall (1994) 1" ] }, "metadata": { "tags": [] }, "execution_count": 107 } ] }, { "cell_type": "code", "metadata": { "id": "QTpavk0cMAzF", "outputId": "3c48eaac-f29a-4cea-bc4b-42a6c44529ce", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "len(merged_genre_movies)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1854" ] }, "metadata": { "tags": [] }, "execution_count": 108 } ] }, { "cell_type": "code", "metadata": { "id": "aOFHbwc2KqQ7", "outputId": "dc9e169b-ad63-4809-c808-aa601a216c3a", "colab": { "base_uri": "https://localhost:8080/", "height": 438 } }, "source": [ "star_based_visualization(merged_genre_movies)" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "stream", "text": [ "Total number of users watched this Genre: 1854\n", " \n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "w_M5bmyVDuM1", "outputId": "4a3a32a8-18e2-40d6-ef89-a7901e6c64bf", "colab": { "base_uri": "https://localhost:8080/", "height": 427 } }, "source": [ "high_rated_movies = merged_genre_movies.groupby(['movie title']).agg({\"rating\":\"mean\"})['rating'].sort_values(ascending=False)\n", "high_rated_movies = high_rated_movies.to_frame()\n", "print(\"These are the top movies that can be naviely suggested to the new users for the requested movie genre:\", x, \". Recommendations based on top average ratings.\")\n", "high_rated_movies.head(10)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "These are the top movies that can be naviely suggested to the new users for the requested movie genre: Western . Recommendations based on top average ratings.\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating
movie title
High Noon (1952)4.102273
Wild Bunch, The (1969)4.023256
Butch Cassidy and the Sundance Kid (1969)3.949074
Magnificent Seven, The (1954)3.942149
Once Upon a Time in the West (1969)3.868421
Unforgiven (1992)3.868132
Good, The Bad and The Ugly, The (1966)3.861314
Dead Man (1995)3.823529
Dances with Wolves (1990)3.792969
Tombstone (1993)3.666667
\n", "
" ], "text/plain": [ " rating\n", "movie title \n", "High Noon (1952) 4.102273\n", "Wild Bunch, The (1969) 4.023256\n", "Butch Cassidy and the Sundance Kid (1969) 3.949074\n", "Magnificent Seven, The (1954) 3.942149\n", "Once Upon a Time in the West (1969) 3.868421\n", "Unforgiven (1992) 3.868132\n", "Good, The Bad and The Ugly, The (1966) 3.861314\n", "Dead Man (1995) 3.823529\n", "Dances with Wolves (1990) 3.792969\n", "Tombstone (1993) 3.666667" ] }, "metadata": { "tags": [] }, "execution_count": 110 } ] }, { "cell_type": "code", "metadata": { "id": "1r8n9xS4HQpj" }, "source": [ "popular_movies_ingenre = merged_genre_movies.groupby(['movie title']).agg({\"rating\":\"count\"})['rating'].sort_values(ascending=False)\n", "popular_movies_ingenre = popular_movies_ingenre.to_frame()\n", "popular_movies_ingenre.reset_index(level=0, inplace=True)\n", "popular_movies_ingenre.columns = ['movie title', 'Number of Users watched']" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OqoyOQ3YPjwi", "outputId": "5f402fa2-f5e3-49f2-891b-4b54f5bab5ad", "colab": { "base_uri": "https://localhost:8080/", "height": 376 } }, "source": [ "# popular_movies[popular_movies['Number of Users watched'] >= 400]\n", "print(\"These are the most popular movies which can be recommended to a new user in\",x,\"genre. Recommendations based on Popularity\")\n", "popular_movies_ingenre.sort_values('Number of Users watched', ascending=False).head(10)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "These are the most popular movies which can be recommended to a new user in Western genre. Recommendations based on Popularity\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleNumber of Users watched
0Dances with Wolves (1990)256
1Butch Cassidy and the Sundance Kid (1969)216
2Unforgiven (1992)182
3Good, The Bad and The Ugly, The (1966)137
4Maverick (1994)128
5Magnificent Seven, The (1954)121
6Tombstone (1993)108
7Young Guns (1988)101
8High Noon (1952)88
9Legends of the Fall (1994)81
\n", "
" ], "text/plain": [ " movie title Number of Users watched\n", "0 Dances with Wolves (1990) 256\n", "1 Butch Cassidy and the Sundance Kid (1969) 216\n", "2 Unforgiven (1992) 182\n", "3 Good, The Bad and The Ugly, The (1966) 137\n", "4 Maverick (1994) 128\n", "5 Magnificent Seven, The (1954) 121\n", "6 Tombstone (1993) 108\n", "7 Young Guns (1988) 101\n", "8 High Noon (1952) 88\n", "9 Legends of the Fall (1994) 81" ] }, "metadata": { "tags": [] }, "execution_count": 112 } ] }, { "cell_type": "code", "metadata": { "id": "pef6XJRkAuH1", "outputId": "f44d1bbb-7047-42f9-d432-538cf2149553", "colab": { "base_uri": "https://localhost:8080/", "height": 359 } }, "source": [ "highly_rated_popular_movies = pd.merge(high_rated_movies, popular_movies_ingenre, how = 'inner', on='movie title')\n", "highly_rated_popular_movies.head(10)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleratingNumber of Users watched
0High Noon (1952)4.10227388
1Wild Bunch, The (1969)4.02325643
2Butch Cassidy and the Sundance Kid (1969)3.949074216
3Magnificent Seven, The (1954)3.942149121
4Once Upon a Time in the West (1969)3.86842138
5Unforgiven (1992)3.868132182
6Good, The Bad and The Ugly, The (1966)3.861314137
7Dead Man (1995)3.82352934
8Dances with Wolves (1990)3.792969256
9Tombstone (1993)3.666667108
\n", "
" ], "text/plain": [ " movie title rating Number of Users watched\n", "0 High Noon (1952) 4.102273 88\n", "1 Wild Bunch, The (1969) 4.023256 43\n", "2 Butch Cassidy and the Sundance Kid (1969) 3.949074 216\n", "3 Magnificent Seven, The (1954) 3.942149 121\n", "4 Once Upon a Time in the West (1969) 3.868421 38\n", "5 Unforgiven (1992) 3.868132 182\n", "6 Good, The Bad and The Ugly, The (1966) 3.861314 137\n", "7 Dead Man (1995) 3.823529 34\n", "8 Dances with Wolves (1990) 3.792969 256\n", "9 Tombstone (1993) 3.666667 108" ] }, "metadata": { "tags": [] }, "execution_count": 113 } ] }, { "cell_type": "code", "metadata": { "id": "EL33xBMOAuNy", "outputId": "7be38ef4-1d4c-46f0-8f02-118ccb9e63c6", "colab": { "base_uri": "https://localhost:8080/", "height": 390 } }, "source": [ "viewer_limit = 300\n", "ratings_limit = 4.0\n", "count = 0\n", "check = 0\n", "while viewer_limit > 0 and ratings_limit > 0:\n", " s = highly_rated_popular_movies[(highly_rated_popular_movies['Number of Users watched']>viewer_limit) & (highly_rated_popular_movies['rating']>=ratings_limit)]\n", " if len(s) < 11:\n", " if check == 0:\n", " viewer_limit -= 50\n", " check = 1\n", " else:\n", " ratings_limit -= 0.5\n", " check = 0\n", " else:\n", " break\n", "s" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie titleratingNumber of Users watched
0High Noon (1952)4.10227388
2Butch Cassidy and the Sundance Kid (1969)3.949074216
3Magnificent Seven, The (1954)3.942149121
5Unforgiven (1992)3.868132182
6Good, The Bad and The Ugly, The (1966)3.861314137
8Dances with Wolves (1990)3.792969256
9Tombstone (1993)3.666667108
10Maverick (1994)3.468750128
11Legends of the Fall (1994)3.45679081
13Young Guns (1988)3.207921101
21Last Man Standing (1996)2.66037753
\n", "
" ], "text/plain": [ " movie title ... Number of Users watched\n", "0 High Noon (1952) ... 88\n", "2 Butch Cassidy and the Sundance Kid (1969) ... 216\n", "3 Magnificent Seven, The (1954) ... 121\n", "5 Unforgiven (1992) ... 182\n", "6 Good, The Bad and The Ugly, The (1966) ... 137\n", "8 Dances with Wolves (1990) ... 256\n", "9 Tombstone (1993) ... 108\n", "10 Maverick (1994) ... 128\n", "11 Legends of the Fall (1994) ... 81\n", "13 Young Guns (1988) ... 101\n", "21 Last Man Standing (1996) ... 53\n", "\n", "[11 rows x 3 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 114 } ] }, { "cell_type": "code", "metadata": { "id": "LkwH-StRfPsT", "outputId": "1013fd50-5c0b-4c87-c431-f473172ef8a2", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "a, r = 20,5.0\n", "# highly_rated_popular_movies[(highly_rated_popular_movies['Number of Users watched']\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie titlerelease datevideo release dateIMDb URLunknownActionAdventureAnimationChildrenComedyCrimeDocumentaryDramaFantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...0001110000000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...0110000000000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...0000000000000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...0100010010000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)0000001010000000100
...........................................................................
16771678Mat' i syn (1997)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?Mat%27+i+syn+...0000000010000000000
16781679B. Monkey (1998)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?B%2E+Monkey+(...0000000000000010100
16791680Sliding Doors (1998)01-Jan-1998NaNhttp://us.imdb.com/Title?Sliding+Doors+(1998)0000000010000010000
16801681You So Crazy (1994)01-Jan-1994NaNhttp://us.imdb.com/M/title-exact?You%20So%20Cr...0000010000000000000
16811682Scream of Stone (Schrei aus Stein) (1991)08-Mar-1996NaNhttp://us.imdb.com/M/title-exact?Schrei%20aus%...0000000010000000000
\n", "

1682 rows × 24 columns

\n", "" ], "text/plain": [ " movie id movie title ... War Western\n", "0 1 Toy Story (1995) ... 0 0\n", "1 2 GoldenEye (1995) ... 0 0\n", "2 3 Four Rooms (1995) ... 0 0\n", "3 4 Get Shorty (1995) ... 0 0\n", "4 5 Copycat (1995) ... 0 0\n", "... ... ... ... .. ...\n", "1677 1678 Mat' i syn (1997) ... 0 0\n", "1678 1679 B. Monkey (1998) ... 0 0\n", "1679 1680 Sliding Doors (1998) ... 0 0\n", "1680 1681 You So Crazy (1994) ... 0 0\n", "1681 1682 Scream of Stone (Schrei aus Stein) (1991) ... 0 0\n", "\n", "[1682 rows x 24 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 185 } ] } ] } ================================================ FILE: README.md ================================================ ## [Unrelated post - Connect with me on LinkedIn] [09-01-2023] It's been almost three years since I completed this project and its documentation. Occasionally, I receive connection requests and questions from individuals on LinkedIn. Each time I return to this repository, I'm pleasantly surprised to see people taking an interest in it. This sense of community engagement warms my heart. I wholeheartedly invite all of you who stumble upon this material to connect with me on LinkedIn for any kind of clarifications or questions. # Recommender-System-on-MovieLens-dataset ## Project Overview Knowledge-based, Content-based and Collaborative Recommender systems are built on MovieLens dataset with 100,000 movie ratings. These Recommender systems were built using Pandas operations and by fitting KNN, SVD & deep learning models which use NLP techniques and NN architecture to suggest movies for the users based on similar users and for queries specific to genre, user, movie, rating, popularity. ## Contents ![Python](https://img.shields.io/badge/python-v3.6+-blue.svg) ![Dependencies](https://img.shields.io/badge/dependencies-up%20to%20date-brightgreen.svg) - [Recommender System Overview](#recommender-system-overview) - [Content-based Filtering](#content-based-recommender-system) - [Collaborative Filtering](#collaborative-recommender-system) - [Knowledge based Recommender System](#knowledge-based-recommender-systems) - [Hybrid Recommender](#hybrid-recommender-system) - [Common Challenges](#common-challenges) - [About DataSet](#about-dataset-used) - [Data Visualizations and Manipulations](#Data-Visualizations-and-Manipulations) - Dataframes formed and used - [Reshaping the dataframe](#reshaping-the-dataframe-to-make-it-compatible-for-knn-algorithm-implementation) - Movie Recommender System Development - [Knowledge based Recommender System](#knowledge-based-recommender-system) - [Movie Recommendation Engine Development with KNN](#item-based-collaborative-recommender-system-using-knn) - [Movie Recommender System for a User](#movie-recommender-system-for-a-user) - [Movie Recommender System using Movie Name](#movie-recommender-system-using-movie-name) - Along with [Dynamic movie name Suggestor](#dynamic-movie-name-suggestor) - [Recommender System using Singular Value Decomposition(SVD)](#recommender-system-using-svd) - [Recommender System using Deep Neural Network (DNN) models](#recommender-system-using-softmax-deep-neural-networks) ![GitHub Logo](Images/netflix-recommendation-s.jpeg) ## Recommender System Overview A recommender system is a subclass of information filtering system that seeks to predict the "rating" or "preference" a user would give to an item. Recommender systems are utilized in a variety of areas including movies, music, news, social tags, and products in general. Recommender systems typically produce a list of recommendations and there are few ways in which it can be done. Two of the most popular ways are – through collaborative filtering or through content-based filtering. Most internet products we use today are powered by recommender systems. YouTube, Netflix, Amazon, Pinterest, and long list of other internet products all rely on recommender systems to filter millions of contents and make personalized recommendations to their users. Recommender systems are well-studied and proven to provide tremendous values to internet businesses and their consumers. There are majorly six types of recommender systems which work primarily in the Media and Entertainment industry: - Collaborative Recommender system - Content-based recommender system - Knowledge based recommender system - Hybrid recommender system - Demographic based recommender system - Utility based recommender system ![GitHub Logo](Images/coll-cont-pic.png) Recommender System is a vast concept rooted from a base idea of giving out suggestions to the users. There are wide range of algorithms are used to build a recommender system and the type of recommender system used is mostly dictated by the type of data available. In this project, first three of the above recommender systems were built. #### Content based recommender system This approach utilizes a series of discrete characteristics of an item in order to recommend additional items with similar properties. Content-based filtering methods are based on a description of the item and a profile of the user's preferences. To keep it simple, it will suggest you similar movies based on the movie we give (movie name would be the input) or based on all of the movies watched by a user (user is the input). It extracts features of a item and it can also look at the user's history to make the suggestions. #### Collaborative recommender system Collaborative filtering is based on the assumption that people who agreed in the past will agree in the future, and that they will like similar kinds of items as they liked in the past. The system generates recommendations using only information about rating profiles for different users or items. By locating peer users/items with a rating history similar to the current user or item, they generate recommendations using this neighborhood. This approach builds a model from a user’s past behaviors (items previously purchased or selected and/or numerical ratings given to those items) as well as similar decisions made by other users. This model is then used to predict items (or ratings for items) that the user may have an interest in. Collaborative filtering methods are classified as memory-based and model-based. #### Knowledge based recommender systems These are based on explicit knowledge about the item assortment, user preferences, and recommendation criteria (i.e., which item should be recommended in which context). These systems are applied in scenarios where alternative approaches such as collaborative filtering and content-based filtering cannot be applied. In simple terms, knowledge based recommender system can be used to suggest content/item to a new user or an anonymous user who doesn't have any history. #### Hybrid recommender system This combines more than one of these techniques to resolve one or more problems. This approach can be used to overcome some of the common problems in recommender systems such as cold start and the sparsity problem in collaborative approach, as well as the knowledge engineering bottleneck in knowledge-based approaches. It is proved that hybrid recommender system performs extremely well compared to pure collaborative and content based methods. #### Common Challenges In this project, three of the above recommender systems were build using different algorithms. Following challenges were encountered while building these recommender systems: * cold start * data sparsity * popular bias (how to recommend products from the tail of product distribution) * User Inconvinience with spelling while giving movie names as input (can't expect to give exact movie name everytime) * scalability (computation grows as number of users and items grow) * pool relationship between like-minded yet sparse users ![GitHub Logo](Images/long-tail.png) Above chart is the distribution of item rating frequency. This distribution often satisfies a property in real-world settings, which is referred to as [the long-tail property [1]](https://www.springer.com/cda/content/document/cda_downloaddocument/9783319296579-c1.pdf?SGWID=0-0-45-1554478-p179516130). According to this property, only a small fraction of the items are rated frequently. Such items are referred to as popular items. The vast majority of items are rated rarely. In most cases, high-frequency items tend to be relatively competitive items with little profit for the merchant. On the other hand, the lower frequency items have larger profit margins. However, many recommendation algorithms have a tendency to suggest popular items rather than infrequent items. This phenomenon also has a negative impact on diversity, and users may often become bored by receiving the same set of recommendations of popular items **A solution for long-tail could be** Use matrix factorization technique to train model to learn user-item interaction by capturing user information in user latent factors and item information in item latent factors. Meanwhile, matrix factorization technique can significantly reduce dimensionality and sparsity and it will reduce huge amount of memory footprint and make our system more scalable ## About Dataset used [MovieLens 100K dataset](https://grouplens.org/datasets/movielens/100k/) has been used for this project. MovieLens is a rating dataset from the MovieLens website, which has been collected over some period. Stable benchmark dataset. 100,000 ratings from 1000 users on 1700 movies. Released on 4/1998. Further information regarding this dataset can be found [here](http://files.grouplens.org/datasets/movielens/ml-100k-README.txt). A little about the dataset: MovieLens data sets were collected by the GroupLens Research Project at the University of Minnesota. This data set consists of: - 100,000 ratings (1-5) from 943 users on 1682 movies. - Each user has rated at least 20 movies. - Simple demographic info for the users (age, gender, occupation, zip) About few components loaded from the package which are used in this project: - u.data -- The full u data set, 100000 ratings by 943 users on 1682 items. Each user has rated at least 20 movies. Users and items are numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of user id | item id | rating | timestamp. - u.info -- The number of users, items, and ratings in the u data set. - u.item -- Information about the items (movies); this is a tab separated list of movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children's | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western | The last 19 fields are the genres, a 1 indicates the movie is of that genre, a 0 indicates it is not; movies can be in several genres at once.The movie ids are the ones used in the u.data data set. - u.genre -- A list of the genres. ## Data Visualizations and Manipulations Data has been loaded into dataframes using pandas. It had been analyzed and visualized to draw some key insights before going further into recommendations. ![GitHub Logo](Images/bar-plot.PNG) Observation: We can observe that most of the users have rewarded movies they watched with a 4 star rating and followed by 3 star and 5 star. The same has been displayed below using a pie chart to understand the constributions. ![GitHub Logo](Images/pie.PNG) Genre based number of movies count is being plotted using bar-graph: ![GitHub Logo](Images/genre-bar-plot.PNG) We can see that most of the movies belong to movie genre : Drama followed by Comedy then Action, Romance and Thriller #### Dataframes formed and used: items_dataset (movie id, movie name, and all genres); dataset (user id, movie id, rating); movie_dataset is a subset of items_dataset (it has movie id, movie name); Both movie_dataset and dataset are merged based on movie id and new merged_dataset is formed (user id, movie id, rating, movie name); a new dataframe is formed by averaging the overall rating available to a movie from the merged_dataset, are sorted with descending order of ratings and is named avg_rating_dataset (movie name, avg rating); There are few movie titles which have multiple movie id's causing duplicate combinations of movie id & title, these duplicate entries are caused when an user gives rating to a movie more than one time. These duplicate ratings are merged into single row by averaging the available ratings. ## [Knowledge based Recommender System](https://github.com/rposhala/Recommender-System-on-MovieLens-dataset/blob/main/Knowledge_based_Recommender_System.ipynb) Recommendations are made based on the available items and their corresponding ratings data, considering we have no user data available. Data manipulations are done using **Pandas** - A General recommendations of movies made based on high average ratings: ``` movie title avg rating Marlene Dietrich: Shadow and Light (1996) 5.0 Prefontaine (1997) 5.0 Santa with Muscles (1996) 5.0 Star Kid (1997) 5.0 Someone Else's America (1995) 5.0 Entertaining Angels: The Dorothy Day Story (1996) 5.0 Saint of Fort Washington, The (1993) 5.0 ``` These are the top 7 movies that can be naviely suggested to the new users, Recommendations based on top average ratings. - Movie Recommendations based on popularity : We have considered movies which have more than 400 viewers as *POPULAR* and there are 12 movies. ``` movie title Number of Users watched Star Wars (1977) 583 Contact (1997) 509 Fargo (1996) 508 Return of the Jedi (1983) 507 Liar Liar (1997) 485 English Patient, The (1996) 481 Scream (1996) 478 Toy Story (1995) 452 Air Force One (1997) 431 Independence Day (ID4) (1996) 429 Raiders of the Lost Ark (1981) 420 Godfather, The (1972) 413 ``` These are the most popular movies which can be recommended to a new user. *Recommendations based on Popularity* *Above two recommendations are good enough but are not complete and may not interest many of the new users* - Movie Recommendations based on both popular and average ratings. *Recommendations based popularity and rating.* These are **top rated popular movies** ``` movie title avg rating Number of Users watched Star Wars (1977) 4.358491 583 Silence of the Lambs, The (1991) 4.289744 390 Godfather, The (1972) 4.283293 413 Raiders of the Lost Ark (1981) 4.252381 420 Titanic (1997) 4.245714 350 Empire Strikes Back, The (1980) 4.204360 367 Princess Bride, The (1987) 4.172840 324 Fargo (1996) 4.155512 508 Monty Python and the Holy Grail (1974) 4.066456 316 1Pulp Fiction (1994) 4.060914 394 4Fugitive, The (1993) 4.044643 336 9Return of the Jedi (1983) 4.007890 507 ``` These movies are the best to suggest to a new user as they are popular and well rated by the users who already watched them. These have rating more than 4 with atleast 300 viewers. (the threshold for ratings and number of viewers can be changed accordingly based on the data available) - Movie suggestions based on specific *Genre* picked by the user For every genre, Genre wise ratings are plotted using bar plot and the above mentioned three types of movie recommendations are given out in specific to the selected genre. Below are the two such examples for genres: Action and Animation ``` **************************** ****** GENRE: Action ****** ****************************** Total number of users watched this Genre: 25589 These are the top movies that can be naviely suggested to the new users for the requested movie genre: Action . Recommendations based on top average ratings. rating movie title Star Wars (1977) 4.358491 Godfather, The (1972) 4.283293 Raiders of the Lost Ark (1981) 4.252381 Titanic (1997) 4.245714 Empire Strikes Back, The (1980) 4.204360 Boot, Das (1981) 4.203980 Godfather: Part II, The (1974) 4.186603 African Queen, The (1951) 4.184211 Princess Bride, The (1987) 4.172840 Braveheart (1995) 4.151515 **************************** ****************************** ****************************** These are the most popular movies which can be recommended to a new user in Action genre. Recommendations based on Popularity movie title Number of Users watched 0 Star Wars (1977) 583 1 Return of the Jedi (1983) 507 2 Air Force One (1997) 431 3 Independence Day (ID4) (1996) 429 4 Raiders of the Lost Ark (1981) 420 5 Godfather, The (1972) 413 6 Rock, The (1996) 378 7 Empire Strikes Back, The (1980) 367 8 Star Trek: First Contact (1996) 365 9 Titanic (1997) 350 **************************** ****************************** ****************************** These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them. These have rating more than 4.0 with atleast 250 viewers. **Recommendations based popularity and rating. These are top rated popular movies** movie title rating Number of Users watched 0 Star Wars (1977) 4.358491 583 1 Godfather, The (1972) 4.283293 413 2 Raiders of the Lost Ark (1981) 4.252381 420 3 Titanic (1997) 4.245714 350 4 Empire Strikes Back, The (1980) 4.204360 367 8 Princess Bride, The (1987) 4.172840 324 9 Braveheart (1995) 4.151515 297 11 Fugitive, The (1993) 4.044643 336 12 Alien (1979) 4.034364 291 13 Return of the Jedi (1983) 4.007890 507 14 Terminator 2: Judgment Day (1991) 4.006780 295 **************************** ****************************** ****************************** ``` ``` **************************** ****** GENRE: Animation ****** ****************************** Total number of users watched this Genre: 3605 These are the top movies that can be naviely suggested to the new users for the requested movie genre: Animation . Recommendations based on top average ratings. rating movie title Close Shave, A (1995) 4.491071 Wrong Trousers, The (1993) 4.466102 Wallace & Gromit: The Best of Aardman Animation... 4.447761 Faust (1994) 4.200000 Grand Day Out, A (1992) 4.106061 Toy Story (1995) 3.878319 Aladdin (1992) 3.812785 Winnie the Pooh and the Blustery Day (1968) 3.800000 Beauty and the Beast (1991) 3.792079 Lion King, The (1994) 3.781818 **************************** ****************************** ****************************** These are the most popular movies which can be recommended to a new user in Animation genre. Recommendations based on Popularity movie title Number of Users watched 0 Toy Story (1995) 452 1 Lion King, The (1994) 220 2 Aladdin (1992) 219 3 Beauty and the Beast (1991) 202 4 Fantasia (1940) 174 5 Snow White and the Seven Dwarfs (1937) 172 6 Beavis and Butt-head Do America (1996) 156 7 Cinderella (1950) 129 8 Hunchback of Notre Dame, The (1996) 127 9 James and the Giant Peach (1996) 126 **************************** ****************************** ****************************** These movies are the best to suggest to a new user within their requested genre as they are popular and well rated by the users who already watched them. These have rating more than 2.5 with atleast 100 viewers. **Recommendations based popularity and rating. These are top rated popular movies** movie title rating Number of Users watched 0 Close Shave, A (1995) 4.491071 112 1 Wrong Trousers, The (1993) 4.466102 118 5 Toy Story (1995) 3.878319 452 6 Aladdin (1992) 3.812785 219 8 Beauty and the Beast (1991) 3.792079 202 9 Lion King, The (1994) 3.781818 220 10 Fantasia (1940) 3.770115 174 11 Snow White and the Seven Dwarfs (1937) 3.709302 172 12 Pinocchio (1940) 3.673267 101 15 Cinderella (1950) 3.581395 129 17 Dumbo (1941) 3.495935 123 20 Hunchback of Notre Dame, The (1996) 3.377953 127 26 James and the Giant Peach (1996) 3.126984 126 33 Beavis and Butt-head Do America (1996) 2.788462 156 **************************** ****************************** ****************************** ``` Rating frequency as bar plot, movie recommendation based on only high ratings, only popularity and high rated popular movie for each movie genre separately. *The thresholds for ratings and number of viewers for a movie to be considered for high rated popular movie catedory are selected dynamically based on the total viewers and it these limits differ from genre to genre* ## [Item based Collaborative Recommender System using KNN](https://github.com/rposhala/Recommender-System-on-MovieLens-dataset/blob/main/Item_based_Collaborative_Recommender_System_using_KNN.ipynb) KNN algorithm is used to determine the corresponding similar movie or a user based on cosine similarity. K value is defined and desired number of nearest neighboring movies/users are returned. Datasets are loaded and similar EDA was performed as described above. A new dataset is created from the existing merged dataset by grouping the unique user id and movie title combination and the ratings by a user to the same movie in different instances (timestamps) are averaged and stored in the new dataset. An example of a multiple rating scenario by an user to a specific movie: ``` user id movie id rating timestamp movie title 894 246 4 882404137 Chasing Amy (1997) 894 268 3 879896041 Chasing Amy (1997) ``` For a KNN algorithm to implement, we have to form a matrix from the available data. From the EDA, we have observed that there are huge number of missing ratings. The matrix formed would be a sparse matrix with most of the entries having 0 in it. #### Reshaping the dataframe to make it compatible for KNN algorithm implementation We need to transform (reshape in this case) the data in such a way that each row of the dataframe represents a movie and each column represents a different user. So we want the data to be [movies, users] array if movie is the subject where similar movies must be found and [users, movies] array for reverse. To reshape the dataframe, we will pivot the dataframe to the wide format with movies as rows and users as columns. As we know that not all users watch all the movies, we can expect a lot of missing values. We will have to fill those missing observations with 0s since we are going to perform linear algebra operations (calculating distances between vectors). Finally, we transform the values of the dataframe into a scipy sparse matrix for most efficient calculations. This dataframe is then fed into a KNN model. **Two types of Collaborative recommendations are done using KNN algorithm in this project are:** ### Movie Recommender System for a User **Movie Recommendation using KNN with Input as User id, Number of similar users should the model pick and Number of movies you want to get recommended:** Reshaping the dataframe in such a way that each user has n-dimensional rating space where n is total number of movies We will train the KNN model inorder to find the closely matching similar users to the user we give as input and we recommend the top movies which would interest the input user. 1. Now we need to pick similar users for the given input User id 2. Then pick the highly rated popular movies among the movies watched by similar users. (Weightage has assigned based on the cosine distance) 3. Excluding the movies which are already seen by the input User and also the movies which are not at all seen by any of the similar users but are still in the list. (This is a crucial step as it could defeat the whole point of building a recommender system) With the help of the KNN model built, we could get desired number of top similar users. For example, lets's consider User: 778 ``` Few of movies seen by the User: ['Amityville Horror, The (1979)', 'Angels in the Outfield (1994)', 'Apocalypse Now (1979)', 'Apollo 13 (1995)', 'Austin Powers: International Man of Mystery (1997)', 'Babe (1995)', 'Back to the Future (1985)', 'Blues Brothers, The (1980)', 'Chasing Amy (1997)', 'Clerks (1994)'] Top 5 users who are very much similar to the User- 778 are: 1 . User: 124 separated by distance of 0.4586649429539592 2 . User: 933 separated by distance of 0.5581959868865324 3 . User: 56 separated by distance of 0.5858413112292744 4 . User: 738 separated by distance of 0.5916272517988691 5 . User: 653 separated by distance of 0.5991479757406326 ``` Now we will have to pick the top movies to recommend. One way would be by taking the average of the existing ratings given by the similar users and picking the top 10 or 15 movies to recommend to our current user. But I feel recommendation would be more effective if we define weights to ratings by each similar user based on the thier distance from the input user. Defining these weights would give us the accurate recommendations by eliminating the chance of decision manipulation by the users who are relatively very far from the input user. Functionality was defined to overcome below **Challenges**: 1. Recommends movies which are already seen by the given input User. 2. There is a possibility of recommending the movies which are not at all seen by any of the similar users. *Results for a User id: 307; number of similar users to be considered: 15; Enter number of movies to be recommended: 15 are: ``` Top 15 users who are very much similar to the User- 307 are: 1 . User: 70 separated by distance of 0.4560883724650484 2 . User: 738 separated by distance of 0.4846662001127756 3 . User: 922 separated by distance of 0.503221313979523 4 . User: 407 separated by distance of 0.5038250337403114 5 . User: 514 separated by distance of 0.5060750098353226 6 . User: 44 separated by distance of 0.5160506271876224 7 . User: 660 separated by distance of 0.5165826487301209 8 . User: 5 separated by distance of 0.5211146313938015 9 . User: 457 separated by distance of 0.5309167131718452 10 . User: 23 separated by distance of 0.5316197783536492 11 . User: 843 separated by distance of 0.5324703658288387 12 . User: 64 separated by distance of 0.53318921205275 13 . User: 198 separated by distance of 0.535682894616484 14 . User: 815 separated by distance of 0.5416036160331636 15 . User: 95 separated by distance of 0.5468066886836396 Movies recommended based on similar users are: ["Schindler's List (1993)", 'Liar Liar (1997)', 'When Harry Met Sally... (1989)', 'Leaving Las Vegas (1995)', 'Silence of the Lambs, The (1991)', 'Dead Man Walking (1995)', 'Trainspotting (1996)', 'Forrest Gump (1994)', 'Scream (1996)', 'Twelve Monkeys (1995)', 'Jerry Maguire (1996)', 'Raising Arizona (1987)', 'Godfather, The (1972)', 'Rock, The (1996)', 'Fugitive, The (1993)'] ``` ### Movie Recommender System using Movie Name **Movie Recommendation using KNN with Input as Movie Name and Number of movies you want to get recommended:** Reshaping model in such a way that each movie has n-dimensional rating space where n is total number of users who could rate. We will train the KNN model inorder to find the closely matching similar movies to the movie we give as input and we recommend the top movies which would more closely align to the movie we have given. For this section, a separate list for movie names and also case insensitive movie names and a dictionary which maps movie name with the index are created. Basic output of this recommender system using KNN: ``` Top 10 movies which are very much similar to the Movie- 101 Dalmatians (1996) are: Jack (1996) Twister (1996) Willy Wonka and the Chocolate Factory (1971) Independence Day (ID4) (1996) Toy Story (1995) Father of the Bride Part II (1995) Hunchback of Notre Dame, The (1996) Lion King, The (1994) Mrs. Doubtfire (1993) Jungle Book, The (1994) ``` **Key Challenge** which needs to be addressed in this segment is not recommending the similar movie names, *it is to let the user give the movie name with correct spelling* To address this challenge, a new functionality has been written. #### Dynamic movie name Suggestor **Dynamic movie name Suggestions for the User (through User Interface)** A functionality was designed to *dynamically suggesting movie name* from the existing movie corpus we have, based on the user input using try and except architecture. A function which outputs movie names as suggestion when the user mis spells the movie name. User might have intended to type any of these movie names. This function provides user with movie name suggestions if movie name is mis-spelled or Recommends similar movies to the input movie if the movie name is valid. Results of the Recommender System built using KNN along with Dynamic Suggestor: ``` Enter the Movie name: back Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions : ['Back to the Future (1985)', 'Backbeat (1993)', 'Best of the Best 3: No Turning Back (1995)', 'Empire Strikes Back, The (1980)', 'Hunchback of Notre Dame, The (1996)', 'Switchback (1997)'] Enter the Movie name: Empire Strikes Back, The (1980) Enter Number of movie recommendations needed: 15 Top 15 movies which are very much similar to the Movie- Empire Strikes Back, The (1980) are: Raiders of the Lost Ark (1981) Indiana Jones and the Last Crusade (1989) Back to the Future (1985) Star Wars (1977) Terminator, The (1984) Return of the Jedi (1983) Terminator 2: Judgment Day (1991) Princess Bride, The (1987) Jurassic Park (1993) Fugitive, The (1993) Silence of the Lambs, The (1991) E.T. the Extra-Terrestrial (1982) Star Trek: The Wrath of Khan (1982) Alien (1979) Blade Runner (1982) ``` **Observations:** on above built KNN Recommender System: An interesting observation would be that the above KNN model for movies recommends movies that are produced in very similar years of the input movie. However, the cosine distance of all those recommendations are observed to be actually quite small. This might be because there are too many zero values in our movie-user matrix. With too many zero values in our data, the data sparsity becomes a real issue for KNN model and the distance in KNN model starts to fall apart. ## [Recommender System using SVD](https://github.com/rposhala/Recommender-System-on-MovieLens-dataset/blob/main/Recommender_System_using_SVD.ipynb) Matrix Factorization is simply a mathematical operation for matrices. It is usually more effective in collaborative filtering, because it allows us to discover the latent (hidden) features underlying the interactions between users and items (movies). Utility matrix has been formed from the existing merged dataframe and normalized across the entity (movie or user) with which you want find the similarity. Singular Value Decomposition is done on utility matrix and latent features of rows and columns (movies and users in this case). In SVD decomposition, Where A is a m x n utility matrix, U is a m x r orthogonal left singular matrix, which represents the relationship between users and latent factors, S is a r x r diagonal matrix, which describes the strength of each latent factor and V is a r x n diagonal right singular matrix, which indicates the similarity between items and latent factors. The latent factors here are the characteristics of the items, for example, the genre of the music. The SVD decreases the dimension of the utility matrix A by extracting its latent factors. It maps each user and each item into a r-dimensional latent space. This mapping facilitates a clear representation of relationships between users and items/movies. **SVD reduces the dimensionality reduction and gets us important latent features which can almost approximate all values in the utility matrix (including null values). Already available values in the utility matrix can be used to evaluate the predictions and tune the parameters/weights in the latent features (if matrix factorization used) or help us to pick the number of latent features from the SVD decomposition. Once number of latent features to be picked are decided, we can populate the null values and use these predicted ratings of a user for movie to recommend the movie with highest predicted rating to that particular user.** A function is defined to calculate the cosine similarity on the given dataframe and extracting requesting number of closely matched movie indices with the help of numpy einsum which valuates the Einstein summation convention on the operands. Dynamic movie name suggestor discussed above is also used as part of user interactive interface. Movie Recommendations using SVD giving a movie name as input: ``` Enter the Movie name: dal Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions : ['101 Dalmatians (1996)', 'Mrs. Dalloway (1997)'] Enter the Movie name: 101 Dalmatians (1996) Enter Number of movie recommendations needed: 10 Top 10 movies which are very much similar to the Movie- 101 Dalmatians (1996) are: Black Beauty (1994) Free Willy 2: The Adventure Home (1995) Evening Star, The (1996) Robin Hood: Men in Tights (1993) Cool Runnings (1993) Turbo: A Power Rangers Movie (1997) Remains of the Day, The (1993) City Hall (1996) Children of the Corn: The Gathering (1996) ``` #### Limitations of Matrix factorization techniques Some limitations of matrix factorization include: * The difficulty of using side features (that is, any features beyond the query ID/item ID). As a result, the model can only be queried with a user or item present in the training set. * Relevance of recommendations. Popular items tend to be recommended for everyone, especially when using dot product as a similarity measure. It is better to capture specific user interests. * The matrix factorization also had the cold start problem due to the fact that it had no feature vector or embedding for the new items. * Matrix factorization works on the simple inner product of the User and item feature embeddings, it is often not enough to capture and represent the complex relations in the user and items. ## [Recommender System using Softmax Deep Neural Networks](https://github.com/rposhala/Recommender-System-on-MovieLens-dataset/blob/main/Recommender_System_using_Softmax_DNN.ipynb) #### Introduction The above mentioned limitations of matrix factorization can be addressed with the help of Deep Neural Network (DNN) models. Due to flexibility of the input layer of network, DNNs can easily incorporate query features and item features which can help capture the specific interests of a user and improve the relevance of recommendations. There are different types of Deep Neural Networks applications like DNN with Softmax layer, DNN with Autoencoder architecture or may it be Recommender System with Wide & Deep Neural Networks that can be applied to Recommender Systems for better movies to recommend. For this project, **Softmax Deep Neural Networks** are used to recommend movies. Users and Movies are one-hot encoded and fed into the Deep Neural Network as different distinct inputs and ratings are given as output. Deep Neural Network model was built by extracting the latent features of Users and movies with the help of Embedding layers and then Dense layers with dropouts were stacked in the end and finally a Dense layer with 9 neurons (one for each possible rating from 1 to 5) with a Softmax activation function was added. Hyperparmeters of the model were tuning, many loss functions and optimizers were tried with minimum validation loss as metric to built the model and get the weights. Finally, 'SGD' for optimizer and **Sparse Categorical Cross entropy** for loss function were picked. #### Movie Recommendations: User id is taken as input from the User. Then the movie ids which were not already seen by extracted from the available dataframe. How this DNN model works is, it takes two inputs, one of the input has user id's and the other has corresponding movie id's. Here DNN model tries to predict the ratings of the user - movie combination. So, we can input a specific user id (broadcasting it with the size of other input) and unseen movie id of the user and expect the model to give the ratings of the movies which would have been the ratings given by the user. Here, the ratings are already normalized and as we need the movies which interest the user more, ratings are not brought back to 0-5 scale. DNN model is used to predict the ratings of the unseen movies. **Predicted Ratings:** ```` [[6.28711879e-01 3.71125787e-01 1.93846718e-05 ... 2.48171236e-05 2.07571484e-05 3.11595759e-05] [5.16196430e-01 4.83636826e-01 2.06636632e-05 ... 2.40022491e-05 2.14833890e-05 3.09596326e-05] ... [6.53564811e-01 3.46285373e-01 1.90432311e-05 ... 2.25746426e-05 1.92296520e-05 2.91551714e-05]] ```` Output is of shape (1628, 9). We got probability of each possible rating from 1 to 5. We can extract specific rating which user would have given to a movie but it is not useful for these recommendations now. ```` array([0.6287119, 0.5161964, 0.8921049, ..., 0.6535648, 0.577208 , 0.6869574], dtype=float32) ```` These predicted pseudo-ratings of the user for the unseen movies are sorted with highest ratings in the first and these labels are inverse transformed to get desired number of Movie names. **Movie Recommendations using Softmax Deep Neural Network given user id as input:** ```` Enter user id 307 Enter number of movies to be recommended: 15 Movie seen by the User: ['12 Angry Men (1957)', '2001: A Space Odyssey (1968)', 'Abyss, The (1989)', 'Alien (1979)', 'Apollo 13 (1995)', 'Boot, Das (1981)', 'Brady Bunch Movie, The (1995)', 'Braveheart (1995)', 'Brazil (1985)', 'Casablanca (1942)', 'Close Shave, A (1995)', 'Contact (1997)', 'E.T. the Extra-Terrestrial (1982)', 'Empire Strikes Back, The (1980)', 'English Patient, The (1996)', 'Englishman Who Went Up a Hill, But Came Down a Mountain, The (1995)', 'Escape from L.A. (1996)', 'Fargo (1996)', ... ... 'Sex, Lies, and Videotape (1989)', 'Shadowlands (1993)', 'Shawshank Redemption, The (1994)', 'Shining, The (1980)', 'Sneakers (1992)', 'Snow White and the Seven Dwarfs (1937)', 'Sound of Music, The (1965)', 'Stand by Me (1986)', 'Star Trek III: The Search for Spock (1984)', 'Star Trek IV: The Voyage Home (1986)', 'Star Trek: The Motion Picture (1979)', 'Star Trek: The Wrath of Khan (1982)', 'Star Wars (1977)', 'Stargate (1994)', 'Tank Girl (1995)', 'Terminator, The (1984)', 'This Is Spinal Tap (1984)', 'Titanic (1997)', 'To Kill a Mockingbird (1962)', 'Top Gun (1986)', 'Toy Story (1995)', 'Wallace & Gromit: The Best of Aardman Animation (1996)', 'Wizard of Oz, The (1939)', 'Wrong Trousers, The (1993)'] ```` ```` Top 15 Movie recommendations for the User 307 are: ['Speed 2: Cruise Control (1997)', 'Houseguest (1994)', 'Batman & Robin (1997)', 'Magic Hour, The (1998)', "Devil's Advocate, The (1997)", 'Gone with the Wind (1939)', 'Cobb (1994)', 'Cool Runnings (1993)', 'Independence Day (ID4) (1996)', 'Smoke (1995)', 'Once Were Warriors (1994)', 'True Romance (1993)', 'Red Rock West (1992)', 'Third Man, The (1949)', 'MatchMaker, The (1997)'] ```` ================================================ FILE: Recommender_System_using_SVD.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Recommender-System-using-SVD.ipynb", "provenance": [], "collapsed_sections": [], "authorship_tag": "ABX9TyPOSQ55wsi8de+tmooQGYsg", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "metadata": { "id": "17vYjrcwNXOt" }, "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ], "execution_count": 1, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "RD2CO0eiNoCX" }, "source": [ "DATASET_LINK='http://files.grouplens.org/datasets/movielens/ml-100k.zip'" ], "execution_count": 2, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "mD1SZuNdNqV5", "outputId": "1c69d5ea-7c54-4ee6-8b43-a5730ede0c9d", "colab": { "base_uri": "https://localhost:8080/", "height": 622 } }, "source": [ "!wget -nc http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "!unzip -n ml-100k.zip" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "--2020-10-29 14:41:19-- http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152\n", "Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 4924029 (4.7M) [application/zip]\n", "Saving to: ‘ml-100k.zip’\n", "\n", "ml-100k.zip 100%[===================>] 4.70M 16.2MB/s in 0.3s \n", "\n", "2020-10-29 14:41:19 (16.2 MB/s) - ‘ml-100k.zip’ saved [4924029/4924029]\n", "\n", "Archive: ml-100k.zip\n", " creating: ml-100k/\n", " inflating: ml-100k/allbut.pl \n", " inflating: ml-100k/mku.sh \n", " inflating: ml-100k/README \n", " inflating: ml-100k/u.data \n", " inflating: ml-100k/u.genre \n", " inflating: ml-100k/u.info \n", " inflating: ml-100k/u.item \n", " inflating: ml-100k/u.occupation \n", " inflating: ml-100k/u.user \n", " inflating: ml-100k/u1.base \n", " inflating: ml-100k/u1.test \n", " inflating: ml-100k/u2.base \n", " inflating: ml-100k/u2.test \n", " inflating: ml-100k/u3.base \n", " inflating: ml-100k/u3.test \n", " inflating: ml-100k/u4.base \n", " inflating: ml-100k/u4.test \n", " inflating: ml-100k/u5.base \n", " inflating: ml-100k/u5.test \n", " inflating: ml-100k/ua.base \n", " inflating: ml-100k/ua.test \n", " inflating: ml-100k/ub.base \n", " inflating: ml-100k/ub.test \n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "tkaD_uOCNvjd" }, "source": [ "#Loading MovieLens dataset" ] }, { "cell_type": "markdown", "metadata": { "id": "atuOW5TGN0fh" }, "source": [ "Loading u.info -- The number of users, items, and ratings in the u data set." ] }, { "cell_type": "code", "metadata": { "id": "9_Ok0vy6Nw24", "outputId": "d4546608-2088-4767-cb5e-57ae5edb3c2c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "overall_stats = pd.read_csv('ml-100k/u.info', header=None)\n", "print(\"Details of users, items and ratings involved in the loaded movielens dataset: \",list(overall_stats[0]))" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "Details of users, items and ratings involved in the loaded movielens dataset: ['943 users', '1682 items', '100000 ratings']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "xP6_W-3IN60_" }, "source": [ "Loading u.data -- The full u data set, 100000 ratings by 943 users on 1682 items.\n", "\n", "---\n", "\n", "\n", "\n", " Each user has rated at least 20 movies. Users and items are\n", " numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of \n", "\t user id | item id | rating | timestamp. \n", " The time stamps are unix seconds since 1/1/1970 UTC " ] }, { "cell_type": "code", "metadata": { "id": "ST78PsBON_2e", "outputId": "f0dfb38f-763a-4a33-b08b-3a6566a9c2f7", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "## same item id is same as movie id, item id column is renamed as movie id\n", "column_names1 = ['user id','movie id','rating','timestamp']\n", "dataset = pd.read_csv('ml-100k/u.data', sep='\\t',header=None,names=column_names1)\n", "dataset.head() " ], "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestamp
01962423881250949
11863023891717742
2223771878887116
3244512880606923
41663461886397596
\n", "
" ], "text/plain": [ " user id movie id rating timestamp\n", "0 196 242 3 881250949\n", "1 186 302 3 891717742\n", "2 22 377 1 878887116\n", "3 244 51 2 880606923\n", "4 166 346 1 886397596" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "code", "metadata": { "id": "67YQURj2OD-4", "outputId": "c9fc4320-d84b-4ff9-be67-0aaeca2a3c5a", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "len(dataset), max(dataset['movie id']),min(dataset['movie id'])" ], "execution_count": 6, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(100000, 1682, 1)" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "3eNaoXfoOG3U" }, "source": [ "Loading u.item -- Information about the items (movies); this is a tab separated\n", "\n", " list of\n", " movie id | movie title | release date | video release date |\n", " IMDb URL | unknown | Action | Adventure | Animation |\n", " Children's | Comedy | Crime | Documentary | Drama | Fantasy |\n", " Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi |\n", " Thriller | War | Western |\n", " The last 19 fields are the genres, a 1 indicates the movie\n", " is of that genre, a 0 indicates it is not; movies can be in\n", " several genres at once.\n", " The movie ids are the ones used in the u.data data set.\n" ] }, { "cell_type": "code", "metadata": { "id": "wefeyoigOHO0", "outputId": "16131173-6a4c-40e0-b3b0-2f6c6b218803", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "d = 'movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western'\n", "column_names2 = d.split(' | ')\n", "print(column_names2)" ], "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ "['movie id', 'movie title', 'release date', 'video release date', 'IMDb URL', 'unknown', 'Action', 'Adventure', 'Animation', 'Children', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 'Musical', 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western']\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "kKCtFYT6OMwH", "outputId": "7911a631-e033-45d7-dfc3-62f916b28e81", "colab": { "base_uri": "https://localhost:8080/", "height": 758 } }, "source": [ "items_dataset = pd.read_csv('ml-100k/u.item', sep='|',header=None,names=column_names2,encoding='latin-1')\n", "items_dataset" ], "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie titlerelease datevideo release dateIMDb URLunknownActionAdventureAnimationChildrenComedyCrimeDocumentaryDramaFantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...0001110000000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...0110000000000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...0000000000000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...0100010010000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)0000001010000000100
...........................................................................
16771678Mat' i syn (1997)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?Mat%27+i+syn+...0000000010000000000
16781679B. Monkey (1998)06-Feb-1998NaNhttp://us.imdb.com/M/title-exact?B%2E+Monkey+(...0000000000000010100
16791680Sliding Doors (1998)01-Jan-1998NaNhttp://us.imdb.com/Title?Sliding+Doors+(1998)0000000010000010000
16801681You So Crazy (1994)01-Jan-1994NaNhttp://us.imdb.com/M/title-exact?You%20So%20Cr...0000010000000000000
16811682Scream of Stone (Schrei aus Stein) (1991)08-Mar-1996NaNhttp://us.imdb.com/M/title-exact?Schrei%20aus%...0000000010000000000
\n", "

1682 rows × 24 columns

\n", "
" ], "text/plain": [ " movie id movie title ... War Western\n", "0 1 Toy Story (1995) ... 0 0\n", "1 2 GoldenEye (1995) ... 0 0\n", "2 3 Four Rooms (1995) ... 0 0\n", "3 4 Get Shorty (1995) ... 0 0\n", "4 5 Copycat (1995) ... 0 0\n", "... ... ... ... .. ...\n", "1677 1678 Mat' i syn (1997) ... 0 0\n", "1678 1679 B. Monkey (1998) ... 0 0\n", "1679 1680 Sliding Doors (1998) ... 0 0\n", "1680 1681 You So Crazy (1994) ... 0 0\n", "1681 1682 Scream of Stone (Schrei aus Stein) (1991) ... 0 0\n", "\n", "[1682 rows x 24 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "code", "metadata": { "id": "va0LfWdWOPlS", "outputId": "9ff29312-94fa-4112-b95d-b7439f761818", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "movie_dataset = items_dataset[['movie id','movie title']]\n", "movie_dataset.head()" ], "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie title
01Toy Story (1995)
12GoldenEye (1995)
23Four Rooms (1995)
34Get Shorty (1995)
45Copycat (1995)
\n", "
" ], "text/plain": [ " movie id movie title\n", "0 1 Toy Story (1995)\n", "1 2 GoldenEye (1995)\n", "2 3 Four Rooms (1995)\n", "3 4 Get Shorty (1995)\n", "4 5 Copycat (1995)" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "jPAs7eSzOSo3" }, "source": [ "Looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column" ] }, { "cell_type": "code", "metadata": { "id": "xGq7uutfOS4n", "outputId": "a7840282-bc5b-4911-baf4-3ef3fdffe2b6", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "## looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column\n", "len(items_dataset.groupby(by=column_names2[1:])),len(items_dataset)" ], "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1664, 1682)" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "A2QGg2ccOaIC" }, "source": [ "We can see there are 18 extra movie id's for already mapped movie title and the same duplicate movie id is assigned to the user in the user-item dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "LKHTNFPHOdbD" }, "source": [ "#Merging required datasets" ] }, { "cell_type": "code", "metadata": { "id": "2miH5N1TOY7c", "outputId": "fb7cb9f5-8fd8-4968-f086-b8ec8c84c2ef", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "merged_dataset = pd.merge(dataset, movie_dataset, how='inner', on='movie id')\n", "merged_dataset.head()" ], "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
01962423881250949Kolya (1996)
1632423875747190Kolya (1996)
22262425883888671Kolya (1996)
31542423879138235Kolya (1996)
43062425876503793Kolya (1996)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "0 196 242 3 881250949 Kolya (1996)\n", "1 63 242 3 875747190 Kolya (1996)\n", "2 226 242 5 883888671 Kolya (1996)\n", "3 154 242 3 879138235 Kolya (1996)\n", "4 306 242 5 876503793 Kolya (1996)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "OqTRx84wOn8k" }, "source": [ "A dataset is created from the existing merged dataset by grouping the unique user id and movie title combination and the ratings by a user to the same movie in different instances (timestamps) are averaged and stored in the new dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "1ZwpiFVyOrM7" }, "source": [ "Example of a multiple rating scenario by an user to a specific movie:" ] }, { "cell_type": "code", "metadata": { "id": "BUP7kGAOOoyY", "outputId": "50dd79ff-34ce-43d6-f571-d3a91e196baa", "colab": { "base_uri": "https://localhost:8080/", "height": 106 } }, "source": [ "merged_dataset[(merged_dataset['movie title'] == 'Chasing Amy (1997)') & (merged_dataset['user id'] == 894)]" ], "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
48008942464882404137Chasing Amy (1997)
223408942683879896041Chasing Amy (1997)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "4800 894 246 4 882404137 Chasing Amy (1997)\n", "22340 894 268 3 879896041 Chasing Amy (1997)" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "JvhzXCA75Vfz" }, "source": [ "## Creating a final refined dataset with unique user id, movie name combination and their ratings:\n" ] }, { "cell_type": "code", "metadata": { "id": "6t2LGS8oOv_9", "outputId": "c95cde04-a43b-4688-9b86-afddcc36230d", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset = merged_dataset.groupby(by=['user id','movie title'], as_index=False).agg({\"rating\":\"mean\"})\n", "\n", "refined_dataset.head()" ], "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titlerating
01101 Dalmatians (1996)2.0
1112 Angry Men (1957)5.0
2120,000 Leagues Under the Sea (1954)3.0
312001: A Space Odyssey (1968)4.0
41Abyss, The (1989)3.0
\n", "
" ], "text/plain": [ " user id movie title rating\n", "0 1 101 Dalmatians (1996) 2.0\n", "1 1 12 Angry Men (1957) 5.0\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0\n", "3 1 2001: A Space Odyssey (1968) 4.0\n", "4 1 Abyss, The (1989) 3.0" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "cell_type": "markdown", "metadata": { "id": "_2XqWYvV5h1d" }, "source": [ "## Creating lists for unique user id's and movie names:" ] }, { "cell_type": "code", "metadata": { "id": "6YV2O4CvOv5u", "outputId": "81dd1e52-8bdc-4835-eeb3-2a967b97300d", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "#list of all users\n", "unique_users = refined_dataset['user id'].unique() \n", "#creating a list of all movie names in it\n", "unique_movies = refined_dataset['movie title'].unique()\n", "len(unique_movies),len(unique_users)" ], "execution_count": 14, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1664, 943)" ] }, "metadata": { "tags": [] }, "execution_count": 14 } ] }, { "cell_type": "markdown", "metadata": { "id": "gBHl_tPZ7oCy" }, "source": [ "## Converting user id, movie name column of refined dataset to respective lists:" ] }, { "cell_type": "code", "metadata": { "id": "CXSqRdqz-4aA", "outputId": "c50be8a9-296d-4ee9-e450-60d021fcc2a4", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "users_list = refined_dataset['user id'].tolist()\n", "movie_list = refined_dataset['movie title'].tolist()\n", "len(users_list),len(movie_list)" ], "execution_count": 15, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(99693, 99693)" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "markdown", "metadata": { "id": "Gxy-Q_aL754R" }, "source": [ "## Extracting ratings into a list:" ] }, { "cell_type": "code", "metadata": { "id": "KndchZIe0Vp3", "outputId": "f44614ca-4ad0-4c36-aca4-3c083cb12270", "colab": { "base_uri": "https://localhost:8080/", "height": 70 } }, "source": [ "ratings_list = refined_dataset['rating'].tolist()\n", "print(ratings_list)\n", "len(ratings_list)" ], "execution_count": 16, "outputs": [ { "output_type": "stream", "text": [ "[2.0, 5.0, 3.0, 4.0, 3.0, 3.0, 1.0, 4.0, 4.0, 5.0, 5.0, 1.0, 5.0, 4.0, 5.0, 3.0, 4.0, 2.0, 4.0, 4.0, 1.0, 5.0, 2.0, 3.0, 1.0, 1.0, 1.0, 3.0, 2.0, 3.0, 5.0, 2.0, 4.0, 5.0, 4.0, 5.0, 3.0, 4.0, 5.0, 1.0, 5.0, 4.0, 4.0, 3.0, 3.0, 3.0, 4.0, 5.0, 5.0, ..., 5.0, 1.0, 3.0, 1.0, 4.0, 4.0, 2.0, 5.0, 5.0, 4.0, 3.0, 5.0, 4.0, 5.0, 5.0, 3.0, 3.0, 4.0, 4.0, 3.0, 4.0, 3.0, 5.0, 4.0, 4.0, 3.0, 4.0, 5.0, 5.0, 4.0, 5.0, 3.0, 3.0, 4.0, 4.0, 4.0, 5.0, 4.0, 4.0, 4.0, 5.0, 5.0, 2.0, 2.0, 5.0, 4.0, 4.0, 4.0, 3.0, 3.0, 5.0, 4.0, 5.0, 5.0, 3.0, 4.0, 4.0, 4.0, 5.0, 4.0, 3.0, 5.0, 5.0, 5.0, 3.0, 4.0, 5.0, 5.0, 3.0, 5.0, 5.0, 5.0, 3.0, 5.0, 5.0, 2.0, 4.0, 5.0, 5.0, 5.0, 5.0, 4.0, 4.0, 5.0, 4.0, 4.0, 5.0, 3.0, 4.0, 5.0, 4.0, 5.0, 4.0, 5.0, 3.0, 3.0, 4.0, 5.0, 4.0, 4.0, 5.0, 5.0, 4.0, 5.0, 5.0, 4.0, 4.0, 5.0, 4.0, 4.0, 4.0, 5.0, 4.0, 5.0, 4.0, 5.0, 3.0, 4.0, 5.0, 4.0, 4.0, 3.0, 5.0, 4.0, 4.0, 4.0, 2.0, 4.0, 1.0, 3.0, 4.0, 1.0, 5.0, 3.0, 3.0, 4.0, 4.0, 2.0, 4.0, 4.0, 2.0, 5.0, 3.0, 2.0, 1.0, 3.0, 4.0, 4.0, 1.0, 5.0, 4.0, 4.0, 4.0, 1.0, 4.0, 5.0, 4.0, 4.0, 4.0, 5.0, 5.0, 4.0, 4.0, 2.0, 4.0, 3.0, 5.0, 4.0, 3.0, 4.0, 2.0, 5.0, 4.0, 2.0, 5.0, 2.0, 2.0, 5.0, 1.0, 5.0, 5.0, 4.0, 2.0, 5.0, 5.0, 5.0, 5.0, 5.0, 4.0, 2.0, 2.0, 4.0, 4.0, 4.0, 2.0, 3.0, 4.0, 4.0, 3.0, 3.0, 4.0, 3.0, 4.0, 4.0, 5.0, 2.0, 4.0, 1.0, 3.0, 1.0, 5.0, 2.0, 2.0, 3.0, 4.0, 2.0, 4.0, 2.0, 2.0, 5.0, 3.0, 3.0, 4.0, 3.0, 2.0, 4.0, 3.0, 5.0, 5.0, 4.0, 5.0, 5.0, 4.0, 2.0, 5.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 1.0, 4.0, 2.0, 4.0, 3.0, 3.0, 4.0, 5.0, 4.0, 5.0, 5.0, 1.0, 3.0, 3.0, 4.0, 2.0, 1.0, 1.0, 1.0, 1.0, 3.0, 4.0, 3.0, 5.0, 3.0, 4.0, 4.0, 4.0, 3.0, 1.0, 5.0, 2.0, 4.0, 4.0, 4.0, 5.0, 4.0, 4.0, 5.0, 4.0, 5.0, 3.0, 5.0, 2.0, 4.0, 2.0, 4.0, 1.0, 3.0, 2.0, 1.0, 4.0, 3.0]\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "99693" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "pKPESOnj8BFn" }, "source": [ "## Creating a dictionary to map movie name to their corresponding index in the unique movie name list" ] }, { "cell_type": "code", "metadata": { "id": "IqxEfLEXif6R", "outputId": "068d9556-810d-4885-c561-1bf242118683", "colab": { "base_uri": "https://localhost:8080/", "height": 70 } }, "source": [ "movies_dict = {unique_movies[i] : i for i in range(len(unique_movies))}\n", "print(movies_dict)\n", "print(len(movies_dict))" ], "execution_count": 17, "outputs": [ { "output_type": "stream", "text": [ "{'101 Dalmatians (1996)': 0, '12 Angry Men (1957)': 1, '20,000 Leagues Under the Sea (1954)': 2, '2001: A Space Odyssey (1968)': 3, 'Abyss, The (1989)': 4, 'Ace Ventura: Pet Detective (1994)': 5, 'Air Bud (1997)': 6, 'Akira (1988)': 7, 'Aladdin (1992)': 8, 'Alien (1979)': 9, 'Aliens (1986)': 10, 'All Dogs Go to Heaven 2 (1996)': 11, 'Amadeus (1984)': 12, 'Angels and Insects (1995)': 13, \"Antonia's Line (1995)\": 14, 'Apocalypse Now (1979)': 15, ..... , 'Entertaining Angels: The Dorothy Day Story (1996)': 1637, 'Favor, The (1994)': 1638, 'Little City (1998)': 1639, 'Target (1995)': 1640, 'Getting Away With Murder (1996)': 1641, 'Small Faces (1995)': 1642, 'New Age, The (1994)': 1643, 'Rough Magic (1995)': 1644, '8 Heads in a Duffel Bag (1997)': 1645, \"Brother's Kiss, A (1997)\": 1646, 'MURDER and murder (1996)': 1647, 'Next Step, The (1995)': 1648, 'Nothing Personal (1995)': 1649, 'Ripe (1996)': 1650, 'Tainted (1998)': 1651, 'Wedding Bell Blues (1996)': 1652, 'Further Gesture, A (1996)': 1653, 'Kika (1993)': 1654, 'Mirage (1995)': 1655, 'Mamma Roma (1962)': 1656, 'Sunchaser, The (1996)': 1657, 'War at Home, The (1996)': 1658, 'Sweet Nothing (1995)': 1659, 'B. Monkey (1998)': 1660, \"Mat' i syn (1997)\": 1661, 'You So Crazy (1994)': 1662, 'Scream of Stone (Schrei aus Stein) (1991)': 1663}\n", "1664\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Dyk5N4CQ8eTG" }, "source": [ "## Creating a Utility matrix with rows as movies, columns as users, to make the refined dataframe compatible for SVD operations" ] }, { "cell_type": "code", "metadata": { "id": "xQCQFZoFmk9M", "outputId": "043372bf-07c3-489c-c3c8-52f9a5d5fd98", "colab": { "base_uri": "https://localhost:8080/", "height": 151 } }, "source": [ "## creating a utility matrix for the available data\n", "\n", "## Creating an empty array with (number of rows = number of movies) and (number of columns = number of users) rows as movies, columns as users\n", "\n", "utility_matrix = np.asarray([[np.nan for j in range(len(unique_users))] for i in range(len(unique_movies))])\n", "print(\"Shape of Utility matrix: \",utility_matrix.shape)\n", "\n", "for i in range(len(ratings_list)):\n", "\n", " ## ith entry in users list and subtract 1 to get the index, we do the same for movies but we already defined a dictionary to get the index.\n", " utility_matrix[movies_dict[movie_list[i]]][users_list[i]-1] = ratings_list[i]\n", "\n", "utility_matrix" ], "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ "Shape of Utility matrix: (1664, 943)\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "array([[ 2., nan, nan, ..., nan, nan, nan],\n", " [ 5., nan, nan, ..., nan, nan, nan],\n", " [ 3., nan, nan, ..., nan, nan, nan],\n", " ...,\n", " [nan, nan, nan, ..., nan, nan, nan],\n", " [nan, nan, nan, ..., nan, nan, nan],\n", " [nan, nan, nan, ..., nan, nan, nan]])" ] }, "metadata": { "tags": [] }, "execution_count": 18 } ] }, { "cell_type": "markdown", "metadata": { "id": "Sbawp-X19TBo" }, "source": [ "## Normalizing the utility matrix across movies column" ] }, { "cell_type": "code", "metadata": { "id": "Kehwev_F-blc" }, "source": [ "mask = np.isnan(utility_matrix)\n", "masked_arr = np.ma.masked_array(utility_matrix, mask)\n", "temp_mask = masked_arr.T\n", "rating_means = np.mean(temp_mask, axis=0)\n", "\n", "filled_matrix = temp_mask.filled(rating_means)\n", "filled_matrix = filled_matrix.T\n", "filled_matrix = filled_matrix - rating_means.data[:,np.newaxis]" ], "execution_count": 19, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "WcGCWYTO1kmG", "outputId": "2b9ae5eb-4529-4bc3-c870-28676256621a", "colab": { "base_uri": "https://localhost:8080/", "height": 235 } }, "source": [ "filled_matrix = filled_matrix.T / np.sqrt(len(movies_dict)-1)\n", "filled_matrix" ], "execution_count": 21, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[-0.02227217, 0.01608636, -0.01226094, ..., 0. ,\n", " 0. , 0. ],\n", " [ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ],\n", " [ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ],\n", " ...,\n", " [ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ],\n", " [ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ],\n", " [ 0. , 0. , 0. , ..., 0. ,\n", " 0. , 0. ]])" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "markdown", "metadata": { "id": "4N4udwv7A_Bv" }, "source": [ "Mean values across movies columns are extracted. \n", "Nan's of utility matrix are imputed with mean values extracted. \n", "Later the utility matrix has been normalized across movies to get all ratings to a standard/normal scale." ] }, { "cell_type": "code", "metadata": { "id": "d8hm0fzFDP77", "outputId": "402a6331-51b4-46ea-aa75-93548f4ad4e4", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "filled_matrix.shape" ], "execution_count": 22, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(943, 1664)" ] }, "metadata": { "tags": [] }, "execution_count": 22 } ] }, { "cell_type": "markdown", "metadata": { "id": "c6DtibCbBelJ" }, "source": [ "## Computing SVD (Singular Value Decomposition) of Utility matrix" ] }, { "cell_type": "code", "metadata": { "id": "2aTS24TEN9Cv" }, "source": [ "## Computing the SVD of the input matrix\n", "\n", "U, S, V = np.linalg.svd(filled_matrix)" ], "execution_count": 23, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "2p2qtdC4Bl7s" }, "source": [ "## Creating a list of Case insensitive movie names for further use" ] }, { "cell_type": "code", "metadata": { "id": "lxXk1y4f0wxj" }, "source": [ "case_insensitive_movies_list = [i.lower() for i in unique_movies]" ], "execution_count": 39, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "gSJ0LSEaBvuu" }, "source": [ "## Defining a function to calculate the cosine similarity on the given dataframe and extracting requesting number of closely matched movie indices with the help of numpy einsum which valuates the Einstein summation convention on the operands." ] }, { "cell_type": "code", "metadata": { "id": "3GDCTxTDDQco" }, "source": [ "#Function to calculate the cosine similarity (sorting by most similar and returning the top N)\n", "def top_cosine_similarity(data, movie_id, top_n=10):\n", " index = movie_id \n", " movie_row = data[index, :]\n", " magnitude = np.sqrt(np.einsum('ij, ij -> i', data, data))\n", " similarity = np.dot(movie_row, data.T) / (magnitude[index] * magnitude)\n", " sort_indexes = np.argsort(-similarity)\n", " return sort_indexes[:top_n]" ], "execution_count": 28, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "3VgUlWboC-tU" }, "source": [ "## Defining a function to get similar movies for the given movie name" ] }, { "cell_type": "code", "metadata": { "id": "YXej0Ynk1HP2" }, "source": [ "#k-principal components to represent movies, movie_id to find recommendations, top_n print n results \n", "def get_similar_movies(movie_name,top_n,k = 50):\n", " # k = 50\n", " # movie_id = 1\n", " # top_n = 10\n", " \n", " sliced = V.T[:, :k] # representative data\n", " movie_id = movies_dict[movie_name]\n", " indexes = top_cosine_similarity(sliced, movie_id, top_n)\n", " print(\" \")\n", " print(\"Top\",top_n,\"movies which are very much similar to the Movie-\",movie_name, \"are: \")\n", " print(\" \")\n", " for i in indexes[1:]:\n", " print(unique_movies[i])" ], "execution_count": 49, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ycb2Ws3jDHuC" }, "source": [ "In SVD decomposition, Where A is a m x n utility matrix, U is a m x r orthogonal left singular matrix, which represents the relationship between users and latent factors, S is a r x r diagonal matrix, which describes the strength of each latent factor and V is a r x n diagonal right singular matrix, which indicates the similarity between items and latent factors. The latent factors here are the characteristics of the items, for example, the genre of the music. The SVD decreases the dimension of the utility matrix A by extracting its latent factors. It maps each user and each item into a r-dimensional latent space. This mapping facilitates a clear representation of relationships between users and items. " ] }, { "cell_type": "markdown", "metadata": { "id": "pMRX3J2wDp_Z" }, "source": [ "**Dynamically suggesting** movie name from the existing movie corpus we have, based on the user input using try and except architecture." ] }, { "cell_type": "markdown", "metadata": { "id": "LvjPjBnIDthD" }, "source": [ "Defining a function which outputs movie names as suggestion when the user mis spells the movie name. **User might have intended to type any of these movie names.**" ] }, { "cell_type": "code", "metadata": { "id": "ou18jV8PQDmA" }, "source": [ "# function which takes input and returns suggestions for the user\n", "\n", "def get_possible_movies(movie):\n", "\n", " temp = ''\n", " possible_movies = case_insensitive_movies_list.copy()\n", " for i in movie :\n", " out = []\n", " temp += i\n", " for j in possible_movies:\n", " if temp in j:\n", " out.append(j)\n", " if len(out) == 0:\n", " return possible_movies\n", " out.sort()\n", " possible_movies = out.copy()\n", "\n", " return possible_movies" ], "execution_count": 50, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "qvhIwdhpDyip" }, "source": [ "This function provides user with **movie name suggestions if movie name is mis-spelled** or **Recommends similar movies to the input movie** if the movie name is valid." ] }, { "cell_type": "code", "metadata": { "id": "aAght7el0XT3" }, "source": [ "class invalid(Exception):\n", " pass\n", "\n", "def recommender():\n", " \n", " try:\n", "\n", " movie_name = input(\"Enter the Movie name: \")\n", " movie_name_lower = movie_name.lower()\n", " if movie_name_lower not in case_insensitive_movies_list :\n", " raise invalid\n", " else :\n", " # movies_list[case_insensitive_country_names.index(movie_name_lower)]\n", " num_recom = int(input(\"Enter Number of movie recommendations needed: \"))\n", " get_similar_movies(unique_movies[case_insensitive_movies_list.index(movie_name_lower)],num_recom)\n", "\n", " except invalid:\n", "\n", " possible_movies = get_possible_movies(movie_name_lower)\n", "\n", " if len(possible_movies) == len(unique_movies) :\n", " print(\"Movie name entered is does not exist in the list \")\n", " else :\n", " indices = [case_insensitive_movies_list.index(i) for i in possible_movies]\n", " print(\"Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions :\\n\",[unique_movies[i] for i in indices])\n", " print(\"\")\n", " recommender()\n" ], "execution_count": 46, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "VETs7zJu3vFD", "outputId": "d7b79b0b-b6c1-4ddd-d772-773405d8f3f1", "colab": { "base_uri": "https://localhost:8080/", "height": 319 } }, "source": [ "recommender()" ], "execution_count": 47, "outputs": [ { "output_type": "stream", "text": [ "Enter the Movie name: dal\n", "Entered Movie name is not matching with any movie from the dataset . Please check the below suggestions :\n", " ['101 Dalmatians (1996)', 'Mrs. Dalloway (1997)']\n", "Enter the Movie name: 101 Dalmatians (1996)\n", "Enter Number of movie recommendations needed: 10\n", "Top 10 movies which are very much similar to the Movie- 101 Dalmatians (1996) are: \n", " \n", "Black Beauty (1994)\n", "Free Willy 2: The Adventure Home (1995)\n", "Evening Star, The (1996)\n", "Robin Hood: Men in Tights (1993)\n", "Cool Runnings (1993)\n", "Turbo: A Power Rangers Movie (1997)\n", "Remains of the Day, The (1993)\n", "City Hall (1996)\n", "Children of the Corn: The Gathering (1996)\n" ], "name": "stdout" }, { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:6: RuntimeWarning: invalid value encountered in true_divide\n", " \n" ], "name": "stderr" } ] }, { "cell_type": "markdown", "metadata": { "id": "HE0WgcdUD7RN" }, "source": [ "## Conclusion:\n", "\n", "The above built recommender system can suggest movie names similar to the given movie name. The same architecture can be built to get similar users for the given user id and then suggesting movies from those user id's (this would be item-item collaborative filtering). This can be done just by extracting latent factors of U matrix (which corresponds to Users) instead V matrix (which corresponds to Movies) as we did. But a better recommender system can be built only if we could change the axis of normalization of utility matrix to userid from movies." ] }, { "cell_type": "code", "metadata": { "id": "G9YUfb5A5Kg3" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "p8sBqW8S5Lz8" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "9IZa7DpF5MGL" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "6Kr6myjW5Ml_" }, "source": [ "# Rough Work" ] }, { "cell_type": "code", "metadata": { "id": "B5X-Z7D1QDiW", "outputId": "cb8a352b-0216-4e7b-b9e4-e7374929349d", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "movies_dict['101 Dalmatians (1996)']" ], "execution_count": 78, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0" ] }, "metadata": { "tags": [] }, "execution_count": 78 } ] }, { "cell_type": "code", "metadata": { "id": "17hc3lLlDQDe", "outputId": "75d763d2-ad6c-4a5b-b2bd-e4595879576d", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "len(movie_list)" ], "execution_count": 48, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "99693" ] }, "metadata": { "tags": [] }, "execution_count": 48 } ] }, { "cell_type": "code", "metadata": { "id": "VtbcVhCW0ARz", "outputId": "bffa5c2c-b1c3-466a-8325-e3c4291ca5f7", "colab": { "base_uri": "https://localhost:8080/", "height": 134 } }, "source": [ "util_mat = np.asarray([[np.nan for j in range(4)] for i in range(7)])\n", "util_mat[6][3] = 4\n", "util_mat[2][3] = 12\n", "util_mat[6][0] = 1\n", "util_mat[4][1] = 4\n", "util_mat[0][2] = 8\n", "util_mat[5][1] = 2\n", "util_mat[6][3] = 3\n", "util_mat[3][1] = 6\n", "util_mat[5][0] = 10\n", "util_mat[1][3] = 2\n", "util_mat[0][2] = 7\n", "util_mat[1][0] = 13\n", "util_mat" ], "execution_count": 58, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[nan, nan, 7., nan],\n", " [13., nan, nan, 2.],\n", " [nan, nan, nan, 12.],\n", " [nan, 6., nan, nan],\n", " [nan, 4., nan, nan],\n", " [10., 2., nan, nan],\n", " [ 1., nan, nan, 3.]])" ] }, "metadata": { "tags": [] }, "execution_count": 58 } ] }, { "cell_type": "code", "metadata": { "id": "5comEfTi0IW3", "outputId": "69500841-9edf-4351-e63a-49f49c278865", "colab": { "base_uri": "https://localhost:8080/", "height": 134 } }, "source": [ "mask = np.isnan(util_mat)\n", "masked_arr = np.ma.masked_array(util_mat, mask)\n", "transp = masked_arr.T\n", "item_means = np.mean(transp, axis=0)\n", "# np.mean(utility_matrix,axis=0)\n", "s = transp.filled(item_means)\n", "s = s.T\n", "s" ], "execution_count": 59, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[ 7. , 7. , 7. , 7. ],\n", " [13. , 7.5, 7.5, 2. ],\n", " [12. , 12. , 12. , 12. ],\n", " [ 6. , 6. , 6. , 6. ],\n", " [ 4. , 4. , 4. , 4. ],\n", " [10. , 2. , 6. , 6. ],\n", " [ 1. , 2. , 2. , 3. ]])" ] }, "metadata": { "tags": [] }, "execution_count": 59 } ] }, { "cell_type": "code", "metadata": { "id": "SkPQTEmH96IF", "outputId": "6427e140-39bf-4f68-bd32-bcf83ccfb3d8", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "e = item_means.data\n", "e" ], "execution_count": 50, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([ 7. , 7.5, 12. , 6. , 4. , 6. , 2. ])" ] }, "metadata": { "tags": [] }, "execution_count": 50 } ] }, { "cell_type": "code", "metadata": { "id": "XC-aG00U9Wqf" }, "source": [ "e = e[:,np.newaxis]" ], "execution_count": 56, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "aaIqSo4K8eTJ", "outputId": "46f64732-6668-4462-b1d6-f486c90282a3", "colab": { "base_uri": "https://localhost:8080/", "height": 134 } }, "source": [ "s.T - e" ], "execution_count": 57, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[ 0. , 0. , 0. , 0. ],\n", " [ 5.5, 0. , 0. , -5.5],\n", " [ 0. , 0. , 0. , 0. ],\n", " [ 0. , 0. , 0. , 0. ],\n", " [ 0. , 0. , 0. , 0. ],\n", " [ 4. , -4. , 0. , 0. ],\n", " [-1. , 0. , 0. , 1. ]])" ] }, "metadata": { "tags": [] }, "execution_count": 57 } ] }, { "cell_type": "code", "metadata": { "id": "ZH39mBBy715B", "outputId": "25641717-d2ed-4e14-d3c3-31a6082cdd11", "colab": { "base_uri": "https://localhost:8080/", "height": 50 } }, "source": [ "d = np.asarray([[2,3,5],[5,6,8]])\n", "d - [[2],[5]]" ], "execution_count": 36, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[0, 1, 3],\n", " [0, 1, 3]])" ] }, "metadata": { "tags": [] }, "execution_count": 36 } ] }, { "cell_type": "code", "metadata": { "id": "dQVerReH9POv", "outputId": "e7b1bfe4-d30e-4ca3-8dc2-ab8da38ba7ea", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "f = np.asarray([2,5])\n", "f.T" ], "execution_count": 44, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([2, 5])" ] }, "metadata": { "tags": [] }, "execution_count": 44 } ] }, { "cell_type": "code", "metadata": { "id": "Khl0RiRc9lax", "outputId": "94c20cb8-758b-4036-e68d-76612c3f4263", "colab": { "base_uri": "https://localhost:8080/", "height": 67 } }, "source": [ "k = np.asarray([[2,3,5],[5,6,8],[6,3,1]])\n", "k" ], "execution_count": 37, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([[2, 3, 5],\n", " [5, 6, 8],\n", " [6, 3, 1]])" ] }, "metadata": { "tags": [] }, "execution_count": 37 } ] }, { "cell_type": "code", "metadata": { "id": "MjWvWZPCDoNH", "outputId": "c5812bc0-4345-42d8-f85d-4542d979d25c", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "np.einsum('ij, ij -> i', k, k)" ], "execution_count": 38, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([ 38, 125, 46])" ] }, "metadata": { "tags": [] }, "execution_count": 38 } ] }, { "cell_type": "code", "metadata": { "id": "j-rpqWG7e30t", "outputId": "e9b54a7e-78c5-46b9-f4ae-5b037fe38d17", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "np.einsum('ii, ii', k, k)" ], "execution_count": 45, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "41" ] }, "metadata": { "tags": [] }, "execution_count": 45 } ] }, { "cell_type": "code", "metadata": { "id": "Z9saWfdsfBMz", "outputId": "6e78d305-1bba-44c8-afc7-3cf724c1383e", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "a = [[1,3],[4,6]]\n", "np.einsum('ij, ij -> i', a, a)" ], "execution_count": 46, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([10, 52])" ] }, "metadata": { "tags": [] }, "execution_count": 46 } ] }, { "cell_type": "code", "metadata": { "id": "GWpvRta3fQr3" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] } ================================================ FILE: Recommender_System_using_Softmax_DNN.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Recommender-System-using-Softmax-DNN.ipynb", "provenance": [], "collapsed_sections": [], "authorship_tag": "ABX9TyNEZIZ1oRmoZXi5mI4AT+Ue", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "f4dpxTTFCNQi" }, "source": [ "## Loading the libraries" ] }, { "cell_type": "code", "metadata": { "id": "pK__TGE8ABxK" }, "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import LabelEncoder" ], "execution_count": 1, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "uKKckGQngZKP" }, "source": [ "# from keras.models import Model\n", "# from keras.layers import Input, Reshape, Dot\n", "# from keras.layers.embeddings import Embedding\n", "# from keras.optimizers import Adam\n", "# from keras.regularizers import l2\n", "# from keras.layers import Concatenate, Dense, Dropout\n", "# from keras.layers import Add, Activation, Lambda\n", "\n", "import tensorflow as tf\n", "import keras\n", "from pprint import pprint" ], "execution_count": 22, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "CEwzA81KOtn8" }, "source": [ "DATASET_LINK='http://files.grouplens.org/datasets/movielens/ml-100k.zip'" ], "execution_count": 2, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "_toQkgU7Ot8r", "outputId": "e9ca5b39-c7b4-487d-8e0c-f22dbd46787b", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "!wget -nc http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "!unzip -n ml-100k.zip" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "--2020-11-14 13:56:35-- http://files.grouplens.org/datasets/movielens/ml-100k.zip\n", "Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152\n", "Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:80... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 4924029 (4.7M) [application/zip]\n", "Saving to: ‘ml-100k.zip’\n", "\n", "ml-100k.zip 100%[===================>] 4.70M 16.1MB/s in 0.3s \n", "\n", "2020-11-14 13:56:35 (16.1 MB/s) - ‘ml-100k.zip’ saved [4924029/4924029]\n", "\n", "Archive: ml-100k.zip\n", " creating: ml-100k/\n", " inflating: ml-100k/allbut.pl \n", " inflating: ml-100k/mku.sh \n", " inflating: ml-100k/README \n", " inflating: ml-100k/u.data \n", " inflating: ml-100k/u.genre \n", " inflating: ml-100k/u.info \n", " inflating: ml-100k/u.item \n", " inflating: ml-100k/u.occupation \n", " inflating: ml-100k/u.user \n", " inflating: ml-100k/u1.base \n", " inflating: ml-100k/u1.test \n", " inflating: ml-100k/u2.base \n", " inflating: ml-100k/u2.test \n", " inflating: ml-100k/u3.base \n", " inflating: ml-100k/u3.test \n", " inflating: ml-100k/u4.base \n", " inflating: ml-100k/u4.test \n", " inflating: ml-100k/u5.base \n", " inflating: ml-100k/u5.test \n", " inflating: ml-100k/ua.base \n", " inflating: ml-100k/ua.test \n", " inflating: ml-100k/ub.base \n", " inflating: ml-100k/ub.test \n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "o7aPc6R_O1S9" }, "source": [ "#Loading MovieLens dataset" ] }, { "cell_type": "markdown", "metadata": { "id": "FZ-rNaLsO8Mj" }, "source": [ "Loading u.info -- The number of users, items, and ratings in the u data set." ] }, { "cell_type": "code", "metadata": { "id": "1IV3uY7hOvvF", "outputId": "76a13a9a-6b1b-471c-ecc1-d96e21265fc3", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "overall_stats = pd.read_csv('ml-100k/u.info', header=None)\n", "print(\"Details of users, items and ratings involved in the loaded movielens dataset: \",list(overall_stats[0]))" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "text": [ "Details of users, items and ratings involved in the loaded movielens dataset: ['943 users', '1682 items', '100000 ratings']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "pm6F7DFUPPWP" }, "source": [ "Loading u.data -- The full u data set, 100000 ratings by 943 users on 1682 items.\n", "\n", "---\n", "\n", "\n", "\n", " Each user has rated at least 20 movies. Users and items are\n", " numbered consecutively from 1. The data is randomly ordered. This is a tab separated list of \n", "\t user id | item id | rating | timestamp. \n", " The time stamps are unix seconds since 1/1/1970 UTC " ] }, { "cell_type": "code", "metadata": { "id": "_Dm64PwPO89K", "outputId": "0ae36ed1-adf8-4dd7-ac16-8c9473e20eba", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "## same item id is same as movie id, item id column is renamed as movie id\n", "column_names1 = ['user id','movie id','rating','timestamp']\n", "ratings_dataset = pd.read_csv('ml-100k/u.data', sep='\\t',header=None,names=column_names1)\n", "ratings_dataset.head() " ], "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestamp
01962423881250949
11863023891717742
2223771878887116
3244512880606923
41663461886397596
\n", "
" ], "text/plain": [ " user id movie id rating timestamp\n", "0 196 242 3 881250949\n", "1 186 302 3 891717742\n", "2 22 377 1 878887116\n", "3 244 51 2 880606923\n", "4 166 346 1 886397596" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "PAp4VVTwR6Pz" }, "source": [ "Loading u.item -- Information about the items (movies); this is a tab separated\n", "\n", " list of\n", " movie id | movie title | release date | video release date |\n", " IMDb URL | unknown | Action | Adventure | Animation |\n", " Children's | Comedy | Crime | Documentary | Drama | Fantasy |\n", " Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi |\n", " Thriller | War | Western |\n", " The last 19 fields are the genres, a 1 indicates the movie\n", " is of that genre, a 0 indicates it is not; movies can be in\n", " several genres at once.\n", " The movie ids are the ones used in the u.data data set.\n" ] }, { "cell_type": "code", "metadata": { "id": "1qxF6i4zRMGj", "outputId": "efd387b6-12e4-4520-f634-16143d3e874e", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "d = 'movie id | movie title | release date | video release date | IMDb URL | unknown | Action | Adventure | Animation | Children | Comedy | Crime | Documentary | Drama | Fantasy | Film-Noir | Horror | Musical | Mystery | Romance | Sci-Fi | Thriller | War | Western'\n", "column_names2 = d.split(' | ')\n", "print(column_names2)" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "['movie id', 'movie title', 'release date', 'video release date', 'IMDb URL', 'unknown', 'Action', 'Adventure', 'Animation', 'Children', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 'Musical', 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western']\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "fZKhPm9dRqvR", "outputId": "44f3ae94-9e6d-4da4-d9d0-1596f6de2699", "colab": { "base_uri": "https://localhost:8080/", "height": 366 } }, "source": [ "items_dataset = pd.read_csv('ml-100k/u.item', sep='|',header=None,names=column_names2,encoding='latin-1')\n", "items_dataset.head()" ], "execution_count": 7, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie titlerelease datevideo release dateIMDb URLunknownActionAdventureAnimationChildrenComedyCrimeDocumentaryDramaFantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...0001110000000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...0110000000000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...0000000000000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...0100010010000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)0000001010000000100
\n", "
" ], "text/plain": [ " movie id movie title release date ... Thriller War Western\n", "0 1 Toy Story (1995) 01-Jan-1995 ... 0 0 0\n", "1 2 GoldenEye (1995) 01-Jan-1995 ... 1 0 0\n", "2 3 Four Rooms (1995) 01-Jan-1995 ... 1 0 0\n", "3 4 Get Shorty (1995) 01-Jan-1995 ... 0 0 0\n", "4 5 Copycat (1995) 01-Jan-1995 ... 1 0 0\n", "\n", "[5 rows x 24 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 7 } ] }, { "cell_type": "code", "metadata": { "id": "zjMViWz_SDlJ", "outputId": "3fa38eec-61c4-41c7-c363-cbcbaebee253", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "movie_dataset = items_dataset[['movie id','movie title']]\n", "movie_dataset.head()" ], "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
movie idmovie title
01Toy Story (1995)
12GoldenEye (1995)
23Four Rooms (1995)
34Get Shorty (1995)
45Copycat (1995)
\n", "
" ], "text/plain": [ " movie id movie title\n", "0 1 Toy Story (1995)\n", "1 2 GoldenEye (1995)\n", "2 3 Four Rooms (1995)\n", "3 4 Get Shorty (1995)\n", "4 5 Copycat (1995)" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "hEsztTxjSiZA" }, "source": [ "Looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column" ] }, { "cell_type": "code", "metadata": { "id": "sdzz8nUySG_q", "outputId": "a0fe00d3-23c4-4125-89fa-b3be9bea9c2e", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "## looking at length of original items_dataset and length of unique combination of rows in items_dataset after removing movie id column\n", "len(items_dataset.groupby(by=column_names2[1:])),len(items_dataset)" ], "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1664, 1682)" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "zcsMvVNrS82A" }, "source": [ "We can see there are 18 extra movie id's for already mapped movie title and the same duplicate movie id is assigned to the user in the user-item dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "V1vln0JRTA9J" }, "source": [ "#Merging required datasets" ] }, { "cell_type": "code", "metadata": { "id": "IBOXHTmvS6Ex", "outputId": "c9995cf4-c7fd-47b0-afb7-c57b7fce007c", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "merged_dataset = pd.merge(ratings_dataset, movie_dataset, how='inner', on='movie id')\n", "merged_dataset.head()" ], "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
01962423881250949Kolya (1996)
1632423875747190Kolya (1996)
22262425883888671Kolya (1996)
31542423879138235Kolya (1996)
43062425876503793Kolya (1996)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "0 196 242 3 881250949 Kolya (1996)\n", "1 63 242 3 875747190 Kolya (1996)\n", "2 226 242 5 883888671 Kolya (1996)\n", "3 154 242 3 879138235 Kolya (1996)\n", "4 306 242 5 876503793 Kolya (1996)" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "qlTqLn-mTUCV" }, "source": [ "A dataset is created from the existing merged dataset by grouping the unique user id and movie title combination and the ratings by a user to the same movie in different instances (timestamps) are averaged and stored in the new dataset." ] }, { "cell_type": "markdown", "metadata": { "id": "U6wjxXe7TeIO" }, "source": [ "Example of a multiple rating scenario by an user to a specific movie:" ] }, { "cell_type": "code", "metadata": { "id": "xKgq_aXmTDft", "outputId": "a2c48fbb-150a-4765-c54c-7be66c36751c", "colab": { "base_uri": "https://localhost:8080/", "height": 106 } }, "source": [ "merged_dataset[(merged_dataset['movie title'] == 'Chasing Amy (1997)') & (merged_dataset['user id'] == 894)]" ], "execution_count": 11, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie idratingtimestampmovie title
48008942464882404137Chasing Amy (1997)
223408942683879896041Chasing Amy (1997)
\n", "
" ], "text/plain": [ " user id movie id rating timestamp movie title\n", "4800 894 246 4 882404137 Chasing Amy (1997)\n", "22340 894 268 3 879896041 Chasing Amy (1997)" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "kuXOfYN-UQrP" }, "source": [ "## Creating a final refined dataset with unique user id, movie name combination and their ratings:\n" ] }, { "cell_type": "code", "metadata": { "id": "gSybgvihTkgE", "outputId": "e43e9262-bca7-4c1c-c238-a47ca4d01303", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset = merged_dataset.groupby(by=['user id','movie title'], as_index=False).agg({\"rating\":\"mean\"})\n", "\n", "refined_dataset.head()" ], "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titlerating
01101 Dalmatians (1996)2.0
1112 Angry Men (1957)5.0
2120,000 Leagues Under the Sea (1954)3.0
312001: A Space Odyssey (1968)4.0
41Abyss, The (1989)3.0
\n", "
" ], "text/plain": [ " user id movie title rating\n", "0 1 101 Dalmatians (1996) 2.0\n", "1 1 12 Angry Men (1957) 5.0\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0\n", "3 1 2001: A Space Odyssey (1968) 4.0\n", "4 1 Abyss, The (1989) 3.0" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "OVuuEkazUn20" }, "source": [ "## Encoding users and movie titles to make sure that the sequence has no missing values when dealing with Deep Neural Networks." ] }, { "cell_type": "code", "metadata": { "id": "-X1Fvj3AUTjt" }, "source": [ "user_enc = LabelEncoder()\n", "refined_dataset['user'] = user_enc.fit_transform(refined_dataset['user id'].values)\n", "n_users = refined_dataset['user'].nunique()" ], "execution_count": 13, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "3f2vtjifW662" }, "source": [ "item_enc = LabelEncoder()\n", "refined_dataset['movie'] = item_enc.fit_transform(refined_dataset['movie title'].values)\n", "n_movies = refined_dataset['movie'].nunique()" ], "execution_count": 14, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OeQb6BDbXUzI", "outputId": "9db3aaae-b877-4ce0-8e39-726b3de57384", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "refined_dataset['rating'] = refined_dataset['rating'].values.astype(np.float32)\n", "min_rating = min(refined_dataset['rating'])\n", "max_rating = max(refined_dataset['rating'])\n", "n_users, n_movies, min_rating, max_rating" ], "execution_count": 15, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(943, 1664, 1.0, 5.0)" ] }, "metadata": { "tags": [] }, "execution_count": 15 } ] }, { "cell_type": "code", "metadata": { "id": "2NLsO6VSXOD4", "outputId": "2ad334e6-8823-4104-bfe4-5b3554063252", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset.head()" ], "execution_count": 16, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titleratingusermovie
01101 Dalmatians (1996)2.002
1112 Angry Men (1957)5.003
2120,000 Leagues Under the Sea (1954)3.006
312001: A Space Odyssey (1968)4.007
41Abyss, The (1989)3.0016
\n", "
" ], "text/plain": [ " user id movie title rating user movie\n", "0 1 101 Dalmatians (1996) 2.0 0 2\n", "1 1 12 Angry Men (1957) 5.0 0 3\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0 0 6\n", "3 1 2001: A Space Odyssey (1968) 4.0 0 7\n", "4 1 Abyss, The (1989) 3.0 0 16" ] }, "metadata": { "tags": [] }, "execution_count": 16 } ] }, { "cell_type": "markdown", "metadata": { "id": "3Vrfgd7TZ08C" }, "source": [ "## Splitting the data into training and testing" ] }, { "cell_type": "code", "metadata": { "id": "9q04V-GnXPFs", "outputId": "efadf08a-206e-4d4f-dd06-17b44fa8f693", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "X = refined_dataset[['user', 'movie']].values\n", "y = refined_dataset['rating'].values\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=50)\n", "X_train.shape, X_test.shape, y_train.shape, y_test.shape" ], "execution_count": 17, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "((89723, 2), (9970, 2), (89723,), (9970,))" ] }, "metadata": { "tags": [] }, "execution_count": 17 } ] }, { "cell_type": "markdown", "metadata": { "id": "y3s3cccxgGPy" }, "source": [ "## Defining number of factors which are to be considered by the Embedding layer" ] }, { "cell_type": "code", "metadata": { "id": "zA39k64MaEfs" }, "source": [ "n_factors = 150" ], "execution_count": 23, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "fcqGOsdZgaFY" }, "source": [ "Columns in the input array are split into two separate arrays. As Keras considers them as two distinct inputs, each input needs to be fed in as its own array." ] }, { "cell_type": "code", "metadata": { "id": "83v-ulEIgS1l" }, "source": [ "X_train_array = [X_train[:, 0], X_train[:, 1]]\n", "X_test_array = [X_test[:, 0], X_test[:, 1]]" ], "execution_count": 19, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OpCiDWkexTkf", "outputId": "1a4a2766-39ef-4fd8-e9f0-535947aae7dd", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "X_train, X_train_array, X_train_array[0].shape" ], "execution_count": 20, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([[ 180, 1152],\n", " [ 487, 389],\n", " [ 177, 302],\n", " ...,\n", " [ 431, 1588],\n", " [ 232, 399],\n", " [ 138, 612]]),\n", " [array([180, 487, 177, ..., 431, 232, 138]),\n", " array([1152, 389, 302, ..., 1588, 399, 612])],\n", " (89723,))" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "markdown", "metadata": { "id": "fgdqWxK1IDAg" }, "source": [ "## Normalizing the labels" ] }, { "cell_type": "code", "metadata": { "id": "4POYLlXTIP7G" }, "source": [ "\n", "y_train = (y_train - min_rating)/(max_rating - min_rating)\n", "y_test = (y_test - min_rating)/(max_rating - min_rating)" ], "execution_count": 21, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "C_sQMkI-m-i-" }, "source": [ "## Building a Softmax Deep Neural Network" ] }, { "cell_type": "code", "metadata": { "id": "PRBTogiuhpmV" }, "source": [ "## Initializing a input layer for users\n", "user = tf.keras.layers.Input(shape = (1,))\n", "\n", "## Embedding layer for n_factors of users\n", "u = keras.layers.embeddings.Embedding(n_users, n_factors, embeddings_initializer = 'he_normal', embeddings_regularizer = tf.keras.regularizers.l2(1e-6))(user)\n", "u = tf.keras.layers.Reshape((n_factors,))(u)\n", "\n", "## Initializing a input layer for movies\n", "movie = tf.keras.layers.Input(shape = (1,))\n", "\n", "## Embedding layer for n_factors of movies\n", "m = keras.layers.embeddings.Embedding(n_movies, n_factors, embeddings_initializer = 'he_normal', embeddings_regularizer=tf.keras.regularizers.l2(1e-6))(movie)\n", "m = tf.keras.layers.Reshape((n_factors,))(m)\n", "\n", "## stacking up both user and movie embeddings\n", "x = tf.keras.layers.Concatenate()([u,m])\n", "x = tf.keras.layers.Dropout(0.05)(x)\n", "\n", "## Adding a Dense layer to the architecture\n", "x = tf.keras.layers.Dense(32, kernel_initializer='he_normal')(x)\n", "x = tf.keras.layers.Activation(activation='relu')(x)\n", "x = tf.keras.layers.Dropout(0.05)(x)\n", "\n", "x = tf.keras.layers.Dense(16, kernel_initializer='he_normal')(x)\n", "x = tf.keras.layers.Activation(activation='relu')(x)\n", "x = tf.keras.layers.Dropout(0.05)(x)\n", "\n", "## Adding an Output layer with Sigmoid activation funtion which gives output between 0 and 1\n", "x = tf.keras.layers.Dense(9)(x)\n", "x = tf.keras.layers.Activation(activation='softmax')(x)\n", "\n", "## Adding a Lambda layer to convert the output to rating by scaling it with the help of available rating information\n", "# x = tf.keras.layers.Lambda(lambda x: x*(max_rating - min_rating) + min_rating)(x)\n", "\n", "## Defining the model\n", "model = tf.keras.models.Model(inputs=[user,movie], outputs=x)\n", "# optimizer = tf.keras.optimizers.Adam(lr=0.001)\n", "# optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.005,\n", " # rho=0.9, momentum=0.01, epsilon=1e-07)\n", "\n", "## Compiling the model\n", "# model.compile(loss='binary_crossentropy', optimizer = optimizer)\n", "# model.compile(loss='mean_squared_error', optimizer = optimizer,metrics=['accuracy'])\n", "model.compile(optimizer='sgd', loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])\n" ], "execution_count": 30, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7rMMb03YpJt-", "outputId": "4a55230d-c639-4c04-c997-4317d3dd8693", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "model.summary()" ], "execution_count": 31, "outputs": [ { "output_type": "stream", "text": [ "Model: \"functional_5\"\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_5 (InputLayer) [(None, 1)] 0 \n", "__________________________________________________________________________________________________\n", "input_6 (InputLayer) [(None, 1)] 0 \n", "__________________________________________________________________________________________________\n", "embedding_4 (Embedding) (None, 1, 150) 141450 input_5[0][0] \n", "__________________________________________________________________________________________________\n", "embedding_5 (Embedding) (None, 1, 150) 249600 input_6[0][0] \n", "__________________________________________________________________________________________________\n", "reshape_4 (Reshape) (None, 150) 0 embedding_4[0][0] \n", "__________________________________________________________________________________________________\n", "reshape_5 (Reshape) (None, 150) 0 embedding_5[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_2 (Concatenate) (None, 300) 0 reshape_4[0][0] \n", " reshape_5[0][0] \n", "__________________________________________________________________________________________________\n", "dropout_6 (Dropout) (None, 300) 0 concatenate_2[0][0] \n", "__________________________________________________________________________________________________\n", "dense_6 (Dense) (None, 32) 9632 dropout_6[0][0] \n", "__________________________________________________________________________________________________\n", "activation_6 (Activation) (None, 32) 0 dense_6[0][0] \n", "__________________________________________________________________________________________________\n", "dropout_7 (Dropout) (None, 32) 0 activation_6[0][0] \n", "__________________________________________________________________________________________________\n", "dense_7 (Dense) (None, 16) 528 dropout_7[0][0] \n", "__________________________________________________________________________________________________\n", "activation_7 (Activation) (None, 16) 0 dense_7[0][0] \n", "__________________________________________________________________________________________________\n", "dropout_8 (Dropout) (None, 16) 0 activation_7[0][0] \n", "__________________________________________________________________________________________________\n", "dense_8 (Dense) (None, 9) 153 dropout_8[0][0] \n", "__________________________________________________________________________________________________\n", "activation_8 (Activation) (None, 9) 0 dense_8[0][0] \n", "==================================================================================================\n", "Total params: 401,363\n", "Trainable params: 401,363\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Ky7cKIGDuSgy", "outputId": "636e86b7-702a-4047-d8c0-d30c8e47df47", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.75, patience=3, min_lr=0.000001, verbose=1)\n", "\n", "history = model.fit(x = X_train_array, y = y_train, batch_size=128, epochs=70, verbose=1, validation_data=(X_test_array, y_test)\n", ",shuffle=True,callbacks=[reduce_lr])\n" ], "execution_count": 32, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/70\n" ], "name": "stdout" }, { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/indexed_slices.py:432: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" ], "name": "stderr" }, { "output_type": "stream", "text": [ "701/701 [==============================] - 4s 5ms/step - loss: 0.8508 - accuracy: 0.0608 - val_loss: 0.5331 - val_accuracy: 0.0617\n", "Epoch 2/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5358 - accuracy: 0.0609 - val_loss: 0.5159 - val_accuracy: 0.0617\n", "Epoch 3/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5253 - accuracy: 0.0609 - val_loss: 0.5125 - val_accuracy: 0.0617\n", "Epoch 4/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5222 - accuracy: 0.0609 - val_loss: 0.5114 - val_accuracy: 0.0617\n", "Epoch 5/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5207 - accuracy: 0.0609 - val_loss: 0.5114 - val_accuracy: 0.0617\n", "Epoch 6/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5201 - accuracy: 0.0609 - val_loss: 0.5106 - val_accuracy: 0.0617\n", "Epoch 7/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5193 - accuracy: 0.0609 - val_loss: 0.5102 - val_accuracy: 0.0617\n", "Epoch 8/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5187 - accuracy: 0.0609 - val_loss: 0.5112 - val_accuracy: 0.0617\n", "Epoch 9/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5188 - accuracy: 0.0609 - val_loss: 0.5098 - val_accuracy: 0.0617\n", "Epoch 10/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5181 - accuracy: 0.0609 - val_loss: 0.5097 - val_accuracy: 0.0617\n", "Epoch 11/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5180 - accuracy: 0.0609 - val_loss: 0.5091 - val_accuracy: 0.0617\n", "Epoch 12/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5176 - accuracy: 0.0609 - val_loss: 0.5088 - val_accuracy: 0.0617\n", "Epoch 13/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5171 - accuracy: 0.0609 - val_loss: 0.5096 - val_accuracy: 0.0617\n", "Epoch 14/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5168 - accuracy: 0.0609 - val_loss: 0.5082 - val_accuracy: 0.0617\n", "Epoch 15/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5162 - accuracy: 0.0609 - val_loss: 0.5076 - val_accuracy: 0.0617\n", "Epoch 16/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5157 - accuracy: 0.0609 - val_loss: 0.5066 - val_accuracy: 0.0617\n", "Epoch 17/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5149 - accuracy: 0.0609 - val_loss: 0.5058 - val_accuracy: 0.0617\n", "Epoch 18/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5141 - accuracy: 0.0609 - val_loss: 0.5051 - val_accuracy: 0.0617\n", "Epoch 19/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5129 - accuracy: 0.0609 - val_loss: 0.5035 - val_accuracy: 0.0617\n", "Epoch 20/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5117 - accuracy: 0.0609 - val_loss: 0.5021 - val_accuracy: 0.0617\n", "Epoch 21/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5101 - accuracy: 0.0609 - val_loss: 0.5005 - val_accuracy: 0.0617\n", "Epoch 22/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5077 - accuracy: 0.0609 - val_loss: 0.4976 - val_accuracy: 0.0617\n", "Epoch 23/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5057 - accuracy: 0.0609 - val_loss: 0.4945 - val_accuracy: 0.0617\n", "Epoch 24/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.5025 - accuracy: 0.0609 - val_loss: 0.4908 - val_accuracy: 0.0617\n", "Epoch 25/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4982 - accuracy: 0.0609 - val_loss: 0.4862 - val_accuracy: 0.0617\n", "Epoch 26/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4935 - accuracy: 0.0609 - val_loss: 0.4806 - val_accuracy: 0.0617\n", "Epoch 27/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4880 - accuracy: 0.0609 - val_loss: 0.4744 - val_accuracy: 0.0617\n", "Epoch 28/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4817 - accuracy: 0.0609 - val_loss: 0.4689 - val_accuracy: 0.0617\n", "Epoch 29/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4748 - accuracy: 0.0609 - val_loss: 0.4629 - val_accuracy: 0.0617\n", "Epoch 30/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4688 - accuracy: 0.0609 - val_loss: 0.4558 - val_accuracy: 0.0617\n", "Epoch 31/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4627 - accuracy: 0.0610 - val_loss: 0.4506 - val_accuracy: 0.0617\n", "Epoch 32/70\n", "701/701 [==============================] - 4s 5ms/step - loss: 0.4574 - accuracy: 0.0619 - val_loss: 0.4464 - val_accuracy: 0.0617\n", "Epoch 33/70\n", "701/701 [==============================] - 4s 5ms/step - loss: 0.4526 - accuracy: 0.0657 - val_loss: 0.4426 - val_accuracy: 0.0617\n", "Epoch 34/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4492 - accuracy: 0.0759 - val_loss: 0.4395 - val_accuracy: 0.0736\n", "Epoch 35/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4447 - accuracy: 0.0835 - val_loss: 0.4368 - val_accuracy: 0.0790\n", "Epoch 36/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4414 - accuracy: 0.0870 - val_loss: 0.4344 - val_accuracy: 0.0896\n", "Epoch 37/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4386 - accuracy: 0.0946 - val_loss: 0.4328 - val_accuracy: 0.0962\n", "Epoch 38/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4355 - accuracy: 0.0986 - val_loss: 0.4309 - val_accuracy: 0.0964\n", "Epoch 39/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4332 - accuracy: 0.1010 - val_loss: 0.4303 - val_accuracy: 0.1120\n", "Epoch 40/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4310 - accuracy: 0.1053 - val_loss: 0.4281 - val_accuracy: 0.1036\n", "Epoch 41/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4297 - accuracy: 0.1076 - val_loss: 0.4276 - val_accuracy: 0.1107\n", "Epoch 42/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4276 - accuracy: 0.1085 - val_loss: 0.4259 - val_accuracy: 0.1131\n", "Epoch 43/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4261 - accuracy: 0.1131 - val_loss: 0.4272 - val_accuracy: 0.1214\n", "Epoch 44/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4243 - accuracy: 0.1109 - val_loss: 0.4242 - val_accuracy: 0.1104\n", "Epoch 45/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4231 - accuracy: 0.1139 - val_loss: 0.4235 - val_accuracy: 0.1058\n", "Epoch 46/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4217 - accuracy: 0.1168 - val_loss: 0.4230 - val_accuracy: 0.1102\n", "Epoch 47/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4211 - accuracy: 0.1168 - val_loss: 0.4227 - val_accuracy: 0.1225\n", "Epoch 48/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4202 - accuracy: 0.1204 - val_loss: 0.4225 - val_accuracy: 0.1203\n", "Epoch 49/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4183 - accuracy: 0.1194 - val_loss: 0.4211 - val_accuracy: 0.1154\n", "Epoch 50/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4174 - accuracy: 0.1211 - val_loss: 0.4212 - val_accuracy: 0.1232\n", "Epoch 51/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4173 - accuracy: 0.1208 - val_loss: 0.4205 - val_accuracy: 0.1214\n", "Epoch 52/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4167 - accuracy: 0.1222 - val_loss: 0.4203 - val_accuracy: 0.1234\n", "Epoch 53/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4149 - accuracy: 0.1230 - val_loss: 0.4198 - val_accuracy: 0.1237\n", "Epoch 54/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4141 - accuracy: 0.1252 - val_loss: 0.4194 - val_accuracy: 0.1188\n", "Epoch 55/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4136 - accuracy: 0.1235 - val_loss: 0.4189 - val_accuracy: 0.1170\n", "Epoch 56/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4136 - accuracy: 0.1245 - val_loss: 0.4187 - val_accuracy: 0.1176\n", "Epoch 57/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4130 - accuracy: 0.1239 - val_loss: 0.4185 - val_accuracy: 0.1178\n", "Epoch 58/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4116 - accuracy: 0.1247 - val_loss: 0.4182 - val_accuracy: 0.1237\n", "Epoch 59/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4107 - accuracy: 0.1257 - val_loss: 0.4181 - val_accuracy: 0.1244\n", "Epoch 60/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4111 - accuracy: 0.1265 - val_loss: 0.4182 - val_accuracy: 0.1281\n", "Epoch 61/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4107 - accuracy: 0.1258 - val_loss: 0.4176 - val_accuracy: 0.1157\n", "Epoch 62/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4098 - accuracy: 0.1264 - val_loss: 0.4178 - val_accuracy: 0.1183\n", "Epoch 63/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4097 - accuracy: 0.1267 - val_loss: 0.4174 - val_accuracy: 0.1254\n", "Epoch 64/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4096 - accuracy: 0.1277 - val_loss: 0.4180 - val_accuracy: 0.1314\n", "Epoch 65/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4084 - accuracy: 0.1289 - val_loss: 0.4170 - val_accuracy: 0.1220\n", "Epoch 66/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4087 - accuracy: 0.1274 - val_loss: 0.4174 - val_accuracy: 0.1254\n", "Epoch 67/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4078 - accuracy: 0.1277 - val_loss: 0.4172 - val_accuracy: 0.1268\n", "Epoch 68/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4070 - accuracy: 0.1287 - val_loss: 0.4169 - val_accuracy: 0.1194\n", "Epoch 69/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4071 - accuracy: 0.1287 - val_loss: 0.4170 - val_accuracy: 0.1273\n", "Epoch 70/70\n", "701/701 [==============================] - 3s 5ms/step - loss: 0.4063 - accuracy: 0.1286 - val_loss: 0.4171 - val_accuracy: 0.1305\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "Ia_EsnKTur47", "outputId": "6e91d112-687e-49a5-9cf3-83395510bfa2", "colab": { "base_uri": "https://localhost:8080/", "height": 295 } }, "source": [ "plt.plot(history.history[\"loss\"][5:])\n", "plt.plot(history.history[\"val_loss\"][5:])\n", "plt.title(\"model loss\")\n", "plt.ylabel(\"loss\")\n", "plt.xlabel(\"epoch\")\n", "plt.legend([\"train\", \"test\"], loc=\"upper left\")\n", "plt.show()" ], "execution_count": 33, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "2VpBSnCPILno" }, "source": [ "## Getting movies for given User" ] }, { "cell_type": "code", "metadata": { "id": "qRgSHldIJMLu", "outputId": "63f27ff6-1c88-4d8f-ddfa-18e84971bb58", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "refined_dataset.head()" ], "execution_count": 34, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
user idmovie titleratingusermovie
01101 Dalmatians (1996)2.002
1112 Angry Men (1957)5.003
2120,000 Leagues Under the Sea (1954)3.006
312001: A Space Odyssey (1968)4.007
41Abyss, The (1989)3.0016
\n", "
" ], "text/plain": [ " user id movie title rating user movie\n", "0 1 101 Dalmatians (1996) 2.0 0 2\n", "1 1 12 Angry Men (1957) 5.0 0 3\n", "2 1 20,000 Leagues Under the Sea (1954) 3.0 0 6\n", "3 1 2001: A Space Odyssey (1968) 4.0 0 7\n", "4 1 Abyss, The (1989) 3.0 0 16" ] }, "metadata": { "tags": [] }, "execution_count": 34 } ] }, { "cell_type": "markdown", "metadata": { "id": "Xdmw3s6eJjSz" }, "source": [ "**How this DNN model works is, it takes two inputs, one of the input has user id's and the other has corresponding movie id's. Here DNN model tries to predict the ratings of the user - movie combination. So, we can input a specific user id (broadcasting it with the size of other input) and unseen movie id of the user and expect the model to give the ratings of the movies which would have been the ratings given by the user. Here, the ratings are already normalized and as we need the movies which interest the user more, ratings are not brought back to 0-5 scale.**" ] }, { "cell_type": "code", "metadata": { "id": "A9pFADxRM-SX", "outputId": "094cda8f-f537-40f8-a4bb-081f1609debc", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "X_train_array" ], "execution_count": 40, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[array([180, 487, 177, ..., 431, 232, 138]),\n", " array([1152, 389, 302, ..., 1588, 399, 612])]" ] }, "metadata": { "tags": [] }, "execution_count": 40 } ] }, { "cell_type": "markdown", "metadata": { "id": "_5Orqr2yatoT" }, "source": [ "Above is the model input shape" ] }, { "cell_type": "code", "metadata": { "id": "bKuwDF7pxEgA", "outputId": "d87ddc00-2d77-467b-e969-a178b6915885", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "\n", "user_id = [777]\n", "encoded_user_id = user_enc.transform(user_id)\n", "\n", "seen_movies = list(refined_dataset[refined_dataset['user id'] == user_id[0]]['movie'])\n", "print(seen_movies)" ], "execution_count": 62, "outputs": [ { "output_type": "stream", "text": [ "[7, 55, 87, 113, 313, 337, 389, 390, 399, 411, 432, 460, 498, 528, 580, 604, 612, 643, 666, 783, 996, 1005, 1032, 1102, 1132, 1157, 1190, 1208, 1251, 1260, 1284, 1302, 1342, 1523, 1558, 1615]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "_qMqFifba4Yj" }, "source": [ "Id's of movies which are already seen by the user are extracted." ] }, { "cell_type": "code", "metadata": { "id": "IjXFgDR4NTkO", "outputId": "5d0f7e81-0a74-4937-9d5f-e6bae0b1a710", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "len(refined_dataset['movie'].unique()), min(refined_dataset['movie']), max(refined_dataset['movie'])" ], "execution_count": 67, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1664, 0, 1663)" ] }, "metadata": { "tags": [] }, "execution_count": 67 } ] }, { "cell_type": "markdown", "metadata": { "id": "Np6LcHMwYTD-" }, "source": [ "We can understand that the labels are from 0 to 1663. So the movie id's which are not seen by the user can be pciked just by excluding the 'seen_movies' list from the first 1663 natural numbers." ] }, { "cell_type": "code", "metadata": { "id": "i_rRA2ScWFLF", "outputId": "91e243ff-bb18-40ca-ca25-b6bbdcbdaa6a", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "unseen_movies = [i for i in range(min(refined_dataset['movie']), max(refined_dataset['movie'])+1) if i not in seen_movies]\n", "print(unseen_movies)" ], "execution_count": 72, "outputs": [ { "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,....., 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "KcspS9SMdJef" }, "source": [ "Movies which are not seen by the user." ] }, { "cell_type": "code", "metadata": { "id": "mtCDRu3WYCZa", "outputId": "48021904-8448-4a42-8503-12ac87cca357", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "len(unseen_movies) + len(seen_movies)" ], "execution_count": 74, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1664" ] }, "metadata": { "tags": [] }, "execution_count": 74 } ] }, { "cell_type": "code", "metadata": { "id": "qmS6oeujY6fo", "outputId": "c0bb5729-431b-47ff-f80c-a5ce7a204206", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "model_input = [np.asarray(list(encoded_user_id)*len(unseen_movies)), np.asarray(unseen_movies)]\n", "len(model_input), len(model_input[0])" ], "execution_count": 92, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(2, 1628)" ] }, "metadata": { "tags": [] }, "execution_count": 92 } ] }, { "cell_type": "markdown", "metadata": { "id": "PyRgI_vJdsAp" }, "source": [ "**DNN model is used to predict the ratings of the unseen movies.**" ] }, { "cell_type": "code", "metadata": { "id": "mmtIZjAgZSax" }, "source": [ "predicted_ratings = model.predict(model_input)" ], "execution_count": 84, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "OfKQOn9CZhi9", "outputId": "22732ec9-ab60-4e1b-fd1c-778be5710790", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print(predicted_ratings.shape)" ], "execution_count": 90, "outputs": [ { "output_type": "stream", "text": [ "(1628, 9)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "y1IGrVJBaKwb", "outputId": "6a5c70e9-c5b5-4364-ec36-2587c40559a4", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print(predicted_ratings)" ], "execution_count": 91, "outputs": [ { "output_type": "stream", "text": [ "[[6.28711879e-01 3.71125787e-01 1.93846718e-05 ... 2.48171236e-05\n", " 2.07571484e-05 3.11595759e-05]\n", " [5.16196430e-01 4.83636826e-01 2.06636632e-05 ... 2.40022491e-05\n", " 2.14833890e-05 3.09596326e-05]\n", " [8.92104924e-01 1.07851624e-01 4.90856564e-06 ... 8.67088238e-06\n", " 4.84645898e-06 9.25974837e-06]\n", " ...\n", " [6.53564811e-01 3.46285373e-01 1.90432311e-05 ... 2.25746426e-05\n", " 1.92296520e-05 2.91551714e-05]\n", " [5.77207983e-01 4.22657400e-01 1.69154791e-05 ... 1.97136451e-05\n", " 1.75365039e-05 2.56826916e-05]\n", " [6.86957419e-01 3.12936485e-01 1.36032540e-05 ... 1.61753997e-05\n", " 1.37795878e-05 2.07246703e-05]]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "4Uqrx92hd1Yl" }, "source": [ "Output is of shape (1628, 9). We got probability of each possible rating from 1 to 5. We can extract specific rating which user would have given to a movie but it is not useful for these recommendations now." ] }, { "cell_type": "code", "metadata": { "id": "KNOAYhR0e6-h", "outputId": "5f6aea9d-d39f-47f5-99c2-6d6fda8e047b", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "predicted_ratings = np.max(predicted_ratings, axis=1)\n", "predicted_ratings" ], "execution_count": 98, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0.6287119, 0.5161964, 0.8921049, ..., 0.6535648, 0.577208 ,\n", " 0.6869574], dtype=float32)" ] }, "metadata": { "tags": [] }, "execution_count": 98 } ] }, { "cell_type": "code", "metadata": { "id": "X_AitEdxe7UB", "outputId": "ff5bee9d-73ab-4d84-f94d-c3ded15bf273", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "predicted_ratings.shape" ], "execution_count": 99, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(1628,)" ] }, "metadata": { "tags": [] }, "execution_count": 99 } ] }, { "cell_type": "markdown", "metadata": { "id": "nMyRRTncgMbf" }, "source": [ "Index of ratings sorted by descending order." ] }, { "cell_type": "code", "metadata": { "id": "ouBCeCapf-UK", "outputId": "a0fd1203-cead-4ceb-9035-5a125a967cb3", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "sorted_index = np.argsort(predicted_ratings)[::-1]\n", "print(sorted_index)" ], "execution_count": 110, "outputs": [ { "output_type": "stream", "text": [ "[1445 135 962 ... 1030 460 159]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "1wKHCeFTkROY" }, "source": [ "**Movie names have been extracted from the available indices we got.**" ] }, { "cell_type": "code", "metadata": { "id": "p6KxPoScf-d6", "outputId": "35e94fd4-35e0-4492-a579-7fa51df0a76b", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "recommended_movies = item_enc.inverse_transform(sorted_index)\n", "recommended_movies" ], "execution_count": 124, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['Sword in the Stone, The (1963)', 'Baton Rouge (1988)',\n", " 'Meet Wally Sparks (1997)', ..., 'My Favorite Year (1982)',\n", " 'English Patient, The (1996)', 'Beverly Hillbillies, The (1993)'],\n", " dtype=object)" ] }, "metadata": { "tags": [] }, "execution_count": 124 } ] }, { "cell_type": "markdown", "metadata": { "id": "HaKPES74keEW" }, "source": [ "## Movies recommended with the help of Softmax Deep Neural Networks" ] }, { "cell_type": "code", "metadata": { "id": "CIIumPFPf-mS", "outputId": "0c5edf6d-6ac6-4a14-e669-7b9ddf8b65a2", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "from pprint import pprint\n", "pprint(list(recommended_movies[:20]))" ], "execution_count": 130, "outputs": [ { "output_type": "stream", "text": [ "['Sword in the Stone, The (1963)',\n", " 'Baton Rouge (1988)',\n", " 'Meet Wally Sparks (1997)',\n", " 'Grosse Fatigue (1994)',\n", " 'In the Line of Duty 2 (1987)',\n", " 'Conspiracy Theory (1997)',\n", " 'Red Firecracker, Green Firecracker (1994)',\n", " 'Striking Distance (1993)',\n", " 'Two or Three Things I Know About Her (1966)',\n", " 'Phat Beach (1996)',\n", " 'Diva (1981)',\n", " 'Getaway, The (1994)',\n", " 'Jaws 2 (1978)',\n", " 'Welcome to the Dollhouse (1995)',\n", " 'Basic Instinct (1992)',\n", " 'Saint, The (1997)',\n", " 'Critical Care (1997)',\n", " 'Jude (1996)',\n", " 'Mediterraneo (1991)',\n", " 'Month by the Lake, A (1995)']\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "SoXBhPMiku38" }, "source": [ "## Summing up the entire code into a recommender system function:" ] }, { "cell_type": "code", "metadata": { "id": "MwBUv7TlkuDn" }, "source": [ "def recommender_system(user_id, model, n_movies):\n", "\n", " print(\"\")\n", " print(\"Movie seen by the User:\")\n", " pprint(list(refined_dataset[refined_dataset['user id'] == user_id]['movie title']))\n", " print(\"\")\n", "\n", " encoded_user_id = user_enc.transform([user_id])\n", "\n", " seen_movies = list(refined_dataset[refined_dataset['user id'] == user_id]['movie'])\n", " unseen_movies = [i for i in range(min(refined_dataset['movie']), max(refined_dataset['movie'])+1) if i not in seen_movies]\n", " model_input = [np.asarray(list(encoded_user_id)*len(unseen_movies)), np.asarray(unseen_movies)]\n", " predicted_ratings = model.predict(model_input)\n", " predicted_ratings = np.max(predicted_ratings, axis=1)\n", " sorted_index = np.argsort(predicted_ratings)[::-1]\n", " recommended_movies = item_enc.inverse_transform(sorted_index)\n", " print(\"---------------------------------------------------------------------------------\")\n", " print(\"Top \"+str(n_movies)+\" Movie recommendations for the User \"+str(user_id)+ \" are:\")\n", " pprint(list(recommended_movies[:n_movies]))" ], "execution_count": 141, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-qAd6yrukuK_", "outputId": "da16c604-2b70-4da3-eff1-9e01d38e4db7", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print(\"Enter user id\")\n", "user_id= int(input())\n", "\n", "print(\"Enter number of movies to be recommended:\")\n", "n_movies = int(input())\n", "recommender_system(user_id,model,n_movies)\n" ], "execution_count": 139, "outputs": [ { "output_type": "stream", "text": [ "Enter user id\n", "307\n", "Enter number of movies to be recommended:\n", "15\n", "Movie seen by the User:\n", "['12 Angry Men (1957)',\n", " '2001: A Space Odyssey (1968)',\n", " 'Abyss, The (1989)',\n", " 'Alien (1979)',\n", " 'Apollo 13 (1995)',\n", " 'Boot, Das (1981)',\n", " 'Brady Bunch Movie, The (1995)',\n", " 'Braveheart (1995)',\n", " 'Brazil (1985)',\n", " 'Casablanca (1942)',\n", " 'Close Shave, A (1995)',\n", " 'Contact (1997)',\n", " 'E.T. the Extra-Terrestrial (1982)',\n", " 'Empire Strikes Back, The (1980)',\n", " 'English Patient, The (1996)',\n", " 'Englishman Who Went Up a Hill, But Came Down a Mountain, The (1995)',\n", " 'Escape from L.A. (1996)',\n", " 'Fargo (1996)',\n", "...\n", "...\n", " 'Sex, Lies, and Videotape (1989)',\n", " 'Shadowlands (1993)',\n", " 'Shawshank Redemption, The (1994)',\n", " 'Shining, The (1980)',\n", " 'Sneakers (1992)',\n", " 'Snow White and the Seven Dwarfs (1937)',\n", " 'Sound of Music, The (1965)',\n", " 'Stand by Me (1986)',\n", " 'Star Trek III: The Search for Spock (1984)',\n", " 'Star Trek IV: The Voyage Home (1986)',\n", " 'Star Trek: The Motion Picture (1979)',\n", " 'Star Trek: The Wrath of Khan (1982)',\n", " 'Star Wars (1977)',\n", " 'Stargate (1994)',\n", " 'Tank Girl (1995)',\n", " 'Terminator, The (1984)',\n", " 'This Is Spinal Tap (1984)',\n", " 'Titanic (1997)',\n", " 'To Kill a Mockingbird (1962)',\n", " 'Top Gun (1986)',\n", " 'Toy Story (1995)',\n", " 'Wallace & Gromit: The Best of Aardman Animation (1996)',\n", " 'Wizard of Oz, The (1939)',\n", " 'Wrong Trousers, The (1993)']\n", "\n", "--------------------------------------------------------------\n", "Top 15 Movie recommendations for the User 307 are:\n", "['Speed 2: Cruise Control (1997)',\n", " 'Houseguest (1994)',\n", " 'Batman & Robin (1997)',\n", " 'Magic Hour, The (1998)',\n", " \"Devil's Advocate, The (1997)\",\n", " 'Gone with the Wind (1939)',\n", " 'Cobb (1994)',\n", " 'Cool Runnings (1993)',\n", " 'Independence Day (ID4) (1996)',\n", " 'Smoke (1995)',\n", " 'Once Were Warriors (1994)',\n", " 'True Romance (1993)',\n", " 'Red Rock West (1992)',\n", " 'Third Man, The (1949)',\n", " 'MatchMaker, The (1997)']\n", "--------------------------------------------------------------\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "tsUcbpEfktjP" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "bwlRm9Hie7Fd" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "MjLN1Dd_m14L" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "XkbzKD0Om2VM" }, "source": [ "# Rough Work" ] }, { "cell_type": "code", "metadata": { "id": "ICIiS-jwfCdL", "outputId": "ec9052d4-c5f9-46d8-a186-a24463234218", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "a = np.asarray([[2,3,14,6],[3,5,7,2],[6,8,4,1]])\n", "a, a.shape" ], "execution_count": 102, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([[ 2, 3, 14, 6],\n", " [ 3, 5, 7, 2],\n", " [ 6, 8, 4, 1]]), (3, 4))" ] }, "metadata": { "tags": [] }, "execution_count": 102 } ] }, { "cell_type": "code", "metadata": { "id": "1Sv1WMgdfOkj", "outputId": "9750cdcc-0663-41c8-a8d4-81c22815d339", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "b=np.max(a, axis=1)\n", "b, b.shape" ], "execution_count": 103, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(array([14, 7, 8]), (3,))" ] }, "metadata": { "tags": [] }, "execution_count": 103 } ] }, { "cell_type": "code", "metadata": { "id": "67xRASFNfu2p", "outputId": "1b812c33-04e1-477e-97bd-d626fa4a4669", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "np.argsort(b)[::-1]" ], "execution_count": 106, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0, 2, 1])" ] }, "metadata": { "tags": [] }, "execution_count": 106 } ] }, { "cell_type": "code", "metadata": { "id": "PfTQmi93Q7X4", "outputId": "fd48d1c0-ef59-4e6c-b78c-98b2acfb37db", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "\n", "user_enc.transform([1])" ], "execution_count": 56, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0])" ] }, "metadata": { "tags": [] }, "execution_count": 56 } ] }, { "cell_type": "code", "metadata": { "id": "5VPBNYx3Rlub", "outputId": "6edd0f33-c3a5-4296-a744-6e2ccca4fbb0", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "max(refined_dataset['user'])" ], "execution_count": 52, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "942" ] }, "metadata": { "tags": [] }, "execution_count": 52 } ] } ] }