commit ae07ca496f8c7dc4e5349fcf5f9a6307ec61660e
parent ad1fa0644b92e7d505f8d5d559a4ec9ae96c1ef1
Author: Andrew <andrewlaack1@gmail.com>
Date: Wed, 5 Jun 2024 20:15:07 -0500
Wrote code to do softmax regression, logistic regression, stochastic gd, and gd for polynomial regression.
Diffstat:
4 files changed, 2120 insertions(+), 0 deletions(-)
diff --git a/gradientDescent/GradientDescentPolynomialRegression.ipynb b/gradientDescent/GradientDescentPolynomialRegression.ipynb
@@ -0,0 +1,352 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "np.random.seed(42)\n",
+ "\n",
+ "m = 100\n",
+ "X = 6 * np.random.rand(m,1) - 3\n",
+ "y = .5 * X ** 2 + X + 2 + np.random.randn(m,1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxuUlEQVR4nO3df3RV5Z3v8c9JKglicgpUOEGjZtKfaSqIFo1yZxULFadDdTrjGqmOSGfRlhtbKW0X0nUxi2VtSldX25nWojId4C5E9E5LkfZK28Eq1ztBLJhWmqvVNBYKiWioJ4gl2Jx9/6An5sf5sfc5+8ez936/1spaerKT/XCSnOdznh/fJ2FZliUAAACfVATdAAAAEC+EDwAA4CvCBwAA8BXhAwAA+IrwAQAAfEX4AAAAviJ8AAAAXxE+AACAr94WdAPGymQyOnr0qGpqapRIJIJuDgAAsMGyLJ04cUIzZsxQRUXhsQ3jwsfRo0dVX18fdDMAAEAJDh8+rPPPP7/gNcaFj5qaGklnGl9bWxtwawAAgB0DAwOqr68f7scLMS58ZKdaamtrCR8AAISMnSUTLDgFAAC+InwAAABfET4AAICvCB8AAMBXhA8AAOArwgcAAPAV4QMAAPiK8AEAAHzlOHzs2bNHixYt0owZM5RIJPSjH/1o1Octy9Kdd96puro6TZw4UfPnz9cLL7zgVnsBAECJhjKWOrr7taPziDq6+zWUsQJph+MKpydPntTMmTP1yU9+Uh//+MfHff7rX/+6/vVf/1WbN29WQ0OD1qxZo2uuuUZdXV2qrq52pdEAAMCZXQd7tXZnl3rTp4Yfq0tWq21RkxY21/naloRlWSXHnkQioe3bt+v666+XdGbUY8aMGfrCF76gL37xi5KkdDqt6dOna9OmTbrxxhuLfs+BgQElk0ml02nKqwMA4IJdB3u1fMsBje3ws4XQ1988u+wA4qT/dnXNR09Pj/r6+jR//vzhx5LJpC6//HJ1dHTk/JrBwUENDAyM+gAAAO4Yylhau7NrXPCQNPzY2p1dvk7BuBo++vr6JEnTp08f9fj06dOHPzdWe3u7ksnk8Ed9fb2bTQIAINb29RwfNdUyliWpN31K+3qO+9amwHe7rF69Wul0evjj8OHDQTcJAIDIOHYif/Ao5To3uBo+UqmUJOnll18e9fjLL788/LmxqqqqVFtbO+oDAAC4Y1qNvc0edq9zg6vho6GhQalUSrt37x5+bGBgQE899ZRaWlrcvBUAALBhTsMU1SWrhxeXjpXQmV0vcxqm+NYmx+Hj9ddfV2dnpzo7OyWdWWTa2dmpQ4cOKZFIaMWKFfrKV76iRx55RM8++6xuueUWzZgxY3hHDAAA8E9lRUJti5okaVwAyf5/26ImVVbkiyfuc7zV9vHHH9e8efPGPb5kyRJt2rRJlmWpra1N999/v1577TXNnTtX3/ve9/Tud7/b1vdnqy0AAO7zus6Hk/67rDofXiB8AADgjaGMpX09x3XsxClNqzkz1eLWiIeT/ttxhVMAABBOlRUJtTRODboZwW+1BQAA8UL4AAAAviJ8AAAAXxE+AACArwgfAADAV4QPAADgK8IHAADwFeEDAAD4ivABAAB8RfgAAAC+InwAAABfET4AAICvCB8AAMBXhA8AAOArwgcAAPAV4QMAAPiK8AEAAHz1tqAbAAAA3DGUsbSv57iOnTilaTXVmtMwRZUViaCbNQ7hAwCACNh1sFdrd3apN31q+LG6ZLXaFjVpYXNdgC0bj2kXAABCbtfBXi3fcmBU8JCkvvQpLd9yQLsO9gbUstwIHwAAhNhQxtLanV2ycnwu+9janV0ayuS6IhiEDwAAQmxfz/FxIx4jWZJ606e0r+e4f40qgvABAECIHTuRP3iUcp0fCB8AAITYtJpqV6/zA+EDAIAQm9MwRXXJauXbUJvQmV0vcxqm+NmsgggfAACEWGVFQm2LmiRpXADJ/n/boiaj6n0QPgAACLmFzXVaf/NspZKjp1ZSyWqtv3m2cXU+KDIGAEAELGyu04KmFBVOAQCAfyorEmppnBp0M4pi2gUAAPiK8AEAAHxF+AAAAL4ifAAAAF8RPgAAgK8IHwAAwFeEDwAA4CvCBwAA8BXhAwAA+IrwAQAAfEX4AAAAviJ8AAAAX3GwHAAAkoYyVihOhI0CwgcAIPZ2HezV2p1d6k2fGn6sLlmttkVNWthcF2DLoolpFwBArO062KvlWw6MCh6S1Jc+peVbDmjXwd6AWhZdhA8AQGwNZSyt3dklK8fnso+t3dmloUyuK1AqwgcAILb29RwfN+IxkiWpN31K+3qO+9eoGCB8AABi69iJ/MGjlOtgDwtOAQCxNa2m2tXrvBK1nTiEDwBAbM1pmKK6ZLX60qdyrvtISEolz3T2pSg1NIz8updePakH9x1S38Dg8OfDvhOH8AEAiK3KioTaFjVp+ZYDSkijAkg2IrQtaipplKHU7bu5vm6s7E6c9TfPDmUAYc0HACDWFjbXaf3Ns5VKjp5aSSWrS+7cS92+m+/rxgr7ThxGPgAAsbewuU4LmlKurKsotn03oTOhYUFTatT3L/R1uYzcidPSONVxO4NE+AAAQGemYNzoxJ1s3x15v2Jfl08Yd+Iw7QIAgItK3b5baogIeidOKQgfAAC4qNTtu6WEiMlnn1XyTpwgET4AAHBRdvtuvtUiCZ3Z9TI2NBT7ulz++Mab+nlXX6lNDYzr4WNoaEhr1qxRQ0ODJk6cqMbGRt11112yrPCtxgUAIJehjKWO7n7t6Dyiju7+UTtOstt3JY0LEoW27xb6unyyi1fDtuPF9QWn69at0/r167V582a9//3v1y9/+UstXbpUyWRSn/vc59y+HQAAvrJTvyO7fXfsdakidT7yfV0+Yd3xkrBcHpL427/9W02fPl3f//73hx/7+7//e02cOFFbtmwp+vUDAwNKJpNKp9Oqra11s2kAAJQlW4djbMeZHakYWxek3Aqnjx7s1f/s+H3R6//lxlm6btZ5Dv4l7nPSf7s+7XLllVdq9+7d+u1vfytJ+tWvfqUnn3xS1157bc7rBwcHNTAwMOoDAADTFKvfIY2fAslu371u1nlqaZxqu25I9uuutVngLGw7Xlyfdrnjjjs0MDCg9773vaqsrNTQ0JDuvvtu3XTTTTmvb29v19q1a91uBgAAriq1fkc5vD57Jiiuj3w8/PDDeuCBB7R161YdOHBAmzdv1je+8Q1t3rw55/WrV69WOp0e/jh8+LDbTQIAoGyl1u8oR6mLV03n+sjHl770Jd1xxx268cYbJUkf+MAH9Pvf/17t7e1asmTJuOurqqpUVVXldjMAAHBVqfU7cnGyFsTJ4tVS15j4zfXw8cYbb6iiYvSASmVlpTKZjNu3AgDAN25NgZRy2q2ds2dKPUU3CK5PuyxatEh33323fvKTn+ill17S9u3b9c1vflN/93d/5/atAADwjRtTIKWedpu9f77Fq+V83yC4vtX2xIkTWrNmjbZv365jx45pxowZWrx4se68805NmDCh6Nez1RYAYLJSRxiGMpbmrnss76LV7MjJk6uudjRV4tX3dcpJ/+16+CgX4QMAYLpS1lZ0dPdr8Ya9Rb/3g8uucLRbxqvv65ST/tv1NR8AAERddgrECa92ywSxC6dcHCwHAIAP3Nwt48f39RLhAwAAH5R62m1Q39dLhA8AAHzgVcGwMBYiI3wAAOCTbMGwVHL0FEgqWT3uUDoTvq9X2O0CAIDPvKpEGmSFU3a7AABgsFJ2ywT5fd3GtAsAAPAV4QMAAPiK8AEAAHxF+AAAAL4ifAAAAF8RPgAAgK8IHwAAwFeEDwAA4CvCBwAA8BXhAwAA+IrwAQAAfEX4AAAAviJ8AAAAXxE+AACArwgfAADAV4QPAADgK8IHAADwFeEDAAD4ivABAAB8RfgAAAC+InwAAABfET4AAICvCB8AAMBXbwu6AQAAoDxDGUv7eo7r2IlTmlZTrTkNU1RZkQi6WXkRPgAAkRC2Dtgtuw72au3OLvWmTw0/VpesVtuiJi1srguwZfkRPgAAoRfGDtgNuw72avmWA7LGPN6XPqXlWw5o/c2zjfz3s+YDABBq2Q54ZPCQ3uqAdx3s9bwNQxlLHd392tF5RB3d/RrKjI0D3txz7c6uccFD0vBja3d2+dIWpxj5AACEVrEOOKEzHfCCppRnUzBBjbrs6zk+LnCNZEnqTZ/Svp7jammc6lk7SsHIBwAgtJx0wF4IctTl2In8/+5SrvMT4QMAEFpBdsBBT3tMq6l29To/ET4AAKEVZAcc9KjLnIYpqktWK99kUkJnpn/mNEzx5P7lIHwAAEIryA446GmPyoqE2hY1SdK4f3/2/9sWNRm53ZjwAQAIrSA7YBOmPRY212n9zbOVSo6+RypZbew2W4ndLgCAkMt2wGN3nKQ83nGSHXXpS5/Kue4j8Zc2eD3tsbC5TguaUqEqsJawLMuoDcADAwNKJpNKp9Oqra0NujkAgJAIosJpdreLpFEBJHtXk0cf3Oak/yZ8AABQhrhWVx3LSf/NtAsAAGUI47RH0AgfAACUqbIiYVwVUZOx2wUAAPiK8AEAAHxF+AAAAL4ifAAAAF8RPgAAgK8IHwAAwFeEDwAA4CvCBwAA8BVFxgAA+IsgzoeJI8IHAADijBY/Me0CAIi97Om0I4OHJPWlT2n5lgPadbA3oJZFE+EDAGJoKGOpo7tfOzqPqKO7X0MZow4499VQxtLanV3K9QxkH1u7syvWz5HbPJl2OXLkiFatWqVHH31Ub7zxht75zndq48aNuuyyy7y4HQDAgbBPL7i9LmNfz/FxIx4jWZJ606e0r+c4h8e5xPXw8cc//lFXXXWV5s2bp0cffVTnnnuuXnjhBU2ePNntWwEAHMpOL4x9D5+dXlh/82yjA4gXwenYifzBo5TrUJzr4WPdunWqr6/Xxo0bhx9raGhw+zYAAIeKTS8kdGZ6YUFTysgdHl4Fp2k11a5eh+JcX/PxyCOP6LLLLtMNN9ygadOm6ZJLLtGGDRvyXj84OKiBgYFRHwAA9zmZXjCNl+sy5jRMUV2yWvniVkJnRlfmNExx/L2Rm+vh43e/+53Wr1+vd73rXfrpT3+q5cuX63Of+5w2b96c8/r29nYlk8nhj/r6erebBABQuKcXvAxOlRUJtS1qkqRxAST7/22LmowcDQor18NHJpPR7Nmz9dWvflWXXHKJPvWpT2nZsmW69957c16/evVqpdPp4Y/Dhw+73SQAgMI9veB1cFrYXKf1N89WKjn6355KVhu/DiaMXF/zUVdXp6amplGPve9979MPfvCDnNdXVVWpqqrK7WYAAMbITi/0pU/lnL5I6Exna+L0gh/BaWFznRY0pahw6gPXRz6uuuoqPf/886Me++1vf6sLL7zQ7VsBABwI8/SCX+syKisSammcqutmnaeWxqlGPhdR4Hr4+PznP6+9e/fqq1/9ql588UVt3bpV999/v1pbW92+FQDAobBOL4Q5OGG8hGVZrpds+/GPf6zVq1frhRdeUENDg1auXKlly5bZ+tqBgQElk0ml02nV1ta63TQAgMJ7gFrYC6RFmZP+25PwUQ7CBwCgkLAGp6hz0n9zqi0AwEj5QkZ2XQbCi/ABADAO0yvRxqm2AACjcLx99BE+AADG4Hj7eCB8AACMYbeM+t7f9fvXKLiO8AEAMIbd8uitDzD9EmaEDwDAOEMZSx3d/drReUQd3f2+TXPYLY/+2p/eZP1HiLHbBQAwSpA7TYqdPzPW2p1dWtCUGlXngzog5iN8AACGZXeajO34sztNvC7Bni2jvnzLgaLXZtd/7Os5Plz3gy264cC0CwBAkjk7TbLnz7x94lm2rs+uE2GLbngQPgAAkuzvNNnXc9zztixsrtM9n5ht69ppNdXGBCfYQ/gAAEiyv9PE7nXluqJxquqS1eNOsc1K6MyUypyGKUYFJxRH+AAASLK/08TudeXKrv+QNC6AZP+/bVGTKisSxgUnFEb4AABIemuniZ2RBr9k13+kkqMDTypZPWrxq2nBCYWx2wUAIGn0TpOENGr9xNiRBj8tbK7TgqZUwe2zxbboJnQmsPgZnJAfIx8AgGF2Rxr8VlmRUEvjVF036zy1NE4dF4CcTNEgeAnLsoxa+jswMKBkMql0Oq3a2tqgmwMAsRTWQl3U+QiOk/6b8AEAiJSwBqewc9J/s+YDABAp2SkamIs1HwAAwFeEDwAA4CvCBwAA8BXhAwAA+IoFp4ZhlTYAIOoIHwZhfzoAIA6YdjHEroO9Wr7lwLhTGfvSp7R8ywHtOtgbUMsAAHAX4cMAQxlLa3d25TyPIPvY2p1dGsoYVQ8OAICSED4MsK/n+LgRj5EsSb3pU9rXc9y/RgEA4BHChwGOncgfPEq5DgAAkxE+DDCtprr4RQ6uAwDAZOx2McCchimqS1arL30q57qPhM4cZz2nYYrfTQMAz1BaIL4IHwaorEiobVGTlm85oIQ0KoBk/wzbFjXxRwkYhI6zPJQWiLeEZVlGbaFwciRv1PDHCIQDf6vlyZYWGNv5ZKPb+ptn8zyGkJP+m/BhGN5NAWaj4yzPUMbS3HWP5d3hl51mfnLV1bz2hYyT/ptpF8NUViTU0jg16GYAyKFYTZ6EztTkWdCUCnXH6eWbICelBXgtjC7CBwDYFIeO0+spJUoLQGKrLQDYFvWO049jHigtAInwAQC2Rbnj9OuYh2xpgXyTOAmdGWmhtEC0ET4AwKYod5xuHfMwlLHU0d2vHZ1H1NHdPy6sZEsLSBr3PFJaID5Y8wEANkW5Jo8bU0p214ssbK7T+ptnj7s2xXbl2CB8AIADUe04y51SyrcFObteZOwW5IXNdVrQlKK0QEwRPgDAoSh2nMWOeZDyTynZ3YJ89Xuna//v/zjqOQvrriCUh/ABACWIWk2eQlNKWX96c0g/7+obN7pjd73IFe3/qeMn3xx+nKqw8cWCUwCApLemlJJnn5Xz8+k33sy55dbuepGRwUNydwsvwoXw4ZJiK7wBIAwWNKVU/bbcXUO+Lbelbi12cwsvwoVpFxdwyBSAqNjXc1x9A4N5P5+riqud9SJOvh+ij5GPMvlRERAA/FLKlttCtTvcvi+igfBRBr8qAgKAG+xMD5e65Ta7XiSVHP341EkTSvp+iDamXQoodrJjHA6ZAhANdqeHi02hZI+8z7XlNtcW5P4Tg/rcQ88o33uwQt8P0UX4yMPOH2rUD5kCEA1OCoCVW8V15BbkXQd79dltzxRdBxLWqrAoHdMuGj8U+b9/bW8dR5QPmQIQDaVMD+ebQkklq8dVKi3lvlkVCemeT1zCwvwYiv3IR64RjopE7gI7Iyv1LWhKlTU8CQB+KHV6uNwqrsXuK0kZS5o8qcrW90O0xHrkI99OlULrQ0f+oXI6IwDTlTM9nJ1CuW7WeWppnOrotYxpaRQS2/BhZ0iwkOwfjBvDk2FCMTUgXIKaHmZaGoXEdtrFzpBgISP/YKJ4yFQuFFMDwieo6WGmpVFIbEc+Sh3qSyj3yY7lDE+GAcXUgHAKano4e998Y6OWR/dFOMQ2fJQy1BfXdRwUUwPCLW7TwzCf5+Hja1/7mhKJhFasWOH1rRzJDgkWihBj80Vc/1CdrJYHYKaFzXV6ctXVenDZFfqXG2fpwWVX6MlVV3v2epZ905JPducgb1riydM1H08//bTuu+8+XXzxxV7expZc1UqLFdL57uJLNHlSVaTXcdjBqnUgGkYWAPMaFaBRiGfh4/XXX9dNN92kDRs26Ctf+YpXt7Gl0ELJ9TfPHve5FIsoR2HVOgCneNOCQjwLH62trfroRz+q+fPnFwwfg4ODGhx86/jmgYEBV9thp6zwk6uujvxOlXKwah2AU7xpQSGerPnYtm2bDhw4oPb29qLXtre3K5lMDn/U19e71g67CyUlRXqnSrkopgbAqWLr6vLtHEQ8uB4+Dh8+rNtvv10PPPCAqquLJ9rVq1crnU4Pfxw+fNi1trBQ0j2slgfgBG9aUIjr0y779+/XsWPHNHv27OHHhoaGtGfPHn33u9/V4OCgKisrhz9XVVWlqipvavsz5+iuuBRTA+CO7JsW1tVhLNfDx4c//GE9++yzox5bunSp3vve92rVqlWjgofXmHN0n5+r5QGEH29akIvr4aOmpkbNzc2jHps0aZKmTp067nGvsVASAADzRPpsl+ycY6FaHsw5AoB3OBMKuSQsyzKqvNzAwICSyaTS6bRqa2td+Z788gOA//KVOsi+3WOxerQ46b8jPfKRxZwjAPirWKmDbHn1BU0pXotjKBbhQ2KhJAD4ifLqKCQ24QNANOU6t4l30sGj1AEKIXwACC3Wc5mLUgcoxJPy6gDgtexixrFD+9lzm3Yd7A2oZf4byljq6O7Xjs4j6ujuL3hMvZNry0F5dRTCyAeA0DF9MaOfU0FORn/8HCmi1AEKicVWW7vcesFgDhrwVkd3vxZv2Fv0ugeXXeH7YkY/O3gnW1mD2vbK1Fh8sNW2BG79gfCHBnjP1MWM+Tr47FSQmx28k9Ef/eW/gxgpotQBcmHNh9ybO2YOGvCHiYsZi4UB6UwH79YaCydbWYM+4Ttb6uC6WeeppXEqwQOEj1JeMHIt2PL7hQeIMxMXM/rdwTsZ/TF1pAjxFftpF6eFcPJNq9z4wXoK6gA+MXExo98dvBejP2x7hV9iP/Lh5AWj0LTKt/7zBVfvB6Cwhc11Wn/zbKWSozvMVLI6kDND/J4KcjL6Y+JIEeIt9iMfdl8I3nFOlb74v35VcFrFzfsBKM6kxYzZDr4vfSrna0JCZ4KRWx2809Ef00aKEG+xH/mw+45AlgpOqxTDOwvAG6YsZsyGAUnjXk+86uCdjP6YNlKEeKPOh97apSLlfkew/ubZGvxzRrdv67T1/fK9syj1D5y6IUB4BLHd3slrBK8n8IqT/pvw8RfFXjDsFjX6/Px3a9vTh1x74aFuCGCufB05HTziiPBRokIvGEMZS3PXPVZ0PvfJVVdLkisvPEFVJARQHG8MgNEIHx6xMz3jZvXCuesey7vOJCFpyqQJ+h8ffZ9SyYm8swJ8xBsDYDwn/XfsF5w64eeCLTv1R/pPntbnH/6VFm/Yq7nrHqOCKuADCgoC5Yv9Vlun/Nra57QeiBdnRwAYz2lhQgDjET5KkN3al48bi82c1gMx4RjxuGAxYbxRqhwoH+HDZW4tQitWsCgX3nF5j0WGMPFQOyBsWPPhIjdPtS1UsKgY3nF5g1OLIZl5qB0QNoQPlxRbhGZJ+vL2Z7X9mbdOwi0m3wLXYnjH5T4WGSIriEqmQNQw7eKSYovQJOn4yTf1+Yc6Jdkfqh+5wLVv4JTu+vFvdPzkmzmvdfvsCLyFRYYYKfvGYOwUXIopOMAWwodLnE519DrYnTJygevEsyoK1hrhHZd7Ri4sfeHl1219DVNewfF7IbBJh9oBYUP4cEkpUx2WnO9OCfodV1x2euRaWGoHU17BCGohcLGdbwByI3y4pJTdKVJpQ/VBveOKy06PfNUrC2HKKzj5fl7UvgHMxYJTl/i9O8XvY8TjstOj0MLSfJjyCg4LgYFwIny4KKq7U+L0Am9n4fBYXpTXhz1OFgIDMAfTLi7LTols+r89uusn/6/o9VMmnWX8UH2cdnrYHYW6bV6j3jW9JtLrXsKAaqNAODHy4YHKioRuvapBdTZGQL5yXbPxHVecXuDtjkJd9c5zfZvyQn5UGwXCifDhkewakELd0qf/ukF/c/EM39pUqji9wFO9Mlz4eQHhRPjwUHYNyNgRkKmTJuh7n5it1X/TFFDLnInTCzzVK8OFnxcQTgnLsoxaJTgwMKBkMql0Oq3a2tqgm+OKKNTGyO52kXIXN4vagsu4bCuOCn5eQPCc9N+ED9gWtxf4KITGOOHnBQSL8AHP8AIPAMjFSf/NVls4QjlpxAlhG/AG4QMAcjBhmpHwg6gifADAGCacF2NC+AG8wlZbABjBhOME4nKWEuKL8BFhQxlLHd392tF5RB3d/ZE4ewXwWtDnxZgQfgCvMe0SUXaGbJlPBsYL+jiBOJ2lhPgifESQnflqSaGeTyY4wStBHycQdPgB/ED4iJhiQ7YJSat/+Kz++Mab4z7v52K6crAQD17KHifQlz6V8+8oISlV4nECdkJz0OEH8APhI2LsDNnmCh7ZzyV0ZkRkQVPK9kiCn6MQJuxCQLRlz4tZvuWAEsp9nEAp58XYDc1ehh/AFCw4jZhyh2KdLqbbdbBXc9c9psUb9ur2bZ1avGGv5q57zJPV+KYsxGMhb/RlD4VMjTkUMpWsLingOtm9wmF5iANGPkIs14iDW0OxdkKM3VEIt0ZGTFiIx5TPaFFee7OwuU4LmlJl//vsTIWOHW3Mhp+xv2upGP+uIVoIHyGVrxNc89GmgkO2dhULMXZfUDMZS3f95P+50lkHvRCPKZ/R4hDE3DhOoNTQ7Fb4AUzEtEsIFRrCbd16QB+beeaFP9eQbULS288+a9znRl5TZ2M+2e4L6n/f+oxrhZKCXIhnypSPKSiCZV85oTkbfq6bdZ5aGqcSPBAZhI+QsdMJPvKrXt3ziUvyzld/7eMfkFTefHI5owuldtbZhXjlBqdSBF14yiQEMWfYvQKMx7RLyNjtBCdPqtKTq67OO2RbbD652Fx+uS+UpazP8GoXgh1BT/mYxIS1N2HC7hVgPMJHyDjpBAvNVxeaT7Yzl1/sBdXtf8/IdgexEI93r28hiDkTZGgGTEX4cCjo1f1udoK5wondRZXFXlDtBpJSOusgFuLx7vUtBDHn2L0CjEb4cMCE1f1eV190siWw0Avqmo826a6fdHnWWbuxC8Hp/Xj3eoafQSzosO8mdq8AbyF82GTKNksvO8FS5vILvaBWVChSnTXvXs/wK4iZEPbd5ndoBkyVsCzLqCXpAwMDSiaTSqfTqq2tDbo5ks68+5q77rG8HXP2nd6Tq672rTP14oV5R+cR3b6ts+h1t7RcqGub62y9a4tiBxLmd+P52l7Kv8nLn22+sJ9tUdxqqgBh4KT/dj18tLe364c//KGee+45TZw4UVdeeaXWrVun97znPba+3sTw0dHdr8Ub9ha97sFlV/j6rsbtTtDuvzPLbkcT5s46SvKFhY/NrNMjv+otKUR48bM1MeyPbBu/y0BuTvpv16ddnnjiCbW2tuqDH/yg/vznP+vLX/6yPvKRj6irq0uTJk1y+3a+MHV1v9tDuE53sNidcmKoOXj5RhJ606d0356ecdcH+bM1dStvFEfxgKC4XmRs165duvXWW/X+979fM2fO1KZNm3To0CHt37/f7Vv5Ji6r+wsdaJULBaXCodBC4nyC/NmaGPap6Aq4y/MKp+l0WpI0ZUrule+Dg4MaGBgY9WGaICtr+i3faZ75xKmyZ1gVG0nIJ6ifrWlhn4qugPs8DR+ZTEYrVqzQVVddpebm5pzXtLe3K5lMDn/U19d72aSSRPWI63xHwy9srtOTq67Wg8uu0C0tF9r6XhSUMle5Pxu/f7amhX1K6wPu8zR8tLa26uDBg9q2bVvea1avXq10Oj38cfjwYS+bVLJ8IwLZ81LCNue762Cv5q57TIs37NXt2zq1eMNezV332PDwcXYu/1qb/66wTzlFWbk/G79/tqaFfROngYCw86zOx2233aYf//jH2rNnj84///y811VVVamqqsqrZrgqKkWCnNQsobKnu4LYLVFqKfwgf7YLm+v0qb9u0Ib/06OR+/ESCWnZf2vwNeybNg0ERIHr4cOyLH32s5/V9u3b9fjjj6uhocHtWwQq7Ds3nFYxDXtlT5O2Rga1W6LQzzCfoH+2uw726v49PePamrGk+/f06JILJkeiqjAQV65Pu7S2tmrLli3aunWrampq1NfXp76+Pv3pT39y+1YoQSnz12Gdcio2teR3W4LcLZHvZ1iXrNan/7pBdQb9bO3szvFzgadp00BAFLheZCyRyP0HuHHjRt16661Fv97EImNRYreK6b/cOEvXzTpv1GMmjSIUY1KFTJOKZrlZ4dQrphb1o84HUFigRcYMq9aOMcqZvw7LlJPTqSWvmVQ0K9/P0KSfrdsLPN0KVlFZ8wWYgIPlQqicF9M4zF+b1NlL7JZwys0Fnm6PVpgU0oAwI3yETLkvpmFfQGqHaZ293c70HedUqaO7P/bvqt0KyKacRA1gPM8rnMI9bi1aDOsCUrtKfeecr+hauewUzZp89ln6wsOdRiyODZobCzypSgqYzfUFp+ViwWluXixaNGmRoZuyz1Wxd84jnyuvFxNmg6M0frQp3x9g3I+PL+dnYuqiVSDKAl1wCmfsBgAv1jFEdf7aztTSmo82DT/vL736hr79n7/1dHg+O9o0tjNNJav1pzeH9Nobb477miAWx5qknAWepk29ARiN8BEgJ+/seDF1plBn/7GZdbrrJ11FD1tzu/PP1ZlmMpZu+v5TBdsQxPHxpig1IFOVFDAb4SMgThfDheHF1LRpnFyd/R9PDqp16zO2y4y73fmP7Ux3dB6x9XWESmfisKsLCDPCRwBKqUNh+oupqQWYRnb22bUgpSxy8qrzD0OoDKM47OoCwozdLgEopcS5ySWegy4dblex570Qrzp/046Pj5Ko7+oCwoyRjwCUun6j0DqGoEYYTKsmWkgpoxdejyjxDt1bVCUFzET4CEA5Q+2mvZiaVk20EKejF351/iaGyiiJ6q4uIMwIHwEod/2GSS+mYdqFU+x5H8vPzt+0UAkAXiJ8BCBKQ+1hWjBZ7Hm3JH1+/rt00Tsm+db5B7VDyLSdSaa3C4C7CB8BicpQu2m7cIp1XiY970HtEDJ1Z5Kp7QLgPsqrBywK7/QKlQ6X/CsP7qTzCvp5z1fnxevnLKj7FmNquwDY56T/JnzAFUG/aw1T5+XFOT0m3zes7Rop6LAKhAFnu8B3QS6YDNN2Xym4HUKm7kwytV1ZQQdrIIoIH3BNULtwTO+8xgpqh1CQO5MKjRyYvGPK6TEIAOwhfCD0TO68cglqh1BQ9y02cmDqjqmwjagBYUJ5dYSeqZ1XPkGVVA/ivnZK75taYr6UYxAA2EP4QOiZ2nnlE9Q5PX7ft9jIgXRm5CB7X7/aZVfYRtSAMCF8IPRMPnQvn6AOPfPzvk5GDkw8BC5sI2pAmLDmA5FgUvEwu4LaIeTXfZ2OHJhWYt60AnpAlBA+EBmmdV52BLVDyI/7ljJyYNK5RVE6BgEwDdMuiJRs53XdrPPU0jiVjiFAYVuLk4uJ00FAFDDyAcATURk5COOIGmA6yqsD8BQVQoF4oLw6AGMwcgBgLMIH8BccHuYdkxaSAgge4QMQUwN+CHO4C3PbARMRPhB7YTg8LOydX5jDXZjbDpiKBaeItaGMpbnrHstbiTNbSOrJVVcH1tmHvfPLF+6yz2aucGdK2Cql7UBcseAUsMlJCfAg1iyEYVSmkFJOhjUlbHGqLeAdiowh1kw+PMzuwWxDGaMGL0dxejKsnVNw/cKptoB3CB+INZMPD4tC5+ck3JkWtkwOpkDYET4QayaXAI9C5+ck3JkWtkwOpkDYET4Qa9kS4JLGBZCgS4BHofNzEu5MC1smB1Mg7AgfETeUsdTR3a8dnUfU0d1v9PqAoJh6eFgUOj8n4c60sGVyMAXCjq22EWbKroGwGLm98x2TqqSE9Orrg0Zs9ZRyH8xm+m6XLDu/i9ltz33pUznXfQS17Zm/I8AeJ/034SOigqhPYEpthnKZ1tmY1p5S2fn9MDVsReV3G/AS4SPmgiicFZUO0tSiUnHq/KLyuwTEDeEj5jq6+7V4w96i1z247ApXCmeZ2mE7FYZqp3ERp7AFRAUVTmPOz10DUaoCaXq10zjhFFwg2tjtEkF+7howrTZDOUzb6gkAUcXIRwRlt2gW2zXgxhbNKHXYpm31NAVTIADcRviIoGx9guVbDiih3LsG3KpPEKUO22loi0OnzOJPAF5g2iWi/CqcFYVCWFlOikrtOtiruese0+INe3X7tk4t3rBXc9c9VvDgs7AVfDPpkDcA0cJul4jz4925qbUZSlXs3X4pu3vCNoLAzh8ATrHVFr4LW+daTL7QVkqnHMatyH5v1wYQfmy1he8WNtdpQVMqMmsg8m31dLodN6xbkaO0kBiAeQgfcE0cajM47ZTDWjskSguJAZiHBaeAA0475bCOIERpITEA8xA+AAecdsphHUHgOHkAXiJ8IHbK2fLqtFMO8wiCX9u1AcQPu10QK27tynHyfcK+FTkOxdQAlI+ttkAObm95ddIpR20rMgCMRfgAxjChaBYjCACizEn/7dmaj3vuuUcXXXSRqqurdfnll2vfvn1e3QooyoTTd7Nbka+bdZ5aGqcSPADElifh46GHHtLKlSvV1tamAwcOaObMmbrmmmt07NgxL24HFBXWLa8AEEWehI9vfvObWrZsmZYuXaqmpibde++9Ovvss/Xv//7vXtwOKCqsW14BIIpcDx+nT5/W/v37NX/+/LduUlGh+fPnq6OjY9z1g4ODGhgYGPUBuC3MW14BIGpcDx+vvvqqhoaGNH369FGPT58+XX19feOub29vVzKZHP6or693u0kARbMAwCCBFxlbvXq10un08Mfhw4eDbhIiiqJZAGAG1w+We8c73qHKykq9/PLLox5/+eWXlUqlxl1fVVWlqqoqt5sB5BS103cBIIxcH/mYMGGCLr30Uu3evXv4sUwmo927d6ulpcXt2wGOseUVAILl+siHJK1cuVJLlizRZZddpjlz5ujb3/62Tp48qaVLl3pxOwAAECKehI9//Md/1CuvvKI777xTfX19mjVrlnbt2jVuESoAAIgfyqsDAICyGVFeHQAAIBfCBwAA8BXhAwAA+IrwAQAAfEX4AAAAviJ8AAAAX3lS56Mc2Z2/nG4LAEB4ZPttOxU8jAsfJ06ckCROtwUAIIROnDihZDJZ8BrjioxlMhkdPXpUNTU1SiTKP3NjYGBA9fX1Onz4MEXLbOI5c47nzBmeL+d4zpzh+XKu3OfMsiydOHFCM2bMUEVF4VUdxo18VFRU6Pzzz3f9+9bW1vIL6BDPmXM8Z87wfDnHc+YMz5dz5TxnxUY8slhwCgAAfEX4AAAAvop8+KiqqlJbW5uqqqqCbkpo8Jw5x3PmDM+XczxnzvB8Oefnc2bcglMAABBtkR/5AAAAZiF8AAAAXxE+AACArwgfAADAV7ELHx/72Md0wQUXqLq6WnV1dfqnf/onHT16NOhmGemll17SP//zP6uhoUETJ05UY2Oj2tradPr06aCbZrS7775bV155pc4++2y9/e1vD7o5Rrrnnnt00UUXqbq6Wpdffrn27dsXdJOMtWfPHi1atEgzZsxQIpHQj370o6CbZLT29nZ98IMfVE1NjaZNm6brr79ezz//fNDNMtr69et18cUXDxcXa2lp0aOPPurpPWMXPubNm6eHH35Yzz//vH7wgx+ou7tb//AP/xB0s4z03HPPKZPJ6L777tNvfvMbfetb39K9996rL3/5y0E3zWinT5/WDTfcoOXLlwfdFCM99NBDWrlypdra2nTgwAHNnDlT11xzjY4dOxZ004x08uRJzZw5U/fcc0/QTQmFJ554Qq2trdq7d69+/vOf680339RHPvIRnTx5MuimGev888/X1772Ne3fv1+//OUvdfXVV+u6667Tb37zG+9uasXcjh07rEQiYZ0+fTropoTC17/+dauhoSHoZoTCxo0brWQyGXQzjDNnzhyrtbV1+P+HhoasGTNmWO3t7QG2KhwkWdu3bw+6GaFy7NgxS5L1xBNPBN2UUJk8ebL1b//2b559/9iNfIx0/PhxPfDAA7ryyit11llnBd2cUEin05oyZUrQzUBInT59Wvv379f8+fOHH6uoqND8+fPV0dERYMsQVel0WpJ43bJpaGhI27Zt08mTJ9XS0uLZfWIZPlatWqVJkyZp6tSpOnTokHbs2BF0k0LhxRdf1He+8x19+tOfDropCKlXX31VQ0NDmj59+qjHp0+frr6+voBahajKZDJasWKFrrrqKjU3NwfdHKM9++yzOuecc1RVVaXPfOYz2r59u5qamjy7XyTCxx133KFEIlHw47nnnhu+/ktf+pKeeeYZ/exnP1NlZaVuueUWWTEq9Or0+ZKkI0eOaOHChbrhhhu0bNmygFoenFKeMwDBam1t1cGDB7Vt27agm2K897znPers7NRTTz2l5cuXa8mSJerq6vLsfpEor/7KK6+ov7+/4DV/9Vd/pQkTJox7/A9/+IPq6+v1X//1X54OMZnE6fN19OhRfehDH9IVV1yhTZs2qaIiEpnVkVJ+xzZt2qQVK1botdde87h14XH69GmdffbZ+o//+A9df/31w48vWbJEr732GqOQRSQSCW3fvn3Uc4fcbrvtNu3YsUN79uxRQ0ND0M0Jnfnz56uxsVH33XefJ9//bZ58V5+de+65Ovfcc0v62kwmI0kaHBx0s0lGc/J8HTlyRPPmzdOll16qjRs3xjJ4SOX9juEtEyZM0KWXXqrdu3cPd6CZTEa7d+/WbbfdFmzjEAmWZemzn/2stm/frscff5zgUaJMJuNpvxiJ8GHXU089paefflpz587V5MmT1d3drTVr1qixsTE2ox5OHDlyRB/60Id04YUX6hvf+IZeeeWV4c+lUqkAW2a2Q4cO6fjx4zp06JCGhobU2dkpSXrnO9+pc845J9jGGWDlypVasmSJLrvsMs2ZM0ff/va3dfLkSS1dujTophnp9ddf14svvjj8/z09Pers7NSUKVN0wQUXBNgyM7W2tmrr1q3asWOHampqhtcSJZNJTZw4MeDWmWn16tW69tprdcEFF+jEiRPaunWrHn/8cf30pz/17qae7aMx0K9//Wtr3rx51pQpU6yqqirroosusj7zmc9Yf/jDH4JumpE2btxoScr5gfyWLFmS8zn7xS9+EXTTjPGd73zHuuCCC6wJEyZYc+bMsfbu3Rt0k4z1i1/8Iufv05IlS4JumpHyvWZt3Lgx6KYZ65Of/KR14YUXWhMmTLDOPfdc68Mf/rD1s5/9zNN7RmLNBwAACI94TuADAIDAED4AAICvCB8AAMBXhA8AAOArwgcAAPAV4QMAAPiK8AEAAHxF+AAAAL4ifAAAAF8RPgAAgK8IHwAAwFeEDwAA4Kv/D0Sm153yhN+oAAAAAElFTkSuQmCC",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "plt.scatter(X, y)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.75275929])"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create new array X_poly that contains two features namely\n",
+ "# the values and their squares.\n",
+ "\n",
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "\n",
+ "poly_features = PolynomialFeatures(degree=2, include_bias=False)\n",
+ "X_poly = poly_features.fit_transform(X)\n",
+ "X[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.75275929, 0.56664654])"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_poly[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([1.78134581]), array([[0.93366893, 0.56456263]]))"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Since we have the values and their squares we can now use linear\n",
+ "# regression because there are two parameters now to find the regression\n",
+ "# line. \n",
+ "\n",
+ "# When we fit this we get both the first and second coefficients for the polynomial\n",
+ " \n",
+ "\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "\n",
+ "lin_reg = LinearRegression()\n",
+ "lin_reg.fit(X_poly, y)\n",
+ "lin_reg.intercept_, lin_reg.coef_"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "100\n",
+ "100\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "<matplotlib.collections.PathCollection at 0x7febdc961990>"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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qlGjRpozZ07OYz6fT3PmzFGTJk0C/XIAAMBlgrLIWO/evZWSkqKrrrpKjRs31vDhw3Xw4EF16NAhGC8HAABcJCjh495779Uff/yhAQMGaPv27briiiv05ZdfnjIIFQAARB6PZVlWwaeFTlZWluLj45WZmam4uDi7ywEAAIXgz/Xb9tkuAAAgshA+AABASBE+AABASBE+AABASBE+AABASBE+AABASAVlnY/iOD7zl91tAQBwj+PX7cKs4OG48LF//35JUo0aNWyuBAAA+Gv//v2Kj48/4zmOW2TM5/Np27ZtKl++vDweT0CfOysrSzVq1NCWLVtYwKwAvFeFx3tVeLxXhcd75R/er8IL1ntlWZb279+vatWqKSrqzKM6HNfyERUVperVqwf1NeLi4vjLWUi8V4XHe1V4vFeFx3vlH96vwgvGe1VQi8dxDDgFAAAhRfgAAAAhFVHhIzY2VgMHDlRsbKzdpTge71Xh8V4VHu9V4fFe+Yf3q/Cc8F45bsApAAAIbxHV8gEAAOxH+AAAACFF+AAAACFF+AAAACEVseHj9ttvV82aNVWqVCmdc845at++vbZt22Z3WY6zadMmdezYUbVr11bp0qVVp04dDRw4UIcPH7a7NEcaPHiwmjZtqjJlyqhChQp2l+M4GRkZqlWrlkqVKqWrr75aS5cutbskR5o/f75at26tatWqyePxaNq0aXaX5Ejp6elKTExU+fLlVaVKFbVp00Zr1qyxuyxHeuONN3TZZZflLCzWpEkTffHFF7bVE7HhIykpSR988IHWrFmjjz/+WBs2bNDdd99td1mO8+uvv8rn82n06NH65Zdf9O9//1ujRo3SU089ZXdpjnT48GG1bdtWXbt2tbsUx5kyZYp69+6tgQMH6ocfftDll1+uli1baufOnXaX5jgHDx7U5ZdfroyMDLtLcbR58+YpNTVVixcv1qxZs3TkyBHddNNNOnjwoN2lOU716tU1ZMgQLV++XN9//72uv/563XHHHfrll1/sKciCZVmWNX36dMvj8ViHDx+2uxTHe+mll6zatWvbXYajjRs3zoqPj7e7DEdp3LixlZqamnPf6/Va1apVs9LT022syvkkWVOnTrW7DFfYuXOnJcmaN2+e3aW4QsWKFa0xY8bY8toR2/Jxoj179mjChAlq2rSpSpQoYXc5jpeZmamEhAS7y4CLHD58WMuXL1dycnLOY1FRUUpOTtaiRYtsrAzhJDMzU5L4fCqA1+vV5MmTdfDgQTVp0sSWGiI6fDz55JMqW7asKlWqpM2bN2v69Ol2l+R469ev16uvvqouXbrYXQpcZNeuXfJ6vapatWqex6tWrart27fbVBXCic/nU69evdSsWTM1aNDA7nIc6eeff1a5cuUUGxurRx99VFOnTtUll1xiSy1hFT769u0rj8dzxtuvv/6ac/4TTzyhH3/8UV999ZWio6P14IMPyoqQBV/9fa8kaevWrbr55pvVtm1bde7c2abKQ68o7xWA0EpNTdWqVas0efJku0txrHr16mnFihVasmSJunbtqpSUFK1evdqWWsJqefU//vhDu3fvPuM5559/vkqWLHnK47///rtq1KihhQsX2tYMFUr+vlfbtm1TixYtdM011+idd95RVFRY5dYzKsrfq3feeUe9evXSvn37glydOxw+fFhlypTRRx99pDZt2uQ8npKSon379tHqeAYej0dTp07N874hr+7du2v69OmaP3++ateubXc5rpGcnKw6depo9OjRIX/tmJC/YhBVrlxZlStXLtKf9fl8kqTs7OxAluRY/rxXW7duVVJSkho1aqRx48ZFVPCQivf3CkbJkiXVqFEjzZkzJ+ci6vP5NGfOHHXv3t3e4uBalmWpR48emjp1qr755huCh598Pp9t17ywCh+FtWTJEi1btkzNmzdXxYoVtWHDBvXv31916tSJiFYPf2zdulUtWrTQeeedp5dffll//PFHzs/OPvtsGytzps2bN2vPnj3avHmzvF6vVqxYIUm64IILVK5cOXuLs1nv3r2VkpKiq666So0bN9bw4cN18OBBdejQwe7SHOfAgQNav359zv2NGzdqxYoVSkhIUM2aNW2szFlSU1M1ceJETZ8+XeXLl88ZPxQfH6/SpUvbXJ2zpKWlqVWrVqpZs6b279+viRMn6ptvvtHMmTPtKciWOTY2++mnn6ykpCQrISHBio2NtWrVqmU9+uij1u+//253aY4zbtw4S1K+N5wqJSUl3/dq7ty5dpfmCK+++qpVs2ZNq2TJklbjxo2txYsX212SI82dOzffv0cpKSl2l+Yop/tsGjdunN2lOc7DDz9snXfeeVbJkiWtypUrWzfccIP11Vdf2VZPWI35AAAAzhdZnfcAAMB2hA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBS/w/xe+j5c9CLQwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# This proves it, i'm a dumbass.\n",
+ "# I should have used the model to show the models fit because doing this\n",
+ "# I had to create an extra function to graph the polynomial when\n",
+ "# using lin_reg.predict() would have done it for me...\n",
+ "\n",
+ "# Set constants\n",
+ "LOWER = -3\n",
+ "UPPER = 3\n",
+ "POINTS = 100\n",
+ "\n",
+ "# Get evenly spaced values in an array between points with specified\n",
+ "# number of points.\n",
+ "x = np.linspace(LOWER, UPPER, POINTS)\n",
+ "\n",
+ "# Equation set\n",
+ "equa = lin_reg.intercept_[0], lin_reg.coef_[0][0], lin_reg.coef_[0][1]\n",
+ "\n",
+ "# Example equation:\n",
+ "# [3 , 4 , 5]\n",
+ "# Represents:\n",
+ "# y = 3 + 4x + 5x^2\n",
+ "def solveSecond(equation, xPos):\n",
+ " return equation[0] + xPos*equation[1] + xPos*xPos * equation[2]\n",
+ "\n",
+ "yVals = []\n",
+ "for i in x:\n",
+ " yVals.append(solveSecond(equa,i))\n",
+ "\n",
+ "print(len(x))\n",
+ "print(len(yVals))\n",
+ "\n",
+ "plt.plot(x, yVals, c='red')\n",
+ "plt.scatter(X, y, s=5)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<matplotlib.collections.PathCollection at 0x7febda698050>"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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qlGjRpozZ07OYz6fT3PmzFGTJk0C/XIAAMBlgrLIWO/evZWSkqKrrrpKjRs31vDhw3Xw4EF16NAhGC8HAABcJCjh495779Uff/yhAQMGaPv27briiiv05ZdfnjIIFQAARB6PZVlWwaeFTlZWluLj45WZmam4uDi7ywEAAIXgz/Xb9tkuAAAgshA+AABASBE+AABASBE+AABASBE+AABASBE+AABASAVlnY/iOD7zl91tAQBwj+PX7cKs4OG48LF//35JUo0aNWyuBAAA+Gv//v2Kj48/4zmOW2TM5/Np27ZtKl++vDweT0CfOysrSzVq1NCWLVtYwKwAvFeFx3tVeLxXhcd75R/er8IL1ntlWZb279+vatWqKSrqzKM6HNfyERUVperVqwf1NeLi4vjLWUi8V4XHe1V4vFeFx3vlH96vwgvGe1VQi8dxDDgFAAAhRfgAAAAhFVHhIzY2VgMHDlRsbKzdpTge71Xh8V4VHu9V4fFe+Yf3q/Cc8F45bsApAAAIbxHV8gEAAOxH+AAAACFF+AAAACFF+AAAACEVseHj9ttvV82aNVWqVCmdc845at++vbZt22Z3WY6zadMmdezYUbVr11bp0qVVp04dDRw4UIcPH7a7NEcaPHiwmjZtqjJlyqhChQp2l+M4GRkZqlWrlkqVKqWrr75aS5cutbskR5o/f75at26tatWqyePxaNq0aXaX5Ejp6elKTExU+fLlVaVKFbVp00Zr1qyxuyxHeuONN3TZZZflLCzWpEkTffHFF7bVE7HhIykpSR988IHWrFmjjz/+WBs2bNDdd99td1mO8+uvv8rn82n06NH65Zdf9O9//1ujRo3SU089ZXdpjnT48GG1bdtWXbt2tbsUx5kyZYp69+6tgQMH6ocfftDll1+uli1baufOnXaX5jgHDx7U5ZdfroyMDLtLcbR58+YpNTVVixcv1qxZs3TkyBHddNNNOnjwoN2lOU716tU1ZMgQLV++XN9//72uv/563XHHHfrll1/sKciCZVmWNX36dMvj8ViHDx+2uxTHe+mll6zatWvbXYajjRs3zoqPj7e7DEdp3LixlZqamnPf6/Va1apVs9LT022syvkkWVOnTrW7DFfYuXOnJcmaN2+e3aW4QsWKFa0xY8bY8toR2/Jxoj179mjChAlq2rSpSpQoYXc5jpeZmamEhAS7y4CLHD58WMuXL1dycnLOY1FRUUpOTtaiRYtsrAzhJDMzU5L4fCqA1+vV5MmTdfDgQTVp0sSWGiI6fDz55JMqW7asKlWqpM2bN2v69Ol2l+R469ev16uvvqouXbrYXQpcZNeuXfJ6vapatWqex6tWrart27fbVBXCic/nU69evdSsWTM1aNDA7nIc6eeff1a5cuUUGxurRx99VFOnTtUll1xiSy1hFT769u0rj8dzxtuvv/6ac/4TTzyhH3/8UV999ZWio6P14IMPyoqQBV/9fa8kaevWrbr55pvVtm1bde7c2abKQ68o7xWA0EpNTdWqVas0efJku0txrHr16mnFihVasmSJunbtqpSUFK1evdqWWsJqefU//vhDu3fvPuM5559/vkqWLHnK47///rtq1KihhQsX2tYMFUr+vlfbtm1TixYtdM011+idd95RVFRY5dYzKsrfq3feeUe9evXSvn37glydOxw+fFhlypTRRx99pDZt2uQ8npKSon379tHqeAYej0dTp07N874hr+7du2v69OmaP3++ateubXc5rpGcnKw6depo9OjRIX/tmJC/YhBVrlxZlStXLtKf9fl8kqTs7OxAluRY/rxXW7duVVJSkho1aqRx48ZFVPCQivf3CkbJkiXVqFEjzZkzJ+ci6vP5NGfOHHXv3t3e4uBalmWpR48emjp1qr755huCh598Pp9t17ywCh+FtWTJEi1btkzNmzdXxYoVtWHDBvXv31916tSJiFYPf2zdulUtWrTQeeedp5dffll//PFHzs/OPvtsGytzps2bN2vPnj3avHmzvF6vVqxYIUm64IILVK5cOXuLs1nv3r2VkpKiq666So0bN9bw4cN18OBBdejQwe7SHOfAgQNav359zv2NGzdqxYoVSkhIUM2aNW2szFlSU1M1ceJETZ8+XeXLl88ZPxQfH6/SpUvbXJ2zpKWlqVWrVqpZs6b279+viRMn6ptvvtHMmTPtKciWOTY2++mnn6ykpCQrISHBio2NtWrVqmU9+uij1u+//253aY4zbtw4S1K+N5wqJSUl3/dq7ty5dpfmCK+++qpVs2ZNq2TJklbjxo2txYsX212SI82dOzffv0cpKSl2l+Yop/tsGjdunN2lOc7DDz9snXfeeVbJkiWtypUrWzfccIP11Vdf2VZPWI35AAAAzhdZnfcAAMB2hA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBShA8AABBS/w/xe+j5c9CLQwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Much better.\n",
+ "\n",
+ "# get a 100,1 2d array of values (can't pass in 100 1D matrix)\n",
+ "# the -1 specifies to create as many rows as needed and the 1\n",
+ "# specifies the number of columns.\n",
+ "\n",
+ "xVals = np.linspace(LOWER,UPPER,POINTS).reshape(-1,1)\n",
+ "\n",
+ "xPoly = poly_features.transform(xVals)\n",
+ "\n",
+ "yVals = lin_reg.predict(xPoly)\n",
+ "\n",
+ "plt.plot(xVals, yVals, c='red')\n",
+ "plt.scatter(X,y, s=5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(0.0, 10.0)"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGiCAYAAAA1LsZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBzklEQVR4nO3deVxU9f7H8dcAijuKGWYukEtm7oZm2U0MNfW2173tZqWV5FqW9svMyjDbzCK1W6ndNFvMbPWmppbmnmVWLpi7uScoFgrM74+voCgKw5zhnDPzfj4e82BmGOZ8HGTOe76rx+v1ehERERGxSZjdBYiIiEhoUxgRERERWymMiIiIiK0URkRERMRWCiMiIiJiK4URERERsZXCiIiIiNhKYURERERspTAiIiIitlIYEREREVv5HEa+/fZbrrrqKmrUqIHH4+GTTz7J932v18sTTzzBOeecQ9myZUlMTGT9+vVW1SsiIiJBxucwkpGRQbNmzUhJSSnw+6NGjWLMmDGMGzeOJUuWUL58eTp37szff//td7EiIiISfDz+bJTn8XiYPn061157LWBaRWrUqMFDDz3Eww8/DEBaWhoxMTFMnDiRm2++2ZKiRUREJHhEWPlkGzduZOfOnSQmJubdFxUVRZs2bVi0aFGBYSQzM5PMzMy82zk5Oezfv5+qVavi8XisLE9EREQCxOv1cvDgQWrUqEFYmG8dL5aGkZ07dwIQExOT7/6YmJi8750sOTmZ4cOHW1mGiIiI2GTr1q3UrFnTp5+xNIwUx5AhQxg4cGDe7bS0NGrXrs3WrVupVKmSjZWJiIjIiXpOWs6i3/cBMH/8vVT9Kx0WLIAmTUhPT6dWrVpUrFjR5+e1NIxUr14dgF27dnHOOefk3b9r1y6aN29e4M9ERkYSGRl5yv2VKlVSGBEREXGQSy6oxdLtf1Eq6yhxf6WbO88/H044XxdniIWl64zExcVRvXp15syZk3dfeno6S5YsoW3btlYeSkREREpYUkJd+ic2oOtZZu6LNzISqlb1+3l9bhk5dOgQqampebc3btzIjz/+SHR0NLVr16Z///4888wz1K9fn7i4OIYOHUqNGjXyZtyIiIiIO0WEh9EvsT6U3Q2Ap0YNsGCyic9hZPny5SQkJOTdzh3v0b17dyZOnMgjjzxCRkYGvXr14sCBA7Rr146ZM2dSpkwZv4sVERERB9i+3Xw991xLns7nMNK+fXvOtDSJx+Phqaee4qmnnvKrMBEREXEoi8OI9qYRERER3yiMiIiIiK0URkRERMRWGzaYr3XqWPJ0CiMiIiJSdF4v/Pqrud6okSVPqTAiIiIiRbd1K2RkQEQE1KtnyVMqjIiIiEjR5baKNGgApUpZ8pQKIyIiIlJ0FnfRgMKIiIiI+OK338xXhRERERGxhVpGRERExDYBmEkDCiMiIiJSVDt3woEDEBZmBrBaRGFEREREiia3VaRuXYiMtOxpFUZERESkaALQRQMKIyIiIlJUCiMiIiJiqwBM6wWFERERESkqtYyIiIiIbfbsMRePBxo2tPSpFUZERESkcLldNLGxUK6cpU+tMCIiIiKFy+2iueACy59aYUREREQKF6DxIqAwIiIiIkWhMCIiIiK2UhgRERER2xw4AH/8Ya4HYMxIhOXPKCIiIq6TlZ1DytwNLNu0n/jYaJIS6hIRfqzNIncmTc2aUKmS5cdWGBERERFS5m5g9Ox1eIGFqXsB6JdY33wzgF00oG4aERERAZZt2o/32HXvsdt5FEZEREQk0OJjo/Ecu+45djtPANcYAXXTiIiICJCUUBcg35iRPAFuGVEYERERESLCw46PETnRoUOwZYu5HqCWEXXTiIiIyOmtWWO+xsRA1aoBOYTCiIiIiJxegLtoQGFEREREzkRhRERERGy1apX5GqDxIqAwIiIiIqdz9CgsWGCuX3JJwA6jMCIiIiIFW7oUDh40A1ebNQvYYRRGREREpGCzZ5uvV1wBYYGLDAojIiIiUrDcMNKxY0APozAiIiIipzp4EBYvNtcTEwN6KIUREREROdX8+ZCVBXXrQmxsQA+lMCIiIiKnyu2iCXCrCCiMiIiISEEURkRERMQ2f/wBv/wCHg8kJAT8cAojIiIikl9uq0irVgHbHO9ECiMiIiKSXwl20YDCiIiIiJzI61UYERERERutWQM7dkCZMnDppSVySIUREREROW7WLPO1XTsTSEqAwoiIiIgcV0JLwJ9IYURERESMo0dh3jxzvYTGiwBElNiRREREgkRWdg4pczewbNN+4mOjSUqoS0R4EHy+X7bM7EkTHQ3Nm5fYYRVGREREfJQydwOjZ6/DCyxM3QtAv8T69hZlhdzxIldcAWElF66CIMaJiIiUrGWb9uM9dt177Lbreb3w4Yfmegl20YDCiIiIiM/iY6PxHLvuOXbb9WbONEvAV6gA//pXiR5a3TQiIiI+SkqoC5BvzIjrjRplvt53H1SuXKKHVhgRERHxUUR4WHCMEcm1bJmZRRMRAf36lfjh1U0jIiIS6p5/3ny99VaoVavED6+WEREREQexetpwoc+XmgrTppnrDz/sZ/XFozAiIiLiIP5MGy4oeBT6fC+9BDk50KULNGli8b+maBRGREREHMSfacMFBY8zPt+ePTBhgrn+yCN+Vl58GjMiIiLiIP5MGy4oeJzx+V57Df7+G+Lj4fLL/a69uNQyIiIi4iD+TBuOj41mYepevBwPHqd9vowME0YABg0Cj6fA5ywJCiMiIiIO4s+04YKCx2mf7+23Yf9+OO88uP56f0r2m8KIiIhIkDhd8DhlYGvVDCIee8x886GHIDy8hCvNz/IxI9nZ2QwdOpS4uDjKli1L3bp1efrpp/F6vYX/sIiIiFgud2DrgtS9vPvJEg5f2Q0OHYIOHaBnT7vLs75l5LnnnmPs2LFMmjSJCy+8kOXLl9OjRw+ioqLo27ev1YcTERGRQuQObI08mskbHz9Dpd07oEED+OgjKFXK7vKsDyPff/8911xzDd26dQMgNjaW9957j6VLl1p9KBEREVeweiEzX8XHRrNw/R5GfTWGFn+s5e+KUZT5/HOoUqXEajgTy1+JSy65hDlz5rBu3ToAfvrpJxYsWECXLl0KfHxmZibp6en5LiIiIsHkxG6S0bPXkTJ3Q4kePymhLlN2zuKa3+aTHR5BqY+nQX3n7K1jecvI4MGDSU9Pp2HDhoSHh5Odnc2IESO47bbbCnx8cnIyw4cPt7oMERERx/BnITO/eb1EvP0Wbd8ZA0D42Nch8YqSO34RWN4y8sEHHzB58mSmTJnCDz/8wKRJk3jhhReYNGlSgY8fMmQIaWlpeZetW7daXZKIiIit/FnIzC/btsHVV0OvXub2gAGOGLB6MstbRgYNGsTgwYO5+eabAWjSpAmbN28mOTmZ7t27n/L4yMhIIiMjrS5DRETEMfxZyKxYcnLgjTfMEu8HD5pBqkOHQu50XoexPIwcPnyYsLD8DS7h4eHk5ORYfSgRERFX8GchM5+tWgV9+8L8+eZ227bw5pvQqFHJHL8YLA8jV111FSNGjKB27dpceOGFrFy5kpdeeom7777b6kOJiIgIwNGjMH06pKTAt9+a+8qVg+RkSEqyfVGzwni8Fq9GdvDgQYYOHcr06dPZvXs3NWrU4JZbbuGJJ56gdOnShf58eno6UVFRpKWlUalSJStLExERcbVTpgg3LEfE22/B+PGwY4d5UHg43HADPPccxMYW/7l9nH7sz/nb8jDiL4URERGRgr0yez2jZ63l4i0/c8fKL+icuoTw7CzzzZgYuO8+M1j13HOL99yz1+Vtstc/sYFPXUv+nL+1N42IiIgbpKUR/eZYZs36kHr7tx2//5JL4MEHTWtIEXogTsfO6ccKIyIiIk6WmQmvvw7PPMMd+01AOFS6LJ80ao/ngQe4rddVlhwmPjaahal781pGSmz6MQojIiIizpSdDZMnwxNPwObNAHgbNmRup5uZUv8ymjSsZekU4RKffnwCjRkRERFxmnnzzPTcn382t889F556Cu68EyKc2Y6gMSMiIiLBICvLhI5nngGvFypXhiFDoE8fKFvW7uoCRmFERETECXbsgFtuOb5OyD33wKhREF1yYzfsojAiIiJit5kz4Y47YO9eqFDBrBty6612V1ViLN8oT0RERIrI64Wnn4YuXUwQad4cVqwIqSACCiMiIiL28HrNxnVPPGFu9+4NixZBgwb21mUDddOIiIiUNK8XBg2CF180t0ePhn79bC3JTgojIiIiJcnrhQED4JVXzO2UFNMqEsIURkREREpKTo5ZPyQlxdweP97sJRPiFEZERERKSv/+Joh4PPDmm3D33XZX5AgKIyIiIiVh7Fh49VUTRCZMgO7d7a7IMTSbRkREJNByl3cHePZZBZGTKIyIiIgE0saNcOONZqn3W26BRx+1uyLHURgREREJlEOH4JprYN8+aNUK3nrLdNNIPgojIiIigZCTY3bZ/flniImBTz4J6s3u/KEwIiIiEghPPw3Tp0Pp0uZrzZp2V+RYCiMiIiJWW7gQnnrKXB8/Htq2tbceh1MYERERsdLBg6Z7Jreb5q677K7I8RRGRERErDRgAPz+O9SpA2PG2F2NKyiMiIiIWGXGjOMzZiZNgqgouytyBYURERERK+zaBT17musPPwyXX25vPS6iMCIiIuIvrxfuvRf27IGmTc1MGikyhRERERF/vfkmfP65mcb77rsQGWl3Ra6iMCIiIuKP7dvhoYfM9eRkaNLE3npcSGFERETEHwMGmOm8bdpA//52V+NKCiMiIiLF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g1i5ciVff/014eHh3HnnnXi1cKzPryPA9u3bufLKK7npppvo2bOnTZU7T3FeSxEJDklJSaxevZqpU6faXYprnX/++fz4448sWbKEBx54gO7du/Prr78W+edtWQ5+z5497Nu374yPOe+88yhduvQp92/bto1atWrx/fffh/wuwL6+jjt27KB9+/ZcfPHFTJw4kbAwVzSMlYji/J+cOHEi/fv358CBAwGuzv2OHDlCuXLl+Oijj7j22mvz7u/evTsHDhxQa2cxeTwepk+fnu81Fd88+OCDzJgxg2+//Za4uDi7ywkaiYmJ1K1bl/Hjxxfp8QHZtbcw1apVo1q1asX62ZycHAAyMzOtLMmVfHkdt2/fTkJCAq1atWLChAkKIifx5/+kFK506dK0atWKOXPm5J04c3JymDNnDg8++KC9xUlI8nq99OnTh+nTpzNv3jwFEYvl5OT4dJ62JYwU1ZIlS1i2bBnt2rWjSpUqbNiwgaFDh1K3bt2QbxXxxfbt22nfvj116tThhRdeYM+ePXnfq169uo2VudOWLVvYv38/W7ZsITs7mx9//BGAevXqUaFCBXuLc7CBAwfSvXt3LrroIlq3bs3o0aPJyMigR48edpfmKocOHSI1NTXv9saNG/nxxx+Jjo6mdu3aNlbmLklJSUyZMoUZM2ZQsWLFvLFLUVFRlC1b1ubq3GXIkCF06dKF2rVrc/DgQaZMmcK8efP43//+V/QnCdCsHkusWrXKm5CQ4I2OjvZGRkZ6Y2Njvffff79327ZtdpfmKhMmTPACBV7Ed927dy/wtZw7d67dpTneq6++6q1du7a3dOnS3tatW3sXL15sd0muM3fu3AL//3Xv3t3u0lzldO+JEyZMsLs017n77ru9derU8ZYuXdpbrVo17xVXXOH9+uuvfXoOW8aMiIiIiOTSwAERERGxlcKIiIiI2EphRERERGylMCIiIiK2UhgRERERWymMiIiIiK0URkRERMRWCiMiIiJiK4URERERsZXCiIiIiNhKYURERERs9f9BhcfCQ8DU1QAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Mess about with degree\n",
+ "\n",
+ "poly_features = PolynomialFeatures(degree=10, include_bias=False)\n",
+ "X_poly = poly_features.fit_transform(X)\n",
+ "lin_reg = LinearRegression()\n",
+ "lin_reg.fit(X_poly, y)\n",
+ "\n",
+ "xVals = np.linspace(LOWER,UPPER,POINTS).reshape(-1,1)\n",
+ "\n",
+ "xPoly = poly_features.transform(xVals)\n",
+ "\n",
+ "yVals = lin_reg.predict(xPoly)\n",
+ "plt.plot(xVals, yVals, c='red')\n",
+ "plt.scatter(X,y, s=5)\n",
+ "plt.xlim(left=-3, right=3)\n",
+ "plt.ylim(bottom=0, top=10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(0.0, 10.0)"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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NUpLSyu8LSYmRmlpaVq+fLmDlQFGdna2JPG5WE0FBQWaM2eODh06FNQSMJ4IIw899JDq1q2rxo0b6/vvv9f8+fOdLsnTsrKy9NJLL+mee+5xuhREib1796qgoEBJSUklbk9KStLOnTsdqgow/H6/hg8frp49e6pz585Ol+NJX375perVq6f4+Hjde++9mjdvnk477bRK/7wjYWTUqFHy+Xzlbhs2bCi8/8iRI/X555/ro48+UmxsrO644w5ZTBwb9OsoSdu3b9dll12mG2+8UQMGDHCocvepymsJIDKkp6frq6++0pw5c5wuxbNOPfVUrVu3TitXrtSgQYPUr18/ff3115X+eUemg9+zZ49++umncu9z8sknq2bNmsfd/sMPP6hly5b69NNPo34V4GBfxx07dqhXr14677zzNGPGDMXEeKJhLCyq8n9yxowZGj58uPbv3x/i6rwvLy9PderU0dy5c3XttdcW3t6vXz/t37+f1s4q8vl8mjdvXonXFMEZMmSI5s+fr6VLl6pNmzZOlxMx0tLS1LZtW73yyiuVun9IVu2tSJMmTdSkSZMq/azf75ck5ebm2lmSJwXzOm7fvl2pqak6++yzNX36dILIMarzfxIVq1mzps4++2wtXLiw8MDp9/u1cOFCDRkyxNniEJUsy9LQoUM1b948LV68mCBiM7/fH9Rx2pEwUlkrV67U6tWrdf7556tRo0bavHmzxowZo7Zt20Z9q0gwtm/frl69eql169Z69tlntWfPnsJ/a9q0qYOVedP333+vffv26fvvv1dBQYHWrVsnSTrllFNUr149Z4tzsREjRqhfv34655xzdO6552rChAk6dOiQ+vfv73RpnnLw4EFlZWUVXt+yZYvWrVunxMREtWrVysHKvCU9PV2zZ8/W/PnzVb9+/cKxSwkJCapdu7bD1XnL6NGjdfnll6tVq1Y6cOCAZs+ercWLF+vDDz+s/IOE6KweW3zxxRdWamqqlZiYaMXHx1vJycnWvffea/3www9Ol+Yp06dPtySVuiF4/fr1K/W1XLRokdOlud5LL71ktWrVyqpZs6Z17rnnWitWrHC6JM9ZtGhRqf//+vXr53RpnlLWZ+L06dOdLs1z7rzzTqt169ZWzZo1rSZNmlgXX3yx9dFHHwX1GI6MGQEAAAhg4AAAAHAUYQQAADiKMAIAABxFGAEAAI4ijAAAAEcRRgAAgKMIIwAAwFGEEQAA4CjCCAAAcBRhBAAAOIowAgAAHPX/roz8M74srzsAAAAASUVORK5CYII=",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn.linear_model import Ridge\n",
+ "\n",
+ "poly_features = PolynomialFeatures(degree=10, include_bias=False)\n",
+ "X_poly = poly_features.fit_transform(X)\n",
+ "\n",
+ "# Something to note here, when using SGD you can specify a penalty of 12 and\n",
+ "# then send in an alpha value to do the same thing with SGD.\n",
+ "\n",
+ "# This hyperparameter of 1000 can create a visually more flat graph of the data\n",
+ "# by punishing higher coeficcients.\n",
+ "\n",
+ "rdg = Ridge(alpha=1000, solver='cholesky')\n",
+ "rdg.fit(X_poly, y)\n",
+ "\n",
+ "xVals = np.linspace(LOWER,UPPER,POINTS).reshape(-1,1)\n",
+ "\n",
+ "xPoly = poly_features.transform(xVals)\n",
+ "\n",
+ "yVals = rdg.predict(xPoly)\n",
+ "plt.plot(xVals, yVals, c='red')\n",
+ "plt.scatter(X,y, s=5)\n",
+ "plt.xlim(left=-3, right=3)\n",
+ "plt.ylim(bottom=0, top=10)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/gradientDescent/StochasticGradientDescentLinearRegression.ipynb b/gradientDescent/StochasticGradientDescentLinearRegression.ipynb
@@ -0,0 +1,532 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "from sklearn.preprocessing import add_dummy_feature\n",
+ "\n",
+ "# init\n",
+ "m = 100\n",
+ "X = 2*np.random.rand(m,1)\n",
+ "y = 4+3 * X + np.random.randn(m,1)\n",
+ "X_b = add_dummy_feature(X)\n",
+ "\n",
+ "# Stochastic gradient descent\n",
+ "epochs = 50\n",
+ "t0,t1 = 5,50 # Learning schedule\n",
+ "\n",
+ "def learning_schedule(t):\n",
+ " return t0 / (t+t1)\n",
+ "\n",
+ "np.random.seed(42)\n",
+ "theta = np.random.randn(2,1)\n",
+ "\n",
+ "for epoch in range(epochs):\n",
+ " for iteration in range(m):\n",
+ " random_index = np.random.randint(m)\n",
+ " xi = X_b[random_index : random_index + 1]\n",
+ " yi = y[random_index : random_index + 1]\n",
+ " gradients = 2*xi.T @ (xi @ theta - yi)\n",
+ " eta = learning_schedule(epoch * m + iteration)\n",
+ " theta = theta - eta * gradients\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[4.07817553]\n",
+ " [3.05643471]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(theta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<style>#sk-container-id-3 {\n",
+ " /* Definition of color scheme common for light and dark mode */\n",
+ " --sklearn-color-text: black;\n",
+ " --sklearn-color-line: gray;\n",
+ " /* Definition of color scheme for unfitted estimators */\n",
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
+ " /* Definition of color scheme for fitted estimators */\n",
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
+ "\n",
+ " /* Specific color for light theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-icon: #696969;\n",
+ "\n",
+ " @media (prefers-color-scheme: dark) {\n",
+ " /* Redefinition of color scheme for dark theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-icon: #878787;\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 pre {\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 input.sk-hidden--visually {\n",
+ " border: 0;\n",
+ " clip: rect(1px 1px 1px 1px);\n",
+ " clip: rect(1px, 1px, 1px, 1px);\n",
+ " height: 1px;\n",
+ " margin: -1px;\n",
+ " overflow: hidden;\n",
+ " padding: 0;\n",
+ " position: absolute;\n",
+ " width: 1px;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-dashed-wrapped {\n",
+ " border: 1px dashed var(--sklearn-color-line);\n",
+ " margin: 0 0.4em 0.5em 0.4em;\n",
+ " box-sizing: border-box;\n",
+ " padding-bottom: 0.4em;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-container {\n",
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
+ " so we also need the `!important` here to be able to override the\n",
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
+ " display: inline-block !important;\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-text-repr-fallback {\n",
+ " display: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-parallel-item,\n",
+ "div.sk-serial,\n",
+ "div.sk-item {\n",
+ " /* draw centered vertical line to link estimators */\n",
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
+ " background-size: 2px 100%;\n",
+ " background-repeat: no-repeat;\n",
+ " background-position: center center;\n",
+ "}\n",
+ "\n",
+ "/* Parallel-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel-item::after {\n",
+ " content: \"\";\n",
+ " width: 100%;\n",
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
+ " flex-grow: 1;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel {\n",
+ " display: flex;\n",
+ " align-items: stretch;\n",
+ " justify-content: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel-item {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
+ " align-self: flex-end;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
+ " align-self: flex-start;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
+ " width: 0;\n",
+ "}\n",
+ "\n",
+ "/* Serial-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-serial {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ " align-items: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " padding-right: 1em;\n",
+ " padding-left: 1em;\n",
+ "}\n",
+ "\n",
+ "\n",
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
+ "clickable and can be expanded/collapsed.\n",
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
+ "*/\n",
+ "\n",
+ "/* Pipeline and ColumnTransformer style (default) */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-toggleable {\n",
+ " /* Default theme specific background. It is overwritten whether we have a\n",
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable label */\n",
+ "#sk-container-id-3 label.sk-toggleable__label {\n",
+ " cursor: pointer;\n",
+ " display: block;\n",
+ " width: 100%;\n",
+ " margin-bottom: 0;\n",
+ " padding: 0.5em;\n",
+ " box-sizing: border-box;\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
+ " /* Arrow on the left of the label */\n",
+ " content: \"▸\";\n",
+ " float: left;\n",
+ " margin-right: 0.25em;\n",
+ " color: var(--sklearn-color-icon);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable content - dropdown */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-toggleable__content {\n",
+ " max-height: 0;\n",
+ " max-width: 0;\n",
+ " overflow: hidden;\n",
+ " text-align: left;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-toggleable__content pre {\n",
+ " margin: 0.2em;\n",
+ " border-radius: 0.25em;\n",
+ " color: var(--sklearn-color-text);\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
+ " /* Expand drop-down */\n",
+ " max-height: 200px;\n",
+ " max-width: 100%;\n",
+ " overflow: auto;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
+ " content: \"▾\";\n",
+ "}\n",
+ "\n",
+ "/* Pipeline/ColumnTransformer-specific style */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific style */\n",
+ "\n",
+ "/* Colorize estimator box */\n",
+ "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
+ "#sk-container-id-3 div.sk-label label {\n",
+ " /* The background is the default theme color */\n",
+ " color: var(--sklearn-color-text-on-default-background);\n",
+ "}\n",
+ "\n",
+ "/* On hover, darken the color of the background */\n",
+ "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Label box, darken color on hover, fitted */\n",
+ "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator label */\n",
+ "\n",
+ "#sk-container-id-3 div.sk-label label {\n",
+ " font-family: monospace;\n",
+ " font-weight: bold;\n",
+ " display: inline-block;\n",
+ " line-height: 1.2em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-label-container {\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific */\n",
+ "#sk-container-id-3 div.sk-estimator {\n",
+ " font-family: monospace;\n",
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
+ " border-radius: 0.25em;\n",
+ " box-sizing: border-box;\n",
+ " margin-bottom: 0.5em;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-estimator.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "/* on hover */\n",
+ "#sk-container-id-3 div.sk-estimator:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
+ "\n",
+ "/* Common style for \"i\" and \"?\" */\n",
+ "\n",
+ ".sk-estimator-doc-link,\n",
+ "a:link.sk-estimator-doc-link,\n",
+ "a:visited.sk-estimator-doc-link {\n",
+ " float: right;\n",
+ " font-size: smaller;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1em;\n",
+ " height: 1em;\n",
+ " width: 1em;\n",
+ " text-decoration: none !important;\n",
+ " margin-left: 1ex;\n",
+ " /* unfitted */\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted,\n",
+ "a:link.sk-estimator-doc-link.fitted,\n",
+ "a:visited.sk-estimator-doc-link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "/* Span, style for the box shown on hovering the info icon */\n",
+ ".sk-estimator-doc-link span {\n",
+ " display: none;\n",
+ " z-index: 9999;\n",
+ " position: relative;\n",
+ " font-weight: normal;\n",
+ " right: .2ex;\n",
+ " padding: .5ex;\n",
+ " margin: .5ex;\n",
+ " width: min-content;\n",
+ " min-width: 20ex;\n",
+ " max-width: 50ex;\n",
+ " color: var(--sklearn-color-text);\n",
+ " box-shadow: 2pt 2pt 4pt #999;\n",
+ " /* unfitted */\n",
+ " background: var(--sklearn-color-unfitted-level-0);\n",
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted span {\n",
+ " /* fitted */\n",
+ " background: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link:hover span {\n",
+ " display: block;\n",
+ "}\n",
+ "\n",
+ "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
+ "\n",
+ "#sk-container-id-3 a.estimator_doc_link {\n",
+ " float: right;\n",
+ " font-size: 1rem;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1rem;\n",
+ " height: 1rem;\n",
+ " width: 1rem;\n",
+ " text-decoration: none;\n",
+ " /* unfitted */\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "#sk-container-id-3 a.estimator_doc_link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>SGDRegressor(n_iter_no_change=100, penalty=None, random_state=42, tol=1e-05)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> SGDRegressor<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.SGDRegressor.html\">?<span>Documentation for SGDRegressor</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>SGDRegressor(n_iter_no_change=100, penalty=None, random_state=42, tol=1e-05)</pre></div> </div></div></div></div>"
+ ],
+ "text/plain": [
+ "SGDRegressor(n_iter_no_change=100, penalty=None, random_state=42, tol=1e-05)"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Built in version of this using sklearn\n",
+ "\n",
+ "from sklearn.linear_model import SGDRegressor\n",
+ "\n",
+ "sgd_reg = SGDRegressor(max_iter=1000, tol=1e-5, penalty=None, eta0=0.01,\n",
+ "n_iter_no_change=100, random_state=42)\n",
+ "\n",
+ "sgd_reg.fit(X, y.ravel())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([4.10476564]), array([3.01131049]))"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sgd_reg.intercept_, sgd_reg.coef_"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/irisClassification/logisticRegression.ipynb b/irisClassification/logisticRegression.ipynb
@@ -0,0 +1,719 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.datasets import load_iris\n",
+ "iris = load_iris(as_frame=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['data',\n",
+ " 'target',\n",
+ " 'frame',\n",
+ " 'target_names',\n",
+ " 'DESCR',\n",
+ " 'feature_names',\n",
+ " 'filename',\n",
+ " 'data_module']"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(iris)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<div>\n",
+ "<style scoped>\n",
+ " .dataframe tbody tr th:only-of-type {\n",
+ " vertical-align: middle;\n",
+ " }\n",
+ "\n",
+ " .dataframe tbody tr th {\n",
+ " vertical-align: top;\n",
+ " }\n",
+ "\n",
+ " .dataframe thead th {\n",
+ " text-align: right;\n",
+ " }\n",
+ "</style>\n",
+ "<table border=\"1\" class=\"dataframe\">\n",
+ " <thead>\n",
+ " <tr style=\"text-align: right;\">\n",
+ " <th></th>\n",
+ " <th>sepal length (cm)</th>\n",
+ " <th>sepal width (cm)</th>\n",
+ " <th>petal length (cm)</th>\n",
+ " <th>petal width (cm)</th>\n",
+ " </tr>\n",
+ " </thead>\n",
+ " <tbody>\n",
+ " <tr>\n",
+ " <th>0</th>\n",
+ " <td>5.1</td>\n",
+ " <td>3.5</td>\n",
+ " <td>1.4</td>\n",
+ " <td>0.2</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <th>1</th>\n",
+ " <td>4.9</td>\n",
+ " <td>3.0</td>\n",
+ " <td>1.4</td>\n",
+ " <td>0.2</td>\n",
+ " </tr>\n",
+ " <tr>\n",
+ " <th>2</th>\n",
+ " <td>4.7</td>\n",
+ " <td>3.2</td>\n",
+ " <td>1.3</td>\n",
+ " <td>0.2</td>\n",
+ " </tr>\n",
+ " </tbody>\n",
+ "</table>\n",
+ "</div>"
+ ],
+ "text/plain": [
+ " sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)\n",
+ "0 5.1 3.5 1.4 0.2\n",
+ "1 4.9 3.0 1.4 0.2\n",
+ "2 4.7 3.2 1.3 0.2"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.data.head(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0 0\n",
+ "1 0\n",
+ "2 0\n",
+ "Name: target, dtype: int64"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.target.head(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['setosa', 'versicolor', 'virginica'], dtype='<U10')"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "iris.target_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<style>#sk-container-id-1 {\n",
+ " /* Definition of color scheme common for light and dark mode */\n",
+ " --sklearn-color-text: black;\n",
+ " --sklearn-color-line: gray;\n",
+ " /* Definition of color scheme for unfitted estimators */\n",
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
+ " /* Definition of color scheme for fitted estimators */\n",
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
+ "\n",
+ " /* Specific color for light theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-icon: #696969;\n",
+ "\n",
+ " @media (prefers-color-scheme: dark) {\n",
+ " /* Redefinition of color scheme for dark theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-icon: #878787;\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 pre {\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 input.sk-hidden--visually {\n",
+ " border: 0;\n",
+ " clip: rect(1px 1px 1px 1px);\n",
+ " clip: rect(1px, 1px, 1px, 1px);\n",
+ " height: 1px;\n",
+ " margin: -1px;\n",
+ " overflow: hidden;\n",
+ " padding: 0;\n",
+ " position: absolute;\n",
+ " width: 1px;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-dashed-wrapped {\n",
+ " border: 1px dashed var(--sklearn-color-line);\n",
+ " margin: 0 0.4em 0.5em 0.4em;\n",
+ " box-sizing: border-box;\n",
+ " padding-bottom: 0.4em;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-container {\n",
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
+ " so we also need the `!important` here to be able to override the\n",
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
+ " display: inline-block !important;\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-text-repr-fallback {\n",
+ " display: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-parallel-item,\n",
+ "div.sk-serial,\n",
+ "div.sk-item {\n",
+ " /* draw centered vertical line to link estimators */\n",
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
+ " background-size: 2px 100%;\n",
+ " background-repeat: no-repeat;\n",
+ " background-position: center center;\n",
+ "}\n",
+ "\n",
+ "/* Parallel-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel-item::after {\n",
+ " content: \"\";\n",
+ " width: 100%;\n",
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
+ " flex-grow: 1;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel {\n",
+ " display: flex;\n",
+ " align-items: stretch;\n",
+ " justify-content: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel-item {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
+ " align-self: flex-end;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
+ " align-self: flex-start;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
+ " width: 0;\n",
+ "}\n",
+ "\n",
+ "/* Serial-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-serial {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ " align-items: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " padding-right: 1em;\n",
+ " padding-left: 1em;\n",
+ "}\n",
+ "\n",
+ "\n",
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
+ "clickable and can be expanded/collapsed.\n",
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
+ "*/\n",
+ "\n",
+ "/* Pipeline and ColumnTransformer style (default) */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-toggleable {\n",
+ " /* Default theme specific background. It is overwritten whether we have a\n",
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable label */\n",
+ "#sk-container-id-1 label.sk-toggleable__label {\n",
+ " cursor: pointer;\n",
+ " display: block;\n",
+ " width: 100%;\n",
+ " margin-bottom: 0;\n",
+ " padding: 0.5em;\n",
+ " box-sizing: border-box;\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
+ " /* Arrow on the left of the label */\n",
+ " content: \"▸\";\n",
+ " float: left;\n",
+ " margin-right: 0.25em;\n",
+ " color: var(--sklearn-color-icon);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable content - dropdown */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-toggleable__content {\n",
+ " max-height: 0;\n",
+ " max-width: 0;\n",
+ " overflow: hidden;\n",
+ " text-align: left;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-toggleable__content pre {\n",
+ " margin: 0.2em;\n",
+ " border-radius: 0.25em;\n",
+ " color: var(--sklearn-color-text);\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
+ " /* Expand drop-down */\n",
+ " max-height: 200px;\n",
+ " max-width: 100%;\n",
+ " overflow: auto;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
+ " content: \"▾\";\n",
+ "}\n",
+ "\n",
+ "/* Pipeline/ColumnTransformer-specific style */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific style */\n",
+ "\n",
+ "/* Colorize estimator box */\n",
+ "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
+ "#sk-container-id-1 div.sk-label label {\n",
+ " /* The background is the default theme color */\n",
+ " color: var(--sklearn-color-text-on-default-background);\n",
+ "}\n",
+ "\n",
+ "/* On hover, darken the color of the background */\n",
+ "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Label box, darken color on hover, fitted */\n",
+ "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator label */\n",
+ "\n",
+ "#sk-container-id-1 div.sk-label label {\n",
+ " font-family: monospace;\n",
+ " font-weight: bold;\n",
+ " display: inline-block;\n",
+ " line-height: 1.2em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-label-container {\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific */\n",
+ "#sk-container-id-1 div.sk-estimator {\n",
+ " font-family: monospace;\n",
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
+ " border-radius: 0.25em;\n",
+ " box-sizing: border-box;\n",
+ " margin-bottom: 0.5em;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-estimator.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "/* on hover */\n",
+ "#sk-container-id-1 div.sk-estimator:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
+ "\n",
+ "/* Common style for \"i\" and \"?\" */\n",
+ "\n",
+ ".sk-estimator-doc-link,\n",
+ "a:link.sk-estimator-doc-link,\n",
+ "a:visited.sk-estimator-doc-link {\n",
+ " float: right;\n",
+ " font-size: smaller;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1em;\n",
+ " height: 1em;\n",
+ " width: 1em;\n",
+ " text-decoration: none !important;\n",
+ " margin-left: 1ex;\n",
+ " /* unfitted */\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted,\n",
+ "a:link.sk-estimator-doc-link.fitted,\n",
+ "a:visited.sk-estimator-doc-link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "/* Span, style for the box shown on hovering the info icon */\n",
+ ".sk-estimator-doc-link span {\n",
+ " display: none;\n",
+ " z-index: 9999;\n",
+ " position: relative;\n",
+ " font-weight: normal;\n",
+ " right: .2ex;\n",
+ " padding: .5ex;\n",
+ " margin: .5ex;\n",
+ " width: min-content;\n",
+ " min-width: 20ex;\n",
+ " max-width: 50ex;\n",
+ " color: var(--sklearn-color-text);\n",
+ " box-shadow: 2pt 2pt 4pt #999;\n",
+ " /* unfitted */\n",
+ " background: var(--sklearn-color-unfitted-level-0);\n",
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted span {\n",
+ " /* fitted */\n",
+ " background: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link:hover span {\n",
+ " display: block;\n",
+ "}\n",
+ "\n",
+ "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
+ "\n",
+ "#sk-container-id-1 a.estimator_doc_link {\n",
+ " float: right;\n",
+ " font-size: 1rem;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1rem;\n",
+ " height: 1rem;\n",
+ " width: 1rem;\n",
+ " text-decoration: none;\n",
+ " /* unfitted */\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "#sk-container-id-1 a.estimator_doc_link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression(random_state=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(random_state=10)</pre></div> </div></div></div></div>"
+ ],
+ "text/plain": [
+ "LogisticRegression(random_state=10)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "X = iris.data[['petal width (cm)']].values\n",
+ "\n",
+ "# Is current virginica?\n",
+ "y = iris.target_names[iris.target] == 'virginica'\n",
+ "\n",
+ "# Split\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=10)\n",
+ "\n",
+ "# Train\n",
+ "\n",
+ "log_reg = LogisticRegression(random_state=10)\n",
+ "log_reg.fit(X_train,y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "# Predict probability on 1,000 evenly spaced values from 0 to 3\n",
+ "X_new = np.linspace(0,3,1000).reshape(-1,1)\n",
+ "y_proba = log_reg.predict_proba(X_new)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<matplotlib.collections.PathCollection at 0x7feb4bf61bd0>"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "<Figure size 640x480 with 1 Axes>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "# First probability is the likelihood it is not\n",
+ "# then the second is the likelihood it is thus\n",
+ "# below we want the second one to show the probability\n",
+ "# that a given value is a virginica iris.\n",
+ "\n",
+ "\n",
+ "plt.plot(X_new,y_proba[:,1]) # Slicing notation. We want all rows\n",
+ " # and then the comma\n",
+ " # specifies the wanted columns.\n",
+ "\n",
+ "\n",
+ "plt.scatter(X_train, y_train, s=60, cmap='jet', c=y_train, marker='^')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.6486486486486487"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# First get the array of only values where the second column is >= 50% probability.\n",
+ "# Then, get the first x val.\n",
+ "decision_boundary = X_new[y_proba[:, 1] >= 0.5][0, 0]\n",
+ "decision_boundary"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([False, True])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "log_reg.predict([[1.5], [1.7]])"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/irisClassification/softmaxRegression.ipynb b/irisClassification/softmaxRegression.ipynb
@@ -0,0 +1,517 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.datasets import load_iris\n",
+ "iris = load_iris(as_frame=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X = iris.data[['petal width (cm)', 'petal width (cm)']].values\n",
+ "y = iris['target']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "<style>#sk-container-id-2 {\n",
+ " /* Definition of color scheme common for light and dark mode */\n",
+ " --sklearn-color-text: black;\n",
+ " --sklearn-color-line: gray;\n",
+ " /* Definition of color scheme for unfitted estimators */\n",
+ " --sklearn-color-unfitted-level-0: #fff5e6;\n",
+ " --sklearn-color-unfitted-level-1: #f6e4d2;\n",
+ " --sklearn-color-unfitted-level-2: #ffe0b3;\n",
+ " --sklearn-color-unfitted-level-3: chocolate;\n",
+ " /* Definition of color scheme for fitted estimators */\n",
+ " --sklearn-color-fitted-level-0: #f0f8ff;\n",
+ " --sklearn-color-fitted-level-1: #d4ebff;\n",
+ " --sklearn-color-fitted-level-2: #b3dbfd;\n",
+ " --sklearn-color-fitted-level-3: cornflowerblue;\n",
+ "\n",
+ " /* Specific color for light theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
+ " --sklearn-color-icon: #696969;\n",
+ "\n",
+ " @media (prefers-color-scheme: dark) {\n",
+ " /* Redefinition of color scheme for dark theme */\n",
+ " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
+ " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
+ " --sklearn-color-icon: #878787;\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 pre {\n",
+ " padding: 0;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-hidden--visually {\n",
+ " border: 0;\n",
+ " clip: rect(1px 1px 1px 1px);\n",
+ " clip: rect(1px, 1px, 1px, 1px);\n",
+ " height: 1px;\n",
+ " margin: -1px;\n",
+ " overflow: hidden;\n",
+ " padding: 0;\n",
+ " position: absolute;\n",
+ " width: 1px;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-dashed-wrapped {\n",
+ " border: 1px dashed var(--sklearn-color-line);\n",
+ " margin: 0 0.4em 0.5em 0.4em;\n",
+ " box-sizing: border-box;\n",
+ " padding-bottom: 0.4em;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-container {\n",
+ " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
+ " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
+ " so we also need the `!important` here to be able to override the\n",
+ " default hidden behavior on the sphinx rendered scikit-learn.org.\n",
+ " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
+ " display: inline-block !important;\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-text-repr-fallback {\n",
+ " display: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-parallel-item,\n",
+ "div.sk-serial,\n",
+ "div.sk-item {\n",
+ " /* draw centered vertical line to link estimators */\n",
+ " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
+ " background-size: 2px 100%;\n",
+ " background-repeat: no-repeat;\n",
+ " background-position: center center;\n",
+ "}\n",
+ "\n",
+ "/* Parallel-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item::after {\n",
+ " content: \"\";\n",
+ " width: 100%;\n",
+ " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
+ " flex-grow: 1;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel {\n",
+ " display: flex;\n",
+ " align-items: stretch;\n",
+ " justify-content: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " position: relative;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
+ " align-self: flex-end;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
+ " align-self: flex-start;\n",
+ " width: 50%;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
+ " width: 0;\n",
+ "}\n",
+ "\n",
+ "/* Serial-specific style estimator block */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-serial {\n",
+ " display: flex;\n",
+ " flex-direction: column;\n",
+ " align-items: center;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " padding-right: 1em;\n",
+ " padding-left: 1em;\n",
+ "}\n",
+ "\n",
+ "\n",
+ "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
+ "clickable and can be expanded/collapsed.\n",
+ "- Pipeline and ColumnTransformer use this feature and define the default style\n",
+ "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
+ "*/\n",
+ "\n",
+ "/* Pipeline and ColumnTransformer style (default) */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable {\n",
+ " /* Default theme specific background. It is overwritten whether we have a\n",
+ " specific estimator or a Pipeline/ColumnTransformer */\n",
+ " background-color: var(--sklearn-color-background);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable label */\n",
+ "#sk-container-id-2 label.sk-toggleable__label {\n",
+ " cursor: pointer;\n",
+ " display: block;\n",
+ " width: 100%;\n",
+ " margin-bottom: 0;\n",
+ " padding: 0.5em;\n",
+ " box-sizing: border-box;\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
+ " /* Arrow on the left of the label */\n",
+ " content: \"▸\";\n",
+ " float: left;\n",
+ " margin-right: 0.25em;\n",
+ " color: var(--sklearn-color-icon);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
+ " color: var(--sklearn-color-text);\n",
+ "}\n",
+ "\n",
+ "/* Toggleable content - dropdown */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content {\n",
+ " max-height: 0;\n",
+ " max-width: 0;\n",
+ " overflow: hidden;\n",
+ " text-align: left;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content pre {\n",
+ " margin: 0.2em;\n",
+ " border-radius: 0.25em;\n",
+ " color: var(--sklearn-color-text);\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
+ " /* Expand drop-down */\n",
+ " max-height: 200px;\n",
+ " max-width: 100%;\n",
+ " overflow: auto;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
+ " content: \"▾\";\n",
+ "}\n",
+ "\n",
+ "/* Pipeline/ColumnTransformer-specific style */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific style */\n",
+ "\n",
+ "/* Colorize estimator box */\n",
+ "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
+ "#sk-container-id-2 div.sk-label label {\n",
+ " /* The background is the default theme color */\n",
+ " color: var(--sklearn-color-text-on-default-background);\n",
+ "}\n",
+ "\n",
+ "/* On hover, darken the color of the background */\n",
+ "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Label box, darken color on hover, fitted */\n",
+ "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
+ " color: var(--sklearn-color-text);\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Estimator label */\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label label {\n",
+ " font-family: monospace;\n",
+ " font-weight: bold;\n",
+ " display: inline-block;\n",
+ " line-height: 1.2em;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-label-container {\n",
+ " text-align: center;\n",
+ "}\n",
+ "\n",
+ "/* Estimator-specific */\n",
+ "#sk-container-id-2 div.sk-estimator {\n",
+ " font-family: monospace;\n",
+ " border: 1px dotted var(--sklearn-color-border-box);\n",
+ " border-radius: 0.25em;\n",
+ " box-sizing: border-box;\n",
+ " margin-bottom: 0.5em;\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-0);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-0);\n",
+ "}\n",
+ "\n",
+ "/* on hover */\n",
+ "#sk-container-id-2 div.sk-estimator:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-2);\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-2);\n",
+ "}\n",
+ "\n",
+ "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
+ "\n",
+ "/* Common style for \"i\" and \"?\" */\n",
+ "\n",
+ ".sk-estimator-doc-link,\n",
+ "a:link.sk-estimator-doc-link,\n",
+ "a:visited.sk-estimator-doc-link {\n",
+ " float: right;\n",
+ " font-size: smaller;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1em;\n",
+ " height: 1em;\n",
+ " width: 1em;\n",
+ " text-decoration: none !important;\n",
+ " margin-left: 1ex;\n",
+ " /* unfitted */\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted,\n",
+ "a:link.sk-estimator-doc-link.fitted,\n",
+ "a:visited.sk-estimator-doc-link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
+ ".sk-estimator-doc-link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover,\n",
+ "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
+ ".sk-estimator-doc-link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "/* Span, style for the box shown on hovering the info icon */\n",
+ ".sk-estimator-doc-link span {\n",
+ " display: none;\n",
+ " z-index: 9999;\n",
+ " position: relative;\n",
+ " font-weight: normal;\n",
+ " right: .2ex;\n",
+ " padding: .5ex;\n",
+ " margin: .5ex;\n",
+ " width: min-content;\n",
+ " min-width: 20ex;\n",
+ " max-width: 50ex;\n",
+ " color: var(--sklearn-color-text);\n",
+ " box-shadow: 2pt 2pt 4pt #999;\n",
+ " /* unfitted */\n",
+ " background: var(--sklearn-color-unfitted-level-0);\n",
+ " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link.fitted span {\n",
+ " /* fitted */\n",
+ " background: var(--sklearn-color-fitted-level-0);\n",
+ " border: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "\n",
+ ".sk-estimator-doc-link:hover span {\n",
+ " display: block;\n",
+ "}\n",
+ "\n",
+ "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link {\n",
+ " float: right;\n",
+ " font-size: 1rem;\n",
+ " line-height: 1em;\n",
+ " font-family: monospace;\n",
+ " background-color: var(--sklearn-color-background);\n",
+ " border-radius: 1rem;\n",
+ " height: 1rem;\n",
+ " width: 1rem;\n",
+ " text-decoration: none;\n",
+ " /* unfitted */\n",
+ " color: var(--sklearn-color-unfitted-level-1);\n",
+ " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
+ " /* fitted */\n",
+ " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
+ " color: var(--sklearn-color-fitted-level-1);\n",
+ "}\n",
+ "\n",
+ "/* On hover */\n",
+ "#sk-container-id-2 a.estimator_doc_link:hover {\n",
+ " /* unfitted */\n",
+ " background-color: var(--sklearn-color-unfitted-level-3);\n",
+ " color: var(--sklearn-color-background);\n",
+ " text-decoration: none;\n",
+ "}\n",
+ "\n",
+ "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
+ " /* fitted */\n",
+ " background-color: var(--sklearn-color-fitted-level-3);\n",
+ "}\n",
+ "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LogisticRegression(C=30, random_state=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> LogisticRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LogisticRegression(C=30, random_state=10)</pre></div> </div></div></div></div>"
+ ],
+ "text/plain": [
+ "LogisticRegression(C=30, random_state=10)"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "\n",
+ "X_train,X_test, y_train,y_test = train_test_split(X,y,random_state=10)\n",
+ "softmax_reg = LogisticRegression(C=30, random_state=10)\n",
+ "softmax_reg.fit(X_train, y_train) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "softmax_reg.predict([[2.4,1]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0. , 0.33, 0.67]])"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "softmax_reg.predict_proba([[2.4,1]]).round(2)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "notebook",
+ "language": "python",
+ "name": "notebook"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}