{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Applications\n", "\n", "## Dimensionality Reduction\n", "\n", "Dimensionality reduction is a technique that is used to reduce the number of features in a dataset. \n", "\n", "Reducing the number of features of a dataset is desirable for the following reasons:\n", "\n", "1. It reduces the time and storage space required and subsequently reduces the computation time.\n", "\n", "2. It removes redundant features and the overcome the [curse of dimensionality]().\n", "\n", "```{admonition} Curse of dimensionality ☠️\n", ":class: note\n", "The curse of dimensionality refers to the fact that **for each additional feature, the number of training examples required to train the machine learning algorithm grows exponentially**. This is because the volume of the space increases so fast that the available data become sparse. \n", "```\n", "\n", "3. It allows us to visualize high-dimensional data in a 2-dimensional or 3-dimensional space.\n", "\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "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", "
messagesentiment
0I really enjoyed the moviepositive
1The food was terriblenegative
2I'm not sure how I feel about thisneutral
3The service was excellentpositive
4I had a bad experiencenegative
\n", "
" ], "text/plain": [ " message sentiment\n", "0 I really enjoyed the movie positive\n", "1 The food was terrible negative\n", "2 I'm not sure how I feel about this neutral\n", "3 The service was excellent positive\n", "4 I had a bad experience negative" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "data = pd.read_csv('https://raw.githubusercontent.com/fahadsultan/csc272/main/data/chat_dataset.csv')\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# creating bow representation\n", "vocab = (' '.join(data['message'].values)).lower().split()\n", "bow = pd.DataFrame(columns=vocab)\n", "for word in vocab: \n", " bow[word] = data['message'].apply(lambda msg: msg.count(word))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "def l2_norm(x):\n", " return (sum(x**2))**(1/2)\n", "\n", "bow_unit = bow.apply(lambda x: x/l2_norm(x), axis=1)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "from sklearn.decomposition import PCA\n", "\n", "# n_components indicates how many dimensions\n", "# you want your data to be reduced to\n", "pca = PCA(n_components = 2)\n", "\n", "bow_reduced = pca.fit_transform(bow)\n", "\n", "bow_reduced = pd.DataFrame(bow_reduced)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "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", "
01
0-13.183063-13.360581
1-14.616593-13.413976
2-11.650563-15.537625
3-14.605181-13.347637
4-16.3104695.483213
\n", "
" ], "text/plain": [ " 0 1\n", "0 -13.183063 -13.360581\n", "1 -14.616593 -13.413976\n", "2 -11.650563 -15.537625\n", "3 -14.605181 -13.347637\n", "4 -16.310469 5.483213" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bow_reduced.head()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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04QlB2OMMU10ijoHY0znd/jwYbZs2cLBgwfTHUqH07VrV/r370+XLl1a/RpLDsaYDmHLli0cf/zxFBQUIK2bhNDgzNlTVVXFli1bGDRoUKtfZ8VKyRIOQ0EB+HzOz3C4pVcYY9rg4MGD5OXlWWJoIxEhLy+vzXdcdueQDOEwTJsGNe40BOXlznOAoqL0xWVMJ2OJ4dgcy9/N7hySobj4aGKIqqlx1htjTAdkySEZKiratt4Yk9XKysr49a9/fUyv7dEjNZPSWXJIhoED27beGJPVmksOR45kxsjhlhySYc4cyM1tuC4311lvjEmLysowq1YVsGKFj1WrCqisbH8jkbKyMs4880ymTp3KsGHDGDduHAcOHODDDz/kqquuYsSIEVxyySW89957ANx0000899xz9a+PXvXPmjWLV155hcLCQn72s5/x1FNPMWHCBL7whS8wbtw4qqurGTNmDOeeey5nn302S5YsaXfsbaaqHX4ZMWKEpl1pqWoopCri/CwtTXdExnQq7777bqv33b69VF96KVeXL6d+eemlXN2+vX3/l5s2bVK/369vvvmmqqpOmDBBFyxYoFdccYVu2LBBVVVff/11vfzyy1VVdfLkyfrss8/Wv7579+6qqrp8+XK95ppr6tc/+eST2q9fP62qqlJV1cOHD+vevXtVVXXnzp166qmnaiQSafAebRXv7wes1gTnVWutlCxFRdYyyZgMsXFjMZFIw0YikUgNGzcWEwy27/900KBBFBYWAjBixAjKyspYuXIlEyZMqN+ntrY2wasTu/LKKznppJMA56J99uzZvPzyy/h8Pj766CMqKys5+eST2xV7W1hyMMZ0OrW18RuDJFrfFoFAoP6x3++nsrKSXr16sXbt2ib75uTkEIlEAOeEf+jQoYTv27179/rH4XCYnTt3smbNGrp06UJBQUHKe4ZbnYMxptMJBOI3Bkm0vj169uzJoEGDePbZZwEnCbz11luAM53AmjVrAFiyZAmHDx8G4Pjjj2ffvn0J33Pv3r3k5+fTpUsXli9fTnl5wpG1PWPJwRjT6QwePAefr2EjEZ8vl8GDvWkkEg6HefzxxznnnHMYNmxYfQXy1KlTeemllzj//PN544036u8Ohg8fTk5ODueccw4/+9nPmrxfUVERq1evZuTIkYTDYc444wxP4m5Op5hDeuTIkWqT/RjTua1b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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt \n", "\n", "labels = data['sentiment'].replace({'neutral':0, 'positive':1, 'negative':-1})\n", "\n", "pos = bow_reduced[labels==1]\n", "neg = bow_reduced[labels==-1]\n", "neu = bow_reduced[labels==0]\n", "\n", "plt.scatter(neu[0], neu[1], c='y', label='neutral');\n", "plt.scatter(pos[0], pos[1], c='b', label='positive');\n", "plt.scatter(neg[0], neg[1], c='r', label='negative');\n", "\n", "plt.legend();\n", "\n", "plt.title('PCA on BOW: Each point is a message');\n", "plt.xlabel('PC1');\n", "plt.ylabel('PC2');" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "It is important to point out that **dimensionality reduction is not the same as feature selection**. The main difference is that in dimensionality reduction, we **transform** the data in a lower dimensional space while in feature selection we **select** a subset of the original features. In other words, PC1 and PC2 are linear combinations of the original features, while the features selected in feature selection are the original features." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## K-Nearest Neighbors (KNN)\n", "\n", "K-Nearest Neighbors (KNN) is a supervised machine learning algorithm that can be used for both classification and regression problems. KNN is a non-parametric, lazy learning algorithm that classifies a data point based on the $k$ data points that are nearest to it. KNN does not make any assumptions on the underlying data distribution. \n", "\n", "Note that nearest points (observations) can be found by multiplying the matrix representation of observations by its transpose. The resulting matrix contains the distances between all pairs of observations. \n", "\n", "Once you have the similarity matrix, you can find the $k$ nearest neighbors of a particular observation by sorting the row of the similarity matrix corresponding to that observation.\n", "\n", "Your prediction can then be mean or median of the target values of the $k$ nearest neighbors.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Recommender Systems\n", "\n", "Recommender systems are a type of information filtering system that are used to predict the rating or preference that a user would give to an item. They are widely used in e-commerce, entertainment, and social media platforms. Recommender systems are of two types:\n", "\n", "Nearest Neighbors (KNN) are often used to build recommender systems. Recommender systems are used to recommend items to users based on their past preferences. \n", "\n", "
\n", "\n", "### Collaborative Filtering\n", "\n", "Collaborative filtering is a technique that is used to filter out items that a user might like on the basis of reactions by similar users. It works by searching a large group of people and finding a smaller set of users with tastes similar to a particular user. It looks at the items they like and combines them to create a ranked list of suggestions.\n", "\n", "Nearest Neighbors (KNN) are used to find the users that are similar to a particular user. The items that are liked by the similar users are then recommended to the particular user.\n", "\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "data = pd.read_csv('../data/bratings.csv', index_col=0)\n", "\n", "data['title'] = data['Title'].apply(lambda x: x[:10]+\"...\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "For instance, in the data above, if we wanted to recommend a book to user `JohnPal`, we would just find the most similar user using Nearest Neighbor and recommend what the most similar user liked that `JohnPal` hasn't read. \n", "\n", "This would require re-formatting the data to a form where **each row represents a user and each column is a book**. " ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "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", "
Gods and K...The Mayor ...Blessings...Stitch 'N ...Why Men Lo...Red Storm ...Great Expe...Sex, Drugs...A Crown Of...The Bread ......Push: A No...Tarzan of ...Ultra Blac...Stone of T...The Truth ...Left to Te...Good to Gr...Blue Like ...Love & Res...1491: New ...
profileName
! Metamorpho ;) \"Reflective and Wiser Seer\"0000000000...0000000000
\"0000000000...0010000000
\"-thewarlock-\"0000000000...0001000000
\"24heineck\"0000000000...0001000000
\"350am\"0000000000...0000000000
..................................................................
~LEON~0000000000...0000000000
~Storm~0000000000...0000000000
~S~0000000000...0000000000
~Terry~0000100000...0000000000
~auntysue~0000000000...0000000000
\n", "

