diff --git a/notebook/problems.ipynb b/notebook/problems.ipynb index 94a8dd29..b33b556c 100644 --- a/notebook/problems.ipynb +++ b/notebook/problems.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","id":"5dbe7b9e","metadata":{},"source":["# Calculus and Algebra problems"]},{"cell_type":"markdown","id":"519c4b12","metadata":{},"source":["## Calculus\n","\n","Calculus is not obscure. It is the language for modeling behaviors. Calculus enables us to find the rate of changes in order to optimise a function. Without calculus, we would not be able to fully understand techniques such as:\n","\n","Backpropagation in neural networks\n","\n","Regression using optimal least square\n","\n","Expectation maximization in fitting probability models"]},{"cell_type":"markdown","id":"b7e2e87a","metadata":{},"source":["### Exercise 1\n","\n","Let’s say in my office, it takes me 10 seconds (time) to travel 25 meters (distance) to the coffee machine.\n","If we want to express the above situation as a function, then it would be:\n","\n","distance = speed * time\n","\n","So for this case, speed is the first derivative of the distance function above. As speed describes the rate of change of distance over time, when people say taking the first derivative of a certain function, they mean finding out the rate of change of a function.\n","\n","**Find the speed and build the linear function on distance $(d)$ over time $(t)$, when $(t ∈ [0,10])$.**"]},{"cell_type":"code","execution_count":null,"id":"bb3e954e","metadata":{},"outputs":[],"source":["#import libraries\n","\n","\n","#define the distance function"]},{"cell_type":"code","execution_count":null,"id":"dbc4c780","metadata":{},"outputs":[],"source":["#plot the distance function on domain(t)"]},{"cell_type":"code","execution_count":null,"id":"4c4d4f20","metadata":{},"outputs":[],"source":["# create a dataframe"]},{"cell_type":"markdown","id":"1144168d","metadata":{},"source":["### Exercise 2\n","\n","It turned out that I wasn't walking a constant speed towards getting my coffee but I was accelerating (my speed increased over time). If initial speed = 0, it still took me 10 seconds to travel from my seat to my coffee but I was walking faster and faster.\n","\n","$V_o$ = initial speed = $0$\n","\n","t = time\n","\n","a = acceleration\n","\n","**distance** = $V_o * t + 0.5 * a * (t^2)$\n","\n","**speed** = $V_o + a * t$\n","\n","The first derivative of the speed function is acceleration. I realise that the speed function is closely related to the distance function.\n","\n","**Find the acceleration value and build the quadratic function $(t ∈ [0,10])$. Also create a graph and a table.**"]},{"cell_type":"code","execution_count":null,"id":"ec1f8bd7","metadata":{},"outputs":[],"source":["#define and plot the quadratic funtion"]},{"cell_type":"code","execution_count":null,"id":"ba5c497b","metadata":{},"outputs":[],"source":["#create a dataframe"]},{"cell_type":"markdown","id":"66d4cc18","metadata":{},"source":["Before exercise 3, we'll make a brief introduction to Gradient Descent algorithm, which will have a larger explanation in future modules of the bootcamp.\n","\n","Gradient Descent algorithm is the hero behind the family of deep learning algorithms. When an algorithm in this family runs, it tries to minimize the error between the training input and predicted output. This minimization is done by optimization algorithms and gradient descent is the most popular one.\n","\n","Let’s say you have these input & output pairs:\n","\n","```py\n","input:\n","[\n"," [1,2],\n"," [3,4]\n","]\n","\n","output:\n","\n","[\n"," [50],\n"," [110]\n","]\n","```\n","We can estimate that if we multiply the input values by [10, 20], we can have the output as shown above.\n","```py\n","1(10) + 2(20) = 50\n","\n","3(10) + 4(20) = 110\n","```\n","When a machine learning algorithm starts running, it assigns random values and makes a prediction. \n","Let’s say it assigned [1,2] values:\n","```py\n","1(1) + 2(2) = 5\n","\n","3(1) + 4(2) = 11\n","```\n","Once it has the predictions, it calculates the error: the difference between the real data and the predicted data. There are many ways to calculate the error and they are called loss functions. \n","Once we have this value, the optimization algorithm starts showing itself and it sets new values which replace the initial random values. \n","\n","And, the loop continues until a condition is met. That condition can be to loop n times, or to loop until error is smaller than a value."]},{"cell_type":"markdown","id":"85ef2f0b","metadata":{},"source":["It can be hard to understand **gradient descent** without understanding **gradient**. So, let’s focus on what gradient is. The gradient shows the direction of the greatest change of a scalar function. The gradient calculation is done with derivatives, so let’s start with a simple example. To calculate the gradient, we just need to remember some linear algebra calculations from high school because we need to calculate derivatives.\n","\n","Let’s say we want to find the minimum point of $f(x) = x^2$. The derivative of that function is $df(x)=2^x$. \n","\n","The gradient of $f(x)$ at point $x=-10$\n","\n","is \n","\n","$df(-10)=-20$.\n","\n","The gradient of $f(x)$ at point $x=1$\n","\n","is \n","\n","$df(1)=2$.\n","\n","Now let’s visualize $f(x)$ and those $x=-10$ and $x=1$ points."]},{"cell_type":"code","execution_count":22,"id":"4ff7e11a","metadata":{},"outputs":[],"source":["import numpy as np\n","import seaborn as sns\n","\n","def f(x):\n"," return x**2\n","\n","def df(x):\n"," return 2*x\n","\n","def visualize(f, x=None):\n"," \n"," xArray = np.linspace(-10, 10, 100) \n"," yArray = f(xArray)\n"," sns.lineplot(x=xArray, y=yArray)\n"," \n"," if x is not None:\n"," assert type(x) in [np.ndarray, list] # x should be numpy array or list\n"," if type(x) is list: # if it is a list, convert to numpy array\n"," x = np.array(x)\n","\n"," \n"," y = f(x)\n"," sns.scatterplot(x=x, y=y, color='red')"]},{"cell_type":"code","execution_count":23,"id":"633a54fd","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=[-10, 1])"]},{"cell_type":"markdown","id":"9c187ad7","metadata":{},"source":["The red dot at x=-10 does not know the surface it stands on and it only knows the coordinates of where it stands and that the gradient of itself which is -20. And the other red dot at x=1 does not know the surface it stands on and it only knows the coordinates of where it stands and that the gradient of itself which is 2.\n","\n","By having only this information: we can say that the red dot at x=-10 should make a bigger jump than x=1 because it has a bigger absolute gradient value. The sign shows the direction. - shows that the red dot at x=-10 should move to the right and the other one should move to the left.\n","\n","In summary; the red dot at x=-10 (gradient: -20) should make a bigger jump to the right and the red dot at x=1 (gradient: 2) should make a smaller jump to the left. \n","\n","We know that the jump length should be proportional to the gradient, but what is that value exactly? We don’t know. So, let’s just say that red points should move with the length of alpha*gradient where alpha is just a parameter.\n","\n","We can say that the new location of the red dot should be calculated with the following formula:\n","\n","x = x - gradient * alpha"]},{"cell_type":"markdown","id":"0a7f5c3f","metadata":{},"source":["Now let's implement this with **Numpy**. Let’s start with visualizing $f(x)=x^2$ function and $x=-10$ point."]},{"cell_type":"code","execution_count":24,"id":"e26dbdf0","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=[-10])"]},{"cell_type":"markdown","id":"6e752e19","metadata":{},"source":["The following code implements the whole logic explained before:"]},{"cell_type":"code","execution_count":25,"id":"2bdd54f1","metadata":{},"outputs":[],"source":["def gradient_descent(x, nsteps=1):\n"," \n"," \n"," #collectXs is an array to store how x changed in each iteration, \n"," #so we can visualize it later\n"," \n"," collectXs = [x]\n"," \n"," #learning_rate is the value that we mentioned as alpha in previous section\n"," \n"," learning_rate = 1e-01\n"," \n"," for _ in range(nsteps):\n"," \n"," #the following one line does the real magic\n"," #the next value of x is calculated by subtracting the gradient*learning_rate by itself\n"," #the intuation behind this line is in the previous section\n"," \n"," x -= df(x) * learning_rate \n"," collectXs.append(x)\n"," \n"," #we return a tuple that contains\n"," #x -> recent x after nsteps \n"," #collectXs -> all the x values that was calculated so far\n"," \n"," return x, collectXs"]},{"cell_type":"markdown","id":"aea74a65","metadata":{},"source":["Before running gradient descent with 1000 steps, let’s just run it twice, one step at a time to see how x evolves. \n","We start with x=-10 and it evolves to x=-8. We know that when x=0 that is the **minimum point**, so, yes it is evolving in the correct direction."]},{"cell_type":"code","execution_count":26,"id":"0350981e","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-8.0\n"]}],"source":["x=-10\n","x, collectedXs = gradient_descent(x, nsteps=1)\n","print(x)"]},{"cell_type":"code","execution_count":27,"id":"f8e01e2d","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-6.4\n"]}],"source":["#The next step will start at x=-8. Let's run gradient for 1 step\n","\n","x, collectedXs = gradient_descent(x, nsteps=1)\n","print(x)"]},{"cell_type":"markdown","id":"93f13b32","metadata":{},"source":["It goes to x=-6.4. Excelent. Now let's run it 1000 times"]},{"cell_type":"code","execution_count":28,"id":"b699d1fb","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-7.873484301831169e-97\n"]}],"source":["x, collectedXs = gradient_descent(x, nsteps=1000)\n","print(x)"]},{"cell_type":"code","execution_count":29,"id":"0b76ee22","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=collectedXs)"]},{"cell_type":"markdown","id":"d00d2fbb","metadata":{},"source":["### Exercise 3\n","\n","When I arrive to the coffee machine, I hear my colleague talking about the per-unit costs of producing 'product B' for the company. As the company produces more units, the per-unit costs continue to decrease until a point where it starts to increase.\n","\n","To optimise the per-unit production cost at its minimal to optimise efficiency, the company would need to find the number of units to be produced where the per-unit production costs begin to change from decreasing to increasing.\n","\n","**Build a quadratic function $f(x)=0.1(x)^2−9x +4500$ on $x∈[0,100]$ to create the per-unit cost function, and make a conclusion.**"]},{"cell_type":"code","execution_count":null,"id":"7c67d8b7","metadata":{},"outputs":[],"source":["#define and plot the funtion"]},{"cell_type":"markdown","id":"fbe54895","metadata":{},"source":["We saw with Gradient Descent how the red dot navigates in an environment it does not know about. It only knows the coordinates of where it is and its gradient. The red dot could find the minimum point by using only this knowledge and gradient descent algorithm.\n","\n","**Optional:**\n","\n","Implement all the previous steps to create a gradient descent algorithm to see how the per-unit cost evolves, with a starting point of 0 units of production."]},{"cell_type":"markdown","id":"aabad82c","metadata":{},"source":["## Linear Algebra"]},{"cell_type":"markdown","id":"6753636d","metadata":{},"source":["### Exercise 1 : Sum of two matrices\n","\n","Suppose we have two matrices A and B.\n","```py\n","A = [[1,2],[3,4]]\n","B = [[4,5],[6,7]]\n","\n","then we get\n","A+B = [[5,7],[9,11]]\n","A-B = [[-3,-3],[-3,-3]]\n","```\n","\n","Make the sum of two matrices using Python with Numpy"]},{"cell_type":"code","execution_count":null,"id":"9e200c32","metadata":{},"outputs":[],"source":["# importing numpy as np\n","\n"," \n"," \n","# creating first matrix\n","\n"," \n","# creating second matrix\n","\n"," \n","#print elements\n","\n","\n"," \n","# adding two matrix\n"]},{"cell_type":"markdown","id":"93bfb6cc","metadata":{},"source":["### Exercise 2: Sum of two lists\n","\n","There will be many situations in which we'll have to find index wise summation of two different lists. This can have possible applications in day-to-day programming. In this exercise we will solve the same problem with various ways in which this task can be performed.\n","\n","We have the following two lists:\n","```py\n","list1 = [2, 5, 4, 7, 3]\n","list2 = [1, 4, 6, 9, 10]\n","```\n","\n","Now let's use Python code to demonstrate addition of two lists.\n"]},{"cell_type":"code","execution_count":null,"id":"867b70fc","metadata":{},"outputs":[],"source":["# Naive method\n","\n","# initializing lists\n","list1 = [2, 5, 4, 7, 3]\n","list2 = [1, 4, 6, 9, 10]\n"," \n","# printing original lists\n","print (\"Original list 1 : \" + str(list1))\n","print (\"Original list 2 : \" + str(list2))\n"," \n","# using naive method to \n","# add two list \n","res_list = []\n","for i in range(0, len(list1)):\n"," res_list.append(list1[i] + list2[i])\n"," \n","# printing resultant list \n","print (\"Resultant list is : \" + str(res_list))"]},{"cell_type":"markdown","id":"7a063d7f","metadata":{},"source":["Now use the following three different methods to make the same calculation: sum of two lists"]},{"cell_type":"code","execution_count":null,"id":"681930a3","metadata":{},"outputs":[],"source":["# Use list comprehensions to perform addition of the two lists:\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# using list comprehension to add two list \n","\n"," \n","# printing resultant list \n"]},{"cell_type":"code","execution_count":null,"id":"a3a8a425","metadata":{},"outputs":[],"source":["# Use map() + add():\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# using map() + add() to add two list \n","\n"," \n","# printing resultant list "]},{"cell_type":"code","execution_count":null,"id":"1708d7ee","metadata":{},"outputs":[],"source":["# Use zip() + sum():\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# Using zip() + sum() to add two list \n","\n"," \n","# printing resultant list "]},{"cell_type":"markdown","id":"1aef1bd2","metadata":{},"source":["### Exercise 3 : Dot multiplication\n","\n","We have two matrices:\n","```py\n","matrix1 = [[1,7,3],\n"," [ 4,5,2],\n"," [ 3,6,1]]\n","matrix2 = [[5,4,1],\n"," [ 1,2,3],\n"," [ 4,5,2]]\n","```\n","\n","A simple technique but expensive method for larger input datasets is using for loops. In this exercise we will first use nested for loops to iterate through each row and column of the matrices, and then we will perform the same multiplication using Numpy."]},{"cell_type":"code","execution_count":null,"id":"840e7d0e","metadata":{},"outputs":[],"source":["#Using a for loop input two matrices of size n x m\n","matrix1 = [[1,7,3],\n"," [ 4,5,2],\n"," [ 3,6,1]]\n","matrix2 = [[5,4,1],\n"," [ 1,2,3],\n"," [ 4,5,2]]\n"," \n","res = [[0 for x in range(3)] for y in range(3)]\n"," \n","# explicit for loops\n","for i in range(len(matrix1)):\n"," for j in range(len(matrix2[0])):\n"," for k in range(len(matrix2)):\n"," \n"," # resulted matrix\n"," res[i][j] += matrix1[i][k] * matrix2[k][j]\n"," \n","print (res)"]},{"cell_type":"code","execution_count":null,"id":"db6c3355","metadata":{},"outputs":[],"source":["# Import libraries\n","\n"," \n","# input two matrices\n","\n"," \n","# This will return dot product\n","\n"," \n","# print resulted matrix\n"]},{"cell_type":"markdown","id":"785f6c30","metadata":{},"source":["\n","https://www.youtube.com/channel/UCXq-PLvYAX-EufF5RAPihVg\n","\n","https://www.geeksforgeeks.org/\n","\n","https://medium.com/@seehleung/basic-calculus-explained-for-machine-learning-c7f642e7ced3\n","\n","https://blog.demir.io/understanding-gradient-descent-266fc3dcf02f"]}],"metadata":{"interpreter":{"hash":"d3463682613d55fcbb64853e38cc3520a7f67bdf8d6940e781ddcdc423122719"},"kernelspec":{"display_name":"Python 3.9.12 ('calculus-project')","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"}},"nbformat":4,"nbformat_minor":5} +{"cells":[{"cell_type":"markdown","id":"5dbe7b9e","metadata":{},"source":["# Calculus and Algebra problems"]},{"cell_type":"markdown","id":"519c4b12","metadata":{},"source":["## Calculus\n","\n","Calculus is not obscure. It is the language for modeling behaviors. Calculus enables us to find the rate of changes in order to optimise a function. Without calculus, we would not be able to fully understand techniques such as:\n","\n","Backpropagation in neural networks;\n","\n","Regression using optimal least square;\n","\n","Expectation maximization in fitting probability models."]},{"cell_type":"markdown","id":"b7e2e87a","metadata":{},"source":["### Exercise 1\n","\n","Let’s say in my office, it takes me 10 seconds (time) to travel 25 meters (distance) to the coffee machine.\n","If we want to express the above situation as a function, then it would be:\n","\n","distance = speed * time\n","\n","So for this case, speed is the first derivative of the distance function above. As speed describes the rate of change of distance over time, when people say taking the first derivative of a certain function, they mean finding out the rate of change of a function.\n","\n","**Find the speed and build the linear function on distance $(d)$ over time $(t)$, when $(t ∈ [0,10])$.**"]},{"cell_type":"code","execution_count":null,"id":"bb3e954e","metadata":{},"outputs":[],"source":["#import libraries\n","\n","\n","#define the distance function"]},{"cell_type":"code","execution_count":null,"id":"dbc4c780","metadata":{},"outputs":[],"source":["#plot the distance function on domain(t)"]},{"cell_type":"code","execution_count":null,"id":"4c4d4f20","metadata":{},"outputs":[],"source":["# create a dataframe"]},{"cell_type":"markdown","id":"1144168d","metadata":{},"source":["### Exercise 2\n","\n","It turned out that I wasn't walking a constant speed towards getting my coffee but I was accelerating (my speed increased over time). If initial speed = 0, it still took me 10 seconds to travel from my seat to my coffee but I was walking faster and faster.\n","\n","$V_o$ = initial speed = $0$\n","\n","t = time\n","\n","a = acceleration\n","\n","**distance** = $V_o * t + 0.5 * a * (t^2)$\n","\n","**speed** = $V_o + a * t$\n","\n","The first derivative of the speed function is acceleration. I realise that the speed function is closely related to the distance function.\n","\n","**Find the acceleration value and build the quadratic function $(t ∈ [0,10])$. Also create a graph and a table.**"]},{"cell_type":"code","execution_count":null,"id":"ec1f8bd7","metadata":{},"outputs":[],"source":["#define and plot the quadratic funtion"]},{"cell_type":"code","execution_count":null,"id":"ba5c497b","metadata":{},"outputs":[],"source":["#create a dataframe"]},{"cell_type":"markdown","id":"66d4cc18","metadata":{},"source":["Before exercise 3, we'll make a brief introduction to Gradient Descent algorithm, which will have a larger explanation in future modules of the bootcamp.\n","\n","Gradient Descent algorithm is the hero behind the family of deep learning algorithms. When an algorithm in this family runs, it tries to minimize the error between the training input and predicted output. This minimization is done by optimization algorithms and gradient descent is the most popular one.\n","\n","Let’s say you have these input & output pairs:\n","\n","```py\n","input:\n","[\n"," [1,2],\n"," [3,4]\n","]\n","\n","output:\n","\n","[\n"," [50],\n"," [110]\n","]\n","```\n","We can estimate that if we multiply the input values by [10, 20], we can have the output as shown above.\n","```py\n","1(10) + 2(20) = 50\n","\n","3(10) + 4(20) = 110\n","```\n","When a machine learning algorithm starts running, it assigns random values and makes a prediction. \n","Let’s say it assigned [1,2] values:\n","```py\n","1(1) + 2(2) = 5\n","\n","3(1) + 4(2) = 11\n","```\n","Once it has the predictions, it calculates the error: the difference between the real data and the predicted data. There are many ways to calculate the error and they are called loss functions. \n","Once we have this value, the optimization algorithm starts showing itself and it sets new values which replace the initial random values. \n","\n","And, the loop continues until a condition is met. That condition can be to loop n times, or to loop until error is smaller than a value."]},{"cell_type":"markdown","id":"85ef2f0b","metadata":{},"source":["It can be hard to understand **gradient descent** without understanding **gradient**. So, let’s focus on what gradient is. The gradient shows the direction of the greatest change of a scalar function. The gradient calculation is done with derivatives, so let’s start with a simple example. To calculate the gradient, we just need to remember some linear algebra calculations from high school because we need to calculate derivatives.\n","\n","Let’s say we want to find the minimum point of $f(x) = x^2$. The derivative of that function is $df(x)=2^x$. \n","\n","The gradient of $f(x)$ at point $x=-10$\n","\n","is \n","\n","$df(-10)=-20$.\n","\n","The gradient of $f(x)$ at point $x=1$\n","\n","is \n","\n","$df(1)=2$.\n","\n","Now let’s visualize $f(x)$ and those $x=-10$ and $x=1$ points."]},{"cell_type":"code","execution_count":22,"id":"4ff7e11a","metadata":{},"outputs":[],"source":["import numpy as np\n","import seaborn as sns\n","\n","def f(x):\n"," return x**2\n","\n","def df(x):\n"," return 2*x\n","\n","def visualize(f, x=None):\n"," \n"," xArray = np.linspace(-10, 10, 100) \n"," yArray = f(xArray)\n"," sns.lineplot(x=xArray, y=yArray)\n"," \n"," if x is not None:\n"," assert type(x) in [np.ndarray, list] # x should be numpy array or list\n"," if type(x) is list: # if it is a list, convert to numpy array\n"," x = np.array(x)\n","\n"," \n"," y = f(x)\n"," sns.scatterplot(x=x, y=y, color='red')"]},{"cell_type":"code","execution_count":23,"id":"633a54fd","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=[-10, 1])"]},{"cell_type":"markdown","id":"9c187ad7","metadata":{},"source":["The red dot at x=-10 does not know the surface it stands on and it only knows the coordinates of where it stands and that the gradient of itself which is -20. And the other red dot at x=1 does not know the surface it stands on and it only knows the coordinates of where it stands and that the gradient of itself which is 2.\n","\n","By having only this information: we can say that the red dot at x=-10 should make a bigger jump than x=1 because it has a bigger absolute gradient value. The sign shows the direction. - shows that the red dot at x=-10 should move to the right and the other one should move to the left.\n","\n","In summary; the red dot at x=-10 (gradient: -20) should make a bigger jump to the right and the red dot at x=1 (gradient: 2) should make a smaller jump to the left. \n","\n","We know that the jump length should be proportional to the gradient, but what is that value exactly? We don’t know. So, let’s just say that red points should move with the length of alpha*gradient where alpha is just a parameter.\n","\n","We can say that the new location of the red dot should be calculated with the following formula:\n","\n","x = x - gradient * alpha"]},{"cell_type":"markdown","id":"0a7f5c3f","metadata":{},"source":["Now let's implement this with **Numpy**. Let’s start with visualizing $f(x)=x^2$ function and $x=-10$ point."]},{"cell_type":"code","execution_count":24,"id":"e26dbdf0","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=[-10])"]},{"cell_type":"markdown","id":"6e752e19","metadata":{},"source":["The following code implements the whole logic explained before:"]},{"cell_type":"code","execution_count":25,"id":"2bdd54f1","metadata":{},"outputs":[],"source":["def gradient_descent(x, nsteps=1):\n"," \n"," \n"," #collectXs is an array to store how x changed in each iteration, \n"," #so we can visualize it later\n"," \n"," collectXs = [x]\n"," \n"," #learning_rate is the value that we mentioned as alpha in previous section\n"," \n"," learning_rate = 1e-01\n"," \n"," for _ in range(nsteps):\n"," \n"," #the following one line does the real magic\n"," #the next value of x is calculated by subtracting the gradient*learning_rate by itself\n"," #the intuation behind this line is in the previous section\n"," \n"," x -= df(x) * learning_rate \n"," collectXs.append(x)\n"," \n"," #we return a tuple that contains\n"," #x -> recent x after nsteps \n"," #collectXs -> all the x values that was calculated so far\n"," \n"," return x, collectXs"]},{"cell_type":"markdown","id":"aea74a65","metadata":{},"source":["Before running gradient descent with 1000 steps, let’s just run it twice, one step at a time to see how x evolves. \n","We start with x=-10 and it evolves to x=-8. We know that when x=0 that is the **minimum point**, so, yes it is evolving in the correct direction."]},{"cell_type":"code","execution_count":26,"id":"0350981e","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-8.0\n"]}],"source":["x=-10\n","x, collectedXs = gradient_descent(x, nsteps=1)\n","print(x)"]},{"cell_type":"code","execution_count":27,"id":"f8e01e2d","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-6.4\n"]}],"source":["#The next step will start at x=-8. Let's run gradient for 1 step\n","\n","x, collectedXs = gradient_descent(x, nsteps=1)\n","print(x)"]},{"cell_type":"markdown","id":"93f13b32","metadata":{},"source":["It goes to x=-6.4. Excelent. Now let's run it 1000 times"]},{"cell_type":"code","execution_count":28,"id":"b699d1fb","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["-7.873484301831169e-97\n"]}],"source":["x, collectedXs = gradient_descent(x, nsteps=1000)\n","print(x)"]},{"cell_type":"code","execution_count":29,"id":"0b76ee22","metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":["
"]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["visualize(f, x=collectedXs)"]},{"cell_type":"markdown","id":"d00d2fbb","metadata":{},"source":["### Exercise 3\n","\n","When I arrive to the coffee machine, I hear my colleague talking about the per-unit costs of producing 'product B' for the company. As the company produces more units, the per-unit costs continue to decrease until a point where it starts to increase.\n","\n","To optimise the per-unit production cost at its minimal to optimise efficiency, the company would need to find the number of units to be produced where the per-unit production costs begin to change from decreasing to increasing.\n","\n","**Build a quadratic function $f(x)=0.1(x)^2−9x +4500$ on $x∈[0,100]$ to create the per-unit cost function, and make a conclusion.**"]},{"cell_type":"code","execution_count":null,"id":"7c67d8b7","metadata":{},"outputs":[],"source":["#define and plot the funtion"]},{"cell_type":"markdown","id":"fbe54895","metadata":{},"source":["We saw with Gradient Descent how the red dot navigates in an environment it does not know about. It only knows the coordinates of where it is and its gradient. The red dot could find the minimum point by using only this knowledge and gradient descent algorithm.\n","\n","**Optional:**\n","\n","Implement all the previous steps to create a gradient descent algorithm to see how the per-unit cost evolves, with a starting point of 0 units of production."]},{"cell_type":"markdown","id":"aabad82c","metadata":{},"source":["## Linear Algebra"]},{"cell_type":"markdown","id":"6753636d","metadata":{},"source":["### Exercise 1 : Sum of two matrices\n","\n","Suppose we have two matrices A and B.\n","```py\n","A = [[1,2],[3,4]]\n","B = [[4,5],[6,7]]\n","\n","then we get\n","A+B = [[5,7],[9,11]]\n","A-B = [[-3,-3],[-3,-3]]\n","```\n","\n","Make the sum of two matrices using Python with Numpy"]},{"cell_type":"code","execution_count":null,"id":"9e200c32","metadata":{},"outputs":[],"source":["# importing numpy as np\n","\n"," \n"," \n","# creating first matrix\n","\n"," \n","# creating second matrix\n","\n"," \n","#print elements\n","\n","\n"," \n","# adding two matrix\n"]},{"cell_type":"markdown","id":"93bfb6cc","metadata":{},"source":["### Exercise 2: Sum of two lists\n","\n","There will be many situations in which we'll have to find index wise summation of two different lists. This can have possible applications in day-to-day programming. In this exercise we will solve the same problem with various ways in which this task can be performed.\n","\n","We have the following two lists:\n","```py\n","list1 = [2, 5, 4, 7, 3]\n","list2 = [1, 4, 6, 9, 10]\n","```\n","\n","Now let's use Python code to demonstrate addition of two lists.\n"]},{"cell_type":"code","execution_count":null,"id":"867b70fc","metadata":{},"outputs":[],"source":["# Naive method\n","\n","# initializing lists\n","list1 = [2, 5, 4, 7, 3]\n","list2 = [1, 4, 6, 9, 10]\n"," \n","# printing original lists\n","print (\"Original list 1 : \" + str(list1))\n","print (\"Original list 2 : \" + str(list2))\n"," \n","# using naive method to \n","# add two list \n","res_list = []\n","for i in range(0, len(list1)):\n"," res_list.append(list1[i] + list2[i])\n"," \n","# printing resultant list \n","print (\"Resultant list is : \" + str(res_list))"]},{"cell_type":"markdown","id":"7a063d7f","metadata":{},"source":["Now use the following three different methods to make the same calculation: sum of two lists"]},{"cell_type":"code","execution_count":null,"id":"681930a3","metadata":{},"outputs":[],"source":["# Use list comprehensions to perform addition of the two lists:\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# using list comprehension to add two list \n","\n"," \n","# printing resultant list \n"]},{"cell_type":"code","execution_count":null,"id":"a3a8a425","metadata":{},"outputs":[],"source":["# Use map() + add():\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# using map() + add() to add two list \n","\n"," \n","# printing resultant list "]},{"cell_type":"code","execution_count":null,"id":"1708d7ee","metadata":{},"outputs":[],"source":["# Use zip() + sum():\n","\n","# initializing lists\n","\n"," \n","# printing original lists\n","\n"," \n","# Using zip() + sum() to add two list \n","\n"," \n","# printing resultant list "]},{"cell_type":"markdown","id":"1aef1bd2","metadata":{},"source":["### Exercise 3 : Dot multiplication\n","\n","We have two matrices:\n","```py\n","matrix1 = [[1,7,3],\n"," [ 4,5,2],\n"," [ 3,6,1]]\n","matrix2 = [[5,4,1],\n"," [ 1,2,3],\n"," [ 4,5,2]]\n","```\n","\n","A simple technique but expensive method for larger input datasets is using for loops. In this exercise we will first use nested for loops to iterate through each row and column of the matrices, and then we will perform the same multiplication using Numpy."]},{"cell_type":"code","execution_count":null,"id":"840e7d0e","metadata":{},"outputs":[],"source":["#Using a for loop input two matrices of size n x m\n","matrix1 = [[1,7,3],\n"," [ 4,5,2],\n"," [ 3,6,1]]\n","matrix2 = [[5,4,1],\n"," [ 1,2,3],\n"," [ 4,5,2]]\n"," \n","res = [[0 for x in range(3)] for y in range(3)]\n"," \n","# explicit for loops\n","for i in range(len(matrix1)):\n"," for j in range(len(matrix2[0])):\n"," for k in range(len(matrix2)):\n"," \n"," # resulted matrix\n"," res[i][j] += matrix1[i][k] * matrix2[k][j]\n"," \n","print (res)"]},{"cell_type":"code","execution_count":null,"id":"db6c3355","metadata":{},"outputs":[],"source":["# Import libraries\n","\n"," \n","# input two matrices\n","\n"," \n","# This will return dot product\n","\n"," \n","# print resulted matrix\n"]},{"cell_type":"markdown","id":"785f6c30","metadata":{},"source":["\n","https://www.youtube.com/channel/UCXq-PLvYAX-EufF5RAPihVg\n","\n","https://www.geeksforgeeks.org/\n","\n","https://medium.com/@seehleung/basic-calculus-explained-for-machine-learning-c7f642e7ced3\n","\n","https://blog.demir.io/understanding-gradient-descent-266fc3dcf02f"]}],"metadata":{"interpreter":{"hash":"d3463682613d55fcbb64853e38cc3520a7f67bdf8d6940e781ddcdc423122719"},"kernelspec":{"display_name":"Python 3.9.12 ('calculus-project')","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"}},"nbformat":4,"nbformat_minor":5}