From 0b5ed62a5c968fa13b9f4028955f39bc2a7b30b9 Mon Sep 17 00:00:00 2001 From: Produpro <136916627+Produpro@users.noreply.github.com> Date: Sun, 15 Oct 2023 16:15:56 +0000 Subject: [PATCH] resuelto --- notebook/problems.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebook/problems.ipynb b/notebook/problems.ipynb index 94a8dd29..e8a5ce4f 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":1,"id":"bb3e954e","metadata":{},"outputs":[],"source":["#import libraries\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import pandas as pd\n","#define the distance function\n","\n","x = np.linspace(0,10)\n","def f(X): return 2.5*x "]},{"cell_type":"code","execution_count":2,"id":"dbc4c780","metadata":{},"outputs":[{"data":{"text/plain":["[]"]},"execution_count":2,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["#plot the distance function on domain(t)\n","plt.plot(x, f(x), label='f')\n"]},{"cell_type":"code","execution_count":3,"id":"4c4d4f20","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","
xf(x)
00.0000000.000000
10.2040820.510204
20.4081631.020408
30.6122451.530612
40.8163272.040816
\n","
"],"text/plain":[" x f(x)\n","0 0.000000 0.000000\n","1 0.204082 0.510204\n","2 0.408163 1.020408\n","3 0.612245 1.530612\n","4 0.816327 2.040816"]},"execution_count":3,"metadata":{},"output_type":"execute_result"}],"source":["# create a dataframe\n","df = pd.DataFrame({'x': x,'f(x)': f(x)})\n","df.head()\n"]},{"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":4,"id":"ec1f8bd7","metadata":{},"outputs":[{"data":{"text/plain":["[]"]},"execution_count":4,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["#define and plot the quadratic funtion\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import pandas as pd\n","\n","\n","def f(x): return 0.5*0.5*(x**2)\n","x = np.linspace(0,10)\n","plt.plot(x, f(x))\n","\n"]},{"cell_type":"code","execution_count":5,"id":"ba5c497b","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","
xf(x)
00.0000000.000000
10.2040820.010412
20.4081630.041649
30.6122450.093711
40.8163270.166597
\n","
"],"text/plain":[" x f(x)\n","0 0.000000 0.000000\n","1 0.204082 0.010412\n","2 0.408163 0.041649\n","3 0.612245 0.093711\n","4 0.816327 0.166597"]},"execution_count":5,"metadata":{},"output_type":"execute_result"}],"source":["#create a dataframe\n","df2 = pd.DataFrame({'x':x, 'f(x)': f(x)})\n","df2.head()"]},{"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":4,"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":5,"id":"633a54fd","metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n"]},{"data":{"image/png":"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trn0Pb722mti8+bN4syZMyIlJUVMmjRJuLm5idTUVCnewlU9//zzYvv27SIjI0P88ccfIjExUQQGBorCwkIhhP3vPyHMH7YRERHiH//4x2WP2eO+Kysrs3zWARDvv/++OHjwoDh37pwQQoi3335b+Pr6inXr1okjR46IsWPHiqioKFFVVWV5jZtvvlksXLjQ8vW1vo+twekKykMPPSQAXHbbtm2bZZvMzEwxevRo4e7uLgIDA8Xzzz/foEVv27ZNABAZGRmW+y5cuCDuu+8+4eXlJXx8fMQjjzxiKT224L777hODBw9u9LGMjIwG/wZZWVli2LBhwt/fX6hUKhEdHS1eeOEFodVq2zBx06SkpIj4+HihVquFm5ubiI2NFf/6178aHO269P0JIURVVZV4+umnhZ+fn/Dw8BB33XVXgw99W7F06dJG/7/+9eCnPe6/hQsXioiICOHq6ioGDhwo9uzZY3nsxhtvFA899FCD7b/99lvRpUsX4erqKrp37y5+/PHHNk7cdFfaX0uXLrVsc+l7nDlzpuXfIzg4WNx2223iwIEDbR++Ce69914REhIiXF1dRfv27cW9994r0tPTLY/b+/4TwnwEHIA4efLkZY/Z476r/8y69Fb/Pkwmk3jllVdEcHCwUKlUYsSIEZe998jISDF37twG913t+9gaZEIIYb0TRkRERETXj/OgEBERkc1hQSEiIiKbw4JCRERENocFhYiIiGwOCwoRERHZHBYUIiIisjksKERERGRzWFCIiIjI5rCgEBERkc1hQSEiIiKbw4JCRERENocFhYiIiGzO/wOdWk+4/hx5RgAAAABJRU5ErkJggg==","text/plain":["
"]},"metadata":{},"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":6,"id":"e26dbdf0","metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n"]},{"data":{"image/png":"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Zs0acejQITFq1CgRHR0tKioqbK9xyy23iPnz59u+vtb3sT20uoIyadIkAeCy25YtW2zbpKenixEjRgh3d3cRGBgonn/++TotesuWLQKASEtLs9134cIFcf/99wsvLy/h4+MjHnnkEVvpkYP7779fDBw4sN7H0tLS6vwbZGRkiCFDhgh/f3+h0WhETEyMeOGFF4Rer2/BxA2TkpIi4uPjhVarFW5ubiI2Nlb861//qnO069L3J4QQFRUV4umnnxZ+fn7Cw8ND3H333XU+9OVi8eLF9f5//evBT0fcf/PnzxeRkZHC1dVV9O/fX+zatcv22I033igmTZpUZ/tvv/1WdOzYUbi6uoquXbuKH3/8sYUTN9yV9tfixYtt21z6HqdPn2779wgJCRG333672LdvX8uHb4D77rtPhIaGCldXV9GmTRtx3333idOnT9sed/T9J4T1CDgAceLEicsec8R9V/uZdemt9n1YLBbxyiuviJCQEKHRaMTQoUMve+9RUVFi9uzZde672vexPSiEEMJ+J4yIiIiIrh/nQSEiIiLZYUEhIiIi2WFBISIiItlhQSEiIiLZYUEhIiIi2WFBISIiItlhQSEiIiLZYUEhIiIi2WFBISIiItlhQSEiIiLZYUEhIiIi2WFBISIiItn5f+IbOqnrlvrOAAAAAElFTkSuQmCC","text/plain":["
"]},"metadata":{},"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":7,"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":8,"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":9,"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":10,"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":11,"id":"0b76ee22","metadata":{},"outputs":[{"name":"stderr","output_type":"stream","text":["/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.\n"," with pd.option_context('mode.use_inf_as_na', True):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n","/home/vscode/.local/lib/python3.11/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n"," if pd.api.types.is_categorical_dtype(vector):\n"]},{"data":{"image/png":"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XE9CQgK6d+8OjUZjvm/48OEoLS3FsWPHrvocT0/PBkckYmNjIZfLkZiYaPXMTbFu3ToUFhbikUceue62P/74I3x9fdGtWzfMnj0blZWVLZCwed599134+PggKioKH3zwwTVPySUlJaG2thaxsbHm+yIiIhAaGoqEhISWiHtTtFotvL29r7udFPefTqdDUlJSg6+9XC5HbGzsVb/2CQkJDbYHTN+TtrCvANP+AnDdfVZeXo6wsDCEhIRg7NixV/15IwUnT55EUFAQ2rVrh8mTJyMjI+Oq29ry/tPpdFi6dCkeffTRay5Ma0v77nLp6enIzc1tsI/UajWio6Ovuo+a833cHDa5WKA15ebmNignAMx/zs3Nvepz/P39G9ynVCrh7e191eeI5dtvv8Xw4cOvu9jiAw88gLCwMAQFBeHIkSN4+eWXkZaWhl9++aWFkt645557Dr1794a3tzd2796N2bNnIycnBx999FGj2+fm5sLR0fGKMUgajUZy++typ06dwvz58/Hhhx9eczup7r+CggIYDIZGv8dSU1Mbfc7Vvielvq8A08rrM2bMwKBBg9CtW7erbte5c2d899136NGjB7RaLT788EMMHDgQx44ds/rCqE0VHR2NxYsXo3PnzsjJycHrr7+OW2+9FUePHoW7u/sV29vy/lu7di1KSkrw8MMPX3UbW9p3janfD03ZR835Pm4Ouygor7zyCt57771rbpOSknLdgVy2pDnvOSsrC3/++SdWrlx53de/dPxM9+7dERgYiGHDhuH06dNo375984PfoKa8v1mzZpnv69GjBxwdHfHEE09g3rx5kp2Kujn77/z58xgxYgQmTJiAxx577JrPFXv/kUl8fDyOHj16zTEaABATE4OYmBjznwcOHIjIyEgsXLgQb775prVjNsmdd95p/v8ePXogOjoaYWFhWLlyJaZNmyZiMsv79ttvceeddyIoKOiq29jSvrM1dlFQXnjhhWs2XABo167dDb1WQEDAFSOR66/uCAgIuOpzLh8YpNfrUVRUdNXn3KzmvOdFixbBx8cHd911V5P/vujoaACm3+Bb4gPuZvZpdHQ09Ho9zp49i86dO1/xeEBAAHQ6HUpKShocRcnLy7Pa/rpcU99fdnY2br/9dgwcOBBfffVVk/++lt5/V+Pr6wuFQnHFFVPX+toHBAQ0aXupeOaZZ8wD5pv6m7SDgwOioqJw6tQpK6WzHE9PT3Tq1OmqWW11/507dw5btmxp8lFHW9p3wMXPtby8PAQGBprvz8vLQ69evRp9TnO+j5vFYqNZbMz1Bsnm5eWZ71u4cKHg4eEhVFdXN/pa9YNk9+/fb77vzz//lNQgWaPRKISHhwsvvPBCs56/c+dOAYBw+PBhCyezvKVLlwpyuVwoKipq9PH6QbKrV68235eamirZQbJZWVlCx44dhYkTJwp6vb5ZryGl/de/f3/hmWeeMf/ZYDAIbdq0ueYg2dGjRze4LyYmRrKDLI1GoxAfHy8EBQUJJ06caNZr6PV6oXPnzsLMmTMtnM7yysrKBC8vL+HTTz9t9HFb23/15s6dKwQEBAi1tbVNep7U9x2uMkj2ww8/NN+n1WpvaJBsU76Pm5XVYq9kI86dOyccPHhQeP311wU3Nzfh4MGDwsGDB4WysjJBEEz/uLp16ybExcUJhw4dEjZu3Cj4+fkJs2fPNr9GYmKi0LlzZyErK8t834gRI4SoqCghMTFR2Llzp9CxY0dh0qRJLf7+rmbLli0CACElJeWKx7KysoTOnTsLiYmJgiAIwqlTp4Q33nhD2L9/v5Ceni78+uuvQrt27YTBgwe3dOzr2r17t/Dxxx8Lhw4dEk6fPi0sXbpU8PPzE6ZMmWLe5vL3JwiC8OSTTwqhoaHCX3/9Jezfv1+IiYkRYmJixHgL15SVlSV06NBBGDZsmJCVlSXk5OSYb5duY0v7b/ny5YJKpRIWL14sHD9+XHj88ccFT09P85VzDz30kPDKK6+Yt9+1a5egVCqFDz/8UEhJSRHmzp0rODg4CMnJyWK9hWt66qmnBLVaLfz9998N9ldlZaV5m8vf4+uvvy78+eefwunTp4WkpCRh4sSJgpOTk3Ds2DEx3sI1vfDCC8Lff/8tpKenC7t27RJiY2MFX19fIT8/XxAE299/gmD6sA0NDRVefvnlKx6zxX1XVlZm/qwDIHz00UfCwYMHhXPnzgmCIAjvvvuu4OnpKfz666/CkSNHhLFjxwrh4eFCVVWV+TWGDh0qzJ8/3/zn630fW0KrKyhTp04VAFxx27Ztm3mbs2fPCnfeeafg7Ows+Pr6Ci+88EKDFr1t2zYBgJCenm6+r7CwUJg0aZLg5uYmeHh4CI888oi59EjBpEmThIEDBzb6WHp6eoOvQUZGhjB48GDB29tbUKlUQocOHYQXX3xR0Gq1LZj4xiQlJQnR0dGCWq0WnJychMjISOGdd95pcLTr8vcnCIJQVVUlPP3004KXl5fg4uIi3H333Q0+9KVi0aJFjf57vfTgpy3uv/nz5wuhoaGCo6Oj0L9/f2HPnj3mx4YMGSJMnTq1wfYrV64UOnXqJDg6Ogpdu3YVfvvttxZOfOOutr8WLVpk3uby9zhjxgzz10Oj0QgjR44UDhw40PLhb8D9998vBAYGCo6OjkKbNm2E+++/Xzh16pT5cVvff4JgOgIOQEhLS7viMVvcd/WfWZff6t+H0WgUXnvtNUGj0QgqlUoYNmzYFe89LCxMmDt3boP7rvV9bAkyQRAEy50wIiIiIrp5nAeFiIiIJIcFhYiIiCSHBYWIiIgkhwWFiIiIJIcFhYiIiCSHBYWIiIgkhwWFiIiIJIcFhYiIiCSHBYWIiIgkhwWFiIiIJIcFhYiIiCSHBYWIiIgk5/8BvqGrerIErUIAAAAASUVORK5CYII=","text/plain":["
"]},"metadata":{},"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":12,"id":"7c67d8b7","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Punto mas bajo de la curva 4297.501041232819\n"]},{"data":{"image/png":"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s3LHQXIOlBLib/OKwbvH1KvAlJSUMHLkSGbOnMmTTz553PagoCBiY397euLw8PCT7vPaa68RHx/PtGnTAOjatSsrVqzg+eefV4ERERGpg7mrfgLgj0mtCfav93kLt1Ovj5DGjBlDamoqQ4cOPeH2uXPnEhUVRWJiIpMnT+bIkSMnfI6oqCj69evHG2+8gWEYrm3p6enHPXdKSgrp6eknzVRRUYHdbq91ExERacry7eV8uTkfgJH925mcpmHVuYrNmzePNWvWkJGRccLtN9xwA+3ataNVq1asX7+eSZMmsXXrVj744APXPo8//jgXXXQRQUFBfPnll9xzzz2UlJRw7733ApCXl0dMTEyt542JicFut1NWVkZgYOBx33fKlCk89thjdX05IiIiXmt+Ri4Op8E57SPoHBtidpwGVacCk5uby7hx40hLSyMgIOCE+9x1112uP3fv3p2WLVsyZMgQduzYQceOHQF4+OGHXfv07t2b0tJSnn32WVeBqY/Jkydz3333ub622+3ExXn+TIMiIiL14XAavOMavOtdZ1+gjh8hZWZmUlBQQFJSEjabDZvNxrJly3jppZew2Ww4HI7jHtO/f38Atm/fftLn7d+/P7t376aiogKA2NhY8vPza+2Tn59PaGjoCc++APj7+xMaGlrrJiIi0lQt3VrA3qJyIoJ8GZ742+NSPVGdzsAMGTKEDRs21Lrv1ltvpUuXLkyaNAmr9fhlubOysgBo2bLlSZ83KyuLiIgI/P39AUhOTubTTz+ttU9aWhrJycl1iSsiItJkHZt590994wjwPf792dPVqcCEhISQmJhY677g4GAiIyNJTExkx44d/Pe//+XSSy8lMjKS9evXM2HCBAYNGuS63PqTTz4hPz+fAQMGEBAQQFpaGk8//TT333+/6zlHjx7NK6+8wsSJE7nttttYsmQJ8+fPZ9GiRQ3wkkVERLzb7kNH+HprAQDX9/OeuV9+qUGvp/Lz8+Orr77ihRdeoLS0lLi4OEaMGMFDDz3k2sfX15fp06czYcIEDMMgISGB5557jjvvvNO1T3x8PIsWLWLChAm8+OKLtGnThlmzZukSahERkVPwzupdGAaclxBFfFSw2XHOCIvxy+uXvYjdbicsLIyioiKNhxERkSajstrJwKlLOFBSwb9GJnFJ95MP4XBHp/r+rbWQREREvEja5nwOlFQQ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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["#define and plot the funtion\n","import numpy as np\n","import matplotlib.pyplot as plt\n","import pandas as pd\n","\n","x = np.linspace(0, 100)\n","def f(x): return 0.1*x**2 -9*x + 4500\n","plt.plot(x,f(x))\n","print(f'Punto mas bajo de la curva {f(x).min()}')\n","\n","\n","\n"]},{"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":2,"id":"9e200c32","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["[[1 2]\n"," [3 4]]\n","[[4 5]\n"," [6 7]]\n","Union de las 2 matrices\n","[[ 5 7]\n"," [ 9 11]]\n"]}],"source":["# importing numpy as np\n","import numpy as np\n"," \n"," \n","# creating first matrix\n","A = np.array([[1,2],[3,4]])\n","\n","\n"," \n","# creating second matrix\n","\n","B = np.array([[4,5],[6,7]])\n","\n"," \n","#print elements\n","print(A)\n","print(B)\n"," \n","# adding two matrix\n","print('Union de las 2 matrices')\n","print(np.add(A,B))\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":1,"id":"867b70fc","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["Original list 1 : [2, 5, 4, 7, 3]\n","Original list 2 : [1, 4, 6, 9, 10]\n","Resultant list is : [3, 9, 10, 16, 13]\n"]}],"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":9,"id":"681930a3","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["[3, 9, 10, 16, 13]\n"]}],"source":["# Use list comprehensions to perform addition of the two lists:\n","\n","res_list = [list1[i] + list2[i] for i in range(len(list1))]\n","print(res_list)\n","\n"," \n"]},{"cell_type":"code","execution_count":8,"id":"a3a8a425","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["[3, 9, 10, 16, 13]\n"]}],"source":["# Use map() + add():\n","from operator import add\n","res_list = list(map(add, list1, list2))\n","print(res_list)\n"]},{"cell_type":"code","execution_count":10,"id":"1708d7ee","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["[3, 9, 10, 16, 13]\n"]}],"source":["# Use zip() + sum():\n","\n","res_list = [sum(i) for i in zip(list1, list2)]\n","print(res_list)\n"]},{"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":15,"id":"840e7d0e","metadata":{},"outputs":[{"ename":"IndentationError","evalue":"unindent does not match any outer indentation level (, line 17)","output_type":"error","traceback":["\u001b[0;36m File \u001b[0;32m:17\u001b[0;36m\u001b[0m\n\u001b[0;31m res[i][j] += matrix1[i][k] * matrix2[k][j]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unindent does not match any outer indentation level\n"]}],"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":17,"id":"db6c3355","metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["[[24 33 28]\n"," [33 36 23]\n"," [25 29 23]]\n"]}],"source":["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 = np.dot(matrix1,matrix2)\n","print(res)"]},{"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.11.4"}},"nbformat":4,"nbformat_minor":5}