42214 rows × 151 columns

\n", "
" ], "text/plain": [ " Gods and K... The Mayor ... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " Blessings... Stitch 'N ... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " Why Men Lo... Red Storm ... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 1 0 \n", "~auntysue~ 0 0 \n", "\n", " Great Expe... Sex, Drugs... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " A Crown Of... The Bread ... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " ... Push: A No... \\\n", "profileName ... \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" ... 0 \n", "\" ... 0 \n", "\"-thewarlock-\" ... 0 \n", "\"24heineck\" ... 0 \n", "\"350am\" ... 0 \n", "... ... ... \n", "~LEON~ ... 0 \n", "~Storm~ ... 0 \n", "~S~ ... 0 \n", "~Terry~ ... 0 \n", "~auntysue~ ... 0 \n", "\n", " Tarzan of ... Ultra Blac... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 1 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " Stone of T... The Truth ... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 1 0 \n", "\"24heineck\" 1 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " Left to Te... Good to Gr... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " Blue Like ... Love & Res... \\\n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 0 \n", "\" 0 0 \n", "\"-thewarlock-\" 0 0 \n", "\"24heineck\" 0 0 \n", "\"350am\" 0 0 \n", "... ... ... \n", "~LEON~ 0 0 \n", "~Storm~ 0 0 \n", "~S~ 0 0 \n", "~Terry~ 0 0 \n", "~auntysue~ 0 0 \n", "\n", " 1491: New ... \n", "profileName \n", "! Metamorpho ;) \"Reflective and Wiser Seer\" 0 \n", "\" 0 \n", "\"-thewarlock-\" 0 \n", "\"24heineck\" 0 \n", "\"350am\" 0 \n", "... ... \n", "~LEON~ 0 \n", "~Storm~ 0 \n", "~S~ 0 \n", "~Terry~ 0 \n", "~auntysue~ 0 \n", "\n", "[42214 rows x 151 columns]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unique_titles = list(data['title'].unique())\n", "\n", "def agg_user(grobj):\n", " user_titles = list(grobj['title'].unique())\n", " vec = pd.Series(0, index=unique_titles)\n", " vec.loc[user_titles] = 1\n", " return vec\n", "\n", "data.groupby('profileName').apply(agg_user)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Content Based Filtering\n", "\n", "Content based filtering is a technique that is used to filter out items that a user might like on the basis of the description of the item itself. It works by creating a profile of the user's interests based on the items that the user has liked in the past. It then recommends items that match the user's profile.\n", "\n", "Nearest Neighbors (KNN) are used to find the items that are similar to the items that a user has liked in the past. The similar items are then recommended to the user.\n", "\n" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "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", "
Poster_LinkSeries_TitleReleased_YearCertificateRuntimeGenreIMDB_RatingOverviewMeta_scoreDirectorStar1Star2Star3Star4No_of_VotesGross
0https://m.media-amazon.com/images/M/MV5BMDFkYT...The Shawshank Redemption1994A142 minDrama9.3Two imprisoned men bond over a number of years...80.0Frank DarabontTim RobbinsMorgan FreemanBob GuntonWilliam Sadler234311028,341,469
1https://m.media-amazon.com/images/M/MV5BM2MyNj...The Godfather1972A175 minCrime, Drama9.2An organized crime dynasty's aging patriarch t...100.0Francis Ford CoppolaMarlon BrandoAl PacinoJames CaanDiane Keaton1620367134,966,411
2https://m.media-amazon.com/images/M/MV5BMTMxNT...The Dark Knight2008UA152 minAction, Crime, Drama9.0When the menace known as the Joker wreaks havo...84.0Christopher NolanChristian BaleHeath LedgerAaron EckhartMichael Caine2303232534,858,444
3https://m.media-amazon.com/images/M/MV5BMWMwMG...The Godfather: Part II1974A202 minCrime, Drama9.0The early life and career of Vito Corleone in ...90.0Francis Ford CoppolaAl PacinoRobert De NiroRobert DuvallDiane Keaton112995257,300,000
4https://m.media-amazon.com/images/M/MV5BMWU4N2...12 Angry Men1957U96 minCrime, Drama9.0A jury holdout attempts to prevent a miscarria...96.0Sidney LumetHenry FondaLee J. CobbMartin BalsamJohn Fiedler6898454,360,000
\n", "
" ], "text/plain": [ " Poster_Link \\\n", "0 https://m.media-amazon.com/images/M/MV5BMDFkYT... \n", "1 https://m.media-amazon.com/images/M/MV5BM2MyNj... \n", "2 https://m.media-amazon.com/images/M/MV5BMTMxNT... \n", "3 https://m.media-amazon.com/images/M/MV5BMWMwMG... \n", "4 https://m.media-amazon.com/images/M/MV5BMWU4N2... \n", "\n", " Series_Title Released_Year Certificate Runtime \\\n", "0 The Shawshank Redemption 1994 A 142 min \n", "1 The Godfather 1972 A 175 min \n", "2 The Dark Knight 2008 UA 152 min \n", "3 The Godfather: Part II 1974 A 202 min \n", "4 12 Angry Men 1957 U 96 min \n", "\n", " Genre IMDB_Rating \\\n", "0 Drama 9.3 \n", "1 Crime, Drama 9.2 \n", "2 Action, Crime, Drama 9.0 \n", "3 Crime, Drama 9.0 \n", "4 Crime, Drama 9.0 \n", "\n", " Overview Meta_score \\\n", "0 Two imprisoned men bond over a number of years... 80.0 \n", "1 An organized crime dynasty's aging patriarch t... 100.0 \n", "2 When the menace known as the Joker wreaks havo... 84.0 \n", "3 The early life and career of Vito Corleone in ... 90.0 \n", "4 A jury holdout attempts to prevent a miscarria... 96.0 \n", "\n", " Director Star1 Star2 Star3 \\\n", "0 Frank Darabont Tim Robbins Morgan Freeman Bob Gunton \n", "1 Francis Ford Coppola Marlon Brando Al Pacino James Caan \n", "2 Christopher Nolan Christian Bale Heath Ledger Aaron Eckhart \n", "3 Francis Ford Coppola Al Pacino Robert De Niro Robert Duvall \n", "4 Sidney Lumet Henry Fonda Lee J. Cobb Martin Balsam \n", "\n", " Star4 No_of_Votes Gross \n", "0 William Sadler 2343110 28,341,469 \n", "1 Diane Keaton 1620367 134,966,411 \n", "2 Michael Caine 2303232 534,858,444 \n", "3 Diane Keaton 1129952 57,300,000 \n", "4 John Fiedler 689845 4,360,000 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_csv('../data/imdb_top_1000.csv')\n", "data.head()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In the data above, for instance, if a user liked `The Shawshank Redemption` then you need to find the most-similar movie (not the user) using Nearest Neighbor and recommend that to the user. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Social Media Feeds\n", "\n", "Social media platforms such as Facebook, Twitter, and Instagram use recommender systems to recommend posts to users. The posts that are recommended to a user are based on the posts that the user has liked in the past.\n", "\n", "
\n", "\n", "These platforms also use algorithms similar to KNN to sort the posts in a user's feed. The posts that are similar to the posts that a user has liked in the past are shown at the top of the user's feed." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }