From 755451e79b87d10185f1b7eb7235a2c4b9944be8 Mon Sep 17 00:00:00 2001 From: Abbas Harris Date: Wed, 2 Dec 2020 10:34:47 -0500 Subject: [PATCH] pull request --- .../abbash_notebook-checkpoint.ipynb | 146 ++ .../practice_notebook-checkpoint.ipynb | 175 ++ .../shariq_notebook-checkpoint.ipynb | 1922 +++++++++++++++++ notebooks/abbash_notebook.ipynb | 111 +- notebooks/shariq_notebook.ipynb | 2 +- 5 files changed, 2348 insertions(+), 8 deletions(-) create mode 100644 notebooks/.ipynb_checkpoints/abbash_notebook-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/practice_notebook-checkpoint.ipynb create mode 100644 notebooks/.ipynb_checkpoints/shariq_notebook-checkpoint.ipynb diff --git a/notebooks/.ipynb_checkpoints/abbash_notebook-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/abbash_notebook-checkpoint.ipynb new file mode 100644 index 0000000..0a4be93 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/abbash_notebook-checkpoint.ipynb @@ -0,0 +1,146 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.fftpack\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numpy Tutorials: Fast Fourier Transform: The First Three Natural Frequencies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### What is Fast Fourier Transform (FFT)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " A Fast Fourier Transform is a fundamental concept in the world of engineering. It is specifically used in the field of vibrations and measuring frequencies of various devices. FFT is primarily used to compute discrete functions, such as trigonometric functions, time it takes to complete a cycle, etc. Whereas, the FFT utilizes signals of any device/function and converts them from time domains into frequency domains. As a result, we are able to associate frequencies to the devices at certain vibrations at certain times. In turn, the correlated frequencies are considered to be \"natural frequencies\" due to the vibrations being unforced. \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example 1: Associating Natural Frequencies to a Sine Function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the first example of setting up a Fast Fourier Transform, we will take a look into a sin wave and generate it's natural frequencies at each peak.\n", + " We will define a sin wave in terms of frequency, a certain value of samples over a certain time frame, in this case a 100 Hz wave frequency over a 10 second period:" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "N_freq = 100 #sample size of frequencies, in terms of Hertz\n", + "time = 10 #duration of sin function, in terms of seconds\n", + "wave_freq = N_freq * time #this outputs a wave frequency over the given time frame\n", + "\n", + "#define a sine wave function in terms of the listed variables\n", + "def sine_function(frequency, N_freq, time):\n", + " x = np.linspace(0, time, wave_freq) \n", + " y = np.sin((2 * np.pi * x)) #sine function that utilizes the variables associated with 'x'\n", + " return x,y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once defining the sine wave function that implements frequency over a certain period of time, we can proceed to graph this data to output a sine wave graph:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x, y = sine_function(100, N_freq, time) #x and y variables are 'returned' when we define the function\n", + "plt.title('Sine Wave Graph')\n", + "plt.plot(x, y)\n", + "plt.xlabel('Time (seconds)')\n", + "plt.ylabel('frequency (Hz)')\n", + "plt.grid('True')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created a sine wave, we can generate a code to convert this function to output corresponding natural frequencies:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/.ipynb_checkpoints/practice_notebook-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/practice_notebook-checkpoint.ipynb new file mode 100644 index 0000000..7fe335b --- /dev/null +++ b/notebooks/.ipynb_checkpoints/practice_notebook-checkpoint.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# This is the Practice Notebook for Fall 2020\n", + "\n", + "Use this notebook to play around with Jupyter notebooks and the interface." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams.update({'font.size': 18})\n", + "plt.rcParams['lines.linewidth'] = 3\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let's manually create an array from 0-8, then square each value. \n", + "\n", + "_Can you do it with a NumPy command?_" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "x=np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])\n", + "y=x**2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## We can plot the result to see the parabola using `matplotlib.pyplot`, which we shortened above to `plt`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'y')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(x, y)\n", + "plt.xlabel('x')\n", + "plt.ylabel('y')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now, let's build a 2D array and print the result." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 2 3]\n", + " [4 5 6]\n", + " [7 8 9]]\n" + ] + } + ], + "source": [ + "A = np.array([[1, 2, 3], \n", + " [4, 5, 6],\n", + " [7, 8, 9]])\n", + "print(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Then, take the transpose and print it again." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 4 7]\n", + " [2 5 8]\n", + " [3 6 9]]\n" + ] + } + ], + "source": [ + "print(A.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's next?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/.ipynb_checkpoints/shariq_notebook-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/shariq_notebook-checkpoint.ipynb new file mode 100644 index 0000000..a8220e8 --- /dev/null +++ b/notebooks/.ipynb_checkpoints/shariq_notebook-checkpoint.ipynb @@ -0,0 +1,1922 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "zVqckeyP8wnd" + }, + "source": [ + "# Collaborative Filtering Recommender Systems for Movies" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "XvLAtMbR-IGT" + }, + "source": [ + "Download data from https://grouplens.org/datasets/movielens/100k/ " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ghLtL-5r5n9P" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# get users\n", + "user_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code']\n", + "users = pd.read_csv('ml-100k/u.user', sep='|', names=user_cols, encoding='latin-1')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(943, 5)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "users.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "kMOuE-bgaxDL", + "outputId": "a4ee4c5b-a416-4f56-a294-e3afaffbf436" + }, + "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", + "
user_idagesexoccupationzip_code
0124Mtechnician85711
1253Fother94043
2323Mwriter32067
3424Mtechnician43537
4533Fother15213
\n", + "
" + ], + "text/plain": [ + " user_id age sex occupation zip_code\n", + "0 1 24 M technician 85711\n", + "1 2 53 F other 94043\n", + "2 3 23 M writer 32067\n", + "3 4 24 M technician 43537\n", + "4 5 33 F other 15213" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "users.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# get items\n", + "item_cols = ['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']\n", + "items = pd.read_csv('ml-100k/u.item', sep='|', names=item_cols, encoding='latin-1')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1682, 24)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "items.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 360 + }, + "colab_type": "code", + "id": "XwyB1-QxY5Rt", + "outputId": "3dfc68a9-f7f3-4650-a380-7982f7ff63e0" + }, + "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", + "
movie_idmovie_titlerelease_datevideo_release_dateIMDb_URLunknownActionAdventureAnimationChildren's...FantasyFilm-NoirHorrorMusicalMysteryRomanceSci-FiThrillerWarWestern
01Toy Story (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Toy%20Story%2...00011...0000000000
12GoldenEye (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?GoldenEye%20(...01100...0000000100
23Four Rooms (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Four%20Rooms%...00000...0000000100
34Get Shorty (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Get%20Shorty%...01000...0000000000
45Copycat (1995)01-Jan-1995NaNhttp://us.imdb.com/M/title-exact?Copycat%20(1995)00000...0000000100
\n", + "

5 rows × 24 columns

\n", + "
" + ], + "text/plain": [ + " movie_id movie_title release_date video_release_date \\\n", + "0 1 Toy Story (1995) 01-Jan-1995 NaN \n", + "1 2 GoldenEye (1995) 01-Jan-1995 NaN \n", + "2 3 Four Rooms (1995) 01-Jan-1995 NaN \n", + "3 4 Get Shorty (1995) 01-Jan-1995 NaN \n", + "4 5 Copycat (1995) 01-Jan-1995 NaN \n", + "\n", + " IMDb_URL unknown Action \\\n", + "0 http://us.imdb.com/M/title-exact?Toy%20Story%2... 0 0 \n", + "1 http://us.imdb.com/M/title-exact?GoldenEye%20(... 0 1 \n", + "2 http://us.imdb.com/M/title-exact?Four%20Rooms%... 0 0 \n", + "3 http://us.imdb.com/M/title-exact?Get%20Shorty%... 0 1 \n", + "4 http://us.imdb.com/M/title-exact?Copycat%20(1995) 0 0 \n", + "\n", + " Adventure Animation Children's ... Fantasy Film-Noir Horror Musical \\\n", + "0 0 1 1 ... 0 0 0 0 \n", + "1 1 0 0 ... 0 0 0 0 \n", + "2 0 0 0 ... 0 0 0 0 \n", + "3 0 0 0 ... 0 0 0 0 \n", + "4 0 0 0 ... 0 0 0 0 \n", + "\n", + " Mystery Romance Sci-Fi Thriller War Western \n", + "0 0 0 0 0 0 0 \n", + "1 0 0 0 1 0 0 \n", + "2 0 0 0 1 0 0 \n", + "3 0 0 0 0 0 0 \n", + "4 0 0 0 1 0 0 \n", + "\n", + "[5 rows x 24 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "items.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "AG9BVXm2dY7X" + }, + "source": [ + "ua.base -- The data sets ua.base, ua.test, ub.base, and ub.test\n", + "ua.test split the u data into a training set and a test set with\n", + "ub.base exactly 10 ratings per user in the test set. The sets\n", + "ub.test ua.test and ub.test are disjoint. These data sets can\n", + " be generated from u.data" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "urp6j4yW6OJl", + "outputId": "0907767b-a04b-4e7b-f315-e9fe0cde73a2" + }, + "outputs": [], + "source": [ + "# get base ratings\n", + "r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp']\n", + "ratings_base = pd.read_csv('ml-100k/ua.base', sep='\\t', names=r_cols, encoding='latin-1')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(90570, 4)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ratings_base.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "ScNSSMlc6aZP", + "outputId": "41f69eff-568e-4014-e2a3-3349fd545496" + }, + "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", + "
user_idmovie_idratingunix_timestamp
0115874965758
1123876893171
2134878542960
3143876893119
4153889751712
\n", + "
" + ], + "text/plain": [ + " user_id movie_id rating unix_timestamp\n", + "0 1 1 5 874965758\n", + "1 1 2 3 876893171\n", + "2 1 3 4 878542960\n", + "3 1 4 3 876893119\n", + "4 1 5 3 889751712" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ratings_base.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ovjdNulP-tow" + }, + "source": [ + "### Create a pivot table from the ratings_base dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "colab_type": "code", + "id": "9axc9p326fC2", + "outputId": "912bf5a5-256f-4392-8f5a-872083fe7d02" + }, + "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", + "
user_id12345678910...934935936937938939940941942943
movie_id
15400040004...2340400500
23000000000...4000000005
34000000000...0040000000
43000005004...5000002000
53000000000...0000000000
\n", + "

5 rows × 943 columns

\n", + "
" + ], + "text/plain": [ + "user_id 1 2 3 4 5 6 7 8 9 10 ... 934 935 \\\n", + "movie_id ... \n", + "1 5 4 0 0 0 4 0 0 0 4 ... 2 3 \n", + "2 3 0 0 0 0 0 0 0 0 0 ... 4 0 \n", + "3 4 0 0 0 0 0 0 0 0 0 ... 0 0 \n", + "4 3 0 0 0 0 0 5 0 0 4 ... 5 0 \n", + "5 3 0 0 0 0 0 0 0 0 0 ... 0 0 \n", + "\n", + "user_id 936 937 938 939 940 941 942 943 \n", + "movie_id \n", + "1 4 0 4 0 0 5 0 0 \n", + "2 0 0 0 0 0 0 0 5 \n", + "3 4 0 0 0 0 0 0 0 \n", + "4 0 0 0 0 2 0 0 0 \n", + "5 0 0 0 0 0 0 0 0 \n", + "\n", + "[5 rows x 943 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rtable = pd.pivot_table(ratings_base,index='movie_id', columns='user_id', values='rating',fill_value = 0)\n", + "rtable.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 136 + }, + "colab_type": "code", + "id": "pZcWfHsPF8rY", + "outputId": "5d1e01e4-16f5-42d8-ae5c-d664956d8895" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[5, 4, 0, ..., 5, 0, 0],\n", + " [3, 0, 0, ..., 0, 0, 5],\n", + " [4, 0, 0, ..., 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0]])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Y\n", + "rtable.values" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "colab_type": "code", + "id": "pubVgFhXhCZu", + "outputId": "e8067e91-e44e-4a42-d279-7ecaf5c9b082" + }, + "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", + "
user_id12345678910...934935936937938939940941942943
movie_id
11.01.00.00.00.01.00.00.00.01.0...1.01.01.00.01.00.00.01.00.00.0
21.00.00.00.00.00.00.00.00.00.0...1.00.00.00.00.00.00.00.00.01.0
31.00.00.00.00.00.00.00.00.00.0...0.00.01.00.00.00.00.00.00.00.0
41.00.00.00.00.00.01.00.00.01.0...1.00.00.00.00.00.01.00.00.00.0
51.00.00.00.00.00.00.00.00.00.0...0.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 6 7 8 9 10 ... 934 935 \\\n", + "movie_id ... \n", + "1 1.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 ... 1.0 1.0 \n", + "2 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.0 0.0 \n", + "3 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n", + "4 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 ... 1.0 0.0 \n", + "5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 \n", + "\n", + "user_id 936 937 938 939 940 941 942 943 \n", + "movie_id \n", + "1 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 \n", + "3 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 \n", + "5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", + "\n", + "[5 rows x 943 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "R = (rtable != 0)\n", + "R = R.astype(float)\n", + "R.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "iqMJX_th6Tim" + }, + "source": [ + "$$\\sum_{i:r(i, j)=1}(\\theta(j)^T x^{(i)} - y^{(i, j)} x_k^{(i)} + \\lambda \\theta_k^{(j)}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CXBaE-DzE4X7" + }, + "outputs": [], + "source": [ + "# user j rating (theta)\n", + "# item/movie i (X)\n", + "# Xk - for loop?" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "Xn015qHn-_2k" + }, + "outputs": [], + "source": [ + "def cost(params, Y, R, num_users, num_movies, num_features, lambd):\n", + " # unwrap params into X and theta\n", + " X = params[: num_movies * num_features].reshape(num_movies, num_features)\n", + " theta = params[num_movies * num_features:].reshape(num_users, num_features)\n", + " \n", + " # make prediction and compute loss\n", + " pred = np.dot(X, theta.T)\n", + " loss = (pred - Y)\n", + " # cost\n", + " J = np.sum((np.square(loss * R))) / 2\n", + " \n", + " # compute cost regularization and add to original cost\n", + " r_X = lambd / 2 * np.sum(np.square(theta))\n", + " r_Theta = lambd / 2 * np.sum(np.square(X))\n", + " J = J + r_X + r_Theta\n", + " \n", + " return J" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-PEimp90eP0T" + }, + "outputs": [], + "source": [ + "def Gradient(params, Y, R, num_users, num_movies, num_features, lambd): \n", + " # unwrap params into X and theta\n", + " X = params[: num_movies * num_features].reshape(num_movies, num_features)\n", + " theta = params[num_movies * num_features:].reshape(num_users, num_features)\n", + "\n", + " # make prediction and compute loss\n", + " pred = np.dot(X, theta.T)\n", + " loss = (pred - Y)\n", + " \n", + " # compute gradient with regularization\n", + " X_grad = np.dot(loss * R, theta) + lambd * X\n", + " theta_grad = np.dot((loss * R).T, X) + lambd * Theta\n", + "\n", + " grad = np.squeeze(np.concatenate((X_grad.reshape([num_movies * num_features, 1], order = \"f\"),\n", + " theta_grad.reshape([num_users * num_features, 1], order = \"f\"))))\n", + "\n", + " return grad" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "610dv4Kb2VDg" + }, + "outputs": [], + "source": [ + "def Optimize(params, Y, r, n_users, n_items, n_features, lambd, step, maxrun):\n", + " costs = []\n", + " for iter in range(maxrun):\n", + " params_prime = params\n", + " J = cost(params_prime, Y, r, n_users, n_items, n_features, lambd)\n", + " grad = Gradient(params_prime, Y, r, n_users, n_items, n_features, lambd)\n", + " params = params_prime - step * grad\n", + " # append cost value on each iteration to costs list so we can plot\n", + " costs.append(J)\n", + "\n", + " return params, costs" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "Dr5HjphVuvmf", + "outputId": "629e8371-b7fd-4c29-b0b0-0907ee7852c5" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "39380.64508844781" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_users = np.size(rtable, 1) # users\n", + "n_items = np.size(rtable, 0) # movies\n", + "n_features = 1 # try a small number \n", + "\n", + "# Initialization\n", + "X = np.random.normal(loc = 0.0, scale = 1.0, size = (n_items, n_features)) # i.e. n movies (items), and 1 user (feature) \n", + "Theta = np.random.normal(loc = 0.0, scale = 1.0, size = (n_users,n_features))\n", + "\n", + "init_params = np.concatenate((X.reshape(n_items * n_features, 1, order = \"F\"),\n", + " Theta.reshape(n_users * n_features, 1, order = \"F\")))\n", + "init_params = np.squeeze(init_params)\n", + "\n", + "# Optimization\n", + "lamba = 0.1\n", + "maxrun = 10000\n", + "step = 0.00001\n", + "params, J = Optimize(init_params, rtable.values, R.values, n_users, n_items, \\\n", + " n_features, lamba, step, maxrun)\n", + "J[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 + }, + "colab_type": "code", + "id": "Y2UQhu5z5be5", + "outputId": "e86ae0ba-863d-4cdf-ef7b-f3753049644d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# now plot the cost\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(J,\"b.\",markersize=1,label=\"Cost\") # note: this is 0-based\n", + "plt.show()\n", + " \n", + "# Extract X and Theta from params vector\n", + "X = params[0:(n_items * n_features)]\n", + "Theta = params[(n_items * n_features):len(params)]\n", + "X = X.reshape(n_items, n_features, order = \"F\")\n", + "Theta = Theta.reshape(n_users, n_features, order = \"F\")\n", + "pred = np.dot(X, Theta.T)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "o4mn6z6h7Z5w", + "outputId": "da0ef956-6f71-4069-83a9-4ec8c40d7716" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1680, 1)\n", + "(943, 1)\n" + ] + } + ], + "source": [ + "param_X = init_params[:n_items].reshape(n_items, n_features)\n", + "print(param_X.shape)\n", + "\n", + "param_theta = init_params[n_items:].reshape(n_users, n_features)\n", + "print(param_theta.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "omeFv6DlB1OP", + "outputId": "aa4b0197-9c01-41fa-a59d-aa4c1863999c" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(1680,)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "init_params[Theta.shape[0]:].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "colab_type": "code", + "id": "TspeeoeKeP9g", + "outputId": "69302ea4-f49d-4faa-c73f-8cd3eac01b3d" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "n_users = np.size(rtable, 1)\n", + "n_items = np.size(rtable, 0)\n", + "n_features = 1 # try a small number\n", + "\n", + "# Initialization\n", + "X = np.random.normal(loc = 0.0, scale = 1.0, size = (n_items, n_features))\n", + "Theta = np.random.normal(loc = 0.0, scale = 1.0, size = (n_users,n_features))\n", + "\n", + "init_params = np.concatenate((X.reshape(n_items * n_features, 1, order = \"F\"),\n", + " Theta.reshape(n_users * n_features, 1, order = \"F\")))\n", + "init_params = np.squeeze(init_params)\n", + "\n", + "# Optimization\n", + "lamba = 0.1\n", + "maxrun = 10000\n", + "step = 0.00001\n", + "params, costs = Optimize(init_params, rtable.values, R.values, n_users, n_items, \\\n", + " n_features, lamba, step, maxrun)\n", + "# now plot the cost\n", + "import matplotlib.pyplot as plt\n", + "plt.plot(costs,\"b.\",markersize=1,label=\"Cost\") # note: this is 0-based\n", + "plt.show()\n", + " \n", + "# Extract X and Theta from params vector\n", + "X = params[0:(n_items * n_features)]\n", + "Theta = params[(n_items * n_features):len(params)]\n", + "X = X.reshape(n_items, n_features, order = \"F\")\n", + "Theta = Theta.reshape(n_users, n_features, order = \"F\")\n", + "pred = np.dot(X, Theta.T)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "colab_type": "code", + "id": "H2LA-WUBQ7h8", + "outputId": "d9d95c2b-3820-483d-edbd-5d0598055947" + }, + "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", + "
user_id12345678910...934935936937938939940941942943
movie_id
13.9814973.9714023.3750804.8024573.4408053.6530024.3131274.1945504.1854074.204742...3.8528114.4494584.2433443.4480893.9653825.1527493.5451094.0742174.3559603.809908
23.3611143.3525912.8491874.0541542.9046703.0838033.6410703.5409693.5332513.549573...3.2524793.7561583.5821612.9108203.3475104.3498652.9927223.4393863.6772293.216261
33.1798983.1718352.6955723.8355732.7480642.9175393.4447603.3500573.3427543.358197...3.0771203.5536443.3890272.7538823.1670284.1153412.8313683.2539513.4789703.042855
43.6460873.6368413.0907564.3978863.1509433.3452643.9497783.8411913.8328183.850524...3.5282414.0746253.8858753.1576143.6313294.7186693.2464603.7309953.9890043.488952
53.3685843.3600422.8555194.0631642.9111253.0906573.6491623.5488393.5411033.557462...3.2597073.7645063.5901222.9172893.3549494.3595322.9993733.4470303.6854013.223409
\n", + "

5 rows × 943 columns

\n", + "
" + ], + "text/plain": [ + "user_id 1 2 3 4 5 6 \\\n", + "movie_id \n", + "1 3.981497 3.971402 3.375080 4.802457 3.440805 3.653002 \n", + "2 3.361114 3.352591 2.849187 4.054154 2.904670 3.083803 \n", + "3 3.179898 3.171835 2.695572 3.835573 2.748064 2.917539 \n", + "4 3.646087 3.636841 3.090756 4.397886 3.150943 3.345264 \n", + "5 3.368584 3.360042 2.855519 4.063164 2.911125 3.090657 \n", + "\n", + "user_id 7 8 9 10 ... 934 935 \\\n", + "movie_id ... \n", + "1 4.313127 4.194550 4.185407 4.204742 ... 3.852811 4.449458 \n", + "2 3.641070 3.540969 3.533251 3.549573 ... 3.252479 3.756158 \n", + "3 3.444760 3.350057 3.342754 3.358197 ... 3.077120 3.553644 \n", + "4 3.949778 3.841191 3.832818 3.850524 ... 3.528241 4.074625 \n", + "5 3.649162 3.548839 3.541103 3.557462 ... 3.259707 3.764506 \n", + "\n", + "user_id 936 937 938 939 940 941 \\\n", + "movie_id \n", + "1 4.243344 3.448089 3.965382 5.152749 3.545109 4.074217 \n", + "2 3.582161 2.910820 3.347510 4.349865 2.992722 3.439386 \n", + "3 3.389027 2.753882 3.167028 4.115341 2.831368 3.253951 \n", + "4 3.885875 3.157614 3.631329 4.718669 3.246460 3.730995 \n", + "5 3.590122 2.917289 3.354949 4.359532 2.999373 3.447030 \n", + "\n", + "user_id 942 943 \n", + "movie_id \n", + "1 4.355960 3.809908 \n", + "2 3.677229 3.216261 \n", + "3 3.478970 3.042855 \n", + "4 3.989004 3.488952 \n", + "5 3.685401 3.223409 \n", + "\n", + "[5 rows x 943 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# make a prediction\n", + "pred_df = pd.DataFrame(pred, columns = rtable.columns, index = rtable.index)\n", + "pred_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "colab_type": "code", + "id": "RMdtfvpCjnXz", + "outputId": "7c0c2f7b-d596-4f7b-e418-28d0aaf13f35" + }, + "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", + "
user_id12345678910...934935936937938939940941942943
movie_id
14435344444...4443454444
23334334444...3443343343
33334333333...3433343333
44434334444...4443453443
53334334444...3443343343
\n", + "

5 rows × 943 columns

\n", + "
" + ], + "text/plain": [ + "user_id 1 2 3 4 5 6 7 8 9 10 ... 934 935 \\\n", + "movie_id ... \n", + "1 4 4 3 5 3 4 4 4 4 4 ... 4 4 \n", + "2 3 3 3 4 3 3 4 4 4 4 ... 3 4 \n", + "3 3 3 3 4 3 3 3 3 3 3 ... 3 4 \n", + "4 4 4 3 4 3 3 4 4 4 4 ... 4 4 \n", + "5 3 3 3 4 3 3 4 4 4 4 ... 3 4 \n", + "\n", + "user_id 936 937 938 939 940 941 942 943 \n", + "movie_id \n", + "1 4 3 4 5 4 4 4 4 \n", + "2 4 3 3 4 3 3 4 3 \n", + "3 3 3 3 4 3 3 3 3 \n", + "4 4 3 4 5 3 4 4 3 \n", + "5 4 3 3 4 3 3 4 3 \n", + "\n", + "[5 rows x 943 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# convert the ratings to numbers numbers 1-5\n", + "pd.options.display.float_format = '{:,.0f}'.format\n", + "pred_df.head()" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "group_4_assignment_7.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/abbash_notebook.ipynb b/notebooks/abbash_notebook.ipynb index b56b6ad..0a4be93 100644 --- a/notebooks/abbash_notebook.ipynb +++ b/notebooks/abbash_notebook.ipynb @@ -2,21 +2,118 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.fftpack\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Numpy Tutorials: Fast Fourier Transform: The First Three Natural Frequencies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### What is Fast Fourier Transform (FFT)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " A Fast Fourier Transform is a fundamental concept in the world of engineering. It is specifically used in the field of vibrations and measuring frequencies of various devices. FFT is primarily used to compute discrete functions, such as trigonometric functions, time it takes to complete a cycle, etc. Whereas, the FFT utilizes signals of any device/function and converts them from time domains into frequency domains. As a result, we are able to associate frequencies to the devices at certain vibrations at certain times. In turn, the correlated frequencies are considered to be \"natural frequencies\" due to the vibrations being unforced. \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Example 1: Associating Natural Frequencies to a Sine Function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the first example of setting up a Fast Fourier Transform, we will take a look into a sin wave and generate it's natural frequencies at each peak.\n", + " We will define a sin wave in terms of frequency, a certain value of samples over a certain time frame, in this case a 100 Hz wave frequency over a 10 second period:" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "N_freq = 100 #sample size of frequencies, in terms of Hertz\n", + "time = 10 #duration of sin function, in terms of seconds\n", + "wave_freq = N_freq * time #this outputs a wave frequency over the given time frame\n", + "\n", + "#define a sine wave function in terms of the listed variables\n", + "def sine_function(frequency, N_freq, time):\n", + " x = np.linspace(0, time, wave_freq) \n", + " y = np.sin((2 * np.pi * x)) #sine function that utilizes the variables associated with 'x'\n", + " return x,y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once defining the sine wave function that implements frequency over a certain period of time, we can proceed to graph this data to output a sine wave graph:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "hello\n" - ] + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "print('hello')" + "x, y = sine_function(100, N_freq, time) #x and y variables are 'returned' when we define the function\n", + "plt.title('Sine Wave Graph')\n", + "plt.plot(x, y)\n", + "plt.xlabel('Time (seconds)')\n", + "plt.ylabel('frequency (Hz)')\n", + "plt.grid('True')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created a sine wave, we can generate a code to convert this function to output corresponding natural frequencies:" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/notebooks/shariq_notebook.ipynb b/notebooks/shariq_notebook.ipynb index a8220e8..bdf9ddc 100644 --- a/notebooks/shariq_notebook.ipynb +++ b/notebooks/shariq_notebook.ipynb @@ -1914,7 +1914,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.8.3" } }, "nbformat": 4,