├── Chapter 1 ├── Ch 1 Exercise.ipynb └── Chapter 1.ipynb ├── Chapter 2 ├── Ch 2 Probability.ipynb └── Ch_2_Exercise.ipynb ├── Chapter 3 ├── Ch 3 Descriptive and Inferential Statistics.ipynb └── Ch 3 Exercise.ipynb ├── Chapter 4 ├── Ch 4 Exercise.ipynb └── Ch 4 Linear Algebra.ipynb ├── Chapter 5 ├── Chapter 5 Exercise.ipynb └── Chapter 5.ipynb ├── Chapter 6 ├── Ch 6.ipynb └── Chapter 6 Exercise.ipynb └── README.md /Chapter 1/Ch 1 Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch 1: Exercise.ipynb","provenance":[],"authorship_tag":"ABX9TyOM76TTaSZgQH7orcGacZS8"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["$\\text {1. Is the value 62.6738 rational or irrational? Why or why not?}$\n","\n","Ans: It is a rational number. For a number to be rational below conditionals should be met:\n","* It should be represented by $p/q$; where p $\\neq$ q\n","* The ratio p/q can be further simplified and represented in decimal form.\n","\n","\\begin{equation}\n"," \\frac{p}{q}=62.6738 = 62.674\n","\\end{equation}"],"metadata":{"id":"QCOu6O6BzBgl"}},{"cell_type":"markdown","source":["$\\text {2. Evaluate expression} \\, {10^710^{-5}}$"],"metadata":{"id":"Lemu7y1V2F3c"}},{"cell_type":"code","execution_count":1,"metadata":{"id":"ZhXoW4tgysnE","executionInfo":{"status":"ok","timestamp":1655892106967,"user_tz":-360,"elapsed":10,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}}},"outputs":[],"source":["from sympy import *"]},{"cell_type":"code","source":["x = symbols('x')\n","expr2=(x**7)*(x**-5)\n","expr2.subs(x,10)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"DB2kxlKV3CEr","executionInfo":{"status":"ok","timestamp":1655892168083,"user_tz":-360,"elapsed":3,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"45cb6d03-fe13-44a3-c0d5-574903569e28"},"execution_count":3,"outputs":[{"output_type":"execute_result","data":{"text/plain":["100"],"text/latex":"$\\displaystyle 100$"},"metadata":{},"execution_count":3}]},{"cell_type":"markdown","source":["$\\text {3. Evaluate expression} \\, {81^{1/2}}$"],"metadata":{"id":"jjk07Tjd3cgy"}},{"cell_type":"code","source":["expr3 = x**(1/2)\n","expr3.subs(x,81)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"mfVgk6UD3Rd3","executionInfo":{"status":"ok","timestamp":1655892420322,"user_tz":-360,"elapsed":6,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"426f439d-a8e4-45e4-f386-e32636e3d275"},"execution_count":7,"outputs":[{"output_type":"execute_result","data":{"text/plain":["9.00000000000000"],"text/latex":"$\\displaystyle 9.0$"},"metadata":{},"execution_count":7}]},{"cell_type":"markdown","source":["$\\text {4. Evaluate expression} \\, {25^{\\frac 32}}$"],"metadata":{"id":"u_K6ubUU39d3"}},{"cell_type":"code","source":["expr4=x**(3/2)\n","expr4.subs(x,25)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"Y1Gwrxss305K","executionInfo":{"status":"ok","timestamp":1655892438954,"user_tz":-360,"elapsed":378,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"f4ab348d-8c73-47f6-f901-5051b50c1231"},"execution_count":9,"outputs":[{"output_type":"execute_result","data":{"text/plain":["125.000000000000"],"text/latex":"$\\displaystyle 125.0$"},"metadata":{},"execution_count":9}]},{"cell_type":"markdown","source":["$\\text {5. Assuming no payments are made, how much would a \\$1,000 be worth at 5% interest compounded monthly after 3 years?}$\n","Ans:\n"," Say- \n"," * A = balance\n"," * P = Starting investment($1000)\n"," * r = Interest rate (5%)\n"," * t = Number of years (3)\n"," * n = Periods (12)\n"," \\begin{equation} A = P × (1+ \\frac {r}{n})^{nt} \\end{equation}\n"," \\begin{equation} A = 1000 × (1+ \\frac {0.05}{12})^{12×3} = ? \\end{equation}\n"],"metadata":{"id":"bhORmnCV4qUP"}},{"cell_type":"code","source":["p, r , n, t = symbols('p r n t')\n","a = p * (1+(r/n))**(n*t)\n","a.evalf(subs={p:1000,r:5/100, n:12, t:3})"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"eDihiLUC4VN7","executionInfo":{"status":"ok","timestamp":1655893207611,"user_tz":-360,"elapsed":369,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"afc8f09d-2c88-40ce-92d5-a04f45ddde4e"},"execution_count":16,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1161.47223133347"],"text/latex":"$\\displaystyle 1161.47223133347$"},"metadata":{},"execution_count":16}]},{"cell_type":"markdown","source":["$\\text {6. Assuming no payments are made, how much would a \\$1,000 be worth at 5% interest compounded continuously after 3 years?}$\n","Ans:\n"," Say- \n"," * A = balance\n"," * P = Starting investment($1000)\n"," * r = Interest rate (5%)\n"," * t = Number of years (3)\n"," * n = Periods (12)\n","\\begin{equation} A = P × e^{rt} \\\\ A = 1000 × e^{0.05×3} = ? \\end{equation}"],"metadata":{"id":"wcIqnwXL_D91"}},{"cell_type":"code","source":["a = p*exp(r*t)\n","a.evalf(subs={p:1000,r:5/100,t:3})"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"y4cdg5J0_R4L","executionInfo":{"status":"ok","timestamp":1655894330651,"user_tz":-360,"elapsed":354,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"53668741-157d-45f7-cda1-1782e0f374ef"},"execution_count":29,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1161.83424272828"],"text/latex":"$\\displaystyle 1161.83424272828$"},"metadata":{},"execution_count":29}]},{"cell_type":"markdown","source":["$\\text{7. For the function }f(x) = 3x^2+1, \\text{what is the slope at x=3?}$"],"metadata":{"id":"kH-J7tt97vBe"}},{"cell_type":"code","source":["f, x = symbols('f x')\n","f = 3*(x**2)+1\n","dx_f=diff(f)\n","dx_f.subs(x,3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"4ZC4YgOL6RRz","executionInfo":{"status":"ok","timestamp":1655894487376,"user_tz":-360,"elapsed":358,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"5b31865f-b60f-41e0-f490-6262898928d9"},"execution_count":31,"outputs":[{"output_type":"execute_result","data":{"text/plain":["18"],"text/latex":"$\\displaystyle 18$"},"metadata":{},"execution_count":31}]},{"cell_type":"markdown","source":["$\\text{8. For the function }f(x) = 3x^2+1, \\text{what is the area under the curve for } x \\text{ between 0 and 2?}$"],"metadata":{"id":"uAIyK-ZJ9Wv_"}},{"cell_type":"code","source":["x = symbols('x')\n","area = integrate(f,(x,0,2)) # f is the same as problem 7\n","area"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":37},"id":"2VW8dBuU8TgM","executionInfo":{"status":"ok","timestamp":1655894063393,"user_tz":-360,"elapsed":8,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"87532923-808a-411e-a394-ecefef5d7a4c"},"execution_count":28,"outputs":[{"output_type":"execute_result","data":{"text/plain":["10"],"text/latex":"$\\displaystyle 10$"},"metadata":{},"execution_count":28}]}]} -------------------------------------------------------------------------------- /Chapter 2/Ch 2 Probability.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch 2: Probability.ipynb","provenance":[],"authorship_tag":"ABX9TyPGaQXbcNbQYVbBF93Io+bi"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["#Most people take probability for granted, but in reality it is more naunced and complicated."],"metadata":{"id":"D76YOvAeChza"}},{"cell_type":"markdown","source":["A report says, 85% of Cancer patients have said to have been Coffee drinkers. \n","\n","Say, in the US the population of Cancer patients is 0.5%\n","and about 65% of the population drink Coffee.\n","\n","Given that condition in the report, we should have more than 5% cancer patients, if it were to be True.\n","\n","Let's say, \n","\n","\\begin{align} P(Coffee|Cancer) = 0.85 \\\\ P(Coffee) = 0.65 \\\\ P(Cancer) = 0.05 \\\\ P(Cancer|Coffee) = ?\\end{align}\n","\n","Applying Bayes' Theorem we get:\n","\n","\\begin{equation}\n","P(Cancer|Coffee)= \\frac {P(Coffee|Cancer) × P(Cancer)}{P(Coffee)}\n","\\end{equation}"],"metadata":{"id":"doZJN6VhH6j-"}},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tfEmVwJvCd-H","executionInfo":{"status":"ok","timestamp":1656061107387,"user_tz":-360,"elapsed":24,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"2617cd73-a951-4a19-de4e-3142f227bb1f"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.006538461538461539"]},"metadata":{},"execution_count":1}],"source":["p_coffee_drinker=0.65\n","p_cancer=0.005\n","p_coffee_given_cancer=0.85\n","p_cancer_given_coffee_drinker=(p_coffee_given_cancer*p_cancer)/p_coffee_drinker\n","p_cancer_given_coffee_drinker"]},{"cell_type":"markdown","source":[""],"metadata":{"id":"U2U23akaOluG"}},{"cell_type":"markdown","source":["># **Binomial Distributions**\n","___\n","\n","Binomial Distributions measures how likely $k$ successes can happen out of $n$ trials, given $p$ probability.\n","\n","\\begin{equation}\n","{n \\choose k}p^k (1-p)^{n-k}\n","\\end{equation}\n","\n"],"metadata":{"id":"nJ-y91fAyLlI"}},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","from scipy.stats import binom\n","import seaborn as sns\n","import numpy as np"],"metadata":{"id":"HSfBDInFK2TZ","executionInfo":{"status":"ok","timestamp":1656061107390,"user_tz":-360,"elapsed":17,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}}},"execution_count":2,"outputs":[]},{"cell_type":"code","source":["n=10\n","p=0.9\n","ks=np.arange(n+1)\n","total=0\n","for k in ks:\n"," probability=binom.pmf(k,n,p)\n"," #print(f\"{k} - {probability}\")\n"," if k<=8:\n"," total+=probability\n"," else:\n"," break\n","print(total) # total probability of 8 or fewer successes"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wj7MOKOE0A3P","executionInfo":{"status":"ok","timestamp":1656061107391,"user_tz":-360,"elapsed":16,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"64135e0e-cd4c-4200-bfd2-c285b0207657"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["0.2639010708999999\n"]}]},{"cell_type":"markdown","source":["So, there is a 26% chance we would see eight or fewer successes even if the underlying success rate is 90%"],"metadata":{"id":"MOBJhrvI4Xds"}},{"cell_type":"markdown","source":[">## ***Building Binomial Distribution from scratch.***\n","___\n","\n","From equation: \n","\n","\\begin{equation}\n","{n \\choose k}p^k (1-p)^{n-k}\\\\ \\text{Binomial Coefficient}{n \\choose k} = \\frac{n!}{k!×(n-k)!}\n","\\end{equation}\n","```python:\n","def factorial(n: int):\n"," f = 1\n"," for i in range(n):\n"," f*=(i+1)\n"," return f\n","def binomial_coefficient(n: int, k: int):\n"," return factorial(n) /(factorial(k)*factorial(n-k))\n","def binomial_distribution(k: int, n: int, p: float):\n"," return binomial_coefficient(n,k) *(p**k) * (1.0 - p)**n-k # refer to equation 1\n","```"],"metadata":{"id":"7tucdr4Q48i6"}},{"cell_type":"markdown","source":["># **Beta Distribution**\n","\n","\n","---\n","\n","So far, we've been creating myriad of distributions to answer the question whether or not we are going to see 8 successes out of 10 tests in the engine testing model.\n","* What if there are more underlying rates of success that yield 8/10 successes besides 90%?\n","* What if 70% or 30% or 80% underlying success rate yields 8/10 success result?\n","* When we fix 8/10 successes, can we explore the probabilities of those probabilities?\n","\n","Simple approach to that would be new type of distribution, _the beta distribution_. It allows us to see the likelihood of didfferent underlying probabilities for an event to occur, given $alpha$ successes and $beta$ failures.\n","\n"],"metadata":{"id":"s0ut8j2E-XRv"}},{"cell_type":"code","source":["from scipy.stats import beta\n","\n","a=8 #success\n","b=2 #failures\n","p=beta.cdf(.90, a, b) # probability the underlying success of 90%\n","print(p)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wCjZCB779-vl","executionInfo":{"status":"ok","timestamp":1656061806409,"user_tz":-360,"elapsed":363,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"6130799d-26f3-4682-8634-90730b36dfab"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["0.7748409780000001\n"]}]},{"cell_type":"markdown","source":["So, according to our calculation, there is a 77.48 % chance the underlying probability of success is 90% or less\n","\n","How do we calculate the probability of success being 90% or more? Pretty simple just subtract it from `1.0`"],"metadata":{"id":"HcvqaEoe-nO1"}},{"cell_type":"code","source":["1.0-p"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_upmrr1c-cQ9","executionInfo":{"status":"ok","timestamp":1656061967163,"user_tz":-360,"elapsed":333,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"502b8241-8c54-482a-c9ca-e4be8573005b"},"execution_count":7,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.22515902199999993"]},"metadata":{},"execution_count":7}]},{"cell_type":"markdown","source":["Which only means that there is only a 22.5% chance that the underlying success rate is 90% or higher? But there is 77.5% chance that it is less than 90%. Could we gamble on that 22.5% chance of 90% or higher underlying success rate? I don't think so. If we run more tests and after 30 tests we get 6 failures then - "],"metadata":{"id":"4c1qfKtP_Msg"}},{"cell_type":"code","source":["a = 30\n","b= 6\n","p= 1.0 - beta.cdf(.90, a, b)\n","print(p)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"kA7YhvQV_MRV","executionInfo":{"status":"ok","timestamp":1656062201502,"user_tz":-360,"elapsed":16,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"b62c4b66-ac6f-4ffe-e3f1-2225d481f603"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["0.13163577484183708\n"]}]},{"cell_type":"markdown","source":["At this point, it might be a good idea to walk away from the tests, unless you want to keep gambling away against the 13.16% chance and hope the peak moves to the right. \n","\n","* Question arises how can we calculate an area in the middle? say - the chances of succeeding is between 80% to 90% ?\n","\n","- That would be to subtract the area behind 80% peak from the area behind 90% "],"metadata":{"id":"cELaYppiABzP"}},{"cell_type":"code","source":["p = beta.cdf(.90, a, b) - beta.cdf(.80, a , b)\n","print(p)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9lKaC0Zi-eq5","executionInfo":{"status":"ok","timestamp":1656062751094,"user_tz":-360,"elapsed":378,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"317e3e7b-0b59-4ad4-898b-1b051d394606"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["0.5962725311986745\n"]}]},{"cell_type":"markdown","source":["So, the probability that our underlying success rate is between 80% and 90% is 59.6%\n"],"metadata":{"id":"UP6NtUZmCZ9s"}}]} -------------------------------------------------------------------------------- /Chapter 2/Ch_2_Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch_2_Exercise.ipynb","provenance":[],"authorship_tag":"ABX9TyNyEOuVsLoW2KrcM7bTqOyI"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["#**Exercise 1:**\n","\n","There is a 30% chance of rain today, and a 40% chance your ubrella order will arive on time. You are eager to walk in the rain today and cannot do so without either!\n","\n","What is the probability it will rain AND your umbrella will arrive?\n","\n","\\begin{equation}\n","P(Rain\\space AND\\space Umbrella) = {P(Umbrella)\\times P(Rain)}\n","= 0.4 × 0.3 = 0.12\n","\\end{equation}"],"metadata":{"id":"KIRW5WjyD-Uy"}},{"cell_type":"markdown","source":["# **Exercise 2:**\n","There is a 30% chance of rain today, and a 40% chance your ubrella order will arive on time. You will be able to run errands only if it doesn't rain or your umbrella arrives.\n","What is probability it will not rain OR your umbrella arrives?\n","\n","\\begin{align}\n","P(NR \\space \\text{OR} \\space U) = P(NR) + P(U) - P(NR \\space AND \\space U) \\\\\n","P(NR \\space \\text{OR} \\space U) = (1.0 - 0.3) + 0.4 - 0.12 = 0.7 + 0.4 - 0.12 = 0.98\n","\\end{align}\n","\n"],"metadata":{"id":"VFiYo2zFGQ7h"}},{"cell_type":"markdown","source":["# **Exercise 3:**\n","\n","There is a 30% chance of rain today, and a 40% chance your ubrella order will arive on time.\n","\n","However, you found out that if it rains thereis only a 20% chance your ubrella will arive on time. \n","\n","What is the probability that it will rain AND your umbrella will arrive on time?\n","\n","\\begin{equation}\n","P(rain \\space AND \\space umbrella) = P(Rain) × P(U|Rain) = 0.3 × 0.2 = 0.06\n","\\end{equation}"],"metadata":{"id":"Nkq21jn-KhZA"}},{"cell_type":"markdown","source":["# **Exercise 4:**\n","You have 137 passengers booked on a flight from Las Vegas to Dallas. However, it is Las Vegas on a Sunday morning and you estimate each passenger is 40% likely to not show up.\n","\n","You trying to figure out how many seats to over book, so the plane doesn't fly empty.\n","\n","How likely is it atleast 50 passengers will not show up?"],"metadata":{"id":"L9NbM5UILr-n"}},{"cell_type":"code","source":["from scipy.stats import binom\n","n= 137\n","p=0.4\n","p_50_or_more_no_shows=0.0\n","for x in range(50,138):\n"," p_50_or_more_no_shows+=binom.pmf(x,n,p)\n","print(p_50_or_more_no_shows)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2xEQz_UNGHxo","executionInfo":{"status":"ok","timestamp":1656065692341,"user_tz":-360,"elapsed":15,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"032c56c1-72c6-4605-d59e-77bc57c8e2d3"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["0.8220955881474781\n"]}]},{"cell_type":"markdown","source":["# Exercise 5:\n","You flipped a coin 19 times and got heads 15 times and tails 4 times.\n","Do you think this coin has any good probability of being fair? Why and why not?"],"metadata":{"id":"bmEQ131fNlHR"}},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"boGUMy3qD3VC","executionInfo":{"status":"ok","timestamp":1656065993568,"user_tz":-360,"elapsed":361,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"a819d7d1-e9d1-43d6-8f6e-6145e9f3c6f4"},"outputs":[{"output_type":"stream","name":"stdout","text":["0.9962310791015625\n"]}],"source":["from scipy.stats import beta\n","\n","a = 15\n","b = 4\n","\n","dist= 1.0 - beta.cdf(0.5,a,b)\n","print(dist)"]},{"cell_type":"markdown","source":["There is over 99.6% chance that the coin is unfair. Because the with the fair underlying probability rate of 0.5 there is less than 1% chance that this type of outcome is likely to have taken place. "],"metadata":{"id":"DdGuKSHnOt34"}}]} -------------------------------------------------------------------------------- /Chapter 3/Ch 3 Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch:3 Exercise.ipynb","provenance":[],"authorship_tag":"ABX9TyOOr4ribZDxXsB6XPHZv1xi"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["Chapter-3\n","#**Exercises**"],"metadata":{"id":"2Q4x74NK7a2a"}},{"cell_type":"markdown","source":["#### **Ex-1:**\n","---\n","You bought a spool of 1.75 mm filament for your 3D printer. You want to measure how close the filament diameter really is to 1.75 mm. You use a caliper tool and sample the diameter five times on the spool:\n","\n","1.78, 1.75, 1.72, 1.74, 1.77\n","\n","`Calculate the mean and standard deviation for this set of values.`"],"metadata":{"id":"tT7f73En7ilf"}},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"RMkZ9Bf-7H0F","executionInfo":{"status":"ok","timestamp":1657102475481,"user_tz":-360,"elapsed":3,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"abb2f76c-5c0c-4ccb-cc1b-377529ce1625"},"outputs":[{"output_type":"stream","name":"stdout","text":["Mean: 1.752\n","Standard Deviation: 0.02135415650406264\n"]}],"source":["from math import sqrt\n","sample=[1.78, 1.75, 1.72, 1.74, 1.77]\n","\n","def mean(values):\n"," return sum(values)/len(values)\n","def variance_sample(values):\n"," mean = sum(values)/len(values)\n"," var = sum((v-mean)**2 for v in values)/len(values)\n"," return var\n","def std_dev_sample(values):\n"," return sqrt(variance_sample(values))\n","mean = mean(sample)\n","std_dev = std_dev_sample(sample)\n","print(\"Mean:\",mean)\n","print(\"Standard Deviation:\", std_dev)"]},{"cell_type":"markdown","source":["#### **Ex-2:**\n","---\n","A manufacturer says Z-Phone smart phone has a mean consumer life of 42 months with a standard deviation of 8 months, Assuming a normal distribution, what is the probability a given random Z-Phone will last between 20 and 30 months?"],"metadata":{"id":"PFG8Fz6T7-gY"}},{"cell_type":"code","source":["from scipy.stats import norm\n","mean = 42\n","std_dev = 8\n","x = norm.cdf(30, mean, std_dev) - norm.cdf(20, mean, std_dev)\n","print(x)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yehI2Mkf8dDF","executionInfo":{"status":"ok","timestamp":1657102752158,"user_tz":-360,"elapsed":400,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"51083c6f-1cbd-468c-f1ef-8d6d29db14e2"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["0.06382743803380352\n"]}]},{"cell_type":"markdown","source":["#### **Ex-3:**\n","---\n","I am skeptical that my 3D printer filament is not 1.75 mm in average diameter as advertised. I sampled 34 measurements with my tool. The sample mean is 1.715588 and the sample standard deviation is 0.029252. \n","\n","What is the 99% confidence interval for the mean of my entire spool of filament?"],"metadata":{"id":"LD7ZLiAc8eTi"}},{"cell_type":"markdown","source":["\\begin{equation}\n","E = ±z_c \\frac{s}{\\sqrt n}\n","\\end{equation}\n","$\\text{Confidence Interval=(sample mean ± }E)$"],"metadata":{"id":"C2CyyuCFHJHG"}},{"cell_type":"code","source":["from math import sqrt\n","from scipy.stats import norm\n","\n","def critical_z_value(p, mean=0.0, std=1.0):\n"," norm_dist=norm(loc=mean, scale=std)\n"," left_area= (1.0-p)/2.0\n"," right_area= 1.0 - ((1.0-p)/2.0)\n"," return norm_dist.ppf(left_area),norm_dist.ppf(right_area)\n","\n","def ci_large_sample(p, sample_mean, sample_std, n):\n"," lower,upper = critical_z_value(p)\n"," lower_ci = lower*(sample_std/sqrt(n)) # lower margin of error\n"," upper_ci = upper*(sample_std/sqrt(n)) # upper margin of error\n"," return sample_mean + lower_ci, sample_mean + upper_ci # mean+margin of error\n","\n","print(ci_large_sample(p=.99, sample_mean=1.715588, sample_std=0.029252, n=34))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"PuzFhEbp84JU","executionInfo":{"status":"ok","timestamp":1657103547672,"user_tz":-360,"elapsed":353,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"c37ab0d3-3235-4b92-dcd4-0c02e20b10bc"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["(1.7026658973748656, 1.7285101026251342)\n"]}]},{"cell_type":"markdown","source":["#### **Ex-4:**\n","---\n","\n","Your marketing department has started a new advertising campaign and wants to know if it affected sales, which in the past averaged \\$10,345 a day with a standard deviation of \\$552. The new advertising campaign ran for 45 days and averaged \\$11,641 in sales.\n","Did the campaign affect sales? Why or why not? (Use a two-tailed test for more reliable significance.)"],"metadata":{"id":"i2TREy-89DKW"}},{"cell_type":"code","source":["from scipy.stats import norm \n","\n","mean = 10345\n","std_dev = 552\n","\n","p1 = 1.0 - norm.cdf(11641,mean, std_dev)\n","\n","p2 = p1\n","\n","p_value = p1+p2\n","print(\"Two tailed P-value\",p_value)\n","if p_value<=0.05:\n"," print(\"Passed!\")\n","else:\n"," print(\"Failed\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"lG64Na3w-IDQ","executionInfo":{"status":"ok","timestamp":1657103773671,"user_tz":-360,"elapsed":15,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"f0b10ed0-08ba-4bdc-8425-695418f2192f"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Two tailed P-value 0.01888333596496139\n","Passed!\n"]}]},{"cell_type":"markdown","source":["Since it passes the two tailed test, we can say that the campaign worked and affected the sales."],"metadata":{"id":"0I-KfpjIFP4p"}}]} 2 | -------------------------------------------------------------------------------- /Chapter 4/Ch 4 Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch 4: Exercise.ipynb","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyNcKCl0Ai5vJ7tq+j2nV+r/"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["####**Imports**"],"metadata":{"id":"8I_ptMAEK3Ep"}},{"cell_type":"code","source":["import numpy as np\n","from numpy import array\n","from numpy.linalg import det,inv"],"metadata":{"id":"j2IByj0WK76r","executionInfo":{"status":"ok","timestamp":1657625603278,"user_tz":-360,"elapsed":408,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}}},"execution_count":5,"outputs":[]},{"cell_type":"markdown","source":["### **Exercise 1**\n","---\n","Vector $\\vec{v}$ has a value of $[1,2]$ but then a transformation happens. $\\hat{i}$ lands at $[2,0]$ and $\\hat{j}$ lands at $[0,1.5]$. Where does $\\vec{v}$ land?"],"metadata":{"id":"kxHlXu_gIBVP"}},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"aXFE5aGPH6xW","executionInfo":{"status":"ok","timestamp":1657625481208,"user_tz":-360,"elapsed":11,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"4c759dda-4776-4974-c12c-89c41224e5d2"},"outputs":[{"output_type":"stream","name":"stdout","text":["[2. 3.]\n"]}],"source":["v=array([1,2])\n","i_hat = array([2,0])\n","j_hat = array([0, 1.5])\n","#fix this line \n","basis = array([i_hat, j_hat])\n","\n","# transform vector v into w \n","w = basis.dot(v)\n","print(w)"]},{"cell_type":"markdown","source":["###**Exercise 2**\n","---\n","Vector $\\vec{v}$ has a value of $[1,2]$ but then a transformation happens. $\\hat{i}$ lands at $[-2,1]$ and $\\hat{j}$ lands at $[1,-2]$. Where does $\\vec{v}$ land?"],"metadata":{"id":"lVzNNLIbIr7o"}},{"cell_type":"code","source":["v=array([1,2])\n","i_hat = array([-2,1])\n","j_hat = array([1, -2])\n","#fix this line \n","basis = array([i_hat, j_hat])\n","\n","# transform vector v into w \n","w = basis.dot(v)\n","print(w)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ChiFTrtxJbqx","executionInfo":{"status":"ok","timestamp":1657625489758,"user_tz":-360,"elapsed":1039,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"5c83d470-3e07-42dd-9dd1-a33844e57bf5"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["[ 0 -3]\n"]}]},{"cell_type":"markdown","source":["#### **Exercise 3**\n","---\n","A transformation $\\hat{i}$ lands at $[1,0]$ and $\\hat{j}$ lands at $[2,2]$. What is the determinant of this transformation?"],"metadata":{"id":"X9LSR-3eIvtD"}},{"cell_type":"code","source":["i_hat = array([1,0])\n","j_hat = array([2,2])\n","basis = array([i_hat, j_hat]).transpose()\n","determinant = det(basis)\n","print(determinant)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"WePh_-XqJcKx","executionInfo":{"status":"ok","timestamp":1657625617696,"user_tz":-360,"elapsed":3,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"ee743588-a619-4ffe-fe6f-4dc3b4502ac3"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["2.0\n"]}]},{"cell_type":"markdown","source":["#### **Exercise 4**\n","---\n","Can two or more linear transformations be done in single linear transformation? Why or why not? "],"metadata":{"id":"qI4MkX5mJivH"}},{"cell_type":"markdown","source":["Yes, because matrix multiplication allows us to combine several matrices into a single matrix representing one consolidated transformation."],"metadata":{"id":"QBs2vap4MCFy"}},{"cell_type":"markdown","source":["#### **Exercise 5**\n","---\n","Solve the system equations for x,y and z:\n","\\begin{equation}\n","3x + 1y + 0z = 54\\\\\n","2x + 4y + 1z = 12\\\\\n","3x + 1y + 8z = 6\n","\\end{equation}"],"metadata":{"id":"3OSgftBoJwNb"}},{"cell_type":"code","source":["A = array([\n"," [3,1,0],\n"," [2,4,1],\n"," [3,1,8]\n","])\n","B = array([\n"," 54,\n"," 12,\n"," 6\n","]) \n","X = inv(A).dot(B)\n","print(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3mlE2tO1KLze","executionInfo":{"status":"ok","timestamp":1657625807435,"user_tz":-360,"elapsed":433,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"226ac1de-9865-44e4-b46c-7296c31d54f8"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["[19.8 -5.4 -6. ]\n"]}]},{"cell_type":"markdown","source":["#### **Exercise 6**\n","---\n","Is the following matrix linearly dependent? Why or why not?\n","\\begin{bmatrix}2\\,\\,\\,\\,1\\\\6\\,\\,\\,\\,3\\end{bmatrix}"],"metadata":{"id":"ihUY7C1lKYDF"}},{"cell_type":"code","source":["i_hat = array([2,6])\n","j_hat = array([1,3])\n","basis = array([i_hat, j_hat]).transpose()\n","determinant = det(basis)\n","print(determinant)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"aK5rKOGlKs_c","executionInfo":{"status":"ok","timestamp":1657625864241,"user_tz":-360,"elapsed":4,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"8381518d-a0c5-4e40-ad52-b343878f215d"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["0.0\n"]}]}]} -------------------------------------------------------------------------------- /Chapter 4/Ch 4 Linear Algebra.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Ch:4 Linear Algebra.ipynb","provenance":[],"authorship_tag":"ABX9TyNM3eCYkPgNoq64+ghaEWOd"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["Chapter 4\n","# **Linear Algebra**\n"],"metadata":{"id":"nY0K7Hartvpp"}},{"cell_type":"markdown","source":["#### What is Vector?\n","\n","Simply put vector is an arrow in a space with a specific direction and length, often representing a piece of data. It has no concept of location, so always imagine it's tail starts at the origin of a Cartesian plane(0,0). A vector $v$ is denoted like this: $v⃗$\n","\n","

\n"],"metadata":{"id":"S2oOq9z7t5tZ"}},{"cell_type":"markdown","source":["To declare a vector, you can use NumPy's array() function then can pass a collection of numebers to it as below: \n","\n"],"metadata":{"id":"PMzSH03k2-Iz"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"rUTLlPH5tRxt","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1657183952765,"user_tz":-360,"elapsed":3,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"4c1d3b29-2bf7-419d-cf01-ff4285be4077"},"outputs":[{"output_type":"stream","name":"stdout","text":["[3 2]\n"]}],"source":["import numpy as np\n","v= np.array([3,2])\n","print(v)"]},{"cell_type":"markdown","source":["A three dimensional vector:\n","$\\vec{v} = \\begin{bmatrix} x\\\\y\\\\z \\end{bmatrix} = \\begin{bmatrix} 4\\\\1\\\\2 \\end{bmatrix} $\n","\n","can be expressed in python like this:"],"metadata":{"id":"OW9sH90P3C-d"}},{"cell_type":"code","source":["v=np.array([4,1,2])\n","print(v)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ZUh8B0lW3Bbb","executionInfo":{"status":"ok","timestamp":1657184325041,"user_tz":-360,"elapsed":1857,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"bf507643-876e-49b3-e30e-35b2ead87b54"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[4 1 2]\n"]}]},{"cell_type":"markdown","source":["#### **Adding and Combining vectors**\n","\n","If we have two vectors $\\vec{v}$ and $\\vec{w}$ how do we add these vectors?\n","\n","$\\vec{v}=\\begin{bmatrix}3\\\\2\\end{bmatrix}$\n","\n","$\\vec{w}=\\begin{bmatrix}2\\\\-1\\end{bmatrix}$\n","\n","$\\vec{v}+\\vec{w}=\\begin{bmatrix}3+2\\\\2+-1\\end{bmatrix}=\\begin{bmatrix}5\\\\1\\end{bmatrix}$\n","\n","In python:"],"metadata":{"id":"z2ki13KQ4jjb"}},{"cell_type":"code","source":["from numpy import array\n","v = array([3, 2])\n","w = array([2,-1])\n","v_plus_w = v + w\n","print(v_plus_w)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"qpoh8f5x4co7","executionInfo":{"status":"ok","timestamp":1657184704022,"user_tz":-360,"elapsed":540,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"b0870ee7-2a56-4167-add2-c7c310d19c80"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[5 1]\n"]}]},{"cell_type":"markdown","source":["$\\vec{v}+\\vec{w} = \\vec{w}+\\vec{v}$"],"metadata":{"id":"dTRiLW5S6iVf"}},{"cell_type":"markdown","source":["#### **Scaling Vectors**\n","Scaling is growing or shrinking a vector's length. You can grow/shrink a vector by multiplying or scaling it with a single value, known as $scalar$\n","\n","$\\vec{v}=\\begin{bmatrix}3\\\\2\\end{bmatrix}$\n","\n","$2\\vec{v}=\\begin{bmatrix}3×2\\\\2×2\\end{bmatrix} = \\begin{bmatrix}6\\\\4\\end{bmatrix}$"],"metadata":{"id":"0jS4Dsne7KD-"}},{"cell_type":"code","source":["from numpy import array\n","v=array([3,2])\n","scaled_v= 2*v\n","print(scaled_v)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"RQTHgNXR58uo","executionInfo":{"status":"ok","timestamp":1657185217709,"user_tz":-360,"elapsed":596,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"eab21ccf-6d93-4386-ec46-09ef02b323c0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[6 4]\n"]}]},{"cell_type":"markdown","source":["Scaling a vector doesn't change it's direction. But when you multiply a vector by negative number it flips the direction of the vector as shown in the image.\n","\n","

\n","\n","Although it stays on the same line. This segues to a key concept called linear dependence."],"metadata":{"id":"-0xwZlA78LQW"}},{"cell_type":"markdown","source":["#### **Span and Linear Dependence**\n","\n","These two operaions adding and scaling vectors, bring about the idea that we can combine two vectors and scale them to create any resulting vector we want.\n","$\\vec{v}+\\vec{w}=\\overrightarrow{v+w}$\n","\n","Again, $\\vec{v}$ and $\\vec{w}$ are fixed in direction, except for flipping with negative scalars, but we can use scaling to freely create any vector composed of $\\overrightarrow{v+w}$. This whole space of possible vectors is called $span$. When we have two vectors in two different directions they are $\\textit{linearly independent}$ and have this unlimited span.\n","\n","We are only limited in span when we have two vectors on the same line and in the same direction. No matter how we may scale or combine them the resulting vector is always going to be on that same line. This makes them $\\textit{linearly dependent}.$"],"metadata":{"id":"ZTpcWHhQ9Zyf"}},{"cell_type":"markdown","source":["###**Linear Transformations**\n","\n","#### **Basis Vectors**\n","\n","Imagine we have two simple vectors $\\hat{i}\\,\\text{and}\\,\\hat{j}$. These are known as basis vectors, which are used to describe transformations on other vectors. They typically have a length of 1 and point in perpendicular positive directions.\n","Think of the basis vectors as building blocks to build or transform any vector. Our basis vector is expressed in a 2 × 2 matrix, where the first column is $\\hat{i}$ and the second is column is $\\hat{j}$ :\n","\n","$\\hat{i}$ = $\\begin{bmatrix}1\\\\0\\end{bmatrix}$\n","\n","$\\hat{j}$ = $\\begin{bmatrix}0\\\\1\\end{bmatrix}$\n","\n","$\\text{basis}$ = $\\begin{bmatrix}1\\,\\,\\,\\,\\,\\,0 \\\\0\\,\\,\\,\\,\\,\\,1\\end{bmatrix}$\n","\n","$\\vec{v}=\\hat{i}+\\hat{j}$\n","\n"],"metadata":{"id":"ktUixtNU_2xs"}},{"cell_type":"markdown","source":["#### **Matrix Vector Multiplication**\n","\n","The formula to transform a vector $\\vec{v}$ given basis vectors $\\hat{i}$ and $\\hat{j}$ packaged as a matrix is:\n","\n","$\\begin{bmatrix}x_{new}\\\\y_{new}\\end{bmatrix} = \\begin{bmatrix}a\\,\\,\\,b\\\\c\\,\\,\\,d \\end{bmatrix}\\begin{bmatrix}x\\\\y\\end{bmatrix}=\\begin{bmatrix}ax+by\\\\cx+dy\\end{bmatrix}$"],"metadata":{"id":"AkrxVIHOD-0m"}},{"cell_type":"code","source":["from numpy import array \n","basis = array([[3,0],\n"," [0,2]])\n","v=array([1,1])\n","new_v=basis.dot(v)\n","print(new_v)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"GQcE9Nfb76VG","executionInfo":{"status":"ok","timestamp":1657187705408,"user_tz":-360,"elapsed":529,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"17d610f1-8909-4e08-d690-22cea3f3992f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[3 2]\n"]}]},{"cell_type":"code","source":["i_hat = array([2,0])\n","j_hat = array([0,3])\n","#convert rows into columns\n","basis = array([i_hat,j_hat]).transpose()\n","v = array([2,1])\n","\n","new_v=basis.dot(v)\n","print(new_v)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"TQo0GqqtFZFv","executionInfo":{"status":"ok","timestamp":1657187872720,"user_tz":-360,"elapsed":649,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"a7db9424-5111-4b6a-85b2-8502f72af162"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[4 3]\n"]}]},{"cell_type":"markdown","source":["#### **Matrix Multiplication**\n","\n","Here is how we apply a rotation and then shear to any vector $\\vec{v}$ with value $[x,y]$:\n","\n","$\\begin{bmatrix}1\\,\\,\\,\\,1\\\\0\\,\\,\\,\\,1\\end{bmatrix}$$\\begin{bmatrix}0\\,\\,\\,\\,-1\\\\1\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,0\\end{bmatrix}$$\\begin{bmatrix}x\\\\y\\end{bmatrix}$ - - - - - - - - - - - - -(1)\n","\n","$\\begin{bmatrix}a\\,\\,\\,\\,b\\\\c\\,\\,\\,\\,d\\end{bmatrix}$$\\begin{bmatrix}e\\,\\,\\,\\,f\\\\g\\,\\,\\,\\,h\\end{bmatrix}$= $\\begin{bmatrix}ae+bg\\,\\,\\,\\,\\,\\,af+bh\\\\ce+dg\\,\\,\\,\\,\\,\\,cf+dh\\end{bmatrix}$ - - - - - - - - - -(2)\n","\n","\n","Applying (2) on (1) we get:\n","\n","$\\begin{bmatrix}1\\,\\,\\,-1\\\\1\\,\\,\\,\\,\\,\\,\\,\\,\\,0\\end{bmatrix}$$\\begin{bmatrix}x\\\\y\\end{bmatrix}$\n"],"metadata":{"id":"jkxrQMiRq1bu"}},{"cell_type":"code","source":["from numpy import array\n","i_hat1 = array([0,1])\n","j_hat1=array([-1,0])\n","transform1=array([i_hat1, j_hat1]).transpose()\n","i_hat2 = array([1,0])\n","j_hat2 = array([1,1])\n","transform2=array([i_hat2, j_hat2]).transpose()\n","\n","#combine transformations\n","combined = transform2 @ transform1 # @ is the shorthand for matmul()\n","\n","#test\n","print(f\"Combined Matrix:\\n{combined}\")"],"metadata":{"id":"EwQElYqPGCdd","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1657282543245,"user_tz":-360,"elapsed":8,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"77e6b3e3-4736-46d7-b75a-12bd049ef8a4"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Combined Matrix:\n","[[ 1 -1]\n"," [ 1 0]]\n"]}]},{"cell_type":"markdown","source":["##### **Using dot() vs matmul() vs @**\n","Usually you want to prefer matmul() and it's shorhand @ to combine matrices rather than the dot() operator in NumPy. The former generally has a preferable policy for higher dimensional matrices and how the elements are broadcasted."],"metadata":{"id":"MgRfnd1BwKsC"}},{"cell_type":"code","source":["from numpy import matmul\n","v = array([1,2])\n","print(combined.dot(v))\n","print(combined @ v)\n","print(matmul(combined,v))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"S2gNCY_cutse","executionInfo":{"status":"ok","timestamp":1657282788178,"user_tz":-360,"elapsed":378,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"0e25e7b6-1f8a-45c3-83f6-17736d263e47"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[-1 1]\n","[-1 1]\n","[-1 1]\n"]}]},{"cell_type":"markdown","source":["Note that we could also have applied each transformation individually to vector $\\vec{v}$"],"metadata":{"id":"JbSL7RHJwvSp"}},{"cell_type":"code","source":["rotated = transform1.dot(v)\n","sheered = transform2.dot(rotated)\n","print(sheered)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tr26uRnyvQ-B","executionInfo":{"status":"ok","timestamp":1657283241229,"user_tz":-360,"elapsed":388,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"d1528799-3faf-4a1c-c8c4-10c1c56205c8"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[-1 1]\n"]}]},{"cell_type":"markdown","source":["Remember the order of transformation matters!\n","If we flip the order as below, see how the result gets changed:"],"metadata":{"id":"cADMVBfzypUL"}},{"cell_type":"code","source":["combined = transform1 @ transform2 # sheer and then rotate\n","print(combined.dot(v))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"U6X2S80yx1_T","executionInfo":{"status":"ok","timestamp":1657283512891,"user_tz":-360,"elapsed":9,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"cb30018b-3cda-44b2-928e-55bff1c9f58b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[-2 3]\n"]}]},{"cell_type":"code","source":["transform2 #sheer"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wTDWGJ6vy4ZB","executionInfo":{"status":"ok","timestamp":1657283586347,"user_tz":-360,"elapsed":12,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"40573178-0922-44a3-ff8d-75b4dfee307c"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[1, 1],\n"," [0, 1]])"]},"metadata":{},"execution_count":14}]},{"cell_type":"code","source":["transform1 #rotation "],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pmdMyENuzJ0Z","executionInfo":{"status":"ok","timestamp":1657283632598,"user_tz":-360,"elapsed":7,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"707f7e99-dbd7-492e-cba8-54ad036df3a8"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([[ 0, -1],\n"," [ 1, 0]])"]},"metadata":{},"execution_count":15}]},{"cell_type":"markdown","source":["#### **Determinants**\n","\n","Determinant are the factor by which a sampled area from vector space is expanded and Squished.\n","\n","If $\\hat{i},\\hat{j}$ is scaled and becomes $2\\hat{i},3\\hat{j}$ the determinant is therefore $2×3=6$\n","\n","Determinants describe how much a sampled area in a vector space changes in scale with linear transformations and this can provide helpful information about the transformation."],"metadata":{"id":"w8OPXUFAzt6S"}},{"cell_type":"code","source":["from numpy.linalg import det\n","from numpy import array \n","i_hat = array([3,0])\n","j_hat = array([0,2])\n","basis = array([i_hat,j_hat]).transpose()\n","determinant=det(basis)\n","print(determinant) "],"metadata":{"id":"A0fJw1Y1zVnv","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1657287376521,"user_tz":-360,"elapsed":15,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"476be603-20e8-4d44-f003-caa590d4db52"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["6.0\n"]}]},{"cell_type":"markdown","source":["Sample shears and rotations should not affect the determinant, as the area will not change. "],"metadata":{"id":"yUGOmzMMCAr4"}},{"cell_type":"code","source":["from numpy.linalg import det\n","from numpy import array \n","i_hat = array([1,0])\n","j_hat = array([1,1])\n","basis = array([i_hat,j_hat]).transpose()\n","determinant=det(basis)\n","print(determinant) "],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"YAEZ7lDFBnaF","executionInfo":{"status":"ok","timestamp":1657287543208,"user_tz":-360,"elapsed":389,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"4d0d3604-86c3-4e1d-cfef-520ca81273fd"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["1.0\n"]}]},{"cell_type":"markdown","source":["But scaling however, will increase or decrease determinant"],"metadata":{"id":"Coet7IRwCThN"}},{"cell_type":"code","source":["from numpy.linalg import det\n","from numpy import array \n","i_hat = array([-2,1])\n","j_hat = array([1,2])\n","basis = array([i_hat,j_hat]).transpose()\n","determinant=det(basis)\n","print(determinant) "],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"N5QlJAgPBxwi","executionInfo":{"status":"ok","timestamp":1657287607338,"user_tz":-360,"elapsed":7,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"1a6352bb-0252-40a5-a93a-927efc90fd3b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["-5.000000000000001\n"]}]},{"cell_type":"markdown","source":["The most critical piece of information that a determinant gives us is whether the transformation is linearly dependent. If you have a determinant of 0, that means all of the space has been squished into a lesser dimension."],"metadata":{"id":"_EpAenOvCvIL"}},{"cell_type":"code","source":["from numpy.linalg import det\n","from numpy import array \n","i_hat = array([-2,1])\n","j_hat = array([3,-1.5])\n","basis = array([i_hat,j_hat]).transpose()\n","determinant=det(basis)\n","print(determinant) "],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"rBiAZmotCf_m","executionInfo":{"status":"ok","timestamp":1657287909675,"user_tz":-360,"elapsed":7,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"57c9aa62-13d6-426f-a4e8-0ed91a9eca84"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["0.0\n"]}]},{"cell_type":"markdown","source":["#### **Systems of Equations and Inverse Matrices**"],"metadata":{"id":"33Gb-fWyEAKA"}},{"cell_type":"markdown","source":["Below are the operations for these equations:\n","\\begin{equation}\n","4x + 2y + 4z = 44\\\\\n","5x + 3y + 7z = 56\\\\ \n","9x + 3y + 6z = 72\\\\\n","\\end{equation}"],"metadata":{"id":"jcmA2CHCEQth"}},{"cell_type":"code","source":["from sympy import *\n","A = Matrix([\n"," [4,2,4],\n"," [5,3,7],\n"," [9,3,6]\n"," ])\n","\n","inverse = A.inv() #inverse matrix calculations\n","identity = inverse*A #identity matrix calculations \n","print(f\"Inverse:{inverse}\")\n","print(f\"Identity:{identity}\")"],"metadata":{"id":"FJIzyGz3DshB","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1657623347455,"user_tz":-360,"elapsed":1066,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"59708188-0cf8-42af-cb39-1570506ad995"},"execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Inverse:Matrix([[-1/2, 0, 1/3], [11/2, -2, -4/3], [-2, 1, 1/3]])\n","Identity:Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])\n"]}]},{"cell_type":"code","source":["from numpy import array \n","from numpy.linalg import inv \n","A = array([[4,2,4],\n"," [5,3,7],\n"," [9,3,6]])\n","B= array([\n"," 44,\n"," 56,\n"," 72\n","])\n","X = inv(A).dot(B)\n","print(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yU9iewsmDMGI","executionInfo":{"status":"ok","timestamp":1657623509489,"user_tz":-360,"elapsed":371,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"a773505f-83a4-43ba-ac7a-e9877b0d6240"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["[ 2. 34. -8.]\n"]}]},{"cell_type":"code","source":["from sympy import * \n","A = Matrix([[4,2,4],\n"," [5,3,7],\n"," [9,3,6]])\n","B= Matrix([\n"," 44,\n"," 56,\n"," 72\n","])\n","X = A.inv() * B \n","print(X)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"OYxz-WdqDzac","executionInfo":{"status":"ok","timestamp":1657623579882,"user_tz":-360,"elapsed":404,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"64faea3d-439e-4c65-d224-63c5bce14445"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Matrix([[2], [34], [-8]])\n"]}]},{"cell_type":"markdown","source":["#### **Eigenvectors and Eigenvalues**\n","Matrix decomposition is breaking up a matrix into it's basic components.\n","If we have a sqare matrix $A$, it has the following eigenvalue equation:\n","\n","$Av=λv$\n","\n","If $A$ is the original matrix, it is composed of eigenvector $v$ and eigenvalue $λ$. There is one eigenvector and eigenvalue for each dimension of the parent matrix and not all matrices can be decomposed into eigenvectors and eigenvalues."],"metadata":{"id":"PmHYrRcZFTDb"}},{"cell_type":"code","source":["from numpy import array,diag \n","from numpy.linalg import eig,inv \n","\n","A = array([\n"," [1,2],\n"," [4,5]\n"," ])\n","eigenvals, eigenvecs = eig(A)\n","print(\"Eigenvalues:\")\n","print(eigenvals)\n","print(\"Eigenvectors:\")\n","print(eigenvecs)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"O0P6ggb2EIWU","executionInfo":{"status":"ok","timestamp":1657624274296,"user_tz":-360,"elapsed":373,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"a58bfd34-3162-42d9-e190-8508ea793b3d"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["Eigenvalues:\n","[-0.46410162 6.46410162]\n","Eigenvectors:\n","[[-0.80689822 -0.34372377]\n"," [ 0.59069049 -0.9390708 ]]\n"]}]},{"cell_type":"markdown","source":["Now we can rebuild the matrix from the eigenvalues and eigenvectors:"],"metadata":{"id":"w8ORN5oBG-Dt"}},{"cell_type":"code","source":["Q = eigenvecs \n","R = inv(Q)\n","\n","L = diag(eigenvals)\n","B = Q @ L @ R \n","print(B)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"sw-iF1sNGuVL","executionInfo":{"status":"ok","timestamp":1657624427395,"user_tz":-360,"elapsed":5,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"584c1d51-e9f6-4b89-bf45-478c09071470"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["[[1. 2.]\n"," [4. 5.]]\n"]}]}]} -------------------------------------------------------------------------------- /Chapter 5/Chapter 5 Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Chapter 5: Exercise.ipynb","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyMh6ScZ1Ir56R6dZM2JrZMI"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":19,"metadata":{"id":"phhXQI_nj6IS","executionInfo":{"status":"ok","timestamp":1659076030918,"user_tz":-360,"elapsed":516,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}}},"outputs":[],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","from sklearn.linear_model import LinearRegression \n","from sklearn.model_selection import KFold, cross_val_score\n","from scipy.stats import t\n","from math import sqrt \n","import seaborn as sns"]},{"cell_type":"markdown","source":["#### **Read the dataset**"],"metadata":{"id":"Y5HFeui1kS6X"}},{"cell_type":"code","source":["link='http://bit.ly/3C8JzrM'\n","dataset=pd.read_csv(link)"],"metadata":{"id":"w5p40Wy1kRSV","executionInfo":{"status":"ok","timestamp":1659075498582,"user_tz":-360,"elapsed":1264,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":["dataset.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"4y0ra5dmkhZ8","executionInfo":{"status":"ok","timestamp":1659075500326,"user_tz":-360,"elapsed":5,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"a26a3fb4-a993-4667-d15e-ec52044d8264"},"execution_count":7,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" x y\n","0 1 -13.115843\n","1 2 25.806547\n","2 3 -5.017285\n","3 4 20.256415\n","4 5 4.075003"],"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","
xy
01-13.115843
1225.806547
23-5.017285
3420.256415
454.075003
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":7}]},{"cell_type":"markdown","source":["#### **Exercise 1**:\n","Perform a simple linear regression to find the $m$ and $b$ values that minimizes the loss (sum of squares)."],"metadata":{"id":"9Yr5_jPCkrBR"}},{"cell_type":"code","source":["df = pd.read_csv(link,delimiter=',')\n","\n","X = df.values[:,:-1]\n","Y = df.values[:,:-1]\n","fit = LinearRegression().fit(X,Y)\n","\n","m = fit.coef_.flatten()\n","b = fit.intercept_.flatten()\n","\n","print(f\"m: {m}\")\n","print(f\"b: {b}\")\n","\n","plt.plot(X,Y,'.')\n","plt.plot(X,m*X+b)\n","plt.legend(['points','line'])\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":300},"id":"OSkWblhjkmPY","executionInfo":{"status":"ok","timestamp":1659075924564,"user_tz":-360,"elapsed":1356,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"b4995db4-8602-4c93-ce9b-3fee8f32d874"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["m: [1.]\n","b: [-1.42108547e-14]\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### **Exercise 2**:\n","Calculate the correlation coefficient and statistical significance of this data (at 95% confidence). Is the correlation useful?"],"metadata":{"id":"_oMjMwXYk676"}},{"cell_type":"code","source":["data = pd.read_csv(link,delimiter=',')\n","correlations=data.corr(method='pearson')\n","sns.heatmap(data=correlations,annot=True,cmap='YlGn_r')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":286},"id":"F-AbC3oklF3x","executionInfo":{"status":"ok","timestamp":1659076037781,"user_tz":-360,"elapsed":1725,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"90d36961-c455-473b-8f3a-2100e7151f18"},"execution_count":20,"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":20},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"code","source":["n = df.shape[0]\n","lower_cv=t(n-1).ppf((1-0.95)/2)\n","upper_cv=t(n-1).ppf((1+0.95)/2)\n","r = correlations[\"y\"][\"x\"]\n","test_value = r/sqrt((1 - r**2)/(n-2))\n","test_value=r/sqrt((1-r**2)/(n-2))\n","print(f\"TEST VALUE:{test_value}\")\n","print(f\"CRITICAL RANGE:{lower_cv,upper_cv}\")\n","\n","if test_valueupper_cv:\n"," print(\"CORRELATION PROVEN, REJECT H0\")\n","else:\n"," print(\"CORRELATION NOT PROVEN, FAILED TO REJECT H0\")\n","\n","if test_value > 0:\n"," p_value = 1.0 - t(n-1).cdf(test_value)\n","else:\n"," p_value = t(n-1).cdf(test_value)\n","#two tailed test so multiply by 2\n","p_value=p_value*2 \n","print(f\"P-VALUE:{p_value}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5WA9y6Luo9-4","executionInfo":{"status":"ok","timestamp":1659076388595,"user_tz":-360,"elapsed":518,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"dc6e6876-2941-4674-f907-435ea2121607"},"execution_count":25,"outputs":[{"output_type":"stream","name":"stdout","text":["TEST VALUE:23.835515323677328\n","CRITICAL RANGE:(-1.984467454426692, 1.984467454426692)\n","CORRELATION PROVEN, REJECT H0\n","P-VALUE:0.0\n"]}]},{"cell_type":"markdown","source":["#### **Exercise 3**:\n","\n","If I predict where x = 50, what is the 95% prediction interval for the predicted value of y?"],"metadata":{"id":"W4YFxMlolS8T"}},{"cell_type":"code","source":["import pandas as pd\n","from scipy.stats import t\n","from math import sqrt\n","\n","points = list(pd.read_csv(link,delimiter=',').itertuples())\n","\n","n = len(points)\n","m = 1.75919315\n","b = 4.69359655\n","\n","x_0 = 50\n","x_mean = sum(p.x for p in points)/len(points) \n","\n","t_value = t(n-2).ppf(.975)\n","\n","standard_error = sqrt(sum((p.y - (m * p.x + b))**2 for p in points)/(n-2))\n","margin_of_error = t_value * standard_error * sqrt(1+(1/n)+(n*((x_0+x_mean)**2))/(n*(sum(p.x**2 for p in points)-(sum(p.x for p in points))**2)))\n","\n","predicted_y = m*x_0 + b\n","\n","print(f'The prediction interval is between:{predicted_y-margin_of_error} and {predicted_y+margin_of_error}')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"h-FCRtE_liCZ","executionInfo":{"status":"ok","timestamp":1659076634186,"user_tz":-360,"elapsed":557,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"46125bfc-76d7-4583-ab9c-863ad3f211a7"},"execution_count":28,"outputs":[{"output_type":"stream","name":"stdout","text":["The prediction interval is between:50.80065904646458 and 134.50584905353543\n"]}]},{"cell_type":"markdown","source":["#### **Exercise 4**:\n","\n","Start your regression over and do a train/test split. Feel free to experiment with cross-validation and random-fold validation. Does the linear regression perform well and consistently on the testing data?"],"metadata":{"id":"FCl0jve2lij2"}},{"cell_type":"code","source":["df = pd.read_csv(link,delimiter=',')\n","X = df.values[:,:-1]\n","Y = df.values[:,:-1]\n","kfold = KFold(n_splits=3,random_state=7, shuffle=True)\n","model = LinearRegression()\n","results = cross_val_score(model,X,Y, cv = kfold)\n","print(results) \n","print(f\"MSE: {results.mean()}, std_dev: {results.std()}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"gcd_IUvQl1rG","executionInfo":{"status":"ok","timestamp":1659077018526,"user_tz":-360,"elapsed":1126,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"4bb73082-45fa-4ce9-d943-cc09136fc351"},"execution_count":33,"outputs":[{"output_type":"stream","name":"stdout","text":["[1. 1. 1.]\n","MSE: 1.0, std_dev: 0.0\n"]}]}]} -------------------------------------------------------------------------------- /Chapter 6/Chapter 6 Exercise.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Chapter 6:Exercise.ipynb","provenance":[],"authorship_tag":"ABX9TyNfhRPE8QnakNKDKIpF1Xgm"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"f1de93fd8e2c43c299c4df9200ccada1":{"model_module":"@jupyter-widgets/controls","model_name":"VBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":["widget-interact"],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"VBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"VBoxView","box_style":"","children":["IPY_MODEL_3f705e7820d64407ad62ad1c2418dc3e","IPY_MODEL_9b7bf8e85e7742c596bcdefc5c1802a2","IPY_MODEL_497cf8c9cbcb4d8dade0e991b3f7ae99","IPY_MODEL_f699b2ce7068468bbd310dd3298c0361"],"layout":"IPY_MODEL_2dc5ed70af2046348efb4f71ff2db3e3"}},"3f705e7820d64407ad62ad1c2418dc3e":{"model_module":"@jupyter-widgets/controls","model_name":"IntSliderModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"IntSliderModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"IntSliderView","continuous_update":false,"description":"Red","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_51960180efe548b591b39cf217127006","max":255,"min":0,"orientation":"horizontal","readout":true,"readout_format":"d","step":1,"style":"IPY_MODEL_609f4c52d30149f084330d18bc235551","value":149}},"9b7bf8e85e7742c596bcdefc5c1802a2":{"model_module":"@jupyter-widgets/controls","model_name":"IntSliderModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"IntSliderModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"IntSliderView","continuous_update":false,"description":"Green","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_a172f1f1daf2431d942f6e3ffaff4fac","max":255,"min":0,"orientation":"horizontal","readout":true,"readout_format":"d","step":1,"style":"IPY_MODEL_22731951a628416182ac74b65405a498","value":188}},"497cf8c9cbcb4d8dade0e991b3f7ae99":{"model_module":"@jupyter-widgets/controls","model_name":"IntSliderModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"IntSliderModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"IntSliderView","continuous_update":false,"description":"Blue","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_86efe8a05549487da8fc1ce4d32417ea","max":255,"min":0,"orientation":"horizontal","readout":true,"readout_format":"d","step":1,"style":"IPY_MODEL_36068737de804c4abc83edd845414f60","value":104}},"f699b2ce7068468bbd310dd3298c0361":{"model_module":"@jupyter-widgets/output","model_name":"OutputModel","model_module_version":"1.0.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/output","_model_module_version":"1.0.0","_model_name":"OutputModel","_view_count":null,"_view_module":"@jupyter-widgets/output","_view_module_version":"1.0.0","_view_name":"OutputView","layout":"IPY_MODEL_187640de1883495581140fa3c604e8fb","msg_id":"","outputs":[{"output_type":"display_data","data":{"text/plain":"'Predicted Font Color: DARK'","application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{}}]}},"2dc5ed70af2046348efb4f71ff2db3e3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"51960180efe548b591b39cf217127006":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"609f4c52d30149f084330d18bc235551":{"model_module":"@jupyter-widgets/controls","model_name":"SliderStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"SliderStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":"","handle_color":null}},"a172f1f1daf2431d942f6e3ffaff4fac":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"22731951a628416182ac74b65405a498":{"model_module":"@jupyter-widgets/controls","model_name":"SliderStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"SliderStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":"","handle_color":null}},"86efe8a05549487da8fc1ce4d32417ea":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"36068737de804c4abc83edd845414f60":{"model_module":"@jupyter-widgets/controls","model_name":"SliderStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"SliderStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":"","handle_color":null}},"187640de1883495581140fa3c604e8fb":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"cells":[{"cell_type":"markdown","source":["# **Exercises**\n","A dataset of three input variables RED, GREEN, and BLUE as well as an output variable\n","LIGHT_OR_DARK_FONT_IND is provided [here](https://bit.ly/3imidqa). It will be used to predict whether a\n","light/dark font (0/1 respectively) will work for a given background color (specified by RGB\n","values).\n","1. Perform a logistic regression on the preceding data, using three-fold cross-validation\n","and accuracy as your metric.\n","2. Produce a confusion matrix comparing the predictions and actual data.\n","3. Pick a few different background colors (you can use an RGB tool like this one) and see\n","if the logistic regression sensibly chooses a light (0) or dark (1) font for each one.\n","4. Based on the preceding exercises, do you think logistic regression is effective for\n","predicting a light or dark font for a given background color?"],"metadata":{"id":"M21-dwPk-4dX"}},{"cell_type":"code","source":["dataset=pd.read_csv(\"https://bit.ly/3imidqa\", delimiter=\",\")\n","dataset.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"EIKcC9KoD3oY","executionInfo":{"status":"ok","timestamp":1659787790412,"user_tz":-360,"elapsed":21,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"ee10df23-0775-44ac-ae1b-b24b99d31a7c"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" RED GREEN BLUE LIGHT_OR_DARK_FONT_IND\n","0 0 0 0 0\n","1 0 0 128 0\n","2 0 0 139 0\n","3 0 0 205 0\n","4 0 0 238 0"],"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","
REDGREENBLUELIGHT_OR_DARK_FONT_IND
00000
1001280
2001390
3002050
4002380
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":19}]},{"cell_type":"markdown","source":["#### **Exercise 1:**\n","___"],"metadata":{"id":"nFOSH_n1-7ab"}},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"w52VNJ85-xD-","executionInfo":{"status":"ok","timestamp":1659786753336,"user_tz":-360,"elapsed":753,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"dee57aea-7242-4e6f-e023-6c748310ad58"},"outputs":[{"output_type":"stream","name":"stdout","text":["Accuracy Mean: 1.000 (stdev=0.000)\n"]}],"source":["import pandas as pd\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.metrics import confusion_matrix\n","from sklearn.model_selection import KFold, cross_val_score\n","# Load the data\n","df = pd.read_csv(\"https://bit.ly/3imidqa\", delimiter=\",\")\n","X = df.values[:, :-1]\n","Y = df.values[:, -1]\n","kfold = KFold(n_splits=3, shuffle=True) # n_splits means how many folds, we are using 3 fold.\n","model = LogisticRegression(penalty='none') # you could use 'elasticnet','l1', or 'l2' as penalty.\n","results = cross_val_score(model, X, Y, cv=kfold)\n","print(\"Accuracy Mean: %.3f (stdev=%.3f)\" % (results.mean(),\\\n","results.std()))"]},{"cell_type":"markdown","source":["#### **Exercise 2**\n","___"],"metadata":{"id":"N51GDUsOAR-E"}},{"cell_type":"code","source":["import pandas as pd\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.metrics import confusion_matrix\n","from sklearn.model_selection import train_test_split\n","# Load the data\n","df = pd.read_csv(\"https://bit.ly/3imidqa\", delimiter=\",\")\n","# Extract input variables (all rows, all columns but last column)\n","X = df.values[:, :-1]\n","# Extract output column (all rows, last column)\\\n","Y = df.values[:, -1]\n","model = LogisticRegression(solver='liblinear')\n","X_train, X_test, Y_train, Y_test = train_test_split(X, Y,\n","test_size=.33)\n","model.fit(X_train, Y_train)\n","prediction = model.predict(X_test)\n","matrix = confusion_matrix(y_true=Y_test, y_pred=prediction)\n","print(matrix)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"H9nxpHzt_uht","executionInfo":{"status":"ok","timestamp":1659786862038,"user_tz":-360,"elapsed":605,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"15d17782-c66e-4eac-9a03-9f01d3cde81d"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["[[168 8]\n"," [ 1 267]]\n"]}]},{"cell_type":"code","source":["import numpy as np\n","import seaborn as sns\n","import matplotlib.pyplot as plt \n","labels = ['True Negative','False Positive','False Negative','True Positive']\n","labels = np.asarray(labels).reshape(2,2)\n","ax = sns.heatmap(matrix, annot=labels, fmt='', cmap='Blues')\n","ax.set_title('Exercise 2 Confusion Matrix Plot \\n\\n',fontsize=18)\n","ax.set_xlabel('\\nPredicted Values')\n","ax.set_ylabel('Actual Values ')\n","ax.xaxis.set_ticklabels(['False','True'])\n","ax.yaxis.set_ticklabels(['False','True'])\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":353},"id":"SEYuiJe3ACw_","executionInfo":{"status":"ok","timestamp":1659787323078,"user_tz":-360,"elapsed":1649,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"bcfe0654-38fe-4c3d-9092-42c905e3ae1e"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAW4AAAFQCAYAAACf0pRSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3wU1frH8c+TIhCaNBUFEQULqFQriCCKvaOiYv+J5dq9dr323ruiIvYO9mtDEcVCv1cEvSKCoggKSEmAFJ7fH2eCS9gkm5BNMvB985oXu2fPnHN2svvMmTNnZs3dERGR+Mio6QaIiEjFKHCLiMSMAreISMwocIuIxIwCt4hIzChwi4jEjAJ3BZjZSDObUdPtWFuYWVsze93M/jAzN7Ohaaqnd1T+iekof21iZjPMbGQN1n9N9LfarKbaEAfVErgTvjilLYXV0Y44M7OuZnaHmU0wswXRMtbMzjSz7AqWlWVmJ5vZh1HQzDezeWb2iZmdbWY56XofJQwFdgduBY4DHq2memtEwud9chl5JhXnW4N6ekcBcP3KllGVzOzEEt/3FWa20Mw+N7Pjq7iuWvXe0yWrmut7AXg3SfqKam5HZfUDrIbqvhjYE3gdeAzIBA4AHgQONrN9PIWrqcysBfAmsDPwNXAPMBtYH+gF3A3sBhyZhveQ2I46UT0PuPsd6awLGAXUAwrSXE8qlgEdzWwHdx+b+IKZdQM6RXnqrkEdvYGrCTvGvyq47lZAuq7Kuw8YS+gwbgacCjxlZq3c/aYqqqM3lX/vsVHdgXuCuz9bzXWWyswauvviVPO7e34621OO+4ET3X1ZQtoDZvYscCywP/B2WQWYmQGvEoL2Oe5+f4ksd5lZe+CIqmt2qTYk7ATnp7sid19BCIa1wWdAV+AkQhBLdDLwJzCB0EmoFtERW6a7L3P35Wms6jN3fzWh3ieB74FLzOw2d9eRd6rcPe0LYS/owD9TyHtblPe4EunbA0uBT4CMhPQ9gQ8Ie9dlwH+B05OUOwMYCXQB3gcWAj8lvN4OeBKYBeQDvwFvAN0S8owEZpQotyPwCvArsBz4PWrj/iXy1QEuB76N2vkX8BbQZQ237YHR9rq0AnlfrGAdvYAPo222lBBYTkmSb2S0nTcmHF0tAPKi7b1lQr6hUTtKLr0TPisnJil/aPjIVmz7l1YmUB+4GfgxYd2ngTalfH5PJATcb6P8M4GLK7AdnbBzvTfaNnVLfD7mE46A3k7yPrcGHorqXhxt1/HA/yXbRkmWa6LXr4medwTuInzei4Deid+ThPL2JxwRP1GingaEoDsH2Kic931iVGf/JK+Ni15rWaJ9m5XItxnwTFTf8uhvdhOQk+p7X5uW6u5x55hZ8yTp+e6+KHp8BSFQPGRmX7n7D9GY60tALjDQQw8KMxsEPAJ8BdwYvb4X8LCZbeHuF5WoZ1PgY8IX/TXChw8z6w6MALKBJ4DJQFPC+OuuhC/IasysWVQeUTtmAs2B7sBOwDtRvmzgvaisZ4AHgMaEQ8XRZtbL3ceVvelK1Sr6f04KeftH/w9OtXAzOxAYTghqdxKCxgDgcTPb3N2vKLFKfcLQxFeEHVVb4FzgDTPb1t2LCGPZkwjDMsOBYdG6U4FtKtC2lLZ/KetmE3YoPQhHIXcC7YEzgH5m1t3dZ5VY7XTCkcIThB3vQOBWM5vl7s+n2m5gCHAOcChhB0f0uEn0WrJhg96E78XbwE+E7XwE8JiZtXD3m6N8jwKNovLOJ/TgIXRoEj1H2AnfSQhus5M11N3fMbN7gPPN7EN3fzF66SHC9trP3X9P7W2vKhou2xQopIxhDTNrA4whfGceAn4gbI/LgB5m1tdDbz3V9x5/1bF34O8eS2nL2yXytyX8IccD6xG+KA4cmJCnJaHn+nyS+u4l9CI2T0ibEZVRsodihEC9DNg+SVmJvfuRJPS4gYOiMo8s5/2fH+Xbu0R6I+BnEno4FdyuDYDp0bZqmkL+8VE7ys0b5c8kBMO/gI0T0tcDRkfbuH2J7eOU6IUCF5V8/4Qe1Gq9ISrQ467A9l+tTMJO04HbSuTdP0p/Jsn6vwGNE9JzgD+AL1Pcnis/69Hf4oOE1z4AxkWPk/W46yf7bEbbfCGQnZB+DUl6rSVeGwlkJXl9RsnPY/T3HhfVsznhRLIDd6T4vk+M8p9E2LFuAOxAOF/jwAtltZ2wk3HCTiKx3Nuj9FNSee9r01Ld0wEHE3rEJZdVem3u/hMwiDAW+DFh7O8+d38rIVt/wuHlE2bWPHEhDEFkEIZREs0nDIck6kw4bHzS3VfbM3vUuy/Fwuj/fc2sURn5BgLfAeNLtHM9whBETzOrV8b6qzGzTOBZwk7uDHdPZay4uI2Lysz1t26EHtEQd/+tONHDWP9thG18cIl1VhBOQiUq7hW3T7HeVKW6/ZM5lNDWmxMT3f0dwtHAwWZW8vvxpLsvTMibRziyqMz7GgL0NbPWZtYa6BulJeXuucWPzaxudLTRlBDwGxGGUiriHk9xTDn6ex9F6OQMJ/R6xxF6vBUxhLCjm0PoQe8HPEXYiSYV/Q0OAia6e8mJDTcT/oaHVrAdsVfdQyU/uPtHqWR095fN7CDCibfJhFkViYoPqcsqb8MSz3/0cKieqPhLNzGVdpVo46dm9jShR3GsmY2N2vOSu08p0dZ6hA9taZoDv6RSb/RhHkIImle4+wvlrFKsOGA3JIyxlqdt9P+3SV4rTtu8RPpvvuoJVIB50f/NUqgzZRXY/sm0jdqabDt8S9ihNwfmJqRPT5J3HpV7X88ThilOIATEfP4eNlmNmTUg9CaPBFonydKkgvX/ryKZ3f1HM7uAMKNpKXC0u1d0ls51hJOzKwhDbt95+ZMDWhCOLFf7DLr7fDObzeqfwbVedQfulEXzMHtGTzcmHF4lBrbiaXnHU8r4HKt/0fKqrIERdz/BzG4H9iVMb7sQuMLMznP3BxLa+g1wQRlFlRXUV4qC9uOE932tV2wa1WTCUUwX/u4FV7WSO8ZEqUyl9DJeW+3zmuL2ryplvbcKcfcFZvY6YadjwOul7ESKPU+Y/jmYcA5hXtSe/QhDcRU9eq7Md+HA6P96hGmD0yq4/jepdtykbLU2cBPGtVsBZxPGsp41sz0Sesw/RP//uYYfhuKeR+fKFuDukwlB8fZoh/M1cIuZPehh4O0HQs/h43KGXsqUELRPAm5w92sqWMRrhID/f6QWuIt3fB2TvNahRJ6qUjzk0zTJa0l7Vils/2SmA/uY2fruXvLEWAfC0cmfq69WpYYQhiAgnPhMKnpPBxDG3U8v8VrJ4UBIwzxsMzubMGRxC3AYMNTMtnf30jpNVeUPQu98tc+gmTUhnOualJBc5e+9NqqVl7yb2emED8cNUa/pn4Qz6lcmZHuZMC3o2mTjw2bWODprXZ7/EA7DTjazZB+OUnuJZta05DhoFAR+Ipy4Kr6I4mlgI0rpcZtZySGdZHmMcJh6EnCTu19V3jpJvEXorR1tZmeWUk87Myseu5xAOHl6kpltlJAnm79POL5RiXaU5SfCLINVApKZ7UqYf56Ylur2T+Z1wuf/0hJl7ks4InlzTXayKfoIuIrwuR5RRr7izsoqn0Uza0nYCZe0JPo/2c6vwsysE6Hz9AnhfNQAwrj6M0nOA1Sp6G/wFtDFzPYp8fKlhL/h8IS0Kn3vtVV197i7mtnAUl573d2XmNm2hPmlo4DrAdz9QTPbC7jKzEa4++fuPsvMziD0QKea2TOEGRAtgO2AQwg9pxllNcjd3cxOInxxxphZ8XTA9QnTAd8jXPySzPGEaVLDCYeNBdE6ewMvu/vSKN+9hJOwt5vZHoTe7iLCib++hBktfcpqJ+GLczJhRzM1yXb80d2/TOG99id8ER40s+MIV1H+Hr3fnoRe1WtR/iIzO4vwxRhrZoMJvZ+jCEH0Jnf/YfWaKi/6DAwF/s/MXiDMfmhP2GH9l3BlYbFUt38yQwnjy5dYuC/GKMJc/jMJJ88ur6r3VJooKN2QQr7FZvYBMNDMlhIu3GkDnEbYSZUcY/8q+v9WM3uO8PmaHB2ZVIiZ1QdeJHxei6fiTjSzSwjTOS+hxAneNLic8P153cweIvytexE+h6MIJziLVdl7r9WqY+oK5U8HdMKXph4haM4DWpUooylhjHsm0CQhvQchsMzl7wtnPiGMdSZe4DCDMqbdEcbsniUEseJyXge6JuQZyarTATsTPjTTCHPIFxEC64VAnRLlZxHm7o6N8uYShlCeA/qlsA1HlrP9hlbg75ENnELo8f1JCHjzCDuUM4F6JfLvTpj9sojwRZhIGRfgJEnfjBJT/5KlJbzWgLBDnkcYi/2MMAd+KKtOB0xp+1P+BTjTo7/5XMI8+zalfH5PTNLWVdpUznZfbeprKfmSTQdsHm2T36K/wTeE2RgnRuX2LpH/4uh9FSRuZ8qZLsfqF+AMIZxMLDkVz6J2FgA7lfN+itu42gU4SfImbR/hZPIz/P09n06JC3DKe+9r02LRGxURkZiolWPcIiJSOgVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiRkFbhGRmFHgFhGJGQVuEZGYUeAWEYkZBW4RkZhR4BYRiZmsmm5Aafa470uv6TZI7fPGaTvVdBOkFmpYJ8PWtIx6Xc5KOeYsnfjAGte3Jmpt4BYRqVYWnwEIBW4REQCr0U50hShwi4iAetwiIrGjHreISMxkZNZ0C1KmwC0iAhoqERGJHQ2ViIjEjHrcIiIxE6Med3x2MSIi6ZSRmfpSBjNrbWafmNkUM/vWzM6N0q8xs1/NbFK07JewzmVmNs3MvjezvctrqnrcIiJQlUMlhcCF7j7BzBoC483sw+i1u939jlWqNesADAA6AhsDH5nZlu5eVFoF6nGLiEAI3KkuZXD32e4+IXq8GJgKbFLGKgcDL7r7cnf/CZgG7FhWHQrcIiIAGZb6kiIz2wzoAnwdJZ1lZv81syFm1iRK2wT4JWG1WZQd6BW4RUSACvW4zWyQmY1LWAatVpxZA+A14Dx3XwQ8DGwBdAZmA3dWtqka4xYRgQrNKnH3wcDg0ouybELQfs7dh0XrzEl4/THg7ejpr0DrhNVbRWmlUo9bRASqclaJAU8AU939roT0lgnZDgUmR4/fBAaYWR0zawu0B8aUVYd63CIiUJWzSnoAxwHfmNmkKO1y4Ggz6ww4MAM4DcDdvzWzl4EphBkp/yhrRgkocIuIBFV0AY67fw4kK+zdMta5Ebgx1ToUuEVEQJe8i4jETowueVfgFhEB3Y9bRCR2NFQiIhIzCtwiIjGjMW4RkZhRj1tEJGbU4xYRiRnNKhERiRdTj1tEJF4UuEVE4iY+cVuBW0QE1OMWEYkdBW4RkZjJyNA8bhGReIlPh1uBW0QENFQiIhI7CtwiIjGjwC0iEjOWocAtIhIr6nGLiMSMAreISMwocIuIxE184rYCt4gIqMe9kpnlABcCm7r7qWbWHtjK3d9OZ70iIhUVp0ve093SJ4HlwC7R81+BG9Jcp4hIhZlZyktNS3fg3sLdbwMKANw9j1iNJInIOsMqsNSwdI9x55tZPcABzGwLQg9cRKRWqQ096VSlO3BfDbwHtDaz54AewIlprlNEpMIUuCPu/qGZTQB2JhxgnOvuf6azzqrUqG4WdxzaAYCmOdmscPhraQEAZ770DYUrfI3ruOuwDtTLzuSMl74BYMsN6nN6zzZcMGzKGpedaO9tWjDu57+Ylxvaf2HfzXl14mxmzl9apfWsS3bs3JF27bdc+fyOex5g4002SZp3t5268dnX49eovmuuvIwJ48bSoGFDzIxLrriK7Tt1qVAZ1199JccefyKbb9GOIY89ysmnnrbytZOPO5ohz7ywRm2MMwXuiJn1ACa5+ztmNhC43MzudfeZ6ay3qixaVsigF/4LwAk7tWJpfhEvT5y98vUMgyqI3ayfk82ObdZnzMy/1rywUuy9TQt+mpe3MnDfOWJ62upaV9SpU5fnXxlerXWec8FF7Nlvb776YjQ3XXcNL772RoXWv+rav+cGPPn44FUC97octEH3Kkn0MNDJzDoBFwBPAE8Du6e53rS5eM8tyC9aQfsW9Zk8ezF5+UWrBPQnju3E5W9+x5zFy9lzq+Yc1qklWZnG1N+XcO/I6UkD/cvjf+PYHTZZLXBnGJy6axs6tWpEdqbxxn9/5+3JczHgnN5t6dKqMXOXLKdohfPvKXMZNW0+x+3Yil3aNqFOVgbfzl7MXR9Pp1e7pmy1QQOu2Ls9ywtXcNbLk7nl4K155POZbLVBAzZuXJdHR4d96d7btGCrDRpw36c/pdx+CfLycrnwnLNYtGghhYWFnHH2ufTu03eVPH/+MZfLLrqA3NxcCgsLuezKq+nSrTtffTGaRx+6n/z8fFq13pSrr7+RnJz6pdbVpVt3fvnlZwCefXoobw5/DYBDDuvPMcedwNK8PC696HzmzplDUVER/3faGfTbZz8GnXw85114MSM+fJ/ly5dxzBGHsvkW7bjhlttXHhVcdvEF7H/AQfTs1RsIPf2evXrTp++ePHDPXYwfN4b8/HyOGHAMhx9xVHo2Zg2oqh63mbUmxLkNCef3Brv7vWbWFHgJ2AyYARzp7gssVHwvsB+QB5zo7hPKqiPdgbvQ3d3MDgYedPcnzOyUNNeZdi0a1OHsVyazwkNPPJlNm9Sjz5bNOPvVyRStcM7t3Za+WzXnw+9WHyn69vfF9NyiKZ1bNSIvv2hl+r4dNiA3v5AzX/qG7Ezjvv7bMu7nhWy5QX02alSHk56dxPo52Qwd2Jl/T5kLwOv/+Z1nxswC4LJ+7dilbRNGTZvPIdsv4ZHPZ/K/ubmr1D3qx3k8cMR2KwN37/bNeG7srxVq/7qqOPABbLzJJtxyxz3cfs/9NGjQgL8WLODEgQPYvfceqwSE9959h5137ckpg06nqKiIZcuW8deCBTwx+GEeGjyEejk5DB3yGM89PZRTT/9HqXV/9ukntGu3JVOnfMtbrw/jqedewnFOPPYounbfgV9nzaJFiw2498FHAViyePEq65993oW8/MLzSY8Y+u29Lx++/x49e/WmoCCfsV9/xaVXXs0bw1+jfsMGPP3CK+Tn53PK8cew8y492KRV8u9A3FThUEkhcKG7TzCzhsB4M/uQcH5vhLvfYmaXApcClwD7Au2jZSdCh3ensipId+BebGaXAQOBXmaWAWSnuc60+/SHeeX2PLu2bkz7Fg14+KjtAKiTlbFyfDyZZ8fOYuAOrRg8+u9RpO5t1mfzZjn0atcMgPrrZdJq/bps17IRn/4wDwcW5BUwadbClet0btWIAd02pk5WJo3qZjFjXh5f/rSg1HoXLi1k9qJlbLNRA379axmbNqnH5NmLOWT7jSrU/nVRyaGSwoICHrzvbiaOH0dGRgZ/zJ3DvHl/0rx5i5V5OnTcluuuvpLCwkJ679GXrbbehs/GjWH69B855YRjASgoKGC7Tp2S1nnfXbcz5LFHWL9JE6669nrGfv0VffruSb2cHAD69N2LSRPGs0uPntxz563cd/cd7NarN126dU/5fe3asxd33Hoz+fn5fDH6M7p0607dunX56ovRTPvhez7+8AMg7Ax++XmmAncJ7j4bmB09XmxmU4FNgIOB3lG2p4CRhMB9MPC0uzvwlZmtb2Yto3KSSnfgPgo4BjjF3X83s02B20vLbGaDgEEAWx11MRvvekiam1c5ywr/7hUXrfBV/uDrZYap8QZ88N0fPP7FzymVOXHWIk7eJYMOGzVcmWbA/Z/+xLifF66Sd6c2TZKWkZ1pnNunLWe8+A1/LMnnhJ1asV5W+VP1P/7fn/Ru34yf5y/l8+nzK9V+gX+/+zZ/LZjPsy++SlZ2Ngfu05f85fmr5OnafQcee/IZPh81kmuvupxjjjuBRo0as9POu3LTbXeWW0fxGHexsV9/lTRfm83a8uxLrzH6s1E8/MC97LDTzmX24BPVqVOHbt134MvRn/Phe/+m3z77AeDuXHTplezSo2dK5cROGoa4zWwzoAvwNbBhQjD+nTCUAiGo/5Kw2qwordTAndYLcNz9d3e/y90/i57/7O5Pl5F/sLt3d/futTVol/T7ouW03yCMRbZvEYYwACbMWkivdk1Zv17YNzask8WGDdcrs6xnx8ziqG4br3w+duZfHLTdRmRGJ01arV+XulkZTJ69iN3aNcOAJvWy6dSqMfD3TmPh0kLqZmes7KkDLC0oIme9zKT1fv7jfHps3pQ9tmrOJ/+bV+n2r+uWLF5Mk6bNyMrOZtyYr5n922+r5Zn92680bdaMQ/sfycGH9ef7qVPYbvtO/GfSRH75ORxtLc3LY+aMn1Kqs0vXboz8eATLli5laV4en4z4iM5du/HH3LnUrVuP/Q44iONOPJnvpk5dbd2srCwKC5IfRfXbZ1/eemMYkyaMZ9eeIVDv0qMnr7784sp1Zs74iaV5eSm1Mw4yMjJSXsxskJmNS1gGlSzPzBoArwHnufuixNei3nWlzxilpcdtZotJ3igjtLlROuqtCaOmzaffNi0Ycmwnpv6+hFl/hel1M+cvZciXv3DbIR0wCz3ze0f+xJzF+aWW9fXMv1iYMBzx7rdz2ahRHR4dsD1mYSriv97+nlHT5tOldWOeHNiZuUuW88PcJeQuLyI3v4h3J89lyMBOzM/N5/s5S1aW9d6UPzi/z+YrT04mWrK8iJnzl9KmaT2+i9apTPvXdfvufyDnn30GRx12EB06bstmbTdfLc/4sWN5eugTZGVnk1Mvh2tvvIUmTZtyzfU3ccUl/yQ/P2zfM846lzabtS23zq07dOSAgw/l+GOOBMLJya236cCXoz/n3rtuJyMjg6ysLC698urV1j20/xEM6H8IW2/TgRtuWfVAeOddevCvyy9l9z57kJ293sqyZ//6K8cedTjuTpOmTbnzngcqvJ1qq4qMlLj7YGBw6WVZNiFoP+fuw6LkOcVDIGbWEpgbpf8KtE5YvVWUVnpbQ+Cvffa478va2bBaom52BssKVtCobhYPHbUdZ78ymQV5a/8Y9BunlXnORtZRDeus+Vy+9he9l3LM+eH2fUqtL5ol8hQw393PS0i/HZiXcHKyqbtfbGb7A2cRZpXsBNzn7juWVX+13NbVzDYA6hY/d3cNnK6hmw7cmgZ1ssjKNJ4ZM2udCNoi6VSF19/0AI4DvjGzSVHa5cAtwMvRzLqZwJHRa+8SgvY0wnTAk8qrIN0X4BwE3AlsTDgsaANMBTqms951QVVfWSmyrqvCWSWfU/qpzr4lE6Lx7tTOHEfSfXfA6wmXu//P3dsSGp38NLiISA0yS32paekeKilw93lmlmFmGe7+iZndk+Y6RUQqLDOzFkTkFKU7cP8VTYkZBTxnZnOB3HLWERGpdnG6yVRahkqiC20gXBGUB5xPuL3rj8CB6ahTRGRNaKgEXge6unuumb3m7ocTpseIiNRKcepxpytwJ26B1a9CEBGpZRS4V71qUhfSiEitF6O4nbbA3cnMFhF63vWix7AWXvIuImuHjHX9hxTcPfndjEREaikNlYiIxEyM4rYCt4gIqMctIhI7MYrbCtwiIqCTkyIisaOhEhGRmIlR3FbgFhEB9bhFRGInRnFbgVtEBOLV4y73tq5mdpuZNTKzbDMbYWZ/mNnA6miciEh1yciwlJealsr9uPu5+yLgAGAG0A64KJ2NEhGpbmaW8lLTUhkqKc6zP/CKuy+sDQ0XEalKcQprqQTut83sO2ApcIaZtQCWpbdZIiLVK04d0nKHStz9UmBXoLu7FxB+iuzgdDdMRKQ6xemny1I5OZkDnAk8HCVtDHRPZ6NERKpbZoalvNS0VE5OPgnkE3rdAL8CN6StRSIiNSBOJydTCdxbuPttQAGAu+ex6m9KiojEXoalvtS0VE5O5ptZPaLfjjSzLYDlaW2ViEg1qw096VSlErivBt4DWpvZc0AP4MR0NkpEpLrFKG6XH7jd/UMzmwDsTBgiOdfd/0x7y0REqpHFaAS43MBtZr2ih4uj/zuYGe4+Kn3NEhGpXrVhtkiqUhkqSby8vS6wIzAe2CMtLRIRqQFxGipJ5QKcAxOWvYBtgQXpb5qISPXJMEt5KY+ZDTGzuWY2OSHtGjP71cwmRct+Ca9dZmbTzOx7M9u73LZW4v3NArapxHoiIrVWFV85ORTYJ0n63e7eOVreDfVaB2AA0DFa5yEzyyyr8FTGuO8nmgpICPSdgQkpNV1EJCaqcjqgu48ys81SzH4w8KK7Lwd+MrNphCHpL0tbIZUx7nEJjwuBF9x9dIoNEhGJhWoa4z7LzI4nxNUL3X0BsAnwVUKeWVFaqVKZDvjUmrRSRCQOMisQuc1sEDAoIWmwuw8uZ7WHgesJIxjXA3cCJ1ewmUAZgdvMvuHvIZJVXgLc3bevTIUiIrVRRYZKoiBdXqAuuc6chLoeA96Onv4KtE7I2ipKK1VZPe4DKtIoEZE4S/c0bjNr6e6zo6eHAsUzTt4Enjezuwh3X20PjCmrrFIDt7vPrIK2iojEQlWenDSzF4DeQHMzm0W4dUhvM+tMGMmYAZwG4O7fmtnLwBTCecR/uHtRWeWnMqtkZ+B+whTA9YBMINfdG1XyPYmI1DpVeXLS3Y9OkvxEGflvBG5MtfxUZpU8QJhj+ArhBxSOB7ZMtQIRkTiI0yXvKV2A4+7TgEx3L3L3J0k+sVxEJLbi9EMKqfS488xsPWCSmd0GzKZyV1yKiNRaNR+OU1dqADazHaKHx0X5zgJyCdNWDk9/00REqk9V3qsk3crqcQ82swbAi4SrJacA11ZPs0REqlctiMcpK7XH7e5dCHO5C4FXzew/ZnZpBa6/FxGJjTiNcZc5VibIdd8AABeNSURBVO3u37v7te7egTCbpDEwwsx0rxIRWatkZljKS01L5eQkZpYBbABsCNQH5qazUSIi1a0WdKRTVmbgNrPdgKOBQ4BvCOPd57v7wnQ37N0zd0l3FRJDTXY4q6abILXQ0okPrHEZtWEIJFVl3WTqF2AmIVhf4+7qZYvIWitOc5zL6nH31P1KRGRdsVb0uBW0RWRdUgvOOaYspZOTIiJru9owWyRVCtwiIqwlPe4SPxK8Gnc/Jy0tEhGpATEa4i6zxz2ujNdERNYqteEeJKkq6+SkfiRYRNYZa8t0QADMrAVwCdABqFuc7u57pLFdIiLVKk4nJ1PZyTwHTAXaEu4OOAMYm8Y2iYhUO7PUl5qWSuBu5u5PAAXu/qm7nwyoty0ia5UMS32paalMByyI/p9tZvsDvwFN09ckEZHqt1acnExwg5k1Bi4k/Np7I+D8tLZKRKSaxShulx+43f3t6OFCoE96myMiUjNqwxBIqlKZVfIkSS7Eica6RUTWCpkx6nKnMlTydsLjusChhHFuEZG1xlrV43b31xKfm9kLwOdpa5GISA1YK27rWob2hJ8xExFZa6xVPW4zW8yqY9y/E66kFBFZa8Sow53SUEnD6miIiEhNitM87nKvnDSzEamkiYjEWWZG6ktNK+t+3HWBHKC5mTUBindHjYBNqqFtIiLVJoP49LjLGio5DTgP2BgYz9+BexHwQJrbJSJSrWI0UlL6UIm73+vubYF/uvvm7t42Wjq5uwK3iKxVqvImU2Y2xMzmmtnkhLSmZvahmf0Q/d8kSjczu8/MppnZf82sa7ltTeH9rDCz9RMqb2JmZ6awnohIbGSYpbykYCiwT4m0S4ER7t4eGBE9B9iXMM26PTAIeLjctqbQgFPd/a/iJ+6+ADg1hfVERGIjM8NSXsrj7qOA+SWSDwaKf1nsKeCQhPSnPfgKWN/MWpZVfiqBO9MSLikys0xgvRTWExGJjWr4IYUN3X129Ph3YMPo8SbALwn5ZlHOBJBUAvd7wEtm1tfM+gIvRGkiImuNjAosZjbIzMYlLIMqUpe7O0lu3peqVC55v4Qw7nJG9PxD4LHKVigiUhtV5F4l7j4YGFzBKuaYWUt3nx0NhcyN0n8FWifkaxWllarcHre7r3D3R9y9v7v3B6YQflBBRGStYRVYKulN4ITo8QnAGwnpx0ezS3YGFiYMqSSV0k2mzKwLcDRwJPATMKwyrRYRqa2q8pL36C6qvQkXMM4CrgZuAV42s1OAmYR4CvAusB8wDcgDTiqv/LKunNySEKyPBv4EXgLM3fUrOCKy1qnKuwO6+9GlvNQ3SV4H/lGR8svqcX8HfAYc4O7TAMxMvzUpImulON2Pu6wx7sOA2cAnZvZYNKMkPu9MRKQCKjKrpKaVdcn76+4+ANga+IRw35INzOxhM+tXXQ0UEakOZpbyUtNSmVWS6+7Pu/uBhGkqE9EPKYjIWqYaZpVUmQr9dFl0uXtl5i+KiNRqtaEnnarK/OakiMhaJ1OBW0QkXuITthW4RUSAeP2QggK3iAhrz0+XiYisM9TjFhGJmaq8V0m6KXCLiBCvoZK0Xb0Z3aJwoJn9K3q+qZntmK76RETWRDX8Ak6VSedl9w8BuxDuLgiwGHgwjfWJiFRanAJ3OodKdnL3rmY2EcJVl2am36oUkVrJYjRUks7AXRD9sLADmFkLYEUa6xMRqbSqvB93uqUzcN8HDCfcUfBGoD9wZRrrExGpNM0qAdz9OTMbT/jFBwMOcfep6aqvqnXZbhvat99y5fO773+QTTZplTTvzt278NW4iWtU31WXX8qXX47m3fdHsN5667FgwXyOObI///7w4zUqt6SPR3xEmzabsUW7dgA8eP+9dOu+AzvvsmuV1rOuaNq4Pu8+ejYAGzZrxIoVK/hjwRIAdht4OwWFRWtcx/uPnctGzRuxLL+A3LzlnHbNc/wwc275KyYYfv8ZnHjZUACO2rc7g1/5DICWLRpz58X9OeaiJ9a4nXGnoRLCLBLC76e9lZjm7j+nq86qVKdOXV4e9kb5GatQZkYmrw97lSMHHJO2Oj4Z8RG9du+9MnD/4+xz01bXumD+wlx2HnALAFecth+5ecu555kRK1/PzMygqGjNRwhPuuIpJkz5mZMP68FN5x/KEec9WqH1Dz37YQA2bdmUQUfutjJwz/5joYJ2REMlwTuE8W0D6gJtge+BjmmsM23ycnM59+wzWbRoEYWFhZx1zrn02WPPVfL88cdcLr7wfHKXLKGwqIgr/3UNXbt154vRn/Pwg/eTn59P69atue6Gm8mpX3+1Oo497gSeefopDut/5GqvDR3yOB+892/yC/LZo+9enHnWOQA8+vCDvPP2mzRp0pSNNmpJh44dOeGkU3jtlZd57ZWXKCgooPWmbbjxltv4/rupjPzkY8aNG8Njjz7Mnffcz+BHHqLX7r3Jyclh+LBXuePu+wAYO+Zrnho6hAceejTl9ksw+NqBLMsvpPNWrfjyP9NZtGTZKgF93CuXc9g5j/Dz7PkM2G8H/nH07mRnZzH2mxmce/NLrFjhpZb9+YRpnHVsbwBuOu8Q+vXogDvc+vh7vPrBBDZq3ohnbj2ZhvXrkpWZwbk3vcToiT/y3TvX0uPY27jh3IPZvFVzvnrxUj7+6jseeWkUw+47ne5H3MSnT13I6dc+x9TpvwOhp3/Z3cP5bvrv3HXJEXRs15KsrExufPRd3h75Tdq3Y3VTjxtw9+0Sn5tZV+DMdNVX1ZYvX8aRhx0MwMatWnHHXfdy930P0qBBAxYsmM9xRx9F7z59V7mH77vvvM2uPXpy6mlnUFRUxLJlS1mwYD6PPfowjz7+JDk5OQx5fDBPP/Ukp5951mp1tmzZki5du/L2W2+we++/f5P5i9Gf8/PMmTz30qu4O+ecdQbjx42lTp06jPjwA14Z9iaFhQUM6H8YHTqG/WLfvfbi8CPCDuCBe+9m+LBXOebY4+jdZw967d6bvfbeZ5W6d9plV6675l/k5eWRk5PD+++9yz777leh9svfNtlgfXqfeCcrVjhXnLZf0jxbtd2Q/v260uekuygsXME9lx3JgP124Pm3x5Ra7v69tuXbH37jkL6d2X6rVux41M00X78Bnz97EZ9PmMZR+3bnwy+mctsT75ORYeTUXXUi15X3vkGHLVquPErYtGXTla+9+sEEDu/XlRseeZeNmjdio+aNmDDlZ64960BGjv0fp1/7HI0b1OOzZy/i46++J29ZfhVsqdojRkPc1XflpLtPMLOdqqu+NVVyqKSgoID77rmLCePHkmEZzJ07h3l//knzFi1W5tl22+24+srLKSwspM8ee7L1NtswbuwnTP9xGicOPHplOdt37lxqvaecehrnnXUmu/XqvTLtyy9G8+UXoznq8EMAyMvLY+bMGeTl5tJ7j77UqVOHOnXq0Csh2E/74QceuO8eFi9eTF5eLrv26Fnm+83KyqJHz934dOQn7NVvbz779FPOv/Aixo0dW6H2SzDso4ll9pwB+uy4FV07bMrnz14MQL062fwxf0nSvE/eeAJLlxfw82/zuODWVzhn4B68/N44Vqxw5s5fzGfjp9GtYxvGfTuTR68eSHZWJm998h/++79fU27zax9M4K2Hz+KGR97l8L26MvyjSQD03WUb9t99O847PvxAed31smjdsgnf/zQn5bLjQPfjBszsgoSnGUBX4Ldy1hkEDAJ44KFHOeXUQelqXoW9+/ZbLFgwnxdeHkZ2djb77rUHy/OXr5KnW/cdGPL0s3z26af864pLOe6Ek2jYqBE779KDW++4K6V62rTZjK223oYP3vv3yjR35+RTB3HEkQNWyfvs00NLLeeqKy7lnvseYqutt+aN4cMYN7b0XlyxvffdjxdfeI7GjRvTYdttqV+/Ae5eofZLkLf0789GYVERGQkDqHXXywbCL648+9bX/Ov+N8str3iMuzyjJ/zIXv93D/v07Mjg647jvmc/LrMHn+i3PxYyf2Eu27bfmP57d+XsG18M7QSO/ufjFT4hGjfxCdvpvXKyYcJShzDmfXBZK7j7YHfv7u7da1PQBliyZDFNmzYjOzubMV9/xW+/rd6T+e23X2nWrDmHH3Ekhx5+BFOnfMv2nTozaeIEfp45Ewi95Rkzfiqzrv877XSeHjpk5fNde/Tk9WGvkZebC8CcOXOYN28enbt05dORn7B8+XLycnMZ9enIlevk5ebSvEULCgoKePedleeHyalfn9y83KT1dt9hR76bMoVhr77MPvuGw/vKtF9WNfO3+XTepjUAnbduxWabNAPgkzHfc+ienWnRpAEATRrlsGnLJimVOXrij/Tv142MDKN5kwb07NaOcZNnsGnLJsyZt4gnh3/B0OFf0GXr1qustyRvOQ3r1y213Fffn8AFJ+xJowb1mPxD6Gd99OVUzhyw+8o8nbZKPrsq9mL0o5Np6XFHF940dPd/pqP8mrDfAQdyzj/O4PBDDqRDx21pu/nmq+UZN2YMQ598gqysLHJycrjh5ltp2rQp1914M5dedAH5BWFM8Kyzz2OzzdqWWle7du3ZukMHvpsyBQiB+6fpP3LcsaHHnZOTw0233M62221P7z570P/Qg2jWrBnt229JgwYNgTBbZODRR9CkSVO2277TyqC/z777cd3VV/H8s89wZ3QislhmZia77d6bN18fzvU33QpQqfbLql4fMYljD9iR8a9ewdhvZqzsuX43/XeuffBt3nr4LDLMKCgs4vxbXubn2QvKLfONj//DTtu3ZcxLl+EOV9zzOnPmLebYA3fi/OP7UlBYRG7eck656plV1pu/MJcvJ01n3CuX88HoKTzy0qhVXh/+0UTuuOhwbn7svZVpNz/2Hrf/83DGvnw5GRnGjF/ncfi5j1TBlqld4nRy0tzLHoercIFmWe5eaGZfuvsulS1nWSFV27C1VF5uLjn167N06VJOPuFY/nXN9WzTIZYTd1LSZAedFJXVLZ34wBpH3THTF6Ycc3bcvHGNRvl09LjHEMazJ5nZm8ArwMpjc3cfloY611nXXfMvpv84jeX5yzno4EPX6qAtkk7x6W+nd1ZJXWAesAd/z+d2QIG7Ct1y+5013QSRtYKt47NKNohmlEzm74BdTMMfIlIrxShupyVwZwINSH7kocAtIrVSjOJ2WgL3bHe/Lg3lioikT4widzoCd4zevohIEKfpgOkI3H3TUKaISFpV5Ri3mc0g/FxjEVDo7t3NrCnwErAZMAM40t3Ln7SfRJVfOenu86u6TBGRdEvDb072cffO7t49en4pMMLd2wMjoueVks5L3kVEYsMq8K+SDgaeih4/BRxS2YIUuEVEqPIetwMfmNn46OZ5ABu6++zo8e/AhpVta7Xd1lVEpDarSD868U6mkcHuPjjheU93/9XMNgA+NLPvEtd3dzezSk+PVuAWEYEKRe4oSA8u4/Vfo//nmtlwYEdgjpm1dPfZZtYSqPR9cjVUIiJC+JX3VJeymFl9M2tY/BjoR7iS/E3ghCjbCUClf9RWPW4REar0ApQNgeHRvU+ygOfd/T0zGwu8bGanADOB1X9cNkUK3CIiUGWR292nA52SpM+jiq5zUeAWEUFXToqIxM66fndAEZHYiVHcVuAWEQH9kIKISOzEKG4rcIuIgIZKRETiJ0aRW4FbRARNBxQRiR2NcYuIxIwCt4hIzGioREQkZtTjFhGJmRjFbQVuERFQj1tEJHZ0ybuISMzEJ2wrcIuIABoqERGJHU0HFBGJm/jEbQVuERGIVdxW4BYRAciI0SC3AreICMSqy63ALSJCrOK2AreICGg6oIhI7Gg6oIhIzKjHLSISMwrcIiIxo6ESEZGYUY9bRCRmYhS3FbhFRIBYRW4FbhERdMm7iEjsxCdsK3CLiAQxitwK3CIixGs6oLl7TbdBymFmg9x9cE23Q2oXfS7WXRk13QBJyaCaboDUSvpcrKMUuEVEYkaBW0QkZhS440HjmJKMPhfrKJ2cFBGJGfW4RURiRvO4a4iZFQHfJCQd4u4zSsm7xN0bVEvDpEaZWTNgRPR0I6AI+CN6vqO759dIw6RW0VBJDalIMFbgXjeZ2TXAEne/IyEty90La65VUhtoqKSWMLMGZjbCzCaY2TdmdnCSPC3NbJSZTTKzyWa2W5Tez8y+jNZ9xcwU5NciZjbUzB4xs6+B28zsGjP7Z8Lrk81ss+jxQDMbE31GHjWzzBpqtqSRAnfNqRd9uSaZ2XBgGXCou3cF+gB3mq12u7JjgPfdvTPQCZhkZs2BK4E9o3XHARdU39uQatIK2NXdS/3bmtk2wFFAj+gzUgQcW03tk2qkMe6aszT6cgFgZtnATWbWC1gBbAJsCPyesM5YYEiU93V3n2RmuwMdgNFRnF8P+LKa3oNUn1fcvaicPH2BbsDY6LNQD5ib7oZJ9VPgrj2OBVoA3dy9wMxmAHUTM7j7qCiw7w8MNbO7gAXAh+5+dHU3WKpVbsLjQlY9Wi7+nBjwlLtfVm2tkhqhoZLaozEwNwrafYA2JTOYWRtgjrs/BjwOdAW+AnqYWbsoT30z27Ia2y3Vbwbhb4+ZdQXaRukjgP5mtkH0WtPoMyNrGfW4a4/ngLfM7BvCOPV3SfL0Bi4yswJgCXC8u/9hZicCL5hZnSjflcD/0t9kqSGvAceb2bfA10R/a3efYmZXAh+YWQZQAPwDmFljLZW00HRAEZGY0VCJiEjMKHCLiMSMAreISMwocIuIxIwCt4hIzChwi4jEjAK3iEjMKHCLiMSMAreISMwocIuIxIwCt4hIzChwi4jEjAK3iEjMKHCLiMSMAreISMwocIuIxIwCt4hIzChwyyrMrMjMJpnZZDN7xcxy1qCsoWbWP3r8uJl1KCNvbzPbtRJ1zDCz5iXSnjSz00qkHWJm/06lrSK1nQK3lLTU3Tu7+7ZAPnB64otmVqnfKXX3/3P3KWVk6Q1UOHCX4gVgQIm0AVG6SOwpcEtZPgPaRb3hz8zsTWCKmWWa2e1mNtbM/lvcu7XgATP73sw+AjYoLsjMRppZ9+jxPmY2wcz+Y2YjzGwzwg7i/Ki3v5uZtTCz16I6xppZj2jdZmb2gZl9a2aPA5ak3SOArc2sZbROfWBP4HUz+1dU3mQzG2xmq62f2Is3s+5mNrK4HDMbYmZjzGyimR0cpXeM0iZF26N9FWx7kVIpcEtSUc96X+CbKKkrcK67bwmcAix09x2AHYBTzawtcCiwFdABOJ4kPWgzawE8Bhzu7p2AI9x9BvAIcHfU2/8MuDd6vgNwOPB4VMTVwOfu3hEYDmxasg53LyL8EvqRUdKBwEh3XwQ84O47REcU9YADKrBZrgA+dvcdgT7A7dFO4XTgXnfvDHQHZlWgTJEKq9Rhr6zV6pnZpOjxZ8AThAA8xt1/itL7AdsnjAk3BtoDvYAXosD5m5l9nKT8nYFRxWW5+/xS2rEn0CGhQ9zIzBpEdRwWrfuOmS0oZf0XgDsIO4ABwDNReh8zuxjIAZoC3wJvlVJGSf2Ag8zsn9HzuoQdx5fAFWbWChjm7j+kWJ5IpShwS0lLo57jSlHwzE1MAs529/dL5NuvCtuRAezs7suStCUVXwAtzawTYcczwMzqAg8B3d39FzO7hhB8Syrk76PRxNeNcKTwfYn8U83sa2B/4F0zO83dk+20RKqEhkqkMt4HzjCzbAAz2zIaMhgFHBWNgbckDCeU9BXQKxpawcyaRumLgYYJ+T4Azi5+YmbFO5NRwDFR2r5Ak2QNdHcHXgKeAv4d7QCKg/CfUe+9tFkkM4Bu0ePDS7zvs4vHxc2sS/T/5sB0d78PeAPYvpRyRaqEArdUxuPAFGCCmU0GHiUcvQ0Hfohee5owhLAKd/8DGAQMM7P/EIIrhOGKQ4tPTgLnAN2jk31T+Ht2y7WEwP8tYcjk5zLa+QLQKfofd/+LML4+mRCEx5ay3rXAvWY2DihKSL8eyAb+G9V/fZR+JDA5GmLaNnrvImljoWMiIiJxoR63iEjMKHCLiMSMAreISMwocIuIxIwCt4hIzChwi4jEjAK3iEjMKHCLiMTM/wNDs59+GuzgbgAAAABJRU5ErkJggg==\n"},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### **Exercise 3**\n","___"],"metadata":{"id":"GVgQoivZCi3x"}},{"cell_type":"code","source":["import numpy as np\n","import pandas as pd\n","import ipywidgets as widgets\n","from IPython.display import display,Latex\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.model_selection import train_test_split\n","from ipywidgets import interact, interactive, fixed, interact_manual\n","\n","# Load the data\n","df = pd.read_csv(\"https://bit.ly/3imidqa\", delimiter=\",\")\n","# Extract input variables (all rows, all columns but last column)\n","X = df.values[:, :-1]\n","# Extract output column (all rows, last column)\n","Y = df.values[:, -1]\n","model = LogisticRegression(solver='liblinear')\n","X_train, X_test, Y_train, Y_test = train_test_split(X, Y,\\\n"," test_size=.33)\n","model.fit(X_train, Y_train)\n","prediction = model.predict(X_test)\n","\n","def colrs(r,g,b):\n"," x = model.predict(np.array([[int(r), int(g), int(b)]]))\n"," if model.predict(np.array([[int(r), int(g), int(b)]]))[0] == 0.0:\n"," return display(\"Predicted Font Color: LIGHT\")\n"," else:\n"," return display(\"Predicted Font Color: DARK\")\n","\n","def slider_maker(description):\n"," slider = widgets.IntSlider(\n"," value=0,\n"," min=0,\n"," max=255,\n"," step=1,\n"," description=description,\n"," disabled=False,\n"," continuous_update=False,\n"," orientation='horizontal',\n"," readout=True,\n"," readout_format='d'\n"," )\n"," return slider\n","w = interactive(colrs,r=slider_maker('Red'),g=slider_maker('Green'),b=slider_maker('Blue'))\n","display(\"Choose RGB combinations from the sliders below: \")\n","display(w)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":150,"referenced_widgets":["f1de93fd8e2c43c299c4df9200ccada1","3f705e7820d64407ad62ad1c2418dc3e","9b7bf8e85e7742c596bcdefc5c1802a2","497cf8c9cbcb4d8dade0e991b3f7ae99","f699b2ce7068468bbd310dd3298c0361","2dc5ed70af2046348efb4f71ff2db3e3","51960180efe548b591b39cf217127006","609f4c52d30149f084330d18bc235551","a172f1f1daf2431d942f6e3ffaff4fac","22731951a628416182ac74b65405a498","86efe8a05549487da8fc1ce4d32417ea","36068737de804c4abc83edd845414f60","187640de1883495581140fa3c604e8fb"]},"id":"-oj8LhmXAlQo","executionInfo":{"status":"ok","timestamp":1659795697653,"user_tz":-360,"elapsed":1360,"user":{"displayName":"Ziaul Karim","userId":"08392030995732291798"}},"outputId":"fb905cd0-4258-4126-a29b-270d8681b674"},"execution_count":120,"outputs":[{"output_type":"display_data","data":{"text/plain":["'Choose RGB combinations from the sliders below: '"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["interactive(children=(IntSlider(value=0, continuous_update=False, description='Red', max=255), IntSlider(value…"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f1de93fd8e2c43c299c4df9200ccada1"}},"metadata":{}}]},{"cell_type":"markdown","source":["#### **Exercise 4**\n","___\n","Yes, the logistic regression is very effective at predicting light or dark\n","fonts for a given background color. Not only is the accuracy extremely\n","high, but the confusion matrix has high numbers in the top-left to\n","bottom-right diagonal with lower numbers in the other cells."],"metadata":{"id":"qBuG_Bg-DHov"}}]} 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Math For Data Science. 2 | 3 | Remarks here are personal and this is just for practice purposes only. Equations may seem erratic at places, as LATEX syntaxes are used to separate the lines. Works better on [colab](https://colab.research.google.com/) 4 | 5 | Lessons here are from the book titled: 6 | 7 |

Essential Math For Data Science.

8 | 9 | ___ 10 |

11 | Written by Thomas Nield 12 |

13 |

14 | © Published by O'REILLY Media® 15 |

16 |

17 | 18 |

19 |
20 | 21 | ### Important notes: 22 | ___ 23 | 24 | 1. **Chapter Length Consideration:** Kindly note that the chapters within this book are deliberately extensive, allowing you ample time to absorb the content at your own pace. 25 | 26 | 2. **Utilization of Python's [Sympy](https://docs.sympy.org/latest/index.html) Library:** It is worth highlighting that this book heavily relies on the Sympy library within the Python programming language. 27 | 28 | 3. **Emphasis on Comprehensive Understanding:** While the comprehensive nature of this book may lead to a temptation to skim through certain sections, particularly those involving intricate algorithms and lengthy lines of code, I strongly encourage you not to succumb to this temptation. Engaging directly with these aspects not only reinforces your cognitive assimilation of the material but also facilitates a deeper understanding of the subject matter. 29 | 30 | 4. **Value of In-Depth Exploration:** Even seemingly straightforward algorithms such as Linear Regression demand a meticulous approach. It's essential to invest time in critically evaluating results and formulating your own hypotheses. 31 | 32 | 5. **Importance of Practical Implementation:** While there's no shortcut to mastering the content, consider the option of copying and executing the provided codes within the chapters. This approach can enhance your familiarity with coding practices. However, I advise against adopting the same approach for the exercises, as they hold significant learning value when approached through manual coding. 33 | 34 | Your commitment to engaging with the material in a comprehensive manner will undoubtedly contribute to a more profound grasp of the subject matter. Thank you for your dedication to this learning journey. 35 | 36 | *⚠ This is a companion repository for the book.* 37 | 38 | 39 | --------------------------------------------------------------------------------