From 6cdf5db4e0f2c25f07a98ac9542722d7070860d9 Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Mon, 5 Sep 2022 21:47:48 +0200 Subject: [PATCH] update of jupyter book --- doc/BookChapters/chapter2.do.txt | 299 +- .../_build/.doctrees/chapter2.doctree | Bin 454146 -> 454071 bytes .../_build/.doctrees/environment.pickle | Bin 171525 -> 171521 bytes .../_build/html/_images/chapter2_254_1.png | Bin 0 -> 9297 bytes .../_build/html/_images/chapter2_256_1.png | Bin 0 -> 11129 bytes .../_build/html/_images/chapter2_258_1.png | Bin 0 -> 14655 bytes .../_build/html/_images/chapter2_324_1.png | Bin 0 -> 10217 bytes .../_build/html/_sources/chapter2.ipynb | 2264 +++++++++----- doc/LectureNotes/_build/html/chapter2.html | 666 ++-- doc/LectureNotes/_build/html/searchindex.js | 2 +- .../_build/jupyter_execute/chapter2.ipynb | 2711 +++++++++++------ .../_build/jupyter_execute/chapter2.py | 441 +-- .../_build/jupyter_execute/chapter2_254_1.png | Bin 0 -> 9297 bytes .../_build/jupyter_execute/chapter2_256_1.png | Bin 0 -> 11129 bytes .../_build/jupyter_execute/chapter2_258_1.png | Bin 0 -> 14655 bytes .../_build/jupyter_execute/chapter2_324_1.png | Bin 0 -> 10217 bytes doc/LectureNotes/chapter2.ipynb | 2264 +++++++++----- 17 files changed, 5155 insertions(+), 3492 deletions(-) create mode 100644 doc/LectureNotes/_build/html/_images/chapter2_254_1.png create mode 100644 doc/LectureNotes/_build/html/_images/chapter2_256_1.png create mode 100644 doc/LectureNotes/_build/html/_images/chapter2_258_1.png create mode 100644 doc/LectureNotes/_build/html/_images/chapter2_324_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/chapter2_254_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/chapter2_256_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/chapter2_258_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/chapter2_324_1.png diff --git a/doc/BookChapters/chapter2.do.txt b/doc/BookChapters/chapter2.do.txt index 4f7ab8198..a436a9dc6 100644 --- a/doc/BookChapters/chapter2.do.txt +++ b/doc/BookChapters/chapter2.do.txt @@ -408,7 +408,7 @@ Using the SVD we can obtain the pseudoinverse of a matrix $\bm{A}$ (labeled here \bm{A}_{\mathrm{PI}}= \bm{V}\bm{D}_{\mathrm{PI}}\bm{U}^T, \] !et -where $\bm{D}_{\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\bm{Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD. +where $\bm{D}_{\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\bm{\Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD. !bc pycod @@ -562,14 +562,6 @@ and using the orthogonality of the matrix $\bm{U}$ we have !et We define $\bm{\Sigma}^T\bm{\Sigma}=\tilde{\bm{\Sigma}}^2$ which is a diagonal matrix containing only the singular values squared. It has dimensionality $p \times p$. -This means, using the orthogonality of $\bm{V}$, that we get - -!bt -\[ -\bm{X}^T\bm{X}=\tilde{\bm{\Sigma}}^2. -\] -!et - We can now insert the result for the matrix $\bm{X}^T\bm{X}$ into our equation for ordinary least squares where !bt @@ -581,10 +573,10 @@ and using our SVD decomposition of $\bm{X}$ we have !bt \[ -\tilde{y}_{\mathrm{OLS}}=\bm{U}\bm{\Sigma}\bm{V}^T\tilde{\bm{\Sigma}}^{-2}\bm{V}\bm{\Sigma}^T\bm{U}^T\bm{y}, +\tilde{y}_{\mathrm{OLS}}=\bm{U}\bm{\Sigma}\bm{V}^T\left(\bm{V}\tilde{\bm{\Sigma}}^{2}(\bm{V}^T\right)^{-1}\bm{V}\bm{\Sigma}^T\bm{U}^T\bm{y}, \] !et -which gives us, using the orthogonality of the matrices $\bm{U}$ and $\bm{V}$, +which gives us, using the orthogonality of the matrices $\bm{U}$ and $\bm{V}$,, !bt \[ @@ -592,6 +584,10 @@ which gives us, using the orthogonality of the matrices $\bm{U}$ and $\bm{V}$, \] !et + + + + Note here that when we perform the multiplication of the various matrices, the orthogonal vectors of the matrix $\bm{U}$ !bt \[ @@ -1014,7 +1010,10 @@ which is just \end{bmatrix}, \] !et -where we wrote $$\bm{C}[\bm{x}_0,\bm{x}_1] = \bm{C}[\bm{x}]$$ to indicate that this is the covariance of the vectors $\bm{x}$ of the design/feature matrix $\bm{X}$. + +where we wrote $\bm{C}[\bm{x}_0,\bm{x}_1]=\bm{C}[\bm{x}]$ to indicate +that this is the covariance of the vectors $\bm{x}$ of the +design/feature matrix $\bm{X}$. It is easy to generalize this to a matrix $\bm{X}\in {\mathbb{R}}^{n\times p}$. @@ -1782,282 +1781,6 @@ series of lectures. As a small addendum, we note that you can also solve this problem using the convex optimization package "CVXOPT":"https://cvxopt.org/examples/mlbook/l1regls.html". This requires, in addition to having installed _CVXOPT_, you need to download the file *l1regl.py*. -The following code example solves the simpler problem we discussed above, where we have added the latter python file. - -!bc pycod -from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed -from cvxopt import blas, lapack, solvers, sparse, spmatrix -import math - -try: - import mosek - import sys - __MOSEK = True -except: __MOSEK = False - -if __MOSEK: - - def l1regls_mosek(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize || A*x - b ||_2^2 + e'*u - - subject to -u <= x <= u - - """ - - m, n = A.size - - env = mosek.Env() - task = env.Task(0,0) - task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x)) - - task.appendvars( 2*n) # number of variables - task.appendcons( 2*n) # number of constraints - - # input quadratic objective - Q = matrix(0.0, (n,n)) - blas.syrk(A, Q, alpha = 2.0, trans='T') - - I = [] - for i in range(n): - I.extend(range(i,n)) - - J = [] - for i in range(n): - J.extend((n-i)*[i]) - - task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n])) - task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0]) # setup linear objective - - # input constraint matrix row by row - for i in range(n): - task.putarow( i, [i, n+i], [1.0, -1.0]) - task.putarow( n+i, [i, n+i], [1.0, 1.0]) - - # setup bounds on constraints - task.putboundslice(mosek.accmode.con, - 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0]) - - # setup variable bounds - task.putboundslice(mosek.accmode.var, - 0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0]) - - # optimize the task - task.putobjsense(mosek.objsense.minimize) - task.optimize() - task.solutionsummary(mosek.streamtype.log) - x = n*[0.0] - task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x) - - return matrix(x) - - def l1regls_mosek2(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize w'*w + e'*u - - subject to -u <= x <= u - - A*x - w = b - - """ - - m, n = A.size - - env = mosek.Env() - task = env.Task(0,0) - task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x)) - - task.appendvars(2*n + m) # number of variables - task.appendcons(2*n + m) # number of constraints - - # input quadratic objective - task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0]) - - task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0]) # setup linear objective - - # input constraint matrix row by row - for i in range(n): - task.putarow( i, [i, n+i], [1.0, -1.0]) - task.putarow( n+i, [i, n+i], [1.0, 1.0]) - - for i in range(m): - task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0]) - - # setup bounds on constraints - task.putboundslice(mosek.accmode.con, - 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - 2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b)) - - # setup variable bounds - task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], - (2*n+m)*[0.0], (2*n+m)*[0.0]) - - # optimize the task - task.putobjsense(mosek.objsense.minimize) - task.optimize() - task.solutionsummary(mosek.streamtype.log) - x = n*[0.0] - task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x) - - return matrix(x) - -def l1regls(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize || A*x - b ||_2^2 + || x ||_1. - - """ - - m, n = A.size - q = matrix(1.0, (2*n,1)) - q[:n] = -2.0 * A.T * b - - def P(u, v, alpha = 1.0, beta = 0.0 ): - """ - v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v - """ - v *= beta - v[:n] += alpha * 2.0 * A.T * (A * u[:n]) - - - def G(u, v, alpha=1.0, beta=0.0, trans='N'): - """ - v := alpha*[I, -I; -I, -I] * u + beta * v (trans = 'N' or 'T') - """ - - v *= beta - v[:n] += alpha*(u[:n] - u[n:]) - v[n:] += alpha*(-u[:n] - u[n:]) - - h = matrix(0.0, (2*n,1)) - - - # Customized solver for the KKT system - # - # [ 2.0*A'*A 0 I -I ] [x[:n] ] [bx[:n] ] - # [ 0 0 -I -I ] [x[n:] ] = [bx[n:] ]. - # [ I -I -D1^-1 0 ] [zl[:n]] [bzl[:n]] - # [ -I -I 0 -D2^-1 ] [zl[n:]] [bzl[n:]] - # - # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2. - # - # We first eliminate zl and x[n:]: - # - # ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = - # bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + - # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - - # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] - # - # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) - # - (D2-D1)*(D1+D2)^-1 * x[:n] - # - # zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] ) - # zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ). - # - # The first equation has the form - # - # (A'*A + D)*x[:n] = rhs - # - # and is equivalent to - # - # [ D A' ] [ x:n] ] = [ rhs ] - # [ A -I ] [ v ] [ 0 ]. - # - # It can be solved as - # - # ( A*D^-1*A' + I ) * v = A * D^-1 * rhs - # x[:n] = D^-1 * ( rhs - A'*v ). - - S = matrix(0.0, (m,m)) - Asc = matrix(0.0, (m,n)) - v = matrix(0.0, (m,1)) - - def Fkkt(W): - - # Factor - # - # S = A*D^-1*A' + I - # - # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2. - - d1, d2 = W['di'][:n]**2, W['di'][n:]**2 - - # ds is square root of diagonal of D - ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), - sqrt(d1+d2) ) - d3 = div(d2 - d1, d1 + d2) - - # Asc = A*diag(d)^-1/2 - Asc = A * spdiag(ds**-1) - - # S = I + A * D^-1 * A' - blas.syrk(Asc, S) - S[::m+1] += 1.0 - lapack.potrf(S) - - def g(x, y, z): - - x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + - mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - - mul(d3, z[n:])) ) - x[:n] = div( x[:n], ds) - - # Solve - # - # S * v = 0.5 * A * D^-1 * ( bx[:n] - - # (D2-D1)*(D1+D2)^-1 * bx[n:] + - # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - - # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] ) - - blas.gemv(Asc, x, v) - lapack.potrs(S, v) - - # x[:n] = D^-1 * ( rhs - A'*v ). - blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T') - x[:n] = div(x[:n], ds) - - # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) - # - (D2-D1)*(D1+D2)^-1 * x[:n] - x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 )\ - - mul( d3, x[:n] ) - - # zl[:n] = D1^1/2 * ( x[:n] - x[n:] - bzl[:n] ) - # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ). - z[:n] = mul( W['di'][:n], x[:n] - x[n:] - z[:n] ) - z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) - - return g - - return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n] - - -!ec - - -Then we call the above functions and solve the problem, as done here - -!bc pycod -from cvxopt import matrix, normal - -X = matrix( [ [ 2, 0, 1], [0, 1, 3]]) -y = matrix( [4, 2, 3]) -x = l1regls(X,y) -!ec - -_More text will be added to this example._ ===== Linking the regression analysis with a statistical interpretation ===== diff --git a/doc/LectureNotes/_build/.doctrees/chapter2.doctree b/doc/LectureNotes/_build/.doctrees/chapter2.doctree index 049f4b713cd1d1160787699dbd18b9eab4193d27..d768f0cd1c914f535b4413b3526b365e6a83ab3a 100644 GIT binary patch literal 454071 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

Gjsph(Vxmvr>xCTaEi9JSpqA|< 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 LitugTdGP-Mb1)Nn literal 454146 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 diff --git a/doc/LectureNotes/_build/.doctrees/environment.pickle b/doc/LectureNotes/_build/.doctrees/environment.pickle index 83191776d8f4549c8eb2134ba8b8e5bc2c8e0e72..2f27e45fe4ad9d7c2290ab873fd512d01207764f 100644 GIT binary patch literal 171521 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:m0U8wZu3*5$ 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%0DX_ynl~@F*Yb}PZYTUfE&~45jkXx(>;D|qg znBY(CPf24!*_bB{wW2MFo}+ey@SbssF)UG8fG1XAo6vE(hA`6iW~s{vc8r^v7Qq|Y zhsGIV#H#=@!fOP_YxS}HM~pesaQtCg5`Fl#g83QxHD2|PtG zTBu|62gclJ82z3tiJoJ$?O*}R&#^FpFnj(UbsPr}=|X8#9%M2&djniY z!v?|tO0FZYF4AGW%9uS3)_?jJ3+q;Y<(4K6vqXVruF6pM8_OzfhrA)J*+W{mgnmhBqSHJgm`SjgBu>1#8h5n<|2iJ4%ol~MQm2l zr4BdkJ;nk~uQkPhx2(#WqBRL~h<6(Eqv^~$Y)SMSt?h^D`dhk#glB__Sa7q8oYhAy zbLzJk(N7vTKP{sD8PDh6pCKyzXRDQLIO|tk;Dkxa$BjAEF#f15iJoJ;aVRftaS-QW z(>f^5ozUiu-6}DH-!yJqS_C&`T)|y7&YjXJ6J{)5H)co!>}$3pdJfpi$BPX*pZ2+g zfOo8n;aR)1SM!in86*KJyeOz7OgL5>^P!=#!j?qOQMta6E1oYlv$(k%_lRL6;Y6?m zjApFKh}~t}%(NY9YewZW8{<>KFJZ2+&zLI>zumSZdX8VL=S2M2SQ%q<*0?EYF{S)!={LmPF6tzl~A|4&ZDq ztQj4o=|NrO$?n9pR8zd_n*e&+ml*2z88<#H)VGN=gE7Hia}e|cjA6t#15Oh$T)x6SO{rxz9T~y<@l|Lt<%rs ztuEKW{-iOJ8rUDVCDC)Rw?9!R<_ZpyEQ=R}GZZET1=p88LKnzA7@I<-eT!lKwsG^* z!n{2*Mf_(a|6%G-7RRUK`qgX^H#Oh@PB~n!&>{Y&F@qY!U$-UEbBH&Sy*_>T*kcmf zad)zaqt+w6w|g}Pal^7+O;ffAn_TzGEeW2_p#s}V9k#W`ENQTV;F_qrEA7 z%6N<#v!51^C7HbceFcNnItFKrInXe8%9cdWG3XP!^JwcW?r7)Z^dq({p`3B~0plj6 z#bs><8y50K@Pu?^pC<*OH9A5s81teb^cq_dJx6HA5H=>&kTyA0aS-Nh)R3=Kynu^o zE5VT`K@w%O9~r#Ii2k&(2+|^Yd&bQMZJ-s1pbZqNjwOPs?na-E^!to?)R2CUEs35Z zz5f{9%_n?Gu}NOpj4Xn0G^?OIS=@2w)sQvJsk2ekEora@eAZYrX*J-^jJS7@+m@}4 zXJy+sut*UEkpoO^3)6yCZCI;o!>5h;)wJQ0wj|=(V6i4Cmo<4Skp&6K#UgDK9hgcx!fjzpClpHG;%ECZAsy z?o~RBlhEnF4LUn2@8xi3vnt&7OcmKwY&ULxvZ>I7-o7r}lSIe0`%Gq;$I&^)BNc}>-fxfkDhI)+LG2RFH}> zD;hlKZAtVTo~;z*33p^Q{L}T2u;`pTbT|st%vBk-A2V)fTG(z7!Jcp*mCvc@W!NPk zU8U8-37H;mHD*hL@GZ6^QbX8pn|$>YVdy)=>>^{}aKtT0j>y;F>Cl`*+Ei_yMCzR2C9(s>2rsKy^1?b^-SbKiOSjK6!=SiVGzKqz_Mq9H&Mp+@FY$&2E zi-`Pm77(k;X-K1K`WY%X=vE~bt9HlQAbERSOMOzZm7<}HAgq%0AW?a#{ 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 K?Psax>Hh<|wMn`F literal 171525 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 F{{!}BdsP4c diff --git a/doc/LectureNotes/_build/html/_images/chapter2_254_1.png b/doc/LectureNotes/_build/html/_images/chapter2_254_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ec67fae4fa6daa8ef3a2b9018b568af7b2f4bb GIT binary patch literal 9297 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 DMI<22 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/chapter2_256_1.png b/doc/LectureNotes/_build/html/_images/chapter2_256_1.png new file mode 100644 index 0000000000000000000000000000000000000000..866b6addfdb31f7636bc251a12977550ffb94dc2 GIT binary patch literal 11129 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 gJk-+?F> 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 BXvF{k literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/chapter2_258_1.png b/doc/LectureNotes/_build/html/_images/chapter2_258_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8636c6a831232279300e0997f3ffbe2b13454b GIT binary patch literal 14655 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_sources/chapter2.ipynb b/doc/LectureNotes/_build/html/_sources/chapter2.ipynb index fc1dc3fa0..8bb203708 100644 --- a/doc/LectureNotes/_build/html/_sources/chapter2.ipynb +++ b/doc/LectureNotes/_build/html/_sources/chapter2.ipynb @@ -2,23 +2,45 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "id": "7146aabe", + "metadata": { + "editable": true + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "383d5dba", + "metadata": { + "editable": true + }, + "source": [ + "# Ridge and Lasso Regression" + ] + }, + { + "cell_type": "markdown", + "id": "08812109", + "metadata": { + "editable": true + }, "source": [ - "# Ridge and Lasso Regression\n", - "\n", - "\n", - "\n", "## Mathematical Interpretation of Ordinary Least Squares\n", "\n", "What is presented here is a mathematical analysis of various regression algorithms (ordinary least squares, Ridge and Lasso Regression). The analysis is based on an important algorithm in linear algebra, the so-called Singular Value Decomposition (SVD). \n", "\n", - "\n", "We have shown that in ordinary least squares (OLS) the optimal parameters $\\beta$ are given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "04ce00fc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -27,7 +49,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "88d4cd43", + "metadata": { + "editable": true + }, "source": [ "The **hat** over $\\boldsymbol{\\beta}$ means we have the optimal parameters after minimization of the cost function.\n", "\n", @@ -36,7 +61,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b95f6106", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -45,14 +73,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2ee3b8e9", + "metadata": { + "editable": true + }, "source": [ "We now define a matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "72f7dde8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T.\n", @@ -61,14 +95,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b092bc7", + "metadata": { + "editable": true + }, "source": [ "We can rewrite" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "44b3e758", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{A}\\boldsymbol{y}.\n", @@ -77,20 +117,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6cec4c92", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{A}$ has the important property that $\\boldsymbol{A}^2=\\boldsymbol{A}$. This is the definition of a [projection matrix](https://en.wikipedia.org/wiki/Projection_matrix).\n", "We can then interpret our optimal model $\\tilde{\\boldsymbol{y}}$ as being represented by an orthogonal projection of $\\boldsymbol{y}$ onto a space defined by the column vectors of $\\boldsymbol{X}$. In our case here the matrix $\\boldsymbol{A}$ is a square matrix. If it is a general rectangular matrix we have an oblique projection matrix.\n", "\n", - "\n", - "\n", - "\n", "We have defined the residual error as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef64424c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=\\left[\\boldsymbol{I}-\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\right]\\boldsymbol{y}.\n", @@ -99,17 +142,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cad57da0", + "metadata": { + "editable": true + }, "source": [ "The residual errors are then the projections of $\\boldsymbol{y}$ onto the orthogonal component of the space defined by the column vectors of $\\boldsymbol{X}$.\n", "\n", - "\n", "If the matrix $\\boldsymbol{X}$ is an orthogonal (or unitary in case of complex values) matrix, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "94355d54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{X}\\boldsymbol{X}^T = \\boldsymbol{I}.\n", @@ -118,14 +166,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c1ccdf5", + "metadata": { + "editable": true + }, "source": [ "In this case the matrix $\\boldsymbol{A}$ becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0d943ee1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T)=\\boldsymbol{I},\n", @@ -134,14 +188,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f951392", + "metadata": { + "editable": true + }, "source": [ "and we have the obvious case" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce1a6d6f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=0.\n", @@ -150,16 +210,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2861bd8e", + "metadata": { + "editable": true + }, + "source": [ + "This serves also as a useful test of our codes." + ] + }, + { + "cell_type": "markdown", + "id": "1dfaffdb", + "metadata": { + "editable": true + }, "source": [ - "This serves also as a useful test of our codes. \n", - "\n", - "\n", - "\n", - "\n", "## The singular value decomposition\n", "\n", - "\n", "The examples we have looked at so far are cases where we normally can\n", "invert the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$. Using a polynomial expansion where we fit of various functions leads to\n", "row vectors of the design matrix which are essentially orthogonal due\n", @@ -167,7 +234,6 @@ "design matrix is then often done via a so-called LU, QR or Cholesky\n", "decomposition.\n", "\n", - "\n", "As we will also see in the first project, \n", "this may\n", "however not the be case in general and a standard matrix inversion\n", @@ -191,9 +257,6 @@ "in the principal component analysis where high-dimensional data can be\n", "reduced to the statistically relevant features.\n", "\n", - "\n", - "\n", - "\n", "One of the typical problems we encounter with linear regression, in particular \n", "when the matrix $\\boldsymbol{X}$ (our so-called design matrix) is high-dimensional, \n", "are problems with near singular or singular matrices. The column vectors of $\\boldsymbol{X}$ \n", @@ -204,7 +267,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3e091b51", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -224,7 +290,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fcbdb36", + "metadata": { + "editable": true + }, "source": [ "The columns of $\\boldsymbol{X}$ are linearly dependent. We see this easily since the \n", "the first column is the row-wise sum of the other two columns. The rank (more correct,\n", @@ -238,7 +307,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f35594a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -254,19 +326,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "093183cd", + "metadata": { + "editable": true + }, "source": [ "We see easily that $\\mbox{det}(\\boldsymbol{X}) = x_{11} x_{22} - x_{12} x_{21} = 1 \\times (-1) - 1 \\times (-1) = 0$. Hence, $\\mathbf{X}$ is singular and its inverse is undefined.\n", "This is equivalent to saying that the matrix $\\boldsymbol{X}$ has at least an eigenvalue which is zero.\n", "\n", - "\n", - "\n", "If our design matrix $\\boldsymbol{X}$ which enters the linear regression problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7a22cf10", + "metadata": { + "editable": true + }, "source": [ "\n", "

\n", @@ -281,7 +357,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a66feb94", + "metadata": { + "editable": true + }, "source": [ "has linearly dependent column vectors, we will not be able to compute the inverse\n", "of $\\boldsymbol{X}^T\\boldsymbol{X}$ and we cannot find the parameters (estimators) $\\beta_i$. \n", @@ -294,7 +373,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5b5978a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^{T} \\boldsymbol{X} \\rightarrow \\boldsymbol{X}^{T} \\boldsymbol{X}+\\lambda \\boldsymbol{I},\n", @@ -303,16 +385,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bed64679", + "metadata": { + "editable": true + }, + "source": [ + "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later." + ] + }, + { + "cell_type": "markdown", + "id": "860c9b6d", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later. \n", - "\n", - "\n", - "\n", - "\n", "## Basic math of the SVD\n", "\n", - "\n", "From standard linear algebra we know that a square matrix $\\boldsymbol{X}$ can be diagonalized if and only it is \n", "a so-called [normal matrix](https://en.wikipedia.org/wiki/Normal_matrix), that is if $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$\n", "we have $\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ or if $\\boldsymbol{X}\\in {\\mathbb{C}}^{n\\times n}$ we have $\\boldsymbol{X}\\boldsymbol{X}^{\\dagger}=\\boldsymbol{X}^{\\dagger}\\boldsymbol{X}$.\n", @@ -321,7 +410,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "724355a3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\lambda_1,\\boldsymbol{u}_1),\\dots, (\\lambda_n,\\boldsymbol{u}_n),\n", @@ -330,14 +422,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "80fea225", + "metadata": { + "editable": true + }, "source": [ "and the eigenvalues are given by the diagonal matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a7bc845", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\\mathrm{Diag}(\\lambda_1, \\dots,\\lambda_n).\n", @@ -346,14 +444,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "789f1977", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ can be written in terms of an orthogonal/unitary transformation $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "56e422f4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -362,7 +466,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f015c981", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{I}$ or $\\boldsymbol{U}\\boldsymbol{U}^{\\dagger}=\\boldsymbol{I}$.\n", "\n", @@ -371,7 +478,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "dfd219d0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\begin{bmatrix} \n", @@ -383,15 +493,14 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9992b4d2", + "metadata": { + "editable": true + }, "source": [ "is not diagonalizable, it is a so-called [defective matrix](https://en.wikipedia.org/wiki/Defective_matrix). It is easy to see that the condition\n", "$\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ is not fulfilled. \n", "\n", - "\n", - "\n", - "\n", - "\n", "However, and this is the strength of the SVD algorithm, any general\n", "matrix $\\boldsymbol{X}$ can be decomposed in terms of a diagonal matrix and\n", "two orthogonal/unitary matrices. The [Singular Value Decompostion\n", @@ -405,7 +514,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e41ce3a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\n", @@ -414,14 +526,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "916148d2", + "metadata": { + "editable": true + }, "source": [ "As an example, the above defective matrix can be decomposed as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8488b628", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& 1 \\\\ 1& -1\\\\ \\end{bmatrix} \\begin{bmatrix} 2& 0 \\\\ 0& 0\\\\ \\end{bmatrix} \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& -1 \\\\ 1& 1\\\\ \\end{bmatrix}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -430,7 +548,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb7bb105", + "metadata": { + "editable": true + }, "source": [ "with eigenvalues $\\sigma_1=2$ and $\\sigma_2=0$. \n", "The SVD exits always! \n", @@ -453,7 +574,6 @@ "\n", "The columns of $\\boldsymbol{U}$ are called the left singular vectors while the columns of $\\boldsymbol{V}$ are the right singular vectors.\n", "\n", - "\n", "If we assume that $n > p$, then our matrix $\\boldsymbol{U}$ has dimension $n\n", "\\times n$. The last $n-p$ columns of $\\boldsymbol{U}$ become however\n", "irrelevant in our calculations since they are multiplied with the\n", @@ -469,14 +589,23 @@ "If $n > p$, we keep only the first $p$ columns of $\\boldsymbol{U}$ and $\\boldsymbol{\\Sigma}$ has dimension $p\\times p$. \n", "If $p > n$, then only the first $n$ columns of $\\boldsymbol{V}$ are computed and $\\boldsymbol{\\Sigma}$ has dimension $n\\times n$.\n", "The $n=p$ case is obvious, we retain the full SVD. \n", - "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy.\n", - "\n", + "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy." + ] + }, + { + "cell_type": "markdown", + "id": "86e39aa0", + "metadata": { + "editable": true + }, + "source": [ "## Codes for the SVD" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, + "id": "9c3ae0cf", "metadata": { "collapsed": false, "editable": true @@ -516,7 +645,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5e02d16", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ has columns that are linearly dependent. The first\n", "column is the row-wise sum of the other two columns. The rank of a\n", @@ -527,8 +659,6 @@ "inversion algorithm for matrix inversion with $\\boldsymbol{X}^T\\boldsymbol{X}$ results\n", "in the program terminating due to a singular matrix.\n", "\n", - "\n", - "\n", "The $U$, $S$, and $V$ matrices returned from the **svd()** function\n", "cannot be multiplied directly.\n", "\n", @@ -540,9 +670,16 @@ "\n", "If you wish to include the zero singular values, you will need to\n", "resize the matrices and set up a diagonal matrix as done in the above\n", - "example\n", - "\n", - "\n", + "example" + ] + }, + { + "cell_type": "markdown", + "id": "ceac1ca3", + "metadata": { + "editable": true + }, + "source": [ "## Code for SVD and Inversion of Matrices\n", "\n", "How do we use the SVD to invert a matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ which is singular or near singular?\n", @@ -551,7 +688,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, + "id": "15a9c8e8", "metadata": { "collapsed": false, "editable": true @@ -563,14 +701,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a6e5469", + "metadata": { + "editable": true + }, "source": [ "Let us first look at a matrix which does not causes problems and write our own function where we just use the SVD." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, + "id": "ef3b6935", "metadata": { "collapsed": false, "editable": true @@ -610,7 +752,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "155ca008", + "metadata": { + "editable": true + }, "source": [ "Although our matrix to invert $\\boldsymbol{X}^T\\boldsymbol{X}$ is a square matrix, our matrix may be singular. \n", "\n", @@ -625,7 +770,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "da493b94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}_{\\mathrm{PI}}= \\boldsymbol{V}\\boldsymbol{D}_{\\mathrm{PI}}\\boldsymbol{U}^T,\n", @@ -634,14 +782,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8bf214ea", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." + "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{\\Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, + "id": "e437b5d9", "metadata": { "collapsed": false, "editable": true @@ -675,14 +827,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e711d30f", + "metadata": { + "editable": true + }, + "source": [ + "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**." + ] + }, + { + "cell_type": "markdown", + "id": "a0ba9d2f", + "metadata": { + "editable": true + }, "source": [ - "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**.\n", - "\n", - "\n", - "\n", - "\n", - "\n", "## Mathematics of the SVD and implications\n", "\n", "Let us take a closer look at the mathematics of the SVD and the various implications for machine learning studies.\n", @@ -692,7 +851,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "90951d11", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -708,14 +870,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91ff188a", + "metadata": { + "editable": true + }, "source": [ "We can SVD decompose our matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "61b2e6d7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -724,7 +892,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a5bf286", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{U}$ is an orthogonal matrix of dimension $n\\times n$, meaning that $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{U}^T\\boldsymbol{U}=\\boldsymbol{I}_n$. Here $\\boldsymbol{I}_n$ is the unit matrix of dimension $n \\times n$.\n", "\n", @@ -735,7 +906,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1bd0e480", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sigma_0 > \\sigma_1 > \\sigma_2 > \\dots > \\sigma_{p-1} > 0.\n", @@ -744,17 +918,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6133bbea", + "metadata": { + "editable": true + }, "source": [ "All values beyond $p-1$ are all zero.\n", "\n", - "\n", "As an example, consider the following $3\\times 2$ example for the matrix $\\boldsymbol{\\Sigma}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2f4ec9c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -768,14 +947,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d8e91a1a", + "metadata": { + "editable": true + }, "source": [ "The singular values are $\\sigma_0=2$ and $\\sigma_1=1$. It is common to rewrite the matrix $\\boldsymbol{\\Sigma}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66510064", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -788,14 +973,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0de239cf", + "metadata": { + "editable": true + }, "source": [ "where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae4894a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{\\Sigma}}=\n", @@ -808,14 +999,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "928421c0", + "metadata": { + "editable": true + }, "source": [ "contains only the singular values. Note also (and we will use this below) that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f707ba94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\n", @@ -828,14 +1025,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2169a96", + "metadata": { + "editable": true + }, "source": [ "which is a $2\\times 2 $ matrix while" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd7213a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T=\n", @@ -849,20 +1052,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "014bf918", + "metadata": { + "editable": true + }, "source": [ "is a $3\\times 3 $ matrix. The last row and column of this last matrix\n", "contain only zeros. This will have important consequences for our SVD\n", "decomposition of the design matrix.\n", "\n", - "\n", - "\n", "The matrix that may cause problems for us is $\\boldsymbol{X}^T\\boldsymbol{X}$. Using the SVD we can rewrite this matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5b371d72", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -871,14 +1078,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5fdd06fb", + "metadata": { + "editable": true + }, "source": [ "and using the orthogonality of the matrix $\\boldsymbol{U}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "416109ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -887,32 +1100,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "38a7766d", + "metadata": { + "editable": true + }, "source": [ "We define $\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\\tilde{\\boldsymbol{\\Sigma}}^2$ which is a diagonal matrix containing only the singular values squared. It has dimensionality $p \\times p$.\n", "\n", - "This means, using the orthogonality of $\\boldsymbol{V}$, that we get" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\boldsymbol{X}^T\\boldsymbol{X}=\\tilde{\\boldsymbol{\\Sigma}}^2.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ "We can now insert the result for the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ into our equation for ordinary least squares where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "18839f7b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -921,30 +1124,42 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b743da67", + "metadata": { + "editable": true + }, "source": [ "and using our SVD decomposition of $\\boldsymbol{X}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b91982c5", + "metadata": { + "editable": true + }, "source": [ "$$\n", - "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\tilde{\\boldsymbol{\\Sigma}}^{-2}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", + "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\left(\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^{2}(\\boldsymbol{V}^T\\right)^{-1}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", "$$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "310034bb", + "metadata": { + "editable": true + }, "source": [ - "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$," + "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$,," ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "efadf88e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_i\\boldsymbol{u}^T_j\\boldsymbol{y},\n", @@ -953,14 +1168,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "293eece5", + "metadata": { + "editable": true + }, "source": [ "Note here that when we perform the multiplication of the various matrices, the orthogonal vectors of the matrix $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66ead26c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{U}=[\\boldsymbol{u}_0,\\boldsymbol{u}_1,\\dots,\\boldsymbol{u}_{n-1}],\n", @@ -969,13 +1190,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "67b71310", + "metadata": { + "editable": true + }, "source": [ "that belong to $i>p-1$, result in only zeros when we perform the multiplications. This means that the sum above has non-zero elements only up to $i=p-1$. This corresponds also to the number of singular values (these are all non-zero).\n", "\n", - "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$.\n", - "\n", - "\n", + "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$." + ] + }, + { + "cell_type": "markdown", + "id": "fa804884", + "metadata": { + "editable": true + }, + "source": [ "## Further properties (important for our analyses later)\n", "\n", "Let us study again $\\boldsymbol{X}^T\\boldsymbol{X}$ in terms of our SVD," @@ -983,7 +1214,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ac661f44", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -992,14 +1226,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1d195b3c", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "38865678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}.\n", @@ -1008,7 +1248,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "07a7126d", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$ are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$\n", "with eigenvalues given by the singular values squared, that is" @@ -1016,7 +1259,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1375bb2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1025,14 +1271,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b32590d", + "metadata": { + "editable": true + }, "source": [ "Similarly, if we use the SVD decomposition for the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bfefb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T.\n", @@ -1041,14 +1293,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9a62b75", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{U}$ (using the orthogonality of $\\boldsymbol{U}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c591bfc0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{U}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T.\n", @@ -1057,7 +1315,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d7fa31d3", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{u}_i$ of the orthogonal matrix $\\boldsymbol{U}$ are the eigenvectors of the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$\n", "with eigenvalues given by the singular values squared, that is" @@ -1065,7 +1326,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d132cee3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{u}_i=\\boldsymbol{u}_i\\sigma_i^2.\n", @@ -1074,7 +1338,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7aa7f89c", + "metadata": { + "editable": true + }, "source": [ "**Important note**: we have defined our design matrix $\\boldsymbol{X}$ to be an\n", "$n\\times p$ matrix. In most supervised learning cases we have that $n\n", @@ -1084,12 +1351,18 @@ "always refer to the number of features in our data set, while the\n", "number of rows represents the number of data inputs. Note that in\n", "other texts you may find the opposite notation. This has consequences\n", - "for the definition of for example the covariance matrix and its relation to the SVD.\n", - "\n", - "\n", + "for the definition of for example the covariance matrix and its relation to the SVD." + ] + }, + { + "cell_type": "markdown", + "id": "8e546bb5", + "metadata": { + "editable": true + }, + "source": [ "## Meet the Covariance Matrix\n", "\n", - "\n", "Before we move on to a discussion of Ridge and Lasso regression, we want to show an important example of the above.\n", "\n", "We have already noted that the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ in ordinary\n", @@ -1099,7 +1372,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "96d8b53c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial^2 C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}^T\\partial \\boldsymbol{\\beta}} =\\frac{2}{n}\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1108,7 +1384,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7e05a9b", + "metadata": { + "editable": true + }, "source": [ "This quantity defines was what is called the Hessian matrix (the second derivative of a function we want to optimize).\n", "\n", @@ -1117,7 +1396,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "55fd14e4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H}=\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1126,15 +1408,16 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "09320523", + "metadata": { + "editable": true + }, "source": [ "The Hessian matrix for ordinary least squares is also proportional to\n", "the covariance matrix. This means also that we can use the SVD to find\n", "the eigenvalues of the covariance matrix and the Hessian matrix in\n", "terms of the singular values. Let us develop these arguments, as they will play an important role in our machine learning studies.\n", "\n", - "\n", - "\n", "Before we discuss the link between for example Ridge regression and the singular value decomposition, we need to remind ourselves about\n", "the definition of the covariance and the correlation function. These are quantities that play a central role in machine learning methods.\n", "\n", @@ -1144,7 +1427,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "23b5cf2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1155,14 +1441,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "136c43bc", + "metadata": { + "editable": true + }, "source": [ "where for example" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b52fc8e3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] =\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})(y_i- \\overline{y}).\n", @@ -1171,14 +1463,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fe153c88", + "metadata": { + "editable": true + }, "source": [ "With this definition and recalling that the variance is defined as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea57dd81", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{var}[\\boldsymbol{x}]=\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})^2,\n", @@ -1187,14 +1485,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8154bc8", + "metadata": { + "editable": true + }, "source": [ "we can rewrite the covariance matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "081adf91", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1205,7 +1509,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d61424f0", + "metadata": { + "editable": true + }, "source": [ "**Note:** we have used $1/n$ in the above definitions of the *sample* variance and covariance. We assume then that we can calculate the exact mean value. \n", "What you will find in essentially all statistics texts are equations\n", @@ -1216,7 +1523,6 @@ "**Scikit-Learn** or **nunmpy's** function calculate the covariance, this\n", "quantity will be computed with a factor $1/(n-1)$.\n", "\n", - "\n", "The covariance takes values between zero and infinity and may thus\n", "lead to problems with loss of numerical precision for particularly\n", "large values. It is common to scale the covariance matrix by\n", @@ -1226,7 +1532,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f517794", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]=\\frac{\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}]}{\\sqrt{\\mathrm{var}[\\boldsymbol{x}] \\mathrm{var}[\\boldsymbol{y}]}}.\n", @@ -1235,7 +1544,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "27c43f34", + "metadata": { + "editable": true + }, "source": [ "The correlation function is then given by values $\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]\n", "\\in [-1,1]$. This avoids eventual problems with too large values. We\n", @@ -1245,7 +1557,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "35ac64e2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} 1 & \\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1256,19 +1571,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ec11e59", + "metadata": { + "editable": true + }, "source": [ "In the above example this is the function we constructed using **pandas**.\n", "\n", - "\n", - "\n", "In our derivation of the various regression algorithms like **Ordinary Least Squares** or **Ridge regression**\n", "we defined the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d1a1a24", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1284,7 +1603,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b12f1560", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors/features $p$ refering to the column numbers and the\n", "entries $n$ being the row elements.\n", @@ -1293,7 +1615,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7975e5ec", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix} \\boldsymbol{x}_0 & \\boldsymbol{x}_1 & \\boldsymbol{x}_2 & \\dots & \\dots & \\boldsymbol{x}_{p-1}\\end{bmatrix},\n", @@ -1302,14 +1627,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4628dae3", + "metadata": { + "editable": true + }, "source": [ "with a given vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "6acd55ed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_i^T = \\begin{bmatrix}x_{0,i} & x_{1,i} & x_{2,i}& \\dots & \\dots x_{n-1,i}\\end{bmatrix}.\n", @@ -1318,7 +1649,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "15268d5e", + "metadata": { + "editable": true + }, "source": [ "With these definitions, we can now rewrite our $2\\times 2$\n", "correlation/covariance matrix in terms of a moe general design/feature\n", @@ -1328,7 +1662,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f7cc7e46", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1344,14 +1681,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91f506bb", + "metadata": { + "editable": true + }, "source": [ "and the correlation matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f65d15d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1367,7 +1710,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4dda44f3", + "metadata": { + "editable": true + }, "source": [ "The Numpy function **np.cov** calculates the covariance elements using\n", "the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have\n", @@ -1380,7 +1726,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a6e7b9b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{W} = \\begin{bmatrix} x_0 & x_1 & x_2 & \\dots & x_{n-2} & x_{n-1} \\\\\n", @@ -1391,7 +1740,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d907b263", + "metadata": { + "editable": true + }, "source": [ "which in turn is converted into into the $2\\times 2$ covariance matrix\n", "$\\boldsymbol{C}$ via the Numpy function **np.cov()**. We note that we can also calculate\n", @@ -1402,7 +1754,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, + "id": "8dbb102f", "metadata": { "collapsed": false, "editable": true @@ -1423,7 +1776,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "25852e86", + "metadata": { + "editable": true + }, "source": [ "The previous example can be converted into the correlation matrix by\n", "simply scaling the matrix elements with the variances. We should also\n", @@ -1434,7 +1790,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, + "id": "cb3ee7b6", "metadata": { "collapsed": false, "editable": true @@ -1466,7 +1823,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6f2860ea", + "metadata": { + "editable": true + }, "source": [ "We see that the matrix elements along the diagonal are one as they\n", "should be and that the matrix is symmetric. Furthermore, diagonalizing\n", @@ -1474,14 +1834,13 @@ "\n", "The above procedure with **numpy** can be made more compact if we use **pandas**.\n", "\n", - "\n", - "\n", "We whow here how we can set up the correlation matrix using **pandas**, as done in this simple code" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, + "id": "48781620", "metadata": { "collapsed": false, "editable": true @@ -1506,14 +1865,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4ccdedad", + "metadata": { + "editable": true + }, "source": [ "We expand this model to the Franke function discussed earlier." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, + "id": "e4090257", "metadata": { "collapsed": false, "editable": true @@ -1567,7 +1930,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6547bf2f", + "metadata": { + "editable": true + }, "source": [ "We note here that the covariance is zero for the first rows and\n", "columns since all matrix elements in the design matrix were set to one\n", @@ -1578,14 +1944,15 @@ "drop these elements and construct a correlation\n", "matrix without these elements. \n", "\n", - "\n", - "\n", "We can rewrite the covariance matrix in a more compact form in terms of the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4e26eab7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}= \\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}].\n", @@ -1594,14 +1961,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7f6a0df9", + "metadata": { + "editable": true + }, "source": [ "To see this let us simply look at a design matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{2\\times 2}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff73ba2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1615,14 +1988,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae6e2e42", + "metadata": { + "editable": true + }, "source": [ "If we then compute the expectation value (note the $1/n$ factor instead of $1/(n-1)$)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "87a8dccc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}=\\frac{1}{n}\\begin{bmatrix}\n", @@ -1634,14 +2013,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1db8e000", + "metadata": { + "editable": true + }, "source": [ "which is just" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "59e0c46d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]=\\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}_0] & \\mathrm{cov}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] \\\\\n", @@ -1652,14 +2037,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce39f8d0", + "metadata": { + "editable": true + }, "source": [ - "where we wrote $$\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]$$ to indicate that this is the covariance of the vectors $\\boldsymbol{x}$ of the design/feature matrix $\\boldsymbol{X}$.\n", - "\n", - "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$.\n", - "\n", - "\n", + "where we wrote $\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1]=\\boldsymbol{C}[\\boldsymbol{x}]$ to indicate\n", + "that this is the covariance of the vectors $\\boldsymbol{x}$ of the\n", + "design/feature matrix $\\boldsymbol{X}$.\n", "\n", + "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$." + ] + }, + { + "cell_type": "markdown", + "id": "526f22b3", + "metadata": { + "editable": true + }, + "source": [ "## Linking with the SVD\n", "\n", "We saw earlier that" @@ -1667,7 +2063,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5d16d7c8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -1676,14 +2075,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11a74368", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $p\\times p$, with $p$ corresponding to the singular values, we defined earlier the matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0ca3614f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma} = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1692,14 +2097,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b98abb6c", + "metadata": { + "editable": true + }, "source": [ "where the tilde-matrix $\\tilde{\\boldsymbol{\\Sigma}}$ is a matrix of dimension $p\\times p$ containing only the singular values $\\sigma_i$, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "813567cc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{\\Sigma}}=\\begin{bmatrix} \\sigma_0 & 0 & 0 & \\dots & 0 & 0 \\\\\n", @@ -1713,14 +2124,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ed905c7b", + "metadata": { + "editable": true + }, "source": [ "meaning we can write" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0136bdac", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2\\boldsymbol{V}^T.\n", @@ -1729,14 +2146,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d43e6609", + "metadata": { + "editable": true + }, "source": [ "Multiplying from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "15d2bb49", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2.\n", @@ -1745,7 +2168,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "374104f4", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$\n", "are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ with eigenvalues\n", @@ -1754,7 +2180,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "86f4db59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1763,7 +2192,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9d007f11", + "metadata": { + "editable": true + }, "source": [ "In other words, each non-zero singular value of $\\boldsymbol{X}$ is a positive\n", "square root of an eigenvalue of $\\boldsymbol{X}^T\\boldsymbol{X}$. It means also that\n", @@ -1773,7 +2205,6 @@ "$\\boldsymbol{v}_i$ are hierarchically ordered by how much correlation they\n", "encode from the columns of $\\boldsymbol{X}$. \n", "\n", - "\n", "Note that these are also the eigenvectors and eigenvalues of the\n", "Hessian matrix.\n", "\n", @@ -1783,7 +2214,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03c93eed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{X}]=\\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X},\n", @@ -1792,7 +2226,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3ee37fac", + "metadata": { + "editable": true + }, "source": [ "meaning that every squared non-singular value of $\\boldsymbol{X}$ divided by $n$ (\n", "the number of samples) are the eigenvalues of the covariance\n", @@ -1801,13 +2238,15 @@ "self-adjoint, the singular values of $\\boldsymbol{X}$ are equal to the\n", "absolute value of the eigenvalues of $\\boldsymbol{X}$.\n", "\n", - "\n", "For $\\boldsymbol{X}\\boldsymbol{X}^T$ we found" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "13290881", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{U}^T.\n", @@ -1816,14 +2255,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3896b3e6", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $n\\times n$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ca47bd66", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\boldsymbol{0}\\\\ \\end{bmatrix}=\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1832,14 +2277,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1513e1d0", + "metadata": { + "editable": true + }, "source": [ "leading to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b9bf25a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\boldsymbol{U}^T.\n", @@ -1848,14 +2299,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2eeb03c8", + "metadata": { + "editable": true + }, "source": [ "Multiplying with $\\boldsymbol{U}$ from the right gives us the eigenvalue problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "da278d8e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{X}\\boldsymbol{X}^T)\\boldsymbol{U}=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}.\n", @@ -1864,7 +2321,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2b341903", + "metadata": { + "editable": true + }, "source": [ "It means that the eigenvalues of $\\boldsymbol{X}\\boldsymbol{X}^T$ are again given by\n", "the non-zero singular values plus now a series of zeros. The column\n", @@ -1873,11 +2333,16 @@ "\n", "Since we will mainly be interested in the correlations among the features\n", "of our data (the columns of $\\boldsymbol{X}$, the quantity of interest for us are the non-zero singular\n", - "values and the column vectors of $\\boldsymbol{V}$.\n", - "\n", - "\n", - "\n", - "\n", + "values and the column vectors of $\\boldsymbol{V}$." + ] + }, + { + "cell_type": "markdown", + "id": "e66723d1", + "metadata": { + "editable": true + }, + "source": [ "## Ridge and Lasso Regression\n", "\n", "Let us remind ourselves about the expression for the standard Mean Squared Error (MSE) which we used to define our cost function and the equations for the ordinary least squares (OLS) method, that is \n", @@ -1886,7 +2351,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "85cff01a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n", @@ -1895,14 +2363,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c3bdf4f5", + "metadata": { + "editable": true + }, "source": [ "or we can state it as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1306ed38", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1912,14 +2386,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "00474af5", + "metadata": { + "editable": true + }, "source": [ "where we have used the definition of a norm-2 vector, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "346ae1ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_2 = \\sqrt{\\sum_i x_i^2}.\n", @@ -1928,7 +2408,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "36f83c2a", + "metadata": { + "editable": true + }, "source": [ "By minimizing the above equation with respect to the parameters\n", "$\\boldsymbol{\\beta}$ we could then obtain an analytical expression for the\n", @@ -1938,7 +2421,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb246827", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1948,7 +2434,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d38c34b0", + "metadata": { + "editable": true + }, "source": [ "which leads to the Ridge regression minimization problem where we\n", "require that $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2^2\\le t$, where $t$ is\n", @@ -1957,7 +2446,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e3f2141f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\frac{1}{n}\\vert\\vert \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\vert\\vert_2^2+\\lambda\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -1966,14 +2458,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "74f56599", + "metadata": { + "editable": true + }, "source": [ "we have a new optimization equation" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea246d4b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1983,7 +2481,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c6b1faa8", + "metadata": { + "editable": true + }, "source": [ "which leads to Lasso regression. Lasso stands for least absolute shrinkage and selection operator. \n", "\n", @@ -1992,7 +2493,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2fc09f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_1 = \\sum_i \\vert x_i\\vert.\n", @@ -2001,14 +2505,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a9f2c69a", + "metadata": { + "editable": true + }, "source": [ "Using the matrix-vector expression for Ridge regression and dropping the parameter $1/n$ in front of the standard means squared error equation, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fb35c59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\boldsymbol{\\beta}^T\\boldsymbol{\\beta},\n", @@ -2017,7 +2527,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2e7636c6", + "metadata": { + "editable": true + }, "source": [ "and \n", "taking the derivatives with respect to $\\boldsymbol{\\beta}$ we obtain then\n", @@ -2028,7 +2541,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51bd5332", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{Ridge}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2037,14 +2553,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbd07896", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{I}$ being a $p\\times p$ identity matrix with the constraint that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "39cd7db8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sum_{i=0}^{p-1} \\beta_i^2 \\leq t,\n", @@ -2053,7 +2575,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "245333af", + "metadata": { + "editable": true + }, "source": [ "with $t$ a finite positive number. \n", "\n", @@ -2062,7 +2587,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ea29678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2071,26 +2599,29 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ad883534", + "metadata": { + "editable": true + }, "source": [ "which can lead to singular matrices. However, with the SVD, we can always compute the inverse of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$.\n", "\n", - "\n", "We see that Ridge regression is nothing but the standard OLS with a\n", "modified diagonal term added to $\\boldsymbol{X}^T\\boldsymbol{X}$. The consequences, in\n", "particular for our discussion of the bias-variance tradeoff are rather\n", "interesting. We will see that for specific values of $\\lambda$, we may\n", "even reduce the variance of the optimal parameters $\\boldsymbol{\\beta}$. These topics and other related ones, will be discussed after the more linear algebra oriented analysis here.\n", "\n", - "\n", - "\n", "Using our insights about the SVD of the design matrix $\\boldsymbol{X}$ \n", "We have already analyzed the OLS solutions in terms of the eigenvectors (the columns) of the right singular value matrix $\\boldsymbol{U}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "54e5791f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{OLS}}=\\boldsymbol{X}\\boldsymbol{\\beta} =\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}.\n", @@ -2099,14 +2630,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c406bcb3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression this becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1a6f9659", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{Ridge}}=\\boldsymbol{X}\\boldsymbol{\\beta}_{\\mathrm{Ridge}} = \\boldsymbol{U\\Sigma V^T}\\left(\\boldsymbol{V}\\boldsymbol{\\Sigma}^2\\boldsymbol{V}^T+\\lambda\\boldsymbol{I} \\right)^{-1}(\\boldsymbol{U\\Sigma V^T})^T\\boldsymbol{y}=\\sum_{j=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda}\\boldsymbol{y},\n", @@ -2115,18 +2652,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e2edbb3a", + "metadata": { + "editable": true + }, "source": [ "with the vectors $\\boldsymbol{u}_j$ being the columns of $\\boldsymbol{U}$ from the SVD of the matrix $\\boldsymbol{X}$. \n", "\n", - "\n", - "\n", "Since $\\lambda \\geq 0$, it means that compared to OLS, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "402353ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda} \\leq 1.\n", @@ -2135,7 +2676,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "423b6396", + "metadata": { + "editable": true + }, "source": [ "Ridge regression finds the coordinates of $\\boldsymbol{y}$ with respect to the\n", "orthonormal basis $\\boldsymbol{U}$, it then shrinks the coordinates by\n", @@ -2145,14 +2689,15 @@ "\n", "For small eigenvalues $\\sigma_i$ it means that their contributions become less important, a fact which can be used to reduce the number of degrees of freedom. More about this when we have covered the material on a statistical interpretation of various linear regression methods.\n", "\n", - "\n", - "\n", "For the sake of simplicity, let us assume that the design matrix is orthonormal, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f1d49878", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=(\\boldsymbol{X}^T\\boldsymbol{X})^{-1} =\\boldsymbol{I}.\n", @@ -2161,14 +2706,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "29e021c6", + "metadata": { + "editable": true + }, "source": [ "In this case the standard OLS results in" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ea41670", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{OLS}} = \\boldsymbol{X}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\boldsymbol{y},\n", @@ -2177,14 +2728,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5c24d1b", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5cde9430", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{Ridge}} = \\left(\\boldsymbol{I}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}=\\left(1+\\lambda\\right)^{-1}\\boldsymbol{\\beta}^{\\mathrm{OLS}},\n", @@ -2193,7 +2750,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8725e06", + "metadata": { + "editable": true + }, "source": [ "that is the Ridge estimator scales the OLS estimator by the inverse of a factor $1+\\lambda$, and\n", "the Ridge estimator converges to zero when the hyperparameter goes to\n", @@ -2201,14 +2761,15 @@ "\n", "We will come back to more interpreations after we have gone through some of the statistical analysis part. \n", "\n", - "\n", - "\n", "Using the matrix-vector expression for Lasso regression and dropping the parameter $1/n$ in front of the standard mean squared error equation, we have the following **cost** function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "77595d78", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -2217,14 +2778,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "30d6a0a4", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative with respect to $\\boldsymbol{\\beta}$ and recalling that the derivative of the absolute value is (we drop the boldfaced vector symbol for simplicty)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e6aaeb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{d \\vert \\beta\\vert}{d \\boldsymbol{\\beta}}=\\mathrm{sgn}(\\boldsymbol{\\beta})=\\left\\{\\begin{array}{cc} 1 & \\beta > 0 \\\\ 0 & \\beta =0\\\\-1 & \\beta < 0, \\end{array}\\right.\n", @@ -2233,14 +2800,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "61f8860b", + "metadata": { + "editable": true + }, "source": [ "we have that the derivative of the cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "848fab1b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{X},\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}=-2\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})+\\lambda sgn(\\boldsymbol{\\beta})=0,\n", @@ -2249,14 +2822,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b3f9c65", + "metadata": { + "editable": true + }, "source": [ "and reordering we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a4535489", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta}+\\lambda sgn(\\boldsymbol{\\beta})=2\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2265,14 +2844,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "08d1dcfc", + "metadata": { + "editable": true + }, "source": [ "This equation does not lead to a nice analytical equation as in Ridge regression or ordinary least squares. This equation can however be solved by using standard convex optimization algorithms using for example the Python package [CVXOPT](https://cvxopt.org/). We will discuss this later. \n", "\n", - "\n", - "\n", - "\n", - "\n", "Let us assume that our design matrix is given by unit (identity) matrix, that is a square diagonal matrix with ones only along the\n", "diagonal. In this case we have an equal number of rows and columns $n=p$.\n", "\n", @@ -2281,7 +2859,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bfad6360", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2,\n", @@ -2290,14 +2871,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ececd781", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "834ae242", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{OLS}} = y_i.\n", @@ -2306,14 +2893,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef16a3d3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a40a2bf7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\beta_i^2,\n", @@ -2322,14 +2915,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c6b14af", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "d9fb8933", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{Ridge}} = \\frac{y_i}{1+\\lambda}.\n", @@ -2338,14 +2937,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "272cb2f8", + "metadata": { + "editable": true + }, "source": [ "For Lasso regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "fadce691", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\vert\\beta_i\\vert=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\sqrt{\\beta_i^2},\n", @@ -2354,14 +2959,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7cd5640", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "463185a0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2\\sum_{i=0}^{p-1}(y_i-\\beta_i)+\\lambda \\sum_{i=0}^{p-1}\\frac{(\\beta_i)}{\\vert\\beta_i\\vert}=0,\n", @@ -2370,14 +2981,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2748c6", + "metadata": { + "editable": true + }, "source": [ "which leads to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "14027ed3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_i^{\\mathrm{Lasso}} = \\left\\{\\begin{array}{ccc}y_i-\\frac{\\lambda}{2} &\\mathrm{if} & y_i> \\frac{\\lambda}{2}\\\\\n", @@ -2388,18 +3005,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6ee85f1d", + "metadata": { + "editable": true + }, "source": [ "Plotting these results ([figure in handwritten notes for week 36](https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2021/NotesSeptember9.pdf)) shows clearly that Lasso regression suppresses (sets to zero) values of $\\beta_i$ for specific values of $\\lambda$. Ridge regression reduces on the other hand the values of $\\beta_i$ as function of $\\lambda$.\n", "\n", - "\n", "As another examples, \n", "let us assume we have a data set with outputs/targets given by the vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5208771", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y}=\\begin{bmatrix}4 \\\\ 2 \\\\3\\end{bmatrix},\n", @@ -2408,14 +3030,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1b21b70", + "metadata": { + "editable": true + }, "source": [ "and our inputs as a $3\\times 2$ design matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7f60db1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}2 & 0\\\\ 0 & 1 \\\\ 0 & 0\\end{bmatrix},\n", @@ -2424,17 +3052,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "908ab8d8", + "metadata": { + "editable": true + }, "source": [ "meaning that we have two features and two unknown parameters $\\beta_0$ and $\\beta_1$ to be determined either by ordinary least squares, Ridge or Lasso regression.\n", "\n", - "\n", "For ordinary least squares (OLS) we know that the optimal solution is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "aebb6349", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2443,14 +3076,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c5e7c53f", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2197be2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\begin{bmatrix}2 \\\\ 2\\end{bmatrix},\n", @@ -2459,17 +3098,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d6f2196", + "metadata": { + "editable": true + }, "source": [ "The code which implements this simpler case is presented after the discussion of Ridge and Lasso.\n", "\n", - "\n", "For Ridge regression we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f340903", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2478,14 +3122,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11b0427e", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "963a0089", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\begin{bmatrix}\\frac{8}{4+\\lambda} \\\\ \\frac{2}{1+\\lambda}\\end{bmatrix},\n", @@ -2494,21 +3144,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7db2daaa", + "metadata": { + "editable": true + }, "source": [ "There is normally a constraint on the value of $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2$ via the parameter $\\lambda$.\n", "Let us for simplicity assume that $\\beta_0^2+\\beta_1^2=1$ as constraint. This will allow us to find an expression for the optimal values of $\\beta$ and $\\lambda$.\n", "\n", "To see this, let us write the cost function for Ridge regression. \n", "\n", - "\n", - "\n", "We define the MSE without the $1/n$ factor and have then, using that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "688d8588", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{\\beta}=\\begin{bmatrix} 2\\beta_0 \\\\ \\beta_1 \\\\0 \\end{bmatrix},\n", @@ -2517,7 +3171,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "711738d9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\beta_0^2+\\beta_1^2),\n", @@ -2526,14 +3183,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c949f8e", + "metadata": { + "editable": true + }, "source": [ "and taking the derivative with respect to $\\beta_0$ we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bbc3b07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{8}{4+\\lambda},\n", @@ -2542,14 +3205,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1cbf8a76", + "metadata": { + "editable": true + }, "source": [ "and for $\\beta_1$ we obtain" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8f10e5bd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{2}{1+\\lambda},\n", @@ -2558,14 +3227,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b547328c", + "metadata": { + "editable": true + }, "source": [ "Using the constraint for $\\beta_0^2+\\beta_1^2=1$ we can constrain $\\lambda$ by solving" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "707c1a57", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\frac{8}{4+\\lambda}\\right)^2+\\left(\\frac{2}{1+\\lambda}\\right)^2=1,\n", @@ -2574,18 +3249,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b90e6997", + "metadata": { + "editable": true + }, "source": [ "which gives $\\lambda=4.571$ and $\\beta_0=0.933$ and $\\beta_1=0.359$.\n", "\n", - "\n", "For Lasso we need now, keeping a constraint on $\\vert\\beta_0\\vert+\\vert\\beta_1\\vert=1$, to take the derivative of the absolute values of $\\beta_0$\n", "and $\\beta_1$. This gives us the following derivatives of the cost function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e4f6ca20", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\vert\\beta_0\\vert+\\vert\\beta_1\\vert),\n", @@ -2594,7 +3274,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b3d7018c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_0}=-4(4-2\\beta_0)+\\lambda\\mathrm{sgn}(\\beta_0)=0,\n", @@ -2603,14 +3286,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9e6f1823", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea3b2bf0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_1}=-2(2-\\beta_1)+\\lambda\\mathrm{sgn}(\\beta_1)=0.\n", @@ -2619,7 +3308,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "484b5cd4", + "metadata": { + "editable": true + }, "source": [ "We have now four cases to solve besides the trivial cases $\\beta_0$ and/or $\\beta_1$ are zero, namely\n", "1. $\\beta_0 > 0$ and $\\beta_1 > 0$,\n", @@ -2635,7 +3327,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4861f625", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-4(4-2\\beta_0)+\\lambda=0,\n", @@ -2644,14 +3339,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9928eadb", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c94a1223", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2(2-\\beta_1)+\\lambda=0.\n", @@ -2660,14 +3361,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9bcaff12", + "metadata": { + "editable": true + }, "source": [ "which yields" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1b7020d6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{16+\\lambda}{8},\n", @@ -2676,14 +3383,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51fce0e9", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1fe81b2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{4+\\lambda}{2}.\n", @@ -2692,11 +3405,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "414a2e5b", + "metadata": { + "editable": true + }, "source": [ "Using the constraint on $\\beta_0$ and $\\beta_1$ we can then find the optimal value of $\\lambda$ for the different cases. We leave this as an exercise to you.\n", "\n", - "\n", "Here we set up the OLS, Ridge and Lasso functionality in order to study the above example. Note that here we have opted for a set of values of $\\lambda$, meaning that we need to perform a search in order to find the optimal values.\n", "\n", "First we study and compare the OLS and Ridge results. The next code compares all three methods.\n", @@ -2705,7 +3420,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, + "id": "57451fca", "metadata": { "collapsed": false, "editable": true @@ -2767,7 +3483,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6d10b060", + "metadata": { + "editable": true + }, "source": [ "We see here that we reach a plateau for the Ridge results. Writing out the coefficients $\\boldsymbol{\\beta}$, we that they are getting smaller and smaller and our error stabilizes since the predicted values of $\\tilde{\\boldsymbol{y}}$ approach zero.\n", "\n", @@ -2780,7 +3499,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, + "id": "100f7dbb", "metadata": { "collapsed": false, "editable": true @@ -2847,7 +3567,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d50bfd5", + "metadata": { + "editable": true + }, "source": [ "We bring then back our exponential function example and study all\n", "three regression methods. Depending on the level of noise, we note\n", @@ -2862,7 +3585,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, + "id": "409f405d", "metadata": { "collapsed": false, "editable": true @@ -2951,315 +3675,26 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "50e9be28", + "metadata": { + "editable": true + }, "source": [ "Both these example send a clear message. The addition of a\n", "shrinkage/regularization term implies that we need to perform a search\n", "for the optimal values of $\\lambda$. We will see this throughout these\n", "series of lectures.\n", "\n", - "\n", - "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*.\n", - "The following code example solves the simpler problem we discussed above, where we have added the latter python file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [], - "source": [ - "from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed\n", - "from cvxopt import blas, lapack, solvers, sparse, spmatrix\n", - "import math\n", - "\n", - "try:\n", - " import mosek\n", - " import sys\n", - " __MOSEK = True\n", - "except: __MOSEK = False\n", - "\n", - "if __MOSEK:\n", - "\n", - " def l1regls_mosek(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize || A*x - b ||_2^2 + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars( 2*n) # number of variables\n", - " task.appendcons( 2*n) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " Q = matrix(0.0, (n,n)) \n", - " blas.syrk(A, Q, alpha = 2.0, trans='T')\n", - "\n", - " I = []\n", - " for i in range(n):\n", - " I.extend(range(i,n))\n", - "\n", - " J = []\n", - " for i in range(n):\n", - " J.extend((n-i)*[i])\n", - "\n", - " task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n]))\n", - " task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var,\n", - " 0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - " def l1regls_mosek2(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize w'*w + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " A*x - w = b\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars(2*n + m) # number of variables\n", - " task.appendcons(2*n + m) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0])\n", - "\n", - " task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " for i in range(m):\n", - " task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " 2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b))\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], \n", - " (2*n+m)*[0.0], (2*n+m)*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - "def l1regls(A, b):\n", - " \"\"\"\n", - " \n", - " Returns the solution of l1-norm regularized least-squares problem\n", - " \n", - " minimize || A*x - b ||_2^2 + || x ||_1.\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - " q = matrix(1.0, (2*n,1))\n", - " q[:n] = -2.0 * A.T * b\n", - "\n", - " def P(u, v, alpha = 1.0, beta = 0.0 ):\n", - " \"\"\"\n", - " v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v \n", - " \"\"\"\n", - " v *= beta\n", - " v[:n] += alpha * 2.0 * A.T * (A * u[:n])\n", - "\n", - "\n", - " def G(u, v, alpha=1.0, beta=0.0, trans='N'):\n", - " \"\"\"\n", - " v := alpha*[I, -I; -I, -I] * u + beta * v (trans = 'N' or 'T')\n", - " \"\"\"\n", - "\n", - " v *= beta\n", - " v[:n] += alpha*(u[:n] - u[n:])\n", - " v[n:] += alpha*(-u[:n] - u[n:])\n", - "\n", - " h = matrix(0.0, (2*n,1))\n", - "\n", - "\n", - " # Customized solver for the KKT system \n", - " #\n", - " # [ 2.0*A'*A 0 I -I ] [x[:n] ] [bx[:n] ]\n", - " # [ 0 0 -I -I ] [x[n:] ] = [bx[n:] ].\n", - " # [ I -I -D1^-1 0 ] [zl[:n]] [bzl[:n]]\n", - " # [ -I -I 0 -D2^-1 ] [zl[n:]] [bzl[n:]]\n", - " #\n", - " # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2.\n", - " # \n", - " # We first eliminate zl and x[n:]:\n", - " #\n", - " # ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = \n", - " # bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] \n", - " #\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " #\n", - " # zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ).\n", - " #\n", - " # The first equation has the form\n", - " #\n", - " # (A'*A + D)*x[:n] = rhs\n", - " #\n", - " # and is equivalent to\n", - " #\n", - " # [ D A' ] [ x:n] ] = [ rhs ]\n", - " # [ A -I ] [ v ] [ 0 ].\n", - " #\n", - " # It can be solved as \n", - " #\n", - " # ( A*D^-1*A' + I ) * v = A * D^-1 * rhs\n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - "\n", - " S = matrix(0.0, (m,m))\n", - " Asc = matrix(0.0, (m,n))\n", - " v = matrix(0.0, (m,1))\n", - "\n", - " def Fkkt(W):\n", - "\n", - " # Factor \n", - " #\n", - " # S = A*D^-1*A' + I \n", - " #\n", - " # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2.\n", - "\n", - " d1, d2 = W['di'][:n]**2, W['di'][n:]**2\n", - "\n", - " # ds is square root of diagonal of D\n", - " ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), \n", - " sqrt(d1+d2) )\n", - " d3 = div(d2 - d1, d1 + d2)\n", - " \n", - " # Asc = A*diag(d)^-1/2\n", - " Asc = A * spdiag(ds**-1)\n", - "\n", - " # S = I + A * D^-1 * A'\n", - " blas.syrk(Asc, S)\n", - " S[::m+1] += 1.0 \n", - " lapack.potrf(S)\n", - "\n", - " def g(x, y, z):\n", - "\n", - " x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + \n", - " mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - \n", - " mul(d3, z[n:])) )\n", - " x[:n] = div( x[:n], ds) \n", - "\n", - " # Solve\n", - " #\n", - " # S * v = 0.5 * A * D^-1 * ( bx[:n] - \n", - " # (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] )\n", - " \n", - " blas.gemv(Asc, x, v)\n", - " lapack.potrs(S, v)\n", - " \n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - " blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T')\n", - " x[:n] = div(x[:n], ds)\n", - "\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 )\\\n", - " - mul( d3, x[:n] )\n", - " \n", - " # zl[:n] = D1^1/2 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ).\n", - " z[:n] = mul( W['di'][:n], x[:n] - x[n:] - z[:n] ) \n", - " z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) \n", - "\n", - " return g\n", - "\n", - " return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n]" + "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*." ] }, { "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we call the above functions and solve the problem, as done here" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "id": "4c5c2565", "metadata": { - "collapsed": false, "editable": true }, - "outputs": [], "source": [ - "from cvxopt import matrix, normal\n", - "\n", - "X = matrix( [ [ 2, 0, 1], [0, 1, 3]])\n", - "y = matrix( [4, 2, 3])\n", - "x = l1regls(X,y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**More text will be added to this example.**\n", - "\n", "## Linking the regression analysis with a statistical interpretation\n", "\n", "We will now couple the discussions of ordinary least squares, Ridge\n", @@ -3270,7 +3705,6 @@ "parameter can reduce considerably the variance of the parameters\n", "$\\beta$.\n", "\n", - "\n", "The\n", "advantage of doing linear regression is that we actually end up with\n", "analytical expressions for several statistical quantities. \n", @@ -3278,7 +3712,6 @@ "derive quantities like the variance and other expectation values in a\n", "rather straightforward way.\n", "\n", - "\n", "It is assumed that $\\varepsilon_i\n", "\\sim \\mathcal{N}(0, \\sigma^2)$ and the $\\varepsilon_{i}$ are\n", "independent, i.e.:" @@ -3286,7 +3719,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f264b531", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3299,7 +3735,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "800b179f", + "metadata": { + "editable": true + }, "source": [ "The randomness of $\\varepsilon_i$ implies that\n", "$\\mathbf{y}_i$ is also a random variable. In particular,\n", @@ -3312,8 +3751,6 @@ "notation above $\\mathbf{X}_{i,\\ast}$ means that we are looking at the\n", "row number $i$ and perform a sum over all values $p$.\n", "\n", - "\n", - "\n", "The assumption we have made here can be summarized as (and this is going to be useful when we discuss the bias-variance trade off)\n", "that there exists a function $f(\\boldsymbol{x})$ and a normal distributed error $\\boldsymbol{\\varepsilon}\\sim \\mathcal{N}(0, \\sigma^2)$\n", "which describe our data" @@ -3321,7 +3758,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b4815186", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y} = f(\\boldsymbol{x})+\\boldsymbol{\\varepsilon}\n", @@ -3330,7 +3770,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2a343970", + "metadata": { + "editable": true + }, "source": [ "We approximate this function with our model from the solution of the linear regression equations, that is our\n", "function $f$ is approximated by $\\boldsymbol{\\tilde{y}}$ where we want to minimize $(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2$, our MSE, with" @@ -3338,7 +3781,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "358077b0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{y}} = \\boldsymbol{X}\\boldsymbol{\\beta}.\n", @@ -3347,14 +3793,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "73f23e81", + "metadata": { + "editable": true + }, "source": [ "We can calculate the expectation value of $\\boldsymbol{y}$ for a given element $i$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bebdffa9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3367,7 +3819,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8c38cb47", + "metadata": { + "editable": true + }, "source": [ "while\n", "its variance is" @@ -3375,7 +3830,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "193c47ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \\mbox{Var}(y_i) & = \\mathbb{E} \\{ [y_i\n", @@ -3395,18 +3853,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "92832b0a", + "metadata": { + "editable": true + }, "source": [ "Hence, $y_i \\sim \\mathcal{N}( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}, \\sigma^2)$, that is $\\boldsymbol{y}$ follows a normal distribution with \n", "mean value $\\boldsymbol{X}\\boldsymbol{\\beta}$ and variance $\\sigma^2$ (not be confused with the singular values of the SVD). \n", "\n", - "\n", "With the OLS expressions for the parameters $\\boldsymbol{\\beta}$ we can evaluate the expectation value" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f517886", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}(\\boldsymbol{\\beta}) = \\mathbb{E}[ (\\mathbf{X}^{\\top} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbb{E}[ \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\mathbf{X}^{T}\\mathbf{X}\\boldsymbol{\\beta}=\\boldsymbol{\\beta}.\n", @@ -3415,7 +3878,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9dea445", + "metadata": { + "editable": true + }, "source": [ "This means that the estimator of the regression parameters is unbiased.\n", "\n", @@ -3426,7 +3892,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3aececb1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{eqnarray*}\n", @@ -3454,7 +3923,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38f2849", + "metadata": { + "editable": true + }, "source": [ "where we have used that $\\mathbb{E} (\\mathbf{Y} \\mathbf{Y}^{T}) =\n", "\\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} \\, \\mathbf{X}^{T} +\n", @@ -3464,7 +3936,6 @@ "$\\boldsymbol{\\sigma}^2 (\\boldsymbol{\\beta}_j ) = \\boldsymbol{\\sigma}^2 [(\\mathbf{X}^{T} \\mathbf{X})^{-1}]_{jj} $. This may be used to\n", "construct a confidence interval for the estimates.\n", "\n", - "\n", "In a similar way, we can obtain analytical expressions for say the\n", "expectation values of the parameters $\\boldsymbol{\\beta}$ and their variance\n", "when we employ Ridge regression, allowing us again to define a confidence interval. \n", @@ -3474,7 +3945,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "47dbc181", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big]=(\\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I}_{pp})^{-1} (\\mathbf{X}^{\\top} \\mathbf{X})\\boldsymbol{\\beta}^{\\mathrm{OLS}}.\n", @@ -3483,7 +3957,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a409614d", + "metadata": { + "editable": true + }, "source": [ "We see clearly that \n", "$\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big] \\not= \\boldsymbol{\\beta}^{\\mathrm{OLS}}$ for any $\\lambda > 0$. We say then that the ridge estimator is biased.\n", @@ -3493,7 +3970,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "32e59beb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{Ridge}}]=\\sigma^2[ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1} \\mathbf{X}^{T} \\mathbf{X} \\{ [ \\mathbf{X}^{\\top} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T},\n", @@ -3502,7 +3982,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5d38011", + "metadata": { + "editable": true + }, "source": [ "and it is easy to see that if the parameter $\\lambda$ goes to infinity then the variance of Ridge parameters $\\boldsymbol{\\beta}$ goes to zero. \n", "\n", @@ -3511,7 +3994,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "999a6bc6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{OLS}}]-\\mbox{Var}(\\boldsymbol{\\beta}^{\\mathrm{Ridge}})=\\sigma^2 [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}[ 2\\lambda\\mathbf{I} + \\lambda^2 (\\mathbf{X}^{T} \\mathbf{X})^{-1} ] \\{ [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T}.\n", @@ -3520,14 +4006,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "888f1db7", + "metadata": { + "editable": true + }, "source": [ "The difference is non-negative definite since each component of the\n", "matrix product is non-negative definite. \n", - "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. \n", - "\n", - "\n", - "\n", + "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below." + ] + }, + { + "cell_type": "markdown", + "id": "76360bbe", + "metadata": { + "editable": true + }, + "source": [ "## Deriving OLS from a probability distribution\n", "\n", "Our basic assumption when we derived the OLS equations was to assume\n", @@ -3546,7 +4041,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b1976cd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "y_i\\sim \\mathcal{N}(\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta}, \\sigma^2)=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -3555,7 +4053,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff419a1", + "metadata": { + "editable": true + }, "source": [ "We assume now that the various $y_i$ values are stochastically distributed according to the above Gaussian distribution. \n", "We define this distribution as" @@ -3563,7 +4064,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "82730c14", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(y_i, \\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]},\n", @@ -3572,7 +4076,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4982965d", + "metadata": { + "editable": true + }, "source": [ "which reads as finding the likelihood of an event $y_i$ with the input variables $\\boldsymbol{X}$ given the parameters (to be determined) $\\boldsymbol{\\beta}$.\n", "\n", @@ -3581,7 +4088,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab4c31a7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{y},\\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}=\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta}).\n", @@ -3590,7 +4100,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "768cb1fc", + "metadata": { + "editable": true + }, "source": [ "We will write this in a more compact form reserving $\\boldsymbol{D}$ for the domain of events, including the ouputs (targets) and the inputs. That is\n", "in case we have a simple one-dimensional input and output case" @@ -3598,7 +4111,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9f0c7f3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})].\n", @@ -3607,7 +4123,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c617cdd7", + "metadata": { + "editable": true + }, "source": [ "In the more general case the various inputs should be replaced by the possible features represented by the input data set $\\boldsymbol{X}$. \n", "We can now rewrite the above probability as" @@ -3615,7 +4134,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "760dd73f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -3624,27 +4146,27 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd8cbb0", + "metadata": { + "editable": true + }, "source": [ "It is a conditional probability (see below) and reads as the\n", "likelihood of a domain of events $\\boldsymbol{D}$ given a set of parameters\n", "$\\boldsymbol{\\beta}$.\n", "\n", - "\n", "In statistics, maximum likelihood estimation (MLE) is a method of\n", "estimating the parameters of an assumed probability distribution,\n", "given some observed data. This is achieved by maximizing a likelihood\n", "function so that, under the assumed statistical model, the observed\n", "data is the most probable. \n", "\n", - "\n", "We will assume here that our events are given by the above Gaussian\n", "distribution and we will determine the optimal parameters $\\beta$ by\n", "maximizing the above PDF. However, computing the derivatives of a\n", "product function is cumbersome and can easily lead to overflow and/or\n", "underflowproblems, with potentials for loss of numerical precision.\n", "\n", - "\n", "In practice, it is more convenient to maximize the logarithm of the\n", "PDF because it is a monotonically increasing function of the argument.\n", "Alternatively, and this will be our option, we will minimize the\n", @@ -3654,15 +4176,15 @@ "Note also that maximization/minimization of the logarithm of the PDF\n", "is equivalent to the maximization/minimization of the function itself.\n", "\n", - "\n", - "\n", - "\n", "We could now define a new cost function to minimize, namely the negative logarithm of the above PDF" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbfab5d3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=-\\log{\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})}=-\\sum_{i=0}^{n-1}\\log{p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})},\n", @@ -3671,14 +4193,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f4ee97d7", + "metadata": { + "editable": true + }, "source": [ "which becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1e74d52d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{n}{2}\\log{2\\pi\\sigma^2}+\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}.\n", @@ -3687,14 +4215,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b983cb4c", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative of the *new* cost function with respect to the parameters $\\beta$ we recognize our familiar OLS equation, namely" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c90a8ed0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right) =0,\n", @@ -3703,14 +4237,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38fcc19", + "metadata": { + "editable": true + }, "source": [ "which leads to the well-known OLS equation for the optimal paramters $\\beta$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "348010f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}!\n", @@ -3719,11 +4259,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd33a62d", + "metadata": { + "editable": true + }, "source": [ "Before we make a similar analysis for Ridge and Lasso regression, we need a short reminder on statistics. \n", "\n", - "\n", "A central theorem in statistics is Bayes' theorem. This theorem plays a similar role as the good old Pythagoras' theorem in geometry.\n", "Bayes' theorem is extremely simple to derive. But to do so we need some basic axioms from statistics.\n", "\n", @@ -3737,7 +4279,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2bb675c1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X)+p(Y)-p(X \\cap Y).\n", @@ -3746,14 +4291,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d1ff7ab5", + "metadata": { + "editable": true + }, "source": [ "The product rule (aka joint probability) is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "80d51bf1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X,Y)= p(X\\vert Y)p(Y)=p(Y\\vert X)p(X),\n", @@ -3762,20 +4313,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3eb856c7", + "metadata": { + "editable": true + }, "source": [ "where we read $p(X\\vert Y)$ as the likelihood of obtaining $X$ given $Y$.\n", "\n", "If we have independent events then $p(X,Y)=p(X)p(Y)$.\n", "\n", - "\n", - "\n", "The marginal probability is defined in terms of only one of the set of variables $X,Y$. For a discrete probability we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "84c98a40", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X)=\\sum_{i=0}^{n-1}p(X,Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert Y=y_i)p(Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert y_i)p(y_i).\n", @@ -3784,14 +4339,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "094f6489", + "metadata": { + "editable": true + }, "source": [ "The conditional probability, if $p(Y) > 0$, is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "40b87dab", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)}=\\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}.\n", @@ -3800,14 +4361,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "02ee6009", + "metadata": { + "editable": true + }, "source": [ "If we combine the conditional probability with the marginal probability and the standard product rule, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9b83f7e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)},\n", @@ -3816,14 +4383,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "28693db1", + "metadata": { + "editable": true + }, "source": [ "which we can rewrite as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd0819c2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}=\\frac{p(Y\\vert X)p(X)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)},\n", @@ -3832,11 +4405,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c73d36a3", + "metadata": { + "editable": true + }, "source": [ "which is Bayes' theorem. It allows us to evaluate the uncertainty in in $X$ after we have observed $Y$. We can easily interchange $X$ with $Y$. \n", "\n", - "\n", "The quantity $p(Y\\vert X)$ on the right-hand side of the theorem is\n", "evaluated for the observed data $Y$ and can be viewed as a function of\n", "the parameter space represented by $X$. This function is not\n", @@ -3849,7 +4424,6 @@ "\n", "Let us try to illustrate Bayes' theorem through an example.\n", "\n", - "\n", "Let us suppose that you are undergoing a series of mammography scans\n", "in order to rule out possible breast cancer cases. We define the\n", "sensitivity for a positive event by the variable $X$. It takes binary\n", @@ -3867,7 +4441,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "779d9389", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=1) =0.8.\n", @@ -3876,7 +4453,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "63db00a0", + "metadata": { + "editable": true + }, "source": [ "This obviously sounds scary since many would conclude that if the test\n", "is positive, there is a likelihood of $80\\%$ for having cancer. It is\n", @@ -3886,7 +4466,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab01099c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1\\vert X=1),\n", @@ -3895,12 +4478,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ec0ebb28", + "metadata": { + "editable": true + }, "source": [ "instead of $p(X=1\\vert Y=1)$.\n", "\n", - "\n", - "\n", "If we look at various national surveys on breast cancer, the general\n", "likelihood of developing breast cancer is a very small number. Let us\n", "assume that the prior probability in the population as a whole is" @@ -3908,7 +4492,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c432161", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1) =0.004.\n", @@ -3917,7 +4504,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03d0cdb8", + "metadata": { + "editable": true + }, "source": [ "We need also to account for the fact that the test may produce a false\n", "positive result (false alarm). Let us here assume that we have" @@ -3925,7 +4515,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d7a0ad2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=0) =0.1.\n", @@ -3934,7 +4527,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fcdc27a1", + "metadata": { + "editable": true + }, "source": [ "Using Bayes' theorem we can then find the posterior probability that\n", "the person has breast cancer in case of a positive test, that is we\n", @@ -3943,7 +4539,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e773eb9e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3958,7 +4557,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3892720e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3973,12 +4575,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c68513be", + "metadata": { + "editable": true + }, + "source": [ + "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!" + ] + }, + { + "cell_type": "markdown", + "id": "db1bcf38", + "metadata": { + "editable": true + }, "source": [ - "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!\n", - "\n", - "\n", - "\n", "## Bayes' Theorem and Ridge and Lasso Regression\n", "\n", "Hitherto we have discussed Ridge and Lasso regression in terms of a\n", @@ -3988,7 +4599,6 @@ "\n", "Before we proceed let us perform a Ridge, Lasso and OLS analysis of a polynomial fit. \n", "\n", - "\n", "We will play around with a study of the values for the optimal\n", "parameters $\\boldsymbol{\\beta}$ using OLS, Ridge and Lasso regression. For\n", "OLS, you will notice as function of the noise and polynomial degree,\n", @@ -4003,7 +4613,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, + "id": "aa27ede9", "metadata": { "collapsed": false, "editable": true @@ -4077,7 +4688,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "66975598", + "metadata": { + "editable": true + }, "source": [ "How can we understand this?\n", "\n", @@ -4103,7 +4717,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, + "id": "f90a238f", "metadata": { "collapsed": false, "editable": true @@ -4152,7 +4767,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d32f4700", + "metadata": { + "editable": true + }, "source": [ "As an exercise, repeat these calculations with ordinary least squares\n", "only with and without noise. Calculate thereafter the variance of the\n", @@ -4160,11 +4778,16 @@ "noise. Here we recommend to use $\\sigma^2=1$ as variance for the\n", "added noise (which follows a normal distribution with mean value zero).\n", "Comment your results. If you have a large noise term, do the parameters $\\beta_j$ vary more as function\n", - "model complexity? And what about their variance? \n", - "\n", - "\n", - "\n", - "\n", + "model complexity? And what about their variance?" + ] + }, + { + "cell_type": "markdown", + "id": "5292b482", + "metadata": { + "editable": true + }, + "source": [ "## Linking Bayes' Theorem with Ridge and Lasso Regression\n", "\n", "We have seen that Ridge regression suppresses those features which\n", @@ -4178,7 +4801,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b827637", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})],\n", @@ -4187,14 +4813,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6e73b7d4", + "metadata": { + "editable": true + }, "source": [ "is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ead2878e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -4203,14 +4835,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1302f31e", + "metadata": { + "editable": true + }, "source": [ "In Bayes' theorem this function plays the role of the so-called likelihood. We could now ask the question what is the posterior probability of a parameter set $\\boldsymbol{\\beta}$ given a domain of events $\\boldsymbol{D}$? That is, how can we define the posterior probability" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "dd411d77", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D}).\n", @@ -4219,14 +4857,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "01dcd800", + "metadata": { + "editable": true + }, "source": [ "Bayes' theorem comes to our rescue here since (omitting the normalization constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0a3fa1e5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})\\propto p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})p(\\boldsymbol{\\beta}).\n", @@ -4235,25 +4879,28 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5ce5ac4", + "metadata": { + "editable": true + }, "source": [ "We have a model for $p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})$ but need one for the **prior** $p(\\boldsymbol{\\beta}$! \n", "\n", - "\n", - "\n", "With the posterior probability defined by a likelihood which we have\n", "already modeled and an unknown prior, we are now ready to make\n", "additional models for the prior.\n", "\n", "We can, based on our discussions of the variance of $\\boldsymbol{\\beta}$ and\n", "the mean value, assume that the prior for the values $\\boldsymbol{\\beta}$ is\n", - "given by a Gaussian with mean value zero and variance $\\tau^2$, that\n", - "is" + "given by a Gaussian with mean value zero and variance $\\tau^2$, that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "9221bb65", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4262,14 +4909,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0e7f22c4", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3565934d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta\\vert\\boldsymbol{D})}=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4278,7 +4931,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5c4b9c3a", + "metadata": { + "editable": true + }, "source": [ "We can now optimize this quantity with respect to $\\boldsymbol{\\beta}$. As we\n", "did for OLS, this is most conveniently done by taking the negative\n", @@ -4288,7 +4944,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f91f265b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{2\\tau^2}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4297,14 +4956,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a0427716", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/2\\tau^2$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "117eb03b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4313,17 +4978,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9015a44a", + "metadata": { + "editable": true + }, "source": [ "which is our Ridge cost function! Nice, isn't it?\n", "\n", - "\n", "To derive the Lasso cost function, we simply replace the Gaussian prior with an exponential distribution ([Laplace in this case](https://en.wikipedia.org/wiki/Laplace_distribution)) with zero mean value, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a184ac5a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4332,14 +5002,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae799fbe", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "055d1b54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4348,7 +5024,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "104615f6", + "metadata": { + "editable": true + }, "source": [ "Taking the negative\n", "logarithm of the posterior probability and leaving out the\n", @@ -4357,7 +5036,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d868c3b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{\\tau}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4366,14 +5048,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c88440ff", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/\\tau$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "07c1232a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4382,11 +5070,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8416dffb", + "metadata": { + "editable": true + }, "source": [ "which is our Lasso cost function! \n", "\n", - "\n", "Plotting these prior functions shows us that we can use the parameter\n", "$\\lambda$ to shrink or increase the role of a given parameter\n", "$\\beta_j$. The variance for the Laplace distribution is\n", @@ -4399,5 +5089,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 5 } diff --git a/doc/LectureNotes/_build/html/chapter2.html b/doc/LectureNotes/_build/html/chapter2.html index cbf86722e..de0d50a77 100644 --- a/doc/LectureNotes/_build/html/chapter2.html +++ b/doc/LectureNotes/_build/html/chapter2.html @@ -478,7 +478,8 @@ const thebe_selector_output = ".output, .cell_output"
-
+

4. Ridge and Lasso Regression¶

4.1. Mathematical Interpretation of Ordinary Least Squares¶

@@ -850,7 +851,7 @@ It is used for the calculation of the inverse for singular or near singular matr \[ \boldsymbol{A}_{\mathrm{PI}}= \boldsymbol{V}\boldsymbol{D}_{\mathrm{PI}}\boldsymbol{U}^T, \]
-

where \(\boldsymbol{D}_{\mathrm{PI}}\) can be calculated by creating a diagonal matrix from \(\boldsymbol{Sigma}\) where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD.

+

where \(\boldsymbol{D}_{\mathrm{PI}}\) can be calculated by creating a diagonal matrix from \(\boldsymbol{\Sigma}\) where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD.

import numpy as np
@@ -983,11 +984,6 @@ decomposition of the design matrix.

\boldsymbol{X}^T\boldsymbol{X}=\boldsymbol{V}\boldsymbol{\Sigma}^T\boldsymbol{\Sigma}\boldsymbol{V}^T. \]

We define \(\boldsymbol{\Sigma}^T\boldsymbol{\Sigma}=\tilde{\boldsymbol{\Sigma}}^2\) which is a diagonal matrix containing only the singular values squared. It has dimensionality \(p \times p\).

-

This means, using the orthogonality of \(\boldsymbol{V}\), that we get

-
-\[ -\boldsymbol{X}^T\boldsymbol{X}=\tilde{\boldsymbol{\Sigma}}^2. -\]

We can now insert the result for the matrix \(\boldsymbol{X}^T\boldsymbol{X}\) into our equation for ordinary least squares where

\[ @@ -996,9 +992,9 @@ decomposition of the design matrix.

and using our SVD decomposition of \(\boldsymbol{X}\) we have

\[ -\tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^T\tilde{\boldsymbol{\Sigma}}^{-2}\boldsymbol{V}\boldsymbol{\Sigma}^T\boldsymbol{U}^T\boldsymbol{y}, +\tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^T\left(\boldsymbol{V}\tilde{\boldsymbol{\Sigma}}^{2}(\boldsymbol{V}^T\right)^{-1}\boldsymbol{V}\boldsymbol{\Sigma}^T\boldsymbol{U}^T\boldsymbol{y}, \]
-

which gives us, using the orthogonality of the matrices \(\boldsymbol{U}\) and \(\boldsymbol{V}\),

+

which gives us, using the orthogonality of the matrices \(\boldsymbol{U}\) and \(\boldsymbol{V}\),,

\[ \tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{U}^T\boldsymbol{y}=\sum_{i=0}^{p-1}\boldsymbol{u}_i\boldsymbol{u}^T_j\boldsymbol{y}, @@ -1214,10 +1210,10 @@ covariance matrix through the np.linalg.eig() function.

-
-0.13876586436927824
-3.722047011333792
-[[ 1.233528    3.58428804]
- [ 3.58428804 11.47942814]]
+
-0.01591355407242949
+3.6808538439837775
+[[ 0.96390357  2.99157584]
+ [ 2.99157584 10.31120247]]
 
@@ -1254,10 +1250,10 @@ a more brute force way. Here we scale the mean values for each column of the des
-
0.08464758160254343
-1.8503720991789538
-[[1.         0.65626043]
- [0.65626043 1.        ]]
+
0.08612280083325631
+1.6149274949460215
+[[1.         0.66934291]
+ [0.66934291 1.        ]]
 
@@ -1287,30 +1283,30 @@ this matrix we easily see that it is a positive definite matrix.

-
[[-1.41876267 -4.93248252]
- [ 1.83687444  5.28097861]
- [ 0.37429133  0.59766   ]
- [ 0.59159438  1.71869727]
- [-0.80315282 -0.89348922]
- [-0.38748219 -2.12288563]
- [-2.08917679 -5.64933923]
- [ 0.27803645  0.89944994]
- [ 1.23703839  3.2321528 ]
- [ 0.38073947  1.86925797]]
+
[[-1.04649105 -2.92658312]
+ [ 0.45985488  1.43876695]
+ [-0.41081513 -1.96426825]
+ [ 1.75703965  4.88736621]
+ [ 1.02698605  3.59304008]
+ [-0.71348713 -1.98249059]
+ [-0.22685646  0.37866422]
+ [-0.90559087 -1.31597731]
+ [-0.60349429 -3.47245463]
+ [ 0.66285434  1.36393643]]
           0         1
-0 -1.418763 -4.932483
-1  1.836874  5.280979
-2  0.374291  0.597660
-3  0.591594  1.718697
-4 -0.803153 -0.893489
-5 -0.387482 -2.122886
-6 -2.089177 -5.649339
-7  0.278036  0.899450
-8  1.237038  3.232153
-9  0.380739  1.869258
+0 -1.046491 -2.926583
+1  0.459855  1.438767
+2 -0.410815 -1.964268
+3  1.757040  4.887366
+4  1.026986  3.593040
+5 -0.713487 -1.982491
+6 -0.226856  0.378664
+7 -0.905591 -1.315977
+8 -0.603494 -3.472455
+9  0.662854  1.363936
           0         1
-0  1.000000  0.977418
-1  0.977418  1.000000
+0  1.000000  0.948641
+1  0.948641  1.000000
 
@@ -1367,37 +1363,37 @@ this matrix we easily see that it is a positive definite matrix.

     0         1         2         3         4         5         6         7   \
 0   0.0  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   
-1   0.0  0.081253  0.083015  0.080297  0.079157  0.078040  0.071112  0.069847   
-2   0.0  0.083015  0.086807  0.084909  0.084904  0.084702  0.076955  0.076338   
-3   0.0  0.080297  0.084909  0.084414  0.084862  0.085018  0.077793  0.077402   
-4   0.0  0.079157  0.084904  0.084862  0.086076  0.086872  0.079281  0.079383   
-5   0.0  0.078040  0.084702  0.085018  0.086872  0.088212  0.080319  0.080847   
-6   0.0  0.071112  0.076955  0.077793  0.079281  0.080319  0.073719  0.074034   
-7   0.0  0.069847  0.076338  0.077402  0.079383  0.080847  0.074034  0.074693   
-8   0.0  0.068735  0.075760  0.077003  0.079405  0.081233  0.074237  0.075195   
-9   0.0  0.067769  0.075241  0.076628  0.079389  0.081533  0.074375  0.075594   
-10  0.0  0.062136  0.068318  0.069888  0.071921  0.073449  0.067622  0.068376   
-11  0.0  0.061149  0.067723  0.069408  0.071767  0.073583  0.067612  0.068608   
-12  0.0  0.060309  0.067213  0.068991  0.071632  0.073699  0.067599  0.068806   
-13  0.0  0.059601  0.066789  0.068642  0.071529  0.073816  0.067597  0.068992   
-14  0.0  0.059013  0.066449  0.068363  0.071467  0.073949  0.067620  0.069181   
+1   0.0  0.084846  0.071547  0.086679  0.078725  0.071480  0.079609  0.073320   
+2   0.0  0.071547  0.061716  0.073647  0.067908  0.062640  0.068417  0.063857   
+3   0.0  0.086679  0.073647  0.094619  0.086262  0.078697  0.090356  0.083579   
+4   0.0  0.078725  0.067908  0.086262  0.079483  0.073303  0.082874  0.077375   
+5   0.0  0.071480  0.062640  0.078697  0.073303  0.068345  0.076121  0.071741   
+6   0.0  0.079609  0.068417  0.090356  0.082874  0.076121  0.088460  0.082267   
+7   0.0  0.073320  0.063857  0.083579  0.077375  0.071741  0.082267  0.077131   
+8   0.0  0.067787  0.059824  0.077620  0.072521  0.067856  0.076821  0.072597   
+9   0.0  0.062888  0.056235  0.072352  0.068210  0.064388  0.072008  0.068573   
+10  0.0  0.071906  0.062551  0.083694  0.077291  0.071515  0.083361  0.077978   
+11  0.0  0.066654  0.058715  0.077948  0.072611  0.067767  0.078042  0.073548   
+12  0.0  0.062061  0.055344  0.072918  0.068500  0.064461  0.073380  0.069654   
+13  0.0  0.058033  0.052372  0.068505  0.064880  0.061538  0.069285  0.066223   
+14  0.0  0.054491  0.049747  0.064623  0.061685  0.058948  0.065680  0.063192   
 
           8         9         10        11        12        13        14  
 0   0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  
-1   0.068735  0.067769  0.062136  0.061149  0.060309  0.059601  0.059013  
-2   0.075760  0.075241  0.068318  0.067723  0.067213  0.066789  0.066449  
-3   0.077003  0.076628  0.069888  0.069408  0.068991  0.068642  0.068363  
-4   0.079405  0.079389  0.071921  0.071767  0.071632  0.071529  0.071467  
-5   0.081233  0.081533  0.073449  0.073583  0.073699  0.073816  0.073949  
-6   0.074237  0.074375  0.067622  0.067612  0.067599  0.067597  0.067620  
-7   0.075195  0.075594  0.068376  0.068608  0.068806  0.068992  0.069181  
-8   0.075959  0.076589  0.068965  0.069409  0.069796  0.070150  0.070491  
-9   0.076589  0.077425  0.069441  0.070074  0.070630  0.071136  0.071614  
-10  0.068965  0.069441  0.063052  0.063364  0.063631  0.063874  0.064110  
-11  0.069409  0.070074  0.063364  0.063851  0.064274  0.064658  0.065020  
-12  0.069796  0.070630  0.063631  0.064274  0.064838  0.065348  0.065826  
-13  0.070150  0.071136  0.063874  0.064658  0.065348  0.065974  0.066558  
-14  0.070491  0.071614  0.064110  0.065020  0.065826  0.066558  0.067240  
+1   0.067787  0.062888  0.071906  0.066654  0.062061  0.058033  0.054491  
+2   0.059824  0.056235  0.062551  0.058715  0.055344  0.052372  0.049747  
+3   0.077620  0.072352  0.083694  0.077948  0.072918  0.068505  0.064623  
+4   0.072521  0.068210  0.077291  0.072611  0.068500  0.064880  0.061685  
+5   0.067856  0.064388  0.071515  0.067767  0.064461  0.061538  0.058948  
+6   0.076821  0.072008  0.083361  0.078042  0.073380  0.069285  0.065680  
+7   0.072597  0.068573  0.077978  0.073548  0.069654  0.066223  0.063192  
+8   0.068852  0.065514  0.073238  0.069578  0.066348  0.063493  0.060963  
+9   0.065514  0.062773  0.069044  0.066051  0.063401  0.061048  0.058955  
+10  0.073238  0.069044  0.079558  0.074881  0.070775  0.067162  0.063977  
+11  0.069578  0.066051  0.074881  0.070959  0.067506  0.064459  0.061765  
+12  0.066348  0.063401  0.070775  0.067506  0.064618  0.062062  0.059795  
+13  0.063493  0.061048  0.067162  0.064459  0.062062  0.059933  0.058038  
+14  0.060963  0.058955  0.063977  0.061765  0.059795  0.058038  0.056468  
 
@@ -1439,7 +1435,9 @@ x_{01}x_{00}+x_{11}x_{10} & x_{01}^2+x_{11}^2\\ \mathrm{cov}[\boldsymbol{x}_1,\boldsymbol{x}_0] & \mathrm{var}[\boldsymbol{x}_1] \\ \end{bmatrix}, \end{split}\]
-

where we wrote $\(\boldsymbol{C}[\boldsymbol{x}_0,\boldsymbol{x}_1] = \boldsymbol{C}[\boldsymbol{x}]\)\( to indicate that this is the covariance of the vectors \)\boldsymbol{x}\( of the design/feature matrix \)\boldsymbol{X}$.

+

where we wrote \(\boldsymbol{C}[\boldsymbol{x}_0,\boldsymbol{x}_1]=\boldsymbol{C}[\boldsymbol{x}]\) to indicate +that this is the covariance of the vectors \(\boldsymbol{x}\) of the +design/feature matrix \(\boldsymbol{X}\).

It is easy to generalize this to a matrix \(\boldsymbol{X}\in {\mathbb{R}}^{n\times p}\).

@@ -1880,7 +1878,7 @@ Training MSE for OLS 3.0
-_images/chapter2_245_1.png +_images/chapter2_254_1.png

We see here that we reach a plateau for the Ridge results. Writing out the coefficients \(\boldsymbol{\beta}\), we that they are getting smaller and smaller and our error stabilizes since the predicted values of \(\tilde{\boldsymbol{y}}\) approach zero.

@@ -2156,7 +2154,7 @@ Training MSE for OLS [ 0. -0.]
-_images/chapter2_247_1.png +_images/chapter2_256_1.png

We bring then back our exponential function example and study all @@ -2259,305 +2257,14 @@ Test MSE OLS 0.008675369724975977 -_images/chapter2_249_1.png +_images/chapter2_258_1.png

Both these example send a clear message. The addition of a shrinkage/regularization term implies that we need to perform a search for the optimal values of \(\lambda\). We will see this throughout these series of lectures.

-

As a small addendum, we note that you can also solve this problem using the convex optimization package CVXOPT. This requires, in addition to having installed CVXOPT, you need to download the file l1regl.py. -The following code example solves the simpler problem we discussed above, where we have added the latter python file.

-
-
-
from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed
-from cvxopt import blas, lapack, solvers, sparse, spmatrix
-import math
-
-try:
-    import mosek
-    import sys
-    __MOSEK = True
-except: __MOSEK = False
-
-if __MOSEK:
-
-    def l1regls_mosek(A, b):
-        """
-
-        Returns the solution of l1-norm regularized least-squares problem
-
-            minimize    || A*x - b ||_2^2  + e'*u
-
-            subject to  -u <= x <= u
-
-        """
-
-        m, n = A.size
-
-        env  = mosek.Env()
-        task = env.Task(0,0)
-        task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))
-
-        task.appendvars( 2*n)            # number of variables
-        task.appendcons( 2*n)            # number of constraints
-
-        # input quadratic objective
-        Q = matrix(0.0, (n,n)) 
-        blas.syrk(A, Q, alpha = 2.0, trans='T')
-
-        I = []
-        for i in range(n):
-            I.extend(range(i,n))
-
-        J = []
-        for i in range(n):
-            J.extend((n-i)*[i])
-
-        task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n]))
-        task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0])  # setup linear objective
-
-        # input constraint matrix row by row
-        for i in range(n):
-            task.putarow(   i, [i, n+i], [1.0, -1.0])
-            task.putarow( n+i, [i, n+i], [1.0,  1.0])
-
-        # setup bounds on constraints
-        task.putboundslice(mosek.accmode.con,
-                           0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])
-        task.putboundslice(mosek.accmode.con,
-                           n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])
-
-        # setup variable bounds
-        task.putboundslice(mosek.accmode.var,
-                           0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0])
-
-        # optimize the task
-        task.putobjsense(mosek.objsense.minimize)
-        task.optimize()
-        task.solutionsummary(mosek.streamtype.log)
-        x = n*[0.0]
-        task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)
-
-        return matrix(x)
-
-    def l1regls_mosek2(A, b):
-        """
-
-        Returns the solution of l1-norm regularized least-squares problem
-
-            minimize     w'*w + e'*u
-
-            subject to  -u <= x <= u
-
-                         A*x - w = b
-
-        """
-
-        m, n = A.size
-
-        env  = mosek.Env()
-        task = env.Task(0,0)
-        task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))
-
-        task.appendvars(2*n + m)     # number of variables
-        task.appendcons(2*n + m)     # number of constraints
-
-        # input quadratic objective
-        task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0])
-
-        task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0])  # setup linear objective
-
-        # input constraint matrix row by row
-        for i in range(n):
-            task.putarow(   i, [i, n+i], [1.0, -1.0])
-            task.putarow( n+i, [i, n+i], [1.0,  1.0])
-
-        for i in range(m):
-            task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0])
-
-        # setup bounds on constraints
-        task.putboundslice(mosek.accmode.con,
-                           0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])
-        task.putboundslice(mosek.accmode.con,
-                           n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])
-        task.putboundslice(mosek.accmode.con,
-                           2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b))
-
-        # setup variable bounds
-        task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], 
-                           (2*n+m)*[0.0], (2*n+m)*[0.0])
-
-        # optimize the task
-        task.putobjsense(mosek.objsense.minimize)
-        task.optimize()
-        task.solutionsummary(mosek.streamtype.log)
-        x = n*[0.0]
-        task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)
-
-        return matrix(x)
-
-def l1regls(A, b):
-    """
-    
-    Returns the solution of l1-norm regularized least-squares problem
-  
-        minimize || A*x - b ||_2^2  + || x ||_1.
-
-    """
-
-    m, n = A.size
-    q = matrix(1.0, (2*n,1))
-    q[:n] = -2.0 * A.T * b
-
-    def P(u, v, alpha = 1.0, beta = 0.0 ):
-        """
-            v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v 
-        """
-        v *= beta
-        v[:n] += alpha * 2.0 * A.T * (A * u[:n])
-
-
-    def G(u, v, alpha=1.0, beta=0.0, trans='N'):
-        """
-            v := alpha*[I, -I; -I, -I] * u + beta * v  (trans = 'N' or 'T')
-        """
-
-        v *= beta
-        v[:n] += alpha*(u[:n] - u[n:])
-        v[n:] += alpha*(-u[:n] - u[n:])
-
-    h = matrix(0.0, (2*n,1))
-
-
-    # Customized solver for the KKT system 
-    #
-    #     [  2.0*A'*A  0    I      -I     ] [x[:n] ]     [bx[:n] ]
-    #     [  0         0   -I      -I     ] [x[n:] ]  =  [bx[n:] ].
-    #     [  I        -I   -D1^-1   0     ] [zl[:n]]     [bzl[:n]]
-    #     [ -I        -I    0      -D2^-1 ] [zl[n:]]     [bzl[n:]]
-    #
-    # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2.
-    #    
-    # We first eliminate zl and x[n:]:
-    #
-    #     ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = 
-    #         bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + 
-    #         D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - 
-    #         D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:]           
-    #
-    #     x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n]  - D2*bzl[n:] ) 
-    #         - (D2-D1)*(D1+D2)^-1 * x[:n]         
-    #
-    #     zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] )
-    #     zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ).
-    #
-    # The first equation has the form
-    #
-    #     (A'*A + D)*x[:n]  =  rhs
-    #
-    # and is equivalent to
-    #
-    #     [ D    A' ] [ x:n] ]  = [ rhs ]
-    #     [ A   -I  ] [ v    ]    [ 0   ].
-    #
-    # It can be solved as 
-    #
-    #     ( A*D^-1*A' + I ) * v = A * D^-1 * rhs
-    #     x[:n] = D^-1 * ( rhs - A'*v ).
-
-    S = matrix(0.0, (m,m))
-    Asc = matrix(0.0, (m,n))
-    v = matrix(0.0, (m,1))
-
-    def Fkkt(W):
-
-        # Factor 
-        #
-        #     S = A*D^-1*A' + I 
-        #
-        # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2.
-
-        d1, d2 = W['di'][:n]**2, W['di'][n:]**2
-
-        # ds is square root of diagonal of D
-        ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), 
-            sqrt(d1+d2) )
-        d3 =  div(d2 - d1, d1 + d2)
-     
-        # Asc = A*diag(d)^-1/2
-        Asc = A * spdiag(ds**-1)
-
-        # S = I + A * D^-1 * A'
-        blas.syrk(Asc, S)
-        S[::m+1] += 1.0 
-        lapack.potrf(S)
-
-        def g(x, y, z):
-
-            x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + 
-                mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - 
-                mul(d3, z[n:])) )
-            x[:n] = div( x[:n], ds) 
-
-            # Solve
-            #
-            #     S * v = 0.5 * A * D^-1 * ( bx[:n] - 
-            #         (D2-D1)*(D1+D2)^-1 * bx[n:] + 
-            #         D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - 
-            #         D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] )
-                
-            blas.gemv(Asc, x, v)
-            lapack.potrs(S, v)
-            
-            # x[:n] = D^-1 * ( rhs - A'*v ).
-            blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T')
-            x[:n] = div(x[:n], ds)
-
-            # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n]  - D2*bzl[n:] ) 
-            #         - (D2-D1)*(D1+D2)^-1 * x[:n]         
-            x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 )\
-                - mul( d3, x[:n] )
-                
-            # zl[:n] = D1^1/2 * (  x[:n] - x[n:] - bzl[:n] )
-            # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ).
-            z[:n] = mul( W['di'][:n],  x[:n] - x[n:] - z[:n] ) 
-            z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) 
-
-        return g
-
-    return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n]
-
-
-
-
-
---------------------------------------------------------------------------
-ModuleNotFoundError                       Traceback (most recent call last)
-<ipython-input-12-d670a873ab0c> in <module>
-----> 1 from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed
-      2 from cvxopt import blas, lapack, solvers, sparse, spmatrix
-      3 import math
-      4 
-      5 try:
-
-ModuleNotFoundError: No module named 'cvxopt'
-
-
-
-
-

Then we call the above functions and solve the problem, as done here

-
-
-
from cvxopt import matrix, normal
-
-X = matrix( [ [ 2, 0, 1], [0, 1, 3]])
-y = matrix( [4, 2, 3])
-x = l1regls(X,y)
-
-
-
-
-

More text will be added to this example.

+

As a small addendum, we note that you can also solve this problem using the convex optimization package CVXOPT. This requires, in addition to having installed CVXOPT, you need to download the file l1regl.py.

4.11. Linking the regression analysis with a statistical interpretation¶

@@ -2971,6 +2678,14 @@ order to another one.

+
+
[ 1.0169643   0.27924636 -1.4087793   1.03308408  0.        ]
+Test MSE OLS
+0.958228616652075
+
+
+_images/chapter2_324_1.png +

How can we understand this?

Let us write out the values of the coefficients \(\beta_i\) as functions @@ -3032,6 +2747,228 @@ large variance (normally for higher orders in the polynomial).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beta
00.986699
1-0.606760
21.280573
3-0.850164
40.000000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beta
00.978553
1-0.511888
21.051418
3-0.701370
40.000000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beta
00.946957
1-0.162246
20.221921
3-0.167787
40.000000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beta
00.906747
10.017665
2-0.029483
3-0.053849
40.000000
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beta
00.718165
10.156956
20.040102
3-0.001880
40.000000
+

As an exercise, repeat these calculations with ordinary least squares only with and without noise. Calculate thereafter the variance of the @@ -3074,8 +3011,7 @@ already modeled and an unknown prior, we are now ready to make additional models for the prior.

We can, based on our discussions of the variance of \(\boldsymbol{\beta}\) and the mean value, assume that the prior for the values \(\boldsymbol{\beta}\) is -given by a Gaussian with mean value zero and variance \(\tau^2\), that -is

+given by a Gaussian with mean value zero and variance \(\tau^2\), that

\[ p(\boldsymbol{\beta})=\prod_{j=0}^{p-1}\exp{\left(-\frac{\beta_j^2}{2\tau^2}\right)}. diff --git a/doc/LectureNotes/_build/html/searchindex.js b/doc/LectureNotes/_build/html/searchindex.js index ce1ccc582..e3985b5a7 100644 --- a/doc/LectureNotes/_build/html/searchindex.js +++ b/doc/LectureNotes/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["chapter1","chapter10","chapter11","chapter12","chapter13","chapter2","chapter3","chapter4","chapter5","chapter6","chapter7","chapter8","chapter9","chapteroptimization","clustering","intro","linalg","schedule","statistics","teachers","textbooks"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["chapter1.ipynb","chapter10.ipynb","chapter11.ipynb","chapter12.ipynb","chapter13.ipynb","chapter2.ipynb","chapter3.ipynb","chapter4.ipynb","chapter5.ipynb","chapter6.ipynb","chapter7.ipynb","chapter8.ipynb","chapter9.ipynb","chapteroptimization.ipynb","clustering.ipynb","intro.md","linalg.ipynb","schedule.md","statistics.ipynb","teachers.md","textbooks.md"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19],"00":[0,1,3,5,6,11,18],"000":[1,3],"0000":[],"00000":[],"000000":[5,11],"00000000e":5,"0000e":3,"0001":[1,3],"000148":[],"00019998":5,"00024087":5,"00028369228101198006":[],"00029012":5,"0003043256065368937":9,"00031535148309580783":6,"0003153514830958081":[],"0003153514830958126":[],"0003153514830958235":6,"00034944":5,"000417932":2,"00042089":5,"000464088":2,"00050694":5,"00058016":6,"000599":[],"00060705":[],"00060708":6,"00061058":5,"00062582":6,"00062595":[],"00066668":6,"00068734":6,"00068941":6,"00069103":[],"00073541":5,"00076495":6,"00076919":6,"00076925":[],"0007698473260556325":6,"0007698473260556334":[],"0007698473260556339":[],"0007698473260556344":6,"00079123":[],"00079130":6,"00079968":5,"00084705":[],"00084711":6,"00085883":6,"00085884":[],"00087697":6,"00088573":5,"00092645":6,"00092646":[],"00096314":5,"001":[1,2,8,13],"00100519":6,"0010479245355337968":[],"0010479245887943952":6,"00105081":6,"00106677":5,"00107405":6,"00111756":6,"0011526":6,"00115999":5,"0011828302640124":[],"00118504":6,"00118527":[],"001263":[],"00128479":5,"001323":6,"00137823":6,"00137835":[],"00139705":5,"00149311":6,"00149956":6,"00152117":6,"00154733":5,"00156379":[],"00156382":6,"00168251":5,"00174276":6,"00175331":6,"00186347":5,"001988":[],"00198806":[],"00200":8,"00202624":5,"00202756":6,"00217499":6,"00224413":5,"00228741":6,"0023548":6,"002381316302584885":[],"002381316302584886":6,"0023813163025848865":6,"00242999":6,"00243186":6,"0024401":5,"00249435":6,"002526":[],"00266858":2,"00270244":5,"00274989":6,"00275135":[],"00289724":6,"00293838":5,"002948":[],"0030828":[],"003083":[],"00310113":2,"00312361":6,"00315593":6,"003215318065760509":[],"0032153180657605125":6,"00323332":6,"0032542":5,"003301":6,"003395515459204093":6,"0033955154592040944":[],"00353823":5,"0036237":6,"0036367":6,"00369758":6,"003704":[],"003717":[],"003759":[],"003774":[],"003788":[],"0038335":6,"00390021":[],"003909404072811217":6,"003909404072811231":[],"00391839":5,"0039987":6,"004":5,"004091940707753948":6,"0040919407077539514":[],"00410387":6,"00410478":6,"004113634617443116":6,"0041136346174431284":[],"004113634617443131":6,"004113634617443135":[],"00411363461744314":6,"004113634617443141":[],"004155986345861364":6,"004155986345861374":[],"00415763":[],"00424909":2,"00424967":6,"00426027":5,"00433417":11,"00440346":6,"00443743":6,"00445655":11,"004579219539673834":6,"004579219539673836":[],"00458878":6,"004610275230656187":6,"004610275230656294":[],"00462287":6,"00471782":5,"00472199":6,"00472512":6,"0049544":6,"004999999999999984":[],"004999999999999994":[],"004999999999999996":[],"005000000000000011":0,"00512927":5,"00517114":6,"00526348":6,"0053018":6,"00554552":6,"00556826":6,"0056799":5,"00577441":[],"00579953":6,"00588657":6,"00607783":6,"006162":6,"00617499":5,"00630331":6,"00642221":6,"00660427":6,"00672607":6,"00673393":13,"00673407":6,"00676387":6,"0068011":6,"00683748":5,"00683964":6,"007012403613997257":[],"007024126888936694":[],"0070241268889382116":6,"00719176":6,"00727646693":0,"007315":[],"0074331":5,"00751823":[],"00759119":6,"00784393":6,"00803064":6,"0080866254785146":[],"00813803":6,"00817631":6,"00823002":5,"00827728":6,"00831018":6,"00834567":6,"00848904":6,"0086649156":0,"008675369724975977":5,"008675369724976501":[],"00894639":5,"00905423":6,"009163470508352211":[],"009163470508352218":5,"009164545680330616":6,"00917248":6,"00934499":6,"009450756365829578":[],"0096208":6,"00990475":5,"00992331":6,"00996754":6,"00it":6,"01":[0,1,2,5,6,9,11,13,18,20],"010018312644139205":6,"010018312644139347":[],"0100706":6,"010331721306655144":6,"01033172130665515":[],"010516485576646513":6,"010516485576652856":[],"01066519":6,"01076611":5,"0110":18,"0110407067093945":[],"01104071":[],"011076219011339788":[],"01107621901137465":6,"011225":2,"0113104":6,"01179792":6,"01191824":5,"01199624e":18,"012073649439965807":[],"012073649472576395":6,"01212754811385597":18,"01219292":6,"01223198":6,"01231917":6,"012633802944855959":[],"01290947":6,"01295356":5,"013121573975499602":[],"013121573975499604":[],"01312157406137079":6,"013121574061370796":6,"01318643":6,"01347916":6,"01348565":6,"01367553":6,"01397146":6,"01405935":6,"01416528":6,"014209325470380275":[],"01433809":5,"014436800088896274":6,"014436800088969727":[],"01449782":6,"01458337":6,"0146081":6,"01463049":6,"015072388895177088":[],"0150723888951771":6,"015072388895177109":[],"015072388895177239":6,"01509543":13,"01530715721129232":[],"01531845":6,"01538461538462":[],"01549377":6,"01558197":5,"016285782696017055":6,"016285782696075054":[],"01633913":6,"01640891":6,"01655318":6,"016587414993037307":[],"016587414993045405":6,"01691985":6,"01708781":6,"01708852":6,"01713366":6,"01724499":5,"01735584819559184":[],"017355848195591845":[],"017355848195593354":6,"01756972":[],"01799917e":18,"01817152":[],"018232":[],"01831036e":6,"01831130e":[],"01831200e":[],"01831207e":6,"01866537":6,"01869785e":18,"01873344":11,"01873869":5,"01898855":6,"01905883":6,"01908936":6,"019587":[],"01963611":6,"01969145":6,"019754165271682844":6,"01975416527179247":[],"01975848":6,"02":[0,4,6,7,12,18],"02024962":6,"02054837e":6,"02068067":6,"02073509":5,"0209518407597062":18,"02098261":6,"02123176":6,"021250026482402":11,"02159270458799264":[],"021592704587992645":[],"021592704588021164":6,"021592704588021167":6,"02198702e":6,"022022882954618364":[],"02208512":6,"02228115":6,"02229529":6,"02252765":5,"022556":11,"02255619":11,"02299949826036602":[],"0229994982603662":6,"02348765":6,"02365049":6,"0245528":6,"02492265":5,"02493054":[],"02498832":6,"02503753":6,"02511518":6,"02522069":6,"025709":11,"02586427":6,"0260906":6,"02625193":8,"02625928":13,"026408391362671896":[],"02642055e":18,"026605727637176654":[],"02660572763718461":6,"026605727637184613":6,"02707227":5,"02723445":6,"027609773491022314":[],"027609773491022387":6,"027609773491022407":6,"02786488":11,"027865":11,"02857":4,"02917662":11,"029177":11,"02926396":[],"029613363972682966":[],"029733":[],"02976145":6,"02994311":5,"02f":6,"03":[1,6],"03032441e":6,"03056589":[],"030566":[],"03071040e":18,"03076923076924":[],"03077640549":4,"03099776":5,"031":5,"03187339273559067":[],"03196357":6,"03251863":5,"03256632e":1,"03267527":6,"03278964":[],"032790":[],"03279636":6,"0330308045180234":[],"0330308045183163":[],"0330308045183219":6,"0330308045190182":6,"033657685071527485":[],"033657685071527624":6,"03382304823545749":11,"03447512":6,"03562355":6,"03568439":6,"03570747":0,"0358909447132981":[],"0359565":5,"03630548":6,"03707133":11,"037559":11,"03755944":11,"03761519":[],"03781367141738885":[],"03781367141738886":[],"037813671417388985":6,"03781367141738899":6,"03794112":16,"03814292":6,"03815288":6,"038300":11,"03850557":11,"038506":11,"039039":5,"03981057":16,"0399676689527968":6,"0399676689527975":6,"04":[1,6,11,18],"04010697":6,"04063602":6,"041":[],"041148729430502":6,"041148729430523":6,"0411487294305246":[],"0411487294305746":[],"04179719":[],"041797190646905":[],"04220758":6,"04284519":[],"043":[],"04315108":5,"0433816":[],"04346721":5,"04355837":6,"04362":[],"04368707":16,"0437499":2,"04389027":6,"043927769551648":[],"04423486":6,"044334":[],"0444119":[],"044613":6,"04483457":[],"04537385":6,"04543942":6,"04566964":6,"0458":9,"04615384615386":[],"04621521":[],"04648335":5,"0466":[],"04683565":5,"04775904":16,"04784395":6,"04818727730430296":[],"048187277304303056":6,"048653428302840175":16,"04892055":6,"04909093":6,"04912436":6,"04930820e":18,"0495569966278238":6,"0495569966278269":6,"0495569966278315":[],"04it":[],"05":[1,3,4,6,13],"05009826":6,"05087958":[],"05100875":6,"051649":11,"0517473":5,"05227921801205691":[],"05227921801205692":[],"052279218012057004":6,"05255759":[],"05263":[],"05290417684691035":[],"05302":[],"05364854":8,"05383795":6,"05434571":16,"05447415":6,"054585":[],"054785":[],"054963":[],"05505310046362":[],"05505310046363":2,"055137":[],"055320":[],"05533":[],"055676":[],"05614483":5,"05623":[],"05648":[],"05651951":6,"056528":11,"05667":[],"057088709963182":[],"057163681553428394":6,"05716368155351588":[],"0572":[],"05756733":[],"05785343":6,"05789007":6,"057899":11,"05796251":6,"05807125":6,"05883":[],"05884":[],"059013":5,"059294":11,"059378":11,"059601":5,"059783":[],"05999":[],"06":[6,13],"060080":[],"060183":[],"06020587":6,"06021285":[],"060213":[],"060228":11,"060309":5,"06043581":6,"060507":[],"060655":[],"060781":[],"060841":[],"061025":[],"061048":[],"061149":5,"061321":[],"061390":[],"061509":[],"061604":[],"06160438":[],"061701":[],"061745":[],"061898":[],"061917":[],"061923":11,"06200174":5,"06208238634231944":6,"06208238634231953":[],"062136":5,"062142":[],"062292565":4,"062294":[],"062391":[],"062409":11,"062411":11,"062435":[],"062451":[],"062534":[],"062676":11,"062706":11,"062834":[],"062884":[],"063052":5,"063078":[],"063250":[],"063343":[],"063364":5,"063513":[],"063631":5,"063657":[],"063752":11,"063851":5,"063872":[],"063874":5,"06388888888888888":[],"064052":[],"064108":[],"064110":5,"064184":[],"064274":5,"064384":[],"06444":[],"064469":[],"06453579006728315":[],"06453579006728322":6,"064538":11,"064604":11,"064648":[],"064658":5,"064681":[],"064838":5,"06491736":6,"064918":[],"064931":11,"064964":[],"06497046":[],"065020":5,"065106":[],"065249":11,"065314":11,"065348":5,"06547790180152352":6,"06547790180152353":6,"06547790180152357":[],"06547790180152363":[],"065514":[],"065557":[],"065575":[],"065641":11,"065730":11,"065826":5,"065892":[],"065974":5,"06602663":[],"066110":[],"066194":[],"066309":[],"06637":[],"066449":5,"066558":5,"066609":[],"066670":11,"0666807":2,"066729":11,"066753":[],"066789":5,"066837":11,"066954":[],"067079":[],"067213":5,"067236":[],"067240":5,"06724062":5,"067282":11,"067392":11,"067402":11,"067432":11,"067544":[],"067597":5,"067599":5,"067612":5,"067620":5,"067622":5,"067675":[],"067714":[],"067723":5,"067769":5,"067956":11,"068059":11,"068093":11,"068094":[],"068103":[],"068120":[],"068318":5,"068363":5,"068376":5,"06844519414009438":[],"06844519414009442":6,"06844519414009444":6,"068461":11,"068538":11,"06858699":[],"068608":5,"068642":5,"068659":[],"068735":5,"068806":5,"068809":[],"068831":[],"068937":[],"068965":5,"068991":5,"068992":5,"069085":11,"069091":[],"069181":5,"069275":11,"069408":5,"069409":5,"069441":5,"069455":[],"069584":[],"069672":[],"069685":11,"069754":[],"069796":5,"069847":5,"069877":11,"069884":11,"069888":5,"069912":[],"06it":6,"07":6,"070028":[],"070043":[],"070071":[],"070074":5,"070150":5,"07016":[],"070163":11,"07017":[],"070343":11,"070379":[],"07039":[],"070419":11,"070429":11,"070491":5,"070492":11,"070576":[],"070612":[],"07062318":6,"070630":5,"070635":[],"070889":11,"070911":[],"070950":11,"070972":11,"07099747918547346":[],"071022":11,"071086":[],"071112":5,"071136":5,"07115":[],"07129539":[],"0712953943627344":[],"0713":0,"071387":[],"07145103":11,"071467":5,"0714956":16,"071529":5,"07160048164232467":6,"07160048164248561":[],"071614":5,"071632":5,"071698":[],"071705":[],"071767":5,"071921":5,"071935":[],"07201957":[],"072216":11,"072242":[],"072348":[],"072442":11,"072492":[],"072530":[],"072617":[],"072620":[],"072750":[],"07285":3,"0728785":[],"07291729":18,"072928":[],"073016":[],"073062":11,"073136":11,"073225":[],"073230":11,"073280":11,"073362":[],"073368":[],"073423":[],"073436":11,"073449":5,"07345504":[],"073531":[],"073575":11,"073583":[5,11],"073598":11,"073629":11,"073695":[],"073699":5,"073719":5,"073761":11,"073810":11,"073816":5,"073827":11,"073907":[],"073949":5,"074034":5,"074067":11,"074111":11,"07413172":[],"074149":11,"07421084":5,"074237":5,"074336":[],"074375":5,"074488":[],"074530":11,"07456491":5,"074573":11,"074666":[],"074693":5,"07490892":6,"074945":[],"075195":5,"075241":5,"075573":[],"075594":5,"075760":5,"075820":[],"075959":5,"076130":11,"076204":[],"076216":11,"076338":5,"0764924":6,"07656896":[],"076589":5,"076604":11,"076628":5,"07678":[],"076780":11,"076804":11,"076895":11,"076905":11,"076938":11,"076955":5,"077003":5,"077013":11,"077015":11,"077022":[],"077083":11,"077211":11,"077349":11,"07735703":16,"077402":5,"077425":5,"077452":11,"077467":[],"07777777777777778":1,"077793":5,"078040":5,"0782":6,"07820":[],"078253":[],"078254":11,"078269":11,"078299":11,"078314":11,"078436":11,"078548":[],"07864":[],"078667":[],"07871":[],"07878641":16,"078911":[],"078992":[],"07903849":16,"079157":5,"079281":5,"079347":[],"079383":5,"079389":5,"079405":5,"079406":[],"07944154":16,"07968918676726029":[],"0796891867672603":6,"079729":[],"079839":[],"079847":[],"079893":[],"07989327":[],"07999999999998":[],"07e":17,"08":[13,18],"080106":[],"080137":[],"080256":[],"080297":5,"080312":[],"080319":5,"080334":[],"080347":[],"080370":[],"080406":[],"080410":[],"08041015":[],"08043851":5,"080517":[],"080582":11,"080593":11,"080647":11,"080706":11,"080738":11,"080801":[],"080847":5,"08085812":[],"080916":[],"080984":11,"081046":11,"081072":11,"081140":[],"081144":11,"081233":5,"081253":5,"08131003":6,"081388":11,"081431":[],"081483":[],"081533":5,"081540":[],"08156108":6,"081773":[],"082174":[],"082183":[],"082295":11,"0823185":[],"082451":[],"082503":11,"08251519":6,"082536":11,"082896":11,"082900":[],"08299273e":6,"083015":5,"083053":[],"08318298e":1,"083220":[],"083227":[],"083276":11,"08328216846752691":11,"08333333333333333":1,"08336233266":4,"083404":[],"083441":[],"083506":[],"083527":[],"083600":[],"083692":[],"08376632":6,"083766322923899":6,"0837663229239016":[],"0837663229239025":[],"0837663229239043":6,"083799":[],"083829":[],"083977":[],"084000":[],"084101":[],"084184":[],"084224":[],"084226":[],"08426840630693411":[],"08426840630693412":6,"08426840630693413":6,"08428156":16,"084282":[],"084364":[],"084400":[],"084408":[],"084414":5,"084444":[],"084484":11,"084536":[],"084549":[],"08455":[],"084570":[],"084604":[],"084629":[],"08464758160254343":5,"084670":[],"084683":[],"084702":5,"08474":[],"084777":[],"084862":[5,11],"084904":5,"084909":5,"084965":[],"085018":5,"085044":[],"085163":11,"085167":[],"085184":[],"085185":[],"085361":[],"085416":[],"08551306":6,"085764":[],"08576932":6,"085879":11,"08593216":6,"086074":11,"086076":5,"08611111111111111":1,"086112":11,"086303":[],"08630331":[],"086567":[],"08673755293381497":[],"086807":5,"086872":5,"086890":11,"08690":[],"086956":11,"087501":[],"08758":[],"08759":[],"087834":[],"08816688":[],"088176":[],"0881981":5,"088212":5,"088526":11,"088611":[],"088631":[],"08871404":5,"088809":[],"088816":[],"088825":[],"088853":[],"08888888888888889":1,"088926":[],"08902":[],"089059":[],"08917679":5,"089177":5,"089212":[],"089329":[],"089425":[],"089501":11,"089614":[],"0896981":6,"08996":[],"09":1,"090028":[],"090229":[],"09085624":16,"090929":[],"091051":11,"091060":[],"09117221":[],"091224":[],"091236":[],"091340":[],"091349":[],"091363":[],"091414":[],"091416":[],"091426":[],"09149881":[],"091630":[],"09166666666666666":1,"091696":11,"0917":9,"09170751":[],"09172408":6,"091891":[],"092066":16,"09216046":[],"0923":[],"09251":[],"09297039":[],"093247":[],"0934597075922044":[],"0938":[],"094082198961999e":6,"0940821989624095e":[],"094082198966615e":6,"0940821989673748e":[],"09440475":18,"094404754965417":18,"09444444444444444":1,"094472507965532":11,"095510":[],"095702":[],"095871":[],"09609807":5,"096173":[],"096472":11,"096623":[],"09672929714683368":[],"097360":[],"09744":[],"09744272":6,"09780":[],"09791":[],"09849763":11,"098498":11,"09856879":16,"09861229":16,"098802859381565":16,"099":[],"09903804":8,"0991919894927399":6,"099191989493334":[],"09951287404314545":1,"0n":0,"0s":[3,4],"0x11da42d90":13,"0x11e031e50":13,"0x7fad10f9a280":[],"0x7fad20f69be0":[],"0x7fd098df3280":[],"0x7fd0a9063be0":[],"1":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20],"10":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],"100":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19],"1000":[0,1,2,4,5,8,11,13,14,15,18],"10000":[2,5,6,10,11,18],"100000":8,"10001":10,"1001":18,"1002":18,"1003":18,"10030":[],"10044225464078282":[],"1005":18,"10077114273548984":6,"1009":18,"1011":18,"1013":18,"1013904243":18,"10141413e":6,"1015":18,"102":3,"1022233262115424":[],"10222333":[],"1023":18,"10230":[],"1023111":16,"1024":3,"1026":18,"1027":18,"1028":[],"103":1,"1030":18,"10302062":16,"10340":[],"1037":18,"10378326e":1,"1038":18,"10391807":6,"10398646080125035":[],"10398646080125036":6,"10398646080125037":6,"1040":18,"10405456":11,"10430":[],"104411":[],"10455924":[],"1047":18,"10505137":16,"10520":[],"10555555555555556":1,"1056":[],"10589577":5,"106":[],"106095":11,"10620135":16,"108":6,"109":[],"10913":6,"10931453":6,"10960":[],"1096767776832326":18,"10967678":18,"10th":9,"10x":0,"11":[0,2,3,4,5,6,7,8,9,10,11,12,13,16,18,20],"110":[],"1100":18,"1101":18,"11022302e":5,"11046771":16,"111":[1,7,12],"11100":[],"1122558214":[],"112383":11,"1124":[],"1125":3,"11297834":[],"1136":3,"11362930e":[],"11388888888888889":1,"1139":3,"11390":[],"114":3,"11402309":16,"114437":[],"11462415":5,"11482289e":6,"11499517":[],"11507992e":1,"11547777218875695":6,"11547777218875696":6,"11547777218940905":[],"11547777218940906":[],"115822":6,"11590":[],"11598862":18,"11598862273198":18,"11604844":[],"116048442683864":[],"11660":[],"11666666666666667":1,"11674401539815678":18,"117":8,"11744554e":6,"11780":[],"11790868":[],"117986":[],"118":2,"1182":[],"1183":[],"118318":[],"1184":4,"11840":[],"1185":[],"1186":[],"11890":[],"119":2,"1199":[],"119936":2,"119999999999976":[],"11it":6,"12":[0,1,2,3,4,5,6,8,9,11,12,13,16,18,20],"120":[2,3],"1203":[],"1203284":8,"1206":8,"12069773":16,"121":[2,8,9,10],"12182967":6,"12196674":[],"122":[2,8,9,10],"12222222222222222":1,"122439":[],"1224392":[],"12288563":5,"122886":5,"123":[],"12318726e":6,"12333649":6,"12345260617257443":9,"123459876":[],"123711":6,"12380":[],"124":0,"12400":[],"125":[],"1250":[],"125000":[],"12552073e":6,"126":[],"1261":[],"12618549":5,"1265":[],"127":4,"1270":[],"127043":[],"1271":6,"1277":6,"127773":[],"12777777777777777":1,"12788968":[],"12790":[],"128":[3,4,13],"128664":6,"12898627064868978":[],"12937662":[],"12945452":[],"1297":[],"1298":9,"12adb44b1c20":7,"12m":3,"13":[0,2,4,5,6,9,11,12,13,16,18],"130":[],"13003291":6,"13055555555555556":1,"131":[],"13117061":[],"1314":[],"132":[],"13220608e":6,"13229545716505003":16,"132360":[],"1323603":[],"1326":[],"13280":[],"133":7,"13333333333333333":[],"135":[],"13519106":[],"13535942":6,"136":[],"1360":[],"13609760e":18,"1361":[],"1362":[],"1363":[],"1364":[],"13646574":5,"13661243e":6,"13679863":6,"1371":6,"13740":[],"137400784702911":[],"137652":11,"1378":[],"1382":[3,4],"1383":[3,4],"1384":[3,4],"1385":[3,4],"1386":[3,4],"13865173":5,"13876586436927824":5,"138775":11,"1388888888888889":1,"13890":[],"1392559581788775e":[],"1392559584983597e":[],"1392559585048734e":6,"13925595925919e":6,"14":[0,2,4,5,6,8,9,10,11,12,13,16,18,20],"140":[],"14021063":6,"1404":[],"14042769":[],"140428":[],"141":2,"14100":[],"1416398":6,"14174745":6,"1418":[],"142":2,"14250":[],"142857":[],"143":[2,7],"1435666":[],"14360598":[],"1437":1,"144":2,"14400":[],"1440501043841336":1,"14440":[],"1446729567":4,"14484695":16,"145":2,"146":[],"147":[],"14710":[],"14722222222222223":1,"147400":11,"14741468":[],"147420":11,"14783702":[],"1479":[],"148":[3,4],"14812206":6,"14818":[],"1484256":[],"148564":6,"14859":6,"148768":[],"149":[3,4],"149213":6,"14932651":[],"14988578":[],"149886":[],"14g":6,"14it":6,"15":[0,2,4,6,7,8,9,12,13,16,18],"150":[3,4,8],"15005476":5,"15098090e":6,"151":[3,4],"15130074e":6,"151986":[],"152":[3,4],"15200":[],"15258907":[],"1527777777777778":1,"153036":[],"153106":[],"1533795":[],"153760":[],"15384615384616":[],"154":[],"15454301":[],"154720":[],"15483121":[],"154911":[],"155":[],"155491":[],"155687":[],"155883":[],"156":[],"1562":[],"15629539":[],"15680777":16,"157":[],"15717291":16,"1575":[],"158":[],"1583767":16,"15843769515580663":18,"1586300629904382":[],"1587":[],"15891336":16,"159":[],"1590":[],"15990":[],"15g":6,"15it":[],"16":[1,2,3,4,5,6,8,9,10,13,18],"160":[],"1603":3,"1604":[],"1605":[],"160539":[],"1606":[],"1607":[],"16111111111111112":1,"1612":[],"16211139":5,"16220":[],"16231451":4,"1625":[],"1628":[],"163":[],"1630775253":[],"16342407":5,"16343471":6,"16384":3,"16500":[],"166":[],"16660817":[],"166667":[],"167":[],"16740002":16,"168":[],"16805821e":6,"16807":[],"16827044":[],"16832385":[],"16b8e3cda33a":1,"17":[1,2,4,5,6,8,13,18],"17084902":[],"1709":[],"17174962e":1,"17222222222222222":1,"1726":[],"17300":[],"1731":[],"17339342":[],"17446471":6,"1752":[],"175300":[],"17641709":6,"176880142835407":[],"17777777777777778":1,"17801022":5,"17861098":6,"17917768":5,"17930649":16,"17949575":5,"17953942":11,"1797":[1,3],"18":[2,4,6,7,8,9,10,13,18],"180":[],"18029127":5,"1807":4,"1809":[],"181":[],"1810":4,"1812":[],"18156717":16,"1821":[],"18276924":[],"18327677":[],"18333333333333332":1,"18393678":[],"184":[],"184519":[],"184895":[],"185":[],"1851":[3,4],"1852":[3,4],"18526":[],"185278747229417":[],"1853":[3,4],"1854":[3,4],"1855":[3,4],"186":[],"1860":[],"1861":[],"18611111111111112":1,"18613217e":6,"18660":[],"18673098":11,"18682538":[],"1887":6,"18912963":16,"189496":[],"189622":[],"18it":[],"19":[2,4,6,13,18],"19003":6,"191262820314401":[],"19166666666666668":1,"19207979":5,"19213479":[],"19220":[],"193":[],"19354258":[],"19379506":[],"19394283":[],"194":[],"1940":0,"19404282648955e":6,"194042826653172e":[],"194042826815498e":[],"1940428268204826e":6,"1943":12,"1944":[],"19444444444444445":[],"19466812":[],"1950915150":[],"1954":[],"1956":[],"19569961":6,"1961":[],"1962":[],"1963":[],"1964":[],"1965":[],"1970":16,"1973":9,"197370":11,"19740":[],"1979":6,"19800":[],"19853775e":18,"1989":[],"199":[],"19937":[],"19994371":6,"1_1":12,"1_2":12,"1_3":12,"1cm":[0,8,10,18],"1d":[1,2,3],"1e":[1,2,3,4,14],"1e10":14,"1e4":6,"1f":1,"1k":16,"1n":0,"1s":3,"1x":0,"2":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],"20":[0,1,2,4,6,7,8,13,18],"200":[0,2,3,4,8,9,10],"2000":0,"200000":[],"20015436":6,"2004":13,"2006":20,"2010":1,"2011":1,"2014":4,"2015":1,"2016":0,"20174121":16,"2018":[0,6],"2018906331":[],"2019":[],"2021":[6,14],"2022":17,"2027":[],"20277777777777778":1,"203":6,"20320502":[],"20375361":[],"203753611274545":[],"20500":[],"20509391":[],"206":[],"2060":[],"20661216":[],"2069":[],"207545":11,"20756638":[],"20833333333333334":1,"20867052175006306":6,"20867052175109335":[],"20980":[],"21":[0,1,2,4,5,6,7,9,12,13,16,18],"210340":11,"21058097":5,"21130":[],"2116753732":4,"21169159e":6,"21265216":[],"213":6,"213103":11,"213743":11,"21472683":16,"2147483647":[],"21519063":16,"21596432":6,"216290":11,"216683":11,"21786964":16,"2188":[],"21919813":[],"21944444444444444":[],"2195":3,"21985165":13,"21997099":16,"22":[0,1,2,4,5,6,12,13,16],"22044605e":5,"220506557673408":18,"22094791":[],"221":8,"221180":[],"2216":[],"2218":[],"221805":2,"222400":[],"2225":3,"225":4,"2259440937":[],"226124657522696":[],"22612466":[],"22690428":5,"2284246870217459":6,"22842468702288576":[],"22842468702288582":[],"22847924":5,"22929905e":18,"2299":3,"22it":6,"23":[1,2,4,6,7,12,13,16],"23002365e":6,"23014274e":18,"231":[],"23103285":[],"2315033":[],"23167717":5,"2321528":5,"232153":5,"232435":[],"23297056":[],"23333333333333334":1,"233528":5,"234":6,"23522201":[],"2357089093":[],"2360682191515046":[],"2361111111111111":[],"2364":[],"237038":5,"23703839":5,"2379":6,"2397":[],"24":[0,1,2,4,6,13,16],"24140":[],"2416":[],"24175744e":6,"2419":[],"24276315":16,"2430":[],"24390":[],"24444444444444444":1,"244858":[],"24485843":[],"24512498":16,"246":2,"2470":[],"24770094":6,"24829908":5,"24906604e":6,"24924624":[],"2495":[],"25":[2,3,4,5,6,7,8,9,11,13],"250":[2,4,7,9],"2500":[],"25000":0,"250000":[],"250154":[],"2517560119":[],"251879":[],"252436":[],"25259666":16,"2526":3,"252866":[],"25286618":[],"253775":[],"255":3,"255001":[],"256":[2,4],"25617654e":6,"25617657e":[],"25617658e":6,"256962":[],"257":[],"2572":[],"2572495066":[],"2572e3a4b38d":1,"2575":[],"25792767":16,"25845e8df859":6,"259153":11,"2597":[],"25976336":[],"26":[2,4,6,13],"26079358":[],"26153846153846":[],"26186844":16,"2619":[],"26290036":[],"26294938":[],"2629493813057833":[],"26301436":5,"26306244":[],"264":4,"26409315307910025":6,"2640931530791003":[],"2640931530791005":[],"26409315307910053":6,"265":[],"2650":[],"265109911":4,"26531223e":18,"2654":[],"266":[],"26610075":[],"26666667":13,"26710969":5,"26780278":5,"268":[],"268227":[],"26822717":[],"269":[],"27":[0,1,2,4,6,13],"270":[],"2703":3,"27092897":6,"2750":[],"275341":[],"27562809e":18,"27621662e":18,"276263":11,"27692307692308":[],"27700":[],"2772":3,"2775623201":[],"27760":[],"278036":5,"27803645":5,"27n_":18,"28":[1,3,4,6],"28001319":[],"28047021":16,"280647":11,"28067036":16,"28097861":5,"280979":5,"2812":[],"282727":11,"283":[],"2830637392":4,"28336218e":6,"2836":[],"28390":[],"28475098":8,"28590743":[],"2861":18,"28634473":11,"286345":11,"2871":[],"2873":9,"2882":18,"2886":18,"2886847885377843":[],"28868479":[],"28875373":16,"2890":0,"2892":18,"28967287":16,"29":[4,6,7],"29149329":[],"2915":18,"29167186":5,"29229741":13,"2923076923077":[],"29512284":11,"295123":11,"2954":[3,4],"2955":[3,4],"2956":[3,4],"2957":[3,4],"2958":[3,4],"29588901":13,"29592539":[],"296247":[],"297":[],"2971492148":[],"2972":[],"29822833":6,"298273":[],"298375":[],"299267190588216":11,"299748":[],"2_":12,"2_1":12,"2_2":12,"2_3":12,"2_i":12,"2_m":[6,18],"2_t":13,"2_x":18,"2b":18,"2cm":8,"2d":[1,3,11,12,15],"2e":6,"2f":[0,7,9,10,11,12],"2ff97f4bf03b":[],"2g":2,"2g_i":2,"2k":3,"2m":6,"2n":[0,2,3],"2nd":9,"2p":18,"2pt":4,"2s":4,"2x":[0,3,8,13],"2x_ix_jy_iy_j":8,"2x_j":8,"2y_i":10,"2y_j":8,"3":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],"30":[0,1,4,6,7,10,13],"30000":0,"30010":[],"30119421":8,"3017":[],"3018":[],"3019":[],"301927":[],"3020":[],"3021":[],"30258509":16,"302m":4,"303":6,"3037":[],"3038":[],"30384239":16,"3039":[],"303m":4,"3040":[],"3041":[],"30466214e":6,"304m":4,"30535506":[],"30552077":16,"30559547":[],"305m":4,"3063":[],"306m":4,"3072":3,"30761405e":18,"30787294":6,"307m":4,"308m":4,"309":0,"30940":[],"30b53504a633":0,"31":[4,6,12,16,18],"310":0,"311":0,"311m":4,"312":0,"3120271598582915":18,"3123314713548606":6,"31276579e":6,"312m":4,"313":0,"31318084":5,"314":[],"31457796":5,"315":6,"3155":[0,5,6],"316":[],"31605061":16,"31614188e":18,"317":[],"31718909":11,"317367":11,"317m":4,"31866499":13,"31896852":8,"319m":4,"32":[3,4,6,12,13,16,18],"3200":1,"32039227e":18,"32047562":[],"3208":2,"320m":4,"32149601703519115":6,"3214960170351912":6,"3215":[],"32179365":[],"32309075":[],"32320052":16,"324":2,"32458459":[],"324m":4,"3250":[1,6],"32512":[],"326238":[],"326m":4,"32721178":11,"327212":11,"32750531e":18,"32816737":[],"32903042":[],"3297":[],"32992274":[],"329923":[],"33":[3,4,12,14,16],"3303":[],"33066907e":5,"3310":[],"33166055e":5,"331939":[],"331m":4,"332331":[],"333":7,"3331":[],"33327369":[],"333274":[],"33333333":13,"3337":[],"33611111111111114":[],"33711888":[],"3384":[],"33900713":[],"33m":4,"34":[4,7,16],"3403":[],"34040204e":18,"340782":11,"34114547":5,"341m":4,"342680":[],"34305928":[],"3436":0,"3437":0,"3456":[],"34568872":16,"34569596":5,"3457":[],"3458":[],"34585355":16,"3459":[],"3460":[],"346810":[],"3469819128513336":[],"34740615":[],"3498":[],"34it":6,"35":[0,2,4,6,7],"3514":[],"35140":[],"35147135":16,"351636":11,"35182854":5,"35203688":16,"3522":[],"3525":[],"3528556":[],"352856":[],"3529":[],"3530606977":[],"3538":[],"35396404e":18,"35401056e":18,"3543":[],"3544313922":[],"3546":[],"35470445e":5,"3548":[],"355":[],"3551":[],"35533773":6,"35533774":[],"3556":[],"35562617e":18,"3558":[],"3560":[],"356399":[],"3567":[],"3572":[],"35724288e":18,"3575":[],"357508":[],"3576":[],"3577":[],"35771842":6,"3581341341":4,"3585":[],"3587":[],"35892474":16,"359":5,"3593":[],"3594821":13,"3595":[],"3598":[],"359999999999985":[],"36":[0,2,4,5,6,7,18],"360":1,"3604":[],"3605":[],"3606":[],"360688":[],"3609":[],"36102113":[],"36117602":[],"3613":[],"3615":[],"361556":[],"3617":[],"3621311":5,"3624":[],"3627":[],"3628":[],"363295916323784e":6,"363295916414895e":[],"3632959170548605e":[],"363295924430451e":6,"363834":11,"36383443":11,"3643":[],"364418e97433":1,"3645":[],"3646":[],"3647":[],"3655":[],"3655222":5,"3659":[],"3668":[],"36689784":[],"366898":[],"3669":[],"367":2,"3672":[],"3673":[],"3674":[],"3679":[],"3684":[],"3687":[],"3688":[],"368m":4,"369139":11,"36it":[],"37":[2,4,6,7],"3704":[],"370782966":4,"3711":[],"3713":[],"3718":[],"3721":[],"3722":[],"3725":[],"3729":[],"37307168":16,"3739":[],"37396662":6,"37415316":16,"374291":5,"37429133":5,"3748":[],"3749":[],"3753":[],"3759":[],"3760":[],"3765":[],"376559":[],"37655936":[],"37692363":[],"37703055":[],"3772":[],"3773":[],"37732":[],"3776":[],"3777801602":[],"3779":[],"37835429e":[],"3784":[],"37900111":6,"3791":[],"3794":[],"379647":11,"37964744":11,"37992857":[],"38":[2,4,7,18],"380":[],"3802":[],"3803":[],"3804":[],"3805":[],"380739":5,"38073947":5,"3811":[],"38135733e":6,"3815":4,"381627865854956":[],"38162787":[],"3817475779":[],"3818":[],"3819":[],"3820":[],"38246359":[],"3827":[],"382951":11,"38295101":11,"3830":4,"3833":[],"38336316":16,"3834":4,"3837":4,"3838":4,"3839":4,"3842":[],"3850":[],"3851":4,"38533184":6,"3854":[],"3858":4,"386":[],"3861":4,"3862":4,"38629436":16,"3864":4,"3867":[],"3869":4,"387":[],"3871":4,"3872":4,"387482":5,"38748219":5,"3876":[],"388":[],"3881":4,"3882":[],"3885":[],"38868469":16,"3888":4,"3889":4,"389":[],"38901478":[],"3891":4,"38916861e":6,"38962192e":6,"3898":[],"39":[0,2,4,13,19],"390":[],"3906":4,"39095416":[],"3914":4,"3915":4,"3916":4,"391602":[],"3917":4,"3922":4,"3925515884752442":[],"3928":4,"3931":[],"39311435":16,"3943":4,"3944":4,"39456996":16,"3950":4,"3955":4,"39560937":16,"39579407":5,"3958":[],"3960":4,"3962":4,"3970":4,"39706038":5,"39724390e":18,"3975":4,"397700":11,"39789527":16,"3979":4,"39794864e":18,"3980313467":[],"3983":4,"3994":4,"3996":4,"399836":[],"3d":[2,3,4,6,13],"3f":[1,3,9],"3n":16,"3x":[2,8],"3x_i":2,"3y":8,"4":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],"40":[1,4,6,19],"400":4,"4000":20,"4005":4,"4011":4,"40116777":[],"401168":[],"4012":4,"4017":4,"401842":11,"40214433":16,"4022":[],"40236901e":18,"4027":4,"4030":4,"40340043":[],"4034668048":[],"4038":4,"4039":4,"404":[],"4045":4,"4048":4,"4055":4,"405890":11,"4059":4,"40599799":[],"4068":4,"4069":4,"4075":4,"4077":[],"408":2,"4082":[4,6],"4084":4,"4087":[],"4088":4,"4089":4,"409":2,"40927184e":6,"40a38ad763f1":6,"41":[2,4,16],"410":2,"4100":4,"4107":[],"411":2,"4115":4,"4117":4,"412":2,"4128":4,"4131":4,"41357064":[],"4143":4,"41433969":5,"4144":4,"4146":4,"41511965e":1,"4155":2,"4162706317":[],"4167":4,"4176":4,"4177":4,"418506":11,"4186":4,"41876267":5,"418763":5,"41882036e":6,"41882037e":6,"4192423635":[],"41958102e":18,"4198":4,"41990268":[],"41it":6,"42":[0,1,2,4,8,9,10,16],"420":[],"42037468e":18,"42078103":[],"421":2,"4212":4,"422":2,"4224":4,"423":2,"42340403e":18,"42394972":16,"424":2,"42441033":5,"42449643":[],"42450":[],"425":2,"4255":[],"4258989918":[],"426":[6,7],"42615374e":18,"42631342":[],"427017":11,"4275":4,"43":[0,1,2,4,7,16],"43054282":5,"43135183":16,"43294696e":18,"43330971e":6,"434932":11,"43493232":11,"435163":[],"43552433":16,"43579948e":6,"436462435":4,"43761347":[],"43766686":11,"4379":4,"438060758":[],"438136":[],"439230":6,"44":[0,1,2,4,16],"44089210e":5,"4410":[],"4411":[],"442600":11,"443217":[],"444":[],"44688507e":18,"44970586e":1,"45":[2,4,19],"450":[],"450257":11,"4504":[],"45290829":16,"45393214e":18,"4543859":[],"4557763":11,"455947":[],"456":[],"456418966187335":[],"457":[2,4],"457770268480242":[],"458027":[],"458078":11,"45960079":5,"46":[2,4,19],"4601":[],"461":[],"461175":16,"462":7,"46383925e":6,"464424":[],"4644244":[],"46508305":16,"46567887":16,"466":[],"46602982":[],"46696223":[],"469":[],"46932688":[],"4694":[],"46984697e":6,"469868":[],"46986815":[],"47":[4,19],"4703":4,"47042744":5,"470714":[],"47075725":6,"47116868e":6,"47125748":5,"47132891":5,"47387858":[],"47400238":[],"47432993":[],"4744":[],"47478057":[],"47485224":[],"475311":[],"47531107":[],"47610036":6,"47815203":11,"47920156":[],"47942814":5,"479465113":4,"48":4,"48089797":[],"48133064":[],"481979":6,"48212873":16,"48257387":19,"48316523e":18,"483257001":[],"4837":[],"48420165":[],"48476997":11,"48574149":16,"486873":[],"48687342":[],"489":[],"48994188":5,"49":[4,5,6,11,13],"490":[],"491":[],"49152":3,"492":[],"493":[],"49385454e":18,"4940954":0,"4959161509356135e":6,"495916150936645e":6,"495916150936654e":[],"495916150938325e":[],"49614357":18,"49636583":[],"497":[3,4],"498":[3,4],"499":[3,4],"4990":18,"4992":18,"4997":18,"49992743e":18,"4c4c7f":[9,10],"4d":3,"4f":6,"4y":8,"4y_i":10,"5":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],"50":[1,2,3,4,6,7,8,10,13],"500":[1,3,4,6,9,10,13],"500000":[],"50000455":5,"50000553":5,"50000718":5,"50000855":5,"50000969":5,"50001063":5,"50001142":5,"50001207":5,"50001261":5,"50001306":5,"50001343":5,"50001374":5,"500014":5,"50001414":5,"50001422":5,"50001439":5,"50001454":5,"50001466":5,"50001476":5,"50001485":5,"50001492":5,"50001498":5,"50001502":5,"50001506":5,"5000151":5,"50001512":5,"50001515":5,"50001517":5,"50001518":5,"50001519":5,"50001521":5,"50001522":5,"50001523":5,"50001524":5,"50001525":5,"501":[3,4],"50105159":[],"5018":18,"50227564e":6,"5031474174499113":18,"50314742":18,"50321091":5,"504167":[],"50416731":[],"506":0,"50680321e":18,"50727059":16,"50769230769231":[],"507d50":[9,10],"50846111e":6,"50846112e":6,"50it":6,"50j":13,"50x10":1,"51":[4,10],"510":1,"51004249":16,"51126895e":18,"512132":[],"51214899":6,"51265232":16,"51289697":11,"512897":11,"5138":[],"51389553":16,"514219":[],"51561271":16,"517350858882083":[],"5177783846":4,"518030":11,"51803019":11,"519842":[],"52":[3,4,13],"5222222222222223":1,"522758":[],"52307692307693":[],"5260627":[],"526744":11,"52723079":[],"52773051":[],"52799362":11,"528115":11,"52811546":11,"52874252":5,"529":[],"52911941":[],"52945798e":[],"53":[3,4,9],"5303329":11,"5305555555555556":1,"5312":[],"531280":[],"53189647":[],"53312754":16,"53423784":16,"53603432":[],"53611562":[],"53697476":[],"53703498":6,"5378811":11,"53794784":11,"537948":11,"53846153846155":[],"539261":11,"54":[3,4,6,18],"540":[],"54016188":11,"540162":11,"54039921":5,"54041041e":5,"541605":[],"54163136":13,"544439":[],"546166676":[],"54780216":[],"54it":[],"55":[1,3,4],"5501":[3,4,14],"550321":[],"5539":[],"55505907":16,"5555555555555556":1,"55578041":[],"5566":[],"557795":11,"55854694":11,"5594":6,"56":[1,3,4],"56033697":5,"561":[],"5611":[],"5615":[],"56198284":5,"5625":[],"56302854":16,"5639":[],"564":[],"564374":11,"565":[],"56536":0,"566":[],"56636616e":6,"567":[],"568":[],"569":1,"56912044e":6,"56939714":5,"56992937":[],"57":[0,4,8,19],"570":[],"5700":[],"571":5,"571105947979336e":6,"571105947979394e":6,"571105947979395e":[],"571105947979439e":[],"57154252":[],"57174058":[],"57201944e":6,"57266138":[],"57361898":[],"574465":11,"57673618":16,"57842073e":18,"57it":[],"58":[4,10,19],"583595":[],"58395707":[],"58428804":5,"584804":[],"5888888888888889":1,"589":[],"58986647":[],"59":[2,4],"590":[],"591":[],"591317992":4,"591594":5,"59159438":5,"592":[],"593":[],"5944444444444444":1,"59591979":[],"595920":[],"59592669":[],"59766":5,"597660":5,"59833875":13,"598392":[],"59839245":[],"59955801":13,"5cm":18,"5dd54edf2138":6,"5f":8,"5x":8,"5y":8,"6":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,17,18],"60":[1,2,3,4,6],"60000":4,"6019067271":4,"60236938":16,"60293962":5,"60420593":5,"60538875":16,"60619654":6,"6063219":[],"606439":[],"60673226":11,"60685864":6,"60791699":[],"6079169911277265":[],"60943791":16,"61":[2,4,7],"61033524":[],"6111111111111112":1,"612939":[],"613579":[],"61399851":11,"613999":11,"61463451":16,"614808":11,"61576236e":18,"618":[],"61808351":[],"618982":[],"6199381169260247":[],"62":[2,3,4],"62168613":[],"62364974":[],"62373464":11,"625":7,"626635268":[],"62767384":[],"62894215":5,"629961":[],"63":[0,1,2,3,4,6,7],"6300745149331701":[],"630224":[],"63025821e":6,"63207808":18,"63249532e":6,"63270833":[],"63395187":[],"63498144":5,"63675140":[],"6371293350711955":[],"63860687":16,"63901111":[],"63it":[],"64":[1,3,4,7,13,16],"64012627":5,"64113381e":18,"64141716e":18,"64293754":[],"64425009":[],"645":[],"64615384615385":[],"646283":11,"647":6,"64742912e":6,"647473":11,"649339":5,"64933923":5,"649382":11,"64x50":1,"65":[1,2,3,4,7,8,9],"65136857":[],"6530742540053943":[],"6562":[],"65626043":5,"65628853":16,"65885453":5,"659306":[],"66":[2,3,4],"66054752":[],"66087937":[],"66204648":6,"66226149":6,"66247212":[],"6628996975186953":[],"66292841":[],"66310422":[],"6638":[],"66410989":[],"66560":[],"66619972":11,"666200":11,"667":[],"668172":[],"668186":[],"66818635":[],"66it":6,"67":[2,4],"67047975e":6,"671089":[],"672721":[],"67314874e":5,"67588315":[],"67591616":[],"67697934":11,"67838309":[],"67882608":[],"68":[2,4],"68176047e":18,"68192193":5,"68246089":16,"68279358":16,"6834195":[],"68534263e":6,"68542204":5,"68545647e":[],"6869":[],"6887363571":4,"68929213e":6,"68944595":[],"689519":11,"69":[2,4,7,18],"690":[],"690569639355314":[],"69061276":11,"690617":[],"69069n_":18,"692":1,"69295955":[],"69484813e":5,"69493539":16,"69504801":6,"69634577e":6,"69695259":5,"69985355":[],"6999536":11,"69it":[],"6e75736fdab1":6,"6f7a6bd7d79f":6,"6m":[3,4],"6n_":18,"7":[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18,20],"70":[1,2,4,6,7],"70127680":6,"70179437":[],"70205195":16,"70354373":[],"703716d317a7":8,"70434005":[],"7050":[],"70598996":[],"70653767":4,"70710678":5,"70769586":[],"70831425":[],"70832814":5,"70980493":16,"71":[1,2,4],"71131626":16,"7119":[],"712018":11,"7134":[],"71350226":[],"7151":[],"71721168":[],"718697":5,"71869727":5,"72":[2,4],"72174172":11,"722047011333792":5,"72271878e":6,"72347283":[],"7236674":5,"72373129":[],"724":3,"72522848":[],"72859758":5,"7293182":[],"72981762":8,"73":[4,6],"731000":[],"73174557":[],"73287103e":18,"733096":[],"73406033e":18,"73484667":[],"735738558766299":[],"73573856":[],"73752910":[],"73it":6,"74":[4,6,13],"740":[],"74081822":8,"74368436":16,"743u":[],"7448615806559786":[],"7469898175164704":[],"74840212":5,"749765":[],"75":[4,5,6,8,11],"7501749450963715":[],"750445":[],"750u":[],"75106135":16,"75118364":[],"751699":11,"75170092":5,"753846153846155":[],"75517445":[],"756352":[],"75838233":[],"75it":[],"76":[2,4,19],"76060096":[],"76066069":16,"763u":[],"7643536":13,"765":7,"76529528":[],"76674796":16,"76731400e":18,"76802186":[],"76923076923077":[],"76936315":5,"7694444444444445":1,"77":[2,4,13,19],"77034458":[],"770345":[],"77152076":5,"7718":9,"773329728649545":[],"77332973":[],"77333117e":18,"774300":[],"775":[],"77627886":13,"77632220e":18,"77636e":13,"77662945":[],"7767978193240488":11,"77714169":8,"77754132e":18,"7782028952":4,"77865169":[],"78":[2,4],"78011544":[],"78156479e":5,"78184120e":6,"7846153846154":[],"78941903":5,"78988962e":18,"79":[2,4],"79009329":16,"79093776":[],"79111643":5,"791123":[],"79145214e":18,"793167":[],"79394867":[],"7939646":[],"794282":11,"79449156":[],"79602861":[],"79754246":[],"797e":6,"79856831e":18,"7c394b1e8b71":9,"7d7d58":[9,10],"7f2b3a6174c2":13,"7m":4,"8":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18],"80":[0,1,2,4,5,6,8],"800":[4,7],"80315282":5,"803153":5,"80354994":6,"80469739":5,"8055555555555556":1,"80561191":[],"80609615e":6,"80609616e":6,"8064":[],"80734875":[],"807349":[],"80738685":16,"80747253":16,"80842254":11,"808423":11,"80847477e":6,"81":[1,2,4],"81048318e":6,"8108619":[],"81160425":5,"81187794":16,"81333804":6,"81333805":[],"81388724e":18,"814":[7,11],"815563":[],"81633628":11,"816454":[],"81671821":[],"816847":[],"8175":[],"82":[2,4],"8219235992494145":[],"8219236":[],"82198978":5,"82650876":[],"826509":[],"8265786":5,"82747653":[],"827477":[],"82773778":[],"829648415811072":18,"82964842":18,"83":4,"8305555555555556":1,"83512277":5,"836874":5,"83687444":5,"83698677":16,"83999999999999":[],"84":4,"84062065":[],"84228957e":[],"84232163":16,"842436":[],"84292394":[],"842u":[],"84355903e":1,"84443254e":1,"84569271":13,"84780262":6,"84854738":[],"84923989e":6,"84924834":11,"84994524":5,"85":[1,4],"8503720991789538":5,"85091337":[],"85263220":6,"8527777777777777":[],"85278920e":5,"853241":[],"85324115":[],"853u":[],"85601992":5,"85758696":16,"858":[],"8583333333333333":1,"85953586":6,"85959007":[],"86":2,"8608479":[],"860848":[],"861":[],"86117291":5,"86134827":5,"86145244":11,"8638888888888889":1,"86478158":[],"86546962":[],"86623151":13,"86630":[],"8666666666666667":1,"86810":[],"869":0,"86905621":[],"86925797":5,"869258":5,"87":2,"870":0,"8702784034":4,"871":0,"872":0,"8722222222222222":1,"873":0,"87327414":[],"87381451":5,"875":1,"8759":13,"876":6,"87625493":[],"87647541":[],"8768":[],"878297":[],"87836018":[],"87940752":16,"87it":6,"88":[0,2,13],"88017651":11,"880177":11,"88031314":[],"88046261":5,"8805555555555555":1,"88118231":[],"88168312e":6,"881788":[],"883":[],"88336879":5,"884":[],"88477619":[],"885":[],"88512489":[],"88529063e":6,"8855417382991412":[],"88554174":[],"886":[],"88679947":[],"887":[],"8879":6,"88871662":16,"8888888888888888":1,"8894":6,"89":2,"8916666666666667":[],"89274639":16,"89288636":11,"893489":5,"89348922":5,"89410423":5,"8944444444444445":1,"89550839":16,"89565264":[],"8962476":[],"896248":[],"89873772":16,"89876748":[],"8991514":16,"89944994":5,"899450":5,"8f":6,"8g":6,"8n":16,"8x8":1,"9":[0,1,2,3,4,5,6,7,8,9,11,12,13,14,16,18],"90":[1,2,6],"900449":[],"90054363":[],"90075537":5,"9011":6,"90220243":5,"90266948":5,"90268858":[],"9027777777777778":1,"903824":[],"90382431":[],"9040":9,"90475506e":6,"90540529":11,"9055555555555556":1,"9083333333333333":[],"90884627":16,"90895045":16,"90940378":16,"90999452e":18,"91":19,"910":[],"9111111111111111":1,"91128596":5,"912u":[],"913":[3,4],"91379157":[],"913791573406831":[],"91383439":16,"91396388":[],"914":[3,4],"91416375":[],"91479093":[],"91492986e":6,"915":[3,4],"91549644":[],"916":[3,4],"9166666666666666":[],"917":[3,4],"91760278":5,"918":[],"91812702":5,"918992":[],"919":[],"92":[6,19],"92272314":[],"922u":[],"92343595":[],"924018":[],"92477093":[],"924e":6,"925":1,"92507116e":1,"9252772":11,"92578916":5,"92603747":16,"92626212":16,"92754397":[],"927544":[],"9277777777777778":1,"92819235":[],"92857143":7,"93":[],"9305555555555556":1,"930583":11,"931":0,"93155188":5,"93158979":5,"93248252":5,"932483":5,"932u":[],"933":5,"93414191":[],"93492130e":6,"93579127":16,"935u":[],"9361111111111111":[],"937":18,"937082":[],"93799826":5,"938":18,"9387":[],"939":[0,18],"94":[7,18],"9400":[],"941866404575299":[],"94226022e":6,"94284104":5,"94320205":5,"9444444444444444":1,"945":[3,4],"94548496":[],"94591015":16,"946":[3,4],"94639099":11,"94659383":[],"947":[3,4],"9472222222222222":1,"94735055":[],"947903":[],"94790323":[],"948":[3,4],"9482527":5,"949":[3,4],"95":[1,7,11],"95008046":6,"95079764":6,"95231424":5,"9527777777777777":1,"95284275":5,"953065564":[],"95351665":5,"954":18,"9549351910143222":[],"954u":[],"9555555555555556":1,"95569422":[],"955820c21e8b":4,"956563":11,"95684892":5,"95703":13,"95714723":[],"957147232685324":[],"95it":[],"96":[6,7,11],"960":18,"9601304850018328e":6,"960130485007504e":6,"960130485007934e":[],"9601304850213484e":[],"96024953":5,"96032148":16,"96084663":5,"961":18,"962":18,"9637117593816477":6,"9640435":5,"96489434":[],"9649652536":4,"96527903":16,"96551427e":18,"965548":[],"96606158":16,"96653373":[],"96686324e":18,"96688672":5,"9674916":5,"967809":11,"96863851":[],"96987657":[],"96992454":[],"97":7,"97005689":5,"97065296":[],"97108e":13,"9722222222222222":1,"97230501":[],"97243128":5,"97300836":5,"97497404e":6,"975":1,"97507735":5,"97547354":18,"97547354476579":18,"975510299261579":9,"9760832":[],"97705827":5,"977418":5,"97758848":5,"9777777777777777":1,"977880":[],"97788031":[],"9780387310732":20,"9780387848570":20,"9781492032632":20,"97898392":6,"97926491":5,"98":[0,1,7],"980":[],"98017611":13,"98036405":[],"9805555555555555":1,"98091621":5,"981321":[],"98139097":5,"98266587":16,"98275501":5,"983310":[],"98346748":[],"98399675":[],"98413059":5,"98454786":5,"985":18,"98566191":5,"986":18,"9861111111111112":1,"98680716":5,"98716878":5,"98756882":13,"98794823":16,"9879924":[],"98808176":5,"98822371":6,"9888888888888889":1,"989":18,"9890348":5,"9893149172528393":[],"9893447":5,"9898254753574576":[],"98982548":[],"9898ff":[9,10],"99":[6,7,11,13],"990":[],"99009525":5,"9902552771282336":[],"99049330":6,"99088801":5,"991":18,"99115119":5,"99176998":5,"992":18,"99242921":5,"99265097":5,"99274513":0,"993":18,"99316252":5,"99353454":[],"993535":[],"99371056":5,"99389612":5,"993972":[],"99397245":[],"9943201":5,"99435648":[],"9947756":5,"99492986":5,"99519225":13,"99528218":5,"99539415":5,"9955282554647219":[],"99566069":5,"99578809":5,"996":5,"99608161":5,"9963961":5,"99650061":5,"9967458":5,"99700706":5,"99709215":5,"99724883":[],"99729756":5,"99751458":5,"99758326":5,"99775587":5,"99775949":[],"99793613":5,"99799099":5,"99813653":5,"99828624":5,"99829953":[],"9983295":5,"99845267":5,"998577":5,"99861053":5,"99871521":5,"99881845":5,"99884384":5,"99893323":5,"999":[9,18],"99901896":5,"99903755":5,"99911427":5,"99918546":5,"99919837":5,"99926459":5,"9993237":5,"99933188":5,"99938942":5,"9994385":5,"99944272":5,"99949306":5,"99953381":5,"99953475":5,"99957911":5,"99961294":5,"99965056":5,"99967865":5,"99970988":5,"9997332":5,"99975913":5,"99977416":[],"99977849":5,"99980002":5,"9998161":5,"99984732":5,"99987324":5,"99989476":5,"99991263":5,"99992746":5,"99993978":5,"99995":5,"9999555851685968":6,"999955585168597":6,"9999840939906267":[],"9999858320366368":[],"9x":6,"9y":6,"\u00f8yvind":[6,19],"abstract":1,"boolean":4,"break":[0,4,6,11,14],"byte":16,"case":[0,1,2,3,4,5,6,7,11,12,13,14,15,16,17],"catch":0,"char":[],"class":[0,1,3,4,6,7,8,9,11,12,13,18],"const":[],"default":[0,1,2,4,6,7,13,16],"do":[0,2,3,4,5,6,8,9,10,11,12,13,14,16],"ekstr\u00f8m":4,"eng\u00f8i":19,"export":9,"f\u00f8470":19,"final":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,17,18,19],"float":[0,3,4,5,9,11,13,14,16],"function":[2,3,4,5,9,14,15,16],"import":[0,1,2,3,4,6,7,8,9,10,11,12,13,14,18],"int":[0,1,2,3,4,5,6,11,13,14,16,18],"long":[0,1,3,4,12,13],"m\u00f8svatn":6,"new":[0,1,2,3,5,6,7,8,9,10,11,13,14,16],"null":[],"public":[0,15],"return":[0,1,2,3,4,5,6,7,8,9,11,13,14,16,18],"s\u00f8rli":[],"s\u00f8rlie":19,"sch\u00f8yen":[6,19],"short":[4,5],"steinsv\u00e5g":[],"super":[3,5],"switch":0,"throw":[3,6,18],"true":[0,1,2,3,4,5,6,7,8,9,10,12,13,14,16,18],"try":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,18],"var":[5,6,10,11,18],"while":[0,1,3,4,5,6,7,8,9,11,12,13,18],A:[2,3,5,6,7,10,11,12,13,15,16,17,18,19,20],AND:2,And:[0,3,4,5,6,9,15,18],As:[0,1,2,3,4,5,6,8,10,12,13,16,18],At:[0,4,6,13],BE:0,Be:[2,15],Being:13,But:[0,1,2,3,5,6,9,10,18],By:[0,3,5,6,12,13,16],For:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],IF:6,IN:20,If:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18],In:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],Is:11,Ising:[5,12],It:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],Its:[1,2,4,11],NO:[7,11],No:[3,4,5,6,7,8,9],Not:[0,1,5,6,17],OR:18,Of:18,On:[0,3,17,18,20],One:[0,1,3,4,5,6,7,8,11,12,13,18],Or:[0,1,6],Such:[0,6,12,18],That:[0,5,7,10,11,12,14,18],The:[4,10,13,14,16,17,18,19,20],Then:[0,1,5,6,8,9,10,11,12,13,14,16],There:[0,3,4,5,6,8,9,11,12,14,16,17,18,19],These:[0,3,4,5,8,9,10,11,12,13,14,16,18],To:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],With:[0,5,6,8,9,10,11,12,14,16,18],_0:[5,8,10,11,13],_1:[2,5,6,8,10,11,12,13,14,16],_2:[2,5,8,11,12,13,16],_3:16,_4:16,_9:13,_:[0,1,2,4,5,6,7,8,9,10,11,12,13,16],_________________________________________________________________:4,__call__:[3,4],__class__:10,__doc__:6,__future__:[8,9],__getitem__:[],__init__:[1,3,4,14],__main__:2,__mosek:5,__name__:[2,10],__traceback__:[3,4],_asarrai:[],_auto10:[6,12],_auto12:6,_auto1:[2,3,4,5,6,7,12,13,16,18],_auto2:[2,3,4,5,6,12,13,16,18],_auto3:[3,4,5,6,12,13,16],_auto4:[4,6,12,13,16],_auto5:[4,6,12,13,16],_auto6:[4,6,12,16],_auto7:[4,6,12,16],_auto8:[6,12],_auto9:[6,12],_ax:[],_base:8,_build:[0,15,17,20],_build_call_output:[3,4],_c:1,_call:[3,4],_call_flat:[3,4],_check_1d:[],_check_optimize_result:[7,11],_compon:11,_coordinate_desc:6,_copy_docstring_and_deprec:[],_decor:0,_depth:9,_fraction:9,_get_lin:[],_getitem_multilevel:[],_handl:[3,4],_i:[0,1,2,5,6,8,11,12,13],_inference_funct:[3,4],_interpolatefunctionerror:[3,4],_is_primit:[],_j:[0,1,2,3,5,6,8,13],_jit_compil:[3,4],_k:13,_l:12,_lambda:6,_leaf:9,_logist:[7,11],_m:10,_make_vjp:[2,13],_maybe_define_funct:[3,4],_multilayer_perceptron:1,_n:[2,5,8,11,13],_node:[2,9,13],_notokstatusexcept:[3,4],_np:[],_num_output:[3,4],_p:[5,8],_plot_arg:[],_process_traceback_fram:[3,4],_r:[3,4],_ratio:11,_sampl:9,_select_forward_and_backward_funct:[3,4],_split:[6,9],_src:[3,4,14],_stateful_fn:[3,4],_stateless_fn:[3,4],_t:13,_test:6,_trace:[2,13],_valu:[2,13],_varianc:11,_weight:9,a0:3,a0faa0:[9,10],a1:0,a2:0,a3:0,a4:0,a_0:0,a_1a:0,a_2a:0,a_3:0,a_3a:0,a_4:0,a_4a:0,a_:[0,1,16],a_h:1,a_i:[0,1,2,12],a_j:[1,12],a_k:[0,1,12],a_ndim:2,aaron:20,ab:[0,2,5,13,14],ab_channel:15,abandon:1,abbrevi:17,abid:18,abil:[0,10],abl:[0,1,4,5,6,7,10,12,13],abort:[],about:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,20],abov:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,18],abovement:6,abscissa:13,absolut:[0,2,5,6,13],acceler:13,accept:[0,3,6,9],access:[0,3,4,11,18],accid:[4,6],accmod:5,accompani:0,accomplish:[8,9,13],accord:[0,1,2,5,6,9,12,13,14,18],accordingli:11,account:[0,3,5,13,18],accumul:[12,18],accur:[0,3,4,6,10,13],accuraci:[0,1,3,4,5,6,7,9,10,11,12],accuracy_scor:[0,1,10],accuracy_score_numpi:1,achiev:[0,1,5,6,8,12,16],aco:18,acquaint:15,acquir:[1,15],acr:0,across:[1,3,6,9,15],act:[1,3,16],action:18,activ:[0,2,3,4,9,17],actual:[0,1,4,5,6,8,11,16,18],ad:[1,3,4,5,8,13,16],ada_clf:10,adaboostclassifi:10,adadelta:13,adagrad:13,adam:[1,3,4],adapt:[4,6,13,20],add:[0,1,2,3,4,5,6,8,10,11,12,18],add_lin:[],add_outgrad:2,add_subplot:[1,7,12,14],addendum:5,addit:[0,2,3,5,6,7,8,9,10,12,13,15,16,18,19,20],addition:[12,13],address:[1,9,11,13,20],adjac:[3,12],adjoint:5,adjust:[0,5,12,13],admir:0,advanc:[4,6,12,20],advantag:[1,3,5,6,10,13,16],affect:3,affin:[0,3,8,11],afford:3,aforement:14,african:0,after:[0,1,2,4,5,6,9,11,12,13,15,16,18],afterward:0,ag:[0,7,17],ag_0:2,again:[0,1,4,5,6,7,8,10,11,12,13,18],against:[1,4,7,10],agegroup:7,agegroupmean:7,aggreg:[9,10],agorithm:10,agre:[5,6,18],ahead:9,ai:[0,20],aid:11,aim:[0,1,4,6,7,11,14,15,16],ainv:5,airplan:3,aka:5,al:[0,2,4,17,20],alarm:5,algebra:[0,3,5,13,15,17],algo:[],algorithm:[0,1,2,4,5,6,7,8,13,14,15,16,17,18,20],align:[0,2,5,6,7,8,13,18],all:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20],allevi:[1,13],alloc:[3,16],allow:[0,1,2,3,5,6,8,10,13,15,16],almost:[0,1,6,8,11,13,18],alon:[2,9],along:[2,3,4,5,6,9,10,11,15,16],alpha:[0,1,2,3,4,5,6,7,8,9,10,13,14,18],alpha_0:3,alpha_1:3,alpha_2:3,alpha_:10,alpha_i:[3,13],alpha_k:13,alpha_m:10,alpha_n:3,alpha_opt:13,alreadi:[2,3,4,5,6,10,12,15,16,18],also:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],alter:1,altern:[0,1,4,5,6,7,8,9,11,13,16],although:[0,1,5,6,8,10,13],alwai:[0,3,5,6,12,13,18],am:4,ame2016:0,american:0,among:[0,3,5,9,10,12,16],amongst:5,amount:[0,1,3,4,6,8,10,14,15],an:[1,2,3,5,6,7,8,9,11,12,13,14,15,16,18,19,20],an_:18,anaconda3:[],anaconda:[0,1,15],analog:13,analys:6,analysi:[1,3,4,7,14,16,17,20],analyt:[2,3,5,6,7,12,13,15],analyz:[0,1,3,4,5,6,18],andrew:1,angl:[0,3,9],anharmon:3,ani:[0,1,2,3,4,5,6,7,8,9,10,12,14,18],anim:[4,12],ann:12,annot:[0,1,3,7,8],anoth:[0,1,3,4,5,6,7,8,10,11,12,13,16,18],anp:2,ans_vspac:2,ansatz:0,answer:[0,1,3,5,6,16],antialias:[2,6],anticip:4,anymor:[1,8],anyon:[4,8],anyth:[1,18],anytim:19,apach:1,apart:[11,13],api:[1,15],appar:2,appear:[0,1,3,13,16,18],append:[1,3,4,8,9,13],appendcon:5,appendvar:5,appli:[0,1,2,3,4,6,7,8,9,10,11,12,13,18,20],applic:[0,1,3,4,5,6,7,9,12,13,16,17,18,20],apply_gradi:4,approach:[1,2,4,5,6,9,10,11,12,13,15,18,20],appropri:[2,6,9,12,13,15,18],approx:[0,2,3,6,10,11,13,18],approxim:[0,1,2,3,4,5,6,7,10,11,13,18],apt:[0,15],aq:18,ar:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],arang:[1,3,4,6,7,9,10,12],arbitrari:[1,4,6,8,12,13,18],arbitrarili:[0,1,11],arc:6,architectur:[3,4,12,20],area:[0,3,6,20],arg:[0,2,3,4,13],argc:[],argmax:[1,11],argmin:[4,10,14],argnum:[2,13],argnum_0:2,argnum_1:2,argsort:11,argu:[1,13],argument:[0,2,3,5,6,11,12,13],argv:[],argval:2,aris:[0,6,12,13,18],arithmet:[0,13,16],arm:[3,4,6,14],arma:[],armadillo:16,around:[0,1,4,5,6,11,18],arr:2,arrai:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,15,18],arrang:3,arraybox:13,arriv:[0,6,9,11,16,18],arrow:12,arrowprop:8,art3d:13,art:[0,1,15],articl:[0,3,4,6,10],artifici:[0,2,7,12,20],artificialneuron:12,arug:13,arxiv:[3,4],as_fram:[],asarrai:[0,2,6,9],asc:5,ascii:[],ashrafi:19,ask:[5,6,11,12],aspect:[0,6,15],assembl:[0,3],assert:4,assess:[0,6],assici:4,assign:[0,7,8,9,12,13,14,17,20],associ:[0,6,9,12,14,18],assum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],assumpt:[0,3,5,6,9,11,18],ast:[0,5,6],astyp:[4,9,10],asymmetri:0,asymptot:[4,6],async_wait:[3,4],atoi:[],atom:0,attempt:[0,4,6,7,8,10],attend:17,attent:[0,16],attr:[3,4],attract:[0,10],attribut:[0,9],attributeerror:[],audi:0,audio:[3,4],aurelien:[0,17,20],austfjel:6,author:[0,1,10,18],authour:0,auto:[6,9,10,18],autocor:18,autocorrelation_tim:18,autocorrelform:18,autocovari:18,autoencod:[4,15],autoencond:15,autograd:15,autom:[0,15],automac:16,automat:[0,1,2,3,4,11,15,16,17],automobil:3,autonom:[4,20],avail:[0,1,4,6,10,11,15,16,17,20],averag:[0,1,3,6,9,10,13,14,18,19],avg:[],avoid:[0,4,5,6,9,11,13,16],avx2:[],avx:[],awai:[2,3,6],awar:[2,10],award:19,ax:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16],axes3d:[2,6,13],axes_grid1:6,axessubplot:[],axhlin:8,axi:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16,18],axiom:5,axlabel:0,axvlin:[4,8],axvspan:4,b1:8,b2:8,b3:8,b:[0,1,2,3,4,5,6,8,9,10,12,13,14,18,19],b_0:0,b_1:[0,2,12,13],b_2:[0,13],b_5:13,b_:[0,1,16],b_group:9,b_i:[0,1,2,12],b_ia_:0,b_ia_i:0,b_index:9,b_is_vec:2,b_j:[1,12],b_k:[0,1,12,13],b_m:12,b_meta:2,b_score:9,b_valu:9,bachelor:17,back:[0,3,4,5,6,8,9,10,16,17,18],backbon:16,backend:[1,4],background:[17,20],backpropag:1,backtrack:9,backup:16,backward:[1,2,4,12,16],backward_pass:2,bad:6,badli:18,bag:[9,15,17],bag_clf:10,baggingboot:10,baggingclassifi:10,baggingtre:10,balanc:6,band:16,bandwidth:16,bar:[0,6,11],barber:20,bare:[4,10],base:[0,1,3,4,5,7,8,9,10,14,15,18,19,20],basi:[5,7,8,10,11,12,13,16],basic:[6,8,12,13,14,15,17,18],batch:[3,4,11,12,13],batch_shap:4,batch_siz:[1,3,4],batchnorm:4,bay:7,bayesian:[5,15,20],bc298b802fe2:6,becaus:[0,1,2,3,4,5,6,8,9,12,13,14],becom:[0,1,2,5,6,7,9,12,13,18],been:[0,1,2,3,4,5,6,11,12,13,15,16],befor:[0,1,2,3,4,5,6,7,8,12,13,14,16,18],beforehand:[0,18],begin:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,16,18],behav:[1,6,13],behavior:[0,1,13],behaviour:12,behind:[0,1,6,8,13],behnoosh:19,being:[0,1,2,3,4,5,7,8,10,11,12,13,18],believ:[9,16],belong:[5,7,8,9,13,14],below:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],benchmark:10,bendik:[],benefici:[1,13],benefit:[0,1,4,11,13,15],bengio:[1,17,20],benign:[1,7],bennosh:19,besid:[4,5],bessel:5,best:[0,1,2,3,4,5,6,7,8,9,10,12,13,19],beta:[0,1,3,5,6,7,10,11,13],beta_0:[0,1,3,5,6,7,13],beta_0x_:0,beta_1:[0,1,3,5,6,7,10,13],beta_1x_0:0,beta_1x_1:[0,7],beta_1x_2:0,beta_1x_:0,beta_1x_i:[7,13],beta_2:[0,3,13],beta_2x_0:0,beta_2x_1:0,beta_2x_2:[0,7],beta_2x_:0,beta_3:3,beta_:[0,3,6,7,13],beta_i:[0,3,5],beta_j:[0,5,6,13],beta_k:13,beta_linreg:13,beta_m:10,beta_mg_m:10,beta_n:3,beta_p:7,beta_px_p:7,betavalu:5,better:[0,1,2,3,4,6,9,10,11,12,13],between:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,18],beyond:[0,1,5,6,8,13],bf:[13,14,16,18],bgd:13,bia:[0,1,2,3,5,8,9,10,12,13,17],bias:[1,2,3,5,6,9,12],big:[0,1,2,5,6,14],bigger:[1,6],bigr:12,bike:9,bilek:19,billion:[3,12,15],bin:[0,7,18],binari:[0,3,5,7,9,10,12,17],binarycrossentropi:4,bind:0,binomi:[15,18],binsboot:6,bioinformat:0,biolog:[1,12,20],bios1100:15,bird:[0,3],bishop:[17,20],bit:[1,4,16,18],bitwis:18,bivari:2,bk:[0,13],bla:[5,16],black:[8,9,14],blob:17,block:[6,10,15,16,18],blockingavg:[],blockingstd:[],blockingvar:[],blocksiz:[],blocksizemax:[],blocksizemin:[],blogpost:4,blue:[0,3],bmatrix:[0,1,3,5,7,8,11,13,16],bmi:1,bodi:[0,1,4,12],bold:1,boldfac:[0,5],boldsymbol:[0,1,2,3,5,6,7,8,10,11,13,14],boltzmann:[12,15],book:[17,20],boost:[1,9,15,17],boostrap:10,bootavg:[],bootstd:[],bootstrap:[1,13,15,17],bootvar:[],bootvec:[],boston_dataset:0,bot:8,both:[0,1,4,5,6,8,9,10,13,14,15,16,18,19],bottl:7,bound:[0,5,8,12],boundari:[2,4,8,11,12],boundkei:5,box:[2,4,9],boxed_arg:2,boyd:[8,13],bracket:[4,18],brain:[1,7,12],branch:9,breast:[5,7,11],breviti:13,brew:[0,15],brg:8,briefli:0,bring:[0,5,6,10],broad:[0,3,4],brought:15,brownle:4,brute:[3,5,11],bs:[8,9,10],buffer_s:4,bui:4,build:[0,4,5,6,10,13,16,18],built:[0,1,3,4,6],bunch:11,busi:0,bx:5,bzl:5,c1:[8,11],c2:[8,11],c95af3df0cdd:3,c:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20],c_0:18,c_1:12,c_2:12,c_3:12,c_4:12,c_:[0,8,9,10,13,18],c_i:[12,13],c_k:18,ca:1,cabc613b8702:13,cach:10,cal:[0,8,10,12,13],calcul:[0,1,2,4,5,6,8,9,10,11,12,13,14,16,18],california:[],call:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],callabl:[3,4],callback:[3,4],calor:0,cambridg:[13,20],can:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],cancel:[0,13],cancellation_manag:[3,4],cancer:[5,10],cancerpd:7,candid:[8,9,10],cannot:[0,1,4,5,6,7,8,9,17,18],canopi:[0,15],cap:5,capabl:[0,1,8,13,15],capac:2,capita:0,captur:[4,11,12],captured_input:[3,4],car:[3,4],card:[0,7],cardin:1,care:11,carefulli:13,carlo:[0,6,15,18,20],carri:[2,6,7],cart:10,carvalho:19,casella:20,cast:1,cat:[3,4],categor:[0,1,3,9,11],categori:[0,1,3,7,10,12,14,17],categorical_crossentropi:[1,3],caus:[0,5,6,18],causal:0,causat:0,cax:1,cb:6,cbar:1,cbook:[],cc:[0,1,5,13],ccc:[5,12],cd_fast:6,cdf:18,cdot:[0,2,6,12,13,14,16,18],celebr:13,cell:4,center:[0,1,6,7,8,9,11,14,18],centr:20,central:[0,3,5,6,8,16],centroid:[14,18],centroid_differ:14,centuri:3,certain:[0,3,6,7,9,18],cg:13,cha:0,chain:[0,1,13,15,18],chanc:[1,5,13,18],chang:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],channel:3,chapter3:0,chapter:[0,6,10,11,16,17,20],charact:[0,3,5],character:[8,9,10,12,18],characterist:[0,1,3,10,13],charg:0,charl:0,chase:4,chd:7,chddata:7,cheap:5,cheaper:[1,13],check:[0,1,3,4,5,6,11,13,16],checkmark:3,checkpoint:4,checkpoint_dir:4,checkpoint_prefix:4,chemic:[],chen:10,chiaramont:2,choic:[0,1,2,3,4,6,9,12,13,14,16],choleski:[5,16],choos:[2,3,6,9,10,11,13,14],chosen:[0,1,2,6,8,9,10,13,18],chosen_datapoint:1,christian:20,christoph:[17,20],cifar10:3,cifar:3,cin:[],circ:[1,12],circl:[0,8,12],circuit:3,circumfer:9,circumv:[1,5,13],ckpt:4,clariti:18,class_nam:[3,9],class_val:9,class_valu:9,class_weight:[3,4],classic:[7,9,13],classif:[0,3,5,6,7,8,11,12,15,17,20],classifi:[0,1,4,7,9,10,11],classificaton:1,classifii:10,clean:1,clear:[1,5,10,12,13],clearli:[0,3,5,6,7,8,18],clever:[1,10],clf3:0,clf:[0,6,8,9,10],clf_lasso:6,clf_ridg:6,clip:[3,18],close:[0,1,2,4,6,8,9,11,12,13,14,18,20],closer:[3,5,13],closest:[8,11,13,14],closur:15,cloud:15,cluster:[0,1,4,6,11,15,17],cluster_label:14,cm:[1,2,3,6,8,13],cmap:[0,1,2,3,4,6,8,9,10],cmap_arg:6,cmath:[],cmb:17,cmd:9,cmu:[],cn_:18,cnn:[12,17],cnn_kera:3,cntk:15,co:[0,2,3,6,9,13],code:[3,4,6,7,8,13,15,16,17,18,20],coef0:8,coef:0,coef_:[0,5,6,8,9,13],coeff:5,coeffici:[0,3,5,6,7,8,9,13,16],coerc:[0,6],coin:[10,18],coin_toss:10,col:[0,11],colab:15,cold:9,colinear:0,collaps:8,collect:[0,2,6,10,11,15,18,20],collinear:5,color:[0,3,4,6,8,9,10,18],color_channel:3,color_cod:6,colorbar:[1,6],colsample_bytre:10,colsaobject:10,colspec:0,column:[0,1,2,5,6,7,8,9,11,12,16],columntransform:9,com:[3,4,6,14,15,17,20],combin:[1,2,5,6,7,10,18],come:[0,1,3,4,5,12,13,14,17],command:[0,1],comment:[0,4,5,6],commerci:[0,15],commod:0,common:[0,1,3,5,6,7,9,11,13,14,18],commonli:[0,1,4,6,7,9,13,14],commun:[0,12],commut:3,commutatitav:3,compact:[0,1,3,5,6,7,9,11,12,13,14],compair:0,compar:[0,3,4,5,6,11,13,16],comparison:[2,4,13],compat:7,compet:0,competit:10,compil:[0,1,3,4,15,16],complet:[0,2,3,4,9,12],completenn:12,complex:[1,5,8,9,11,12,13],complic:[0,1,9,13],compon:[0,1,3,4,5,6,7,9,14,15,17],components_:11,compos:[9,12,14,15],compphys:[0,6,15,17,20],compress:0,compris:6,compromis:5,compulsori:15,comput:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,20],computation:[0,3,6,9,13,18],con:5,concaten:[2,4,6,14],concav:[1,13],concentr:[0,10],concept:[0,2,15],conceptu:[12,13],concern:[0,1,4,7],conclud:[0,5,13],conclus:1,cond:2,conda:[0,1,15],condit:[0,2,4,5,6,8,9,11,13,18],conduct:15,condwav:2,coneqp:5,confid:[0,5,6,7,8],configur:3,confirm:[5,12],confus:[5,6,10,16],confusion_matrix:9,congruenti:18,conjug:[4,8],conjugaci:13,conjunct:3,connect:[0,1,3,4,9,11,12,13,16],consequ:[5,6,8,10,12,13],conserv:[5,14],consid:[0,1,2,3,5,6,7,8,9,10,12,13,16,18],consider:[0,1,5,13],consist:[0,1,2,3,4,6,12,13,18],constant:[0,2,4,5,6,8,12,13,18],constitu:0,constitut:[2,6],constrain:[1,3,5,7,11],constraint:[5,6,8,13],construct:[0,1,2,3,5,6,7,8,9,10,11,16,18,20],contact:0,contain:[0,2,3,4,5,6,7,8,9,11,12,13,16,18,20],contemporari:20,content:[1,15,16],context:[3,4,6,10,13],contigu:16,continu:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,18],contour:[9,10,13],contourf:[8,9,10],contrast:[1,4,9,10,12],contribut:[0,3,5,13,18],contributor:0,control:[0,1,3,9,13,15],conv2d:[3,4],conv2dtranspos:4,conv:[3,4],conveni:[0,5,6,12,13,16],convent:12,converg:[1,2,4,5,6,7,8,11,13,14],convergencewarn:[1,6,7,8,11],convert:[0,1,4,5,9,11,13,16],converttomatrix:4,convex:[4,5,7],convinc:13,convolut:[1,4,15,17],cool:[4,9],coolwarm:6,coordin:[5,12,14],coorel:0,copi:[0,1,14],core:[2,3,4,10,13],corel:0,coronari:7,corr:[0,5,7,11],correalt:[11,15],correct:[0,1,2,3,4,5,13,16,18],correctli:[1,2,6,10],correl:[0,1,3,5,6,7,10,12,13,15,18],correlation_matrix:[0,5,7,11],correspond:[0,3,5,6,8,9,11,12,15,16,18],cortex:12,cosin:[3,6],cost:[0,2,3,5,6,7,8,9,12,13],cost_deep_grad:2,cost_funct:2,cost_function_deep:2,cost_function_deep_grad:2,cost_function_grad:2,cost_grad:2,cost_sum:2,costol:13,could:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],coulomb:0,count:[0,9,17,18,19],countor:13,coupl:[4,5,6],cours:[0,1,3,5,11,17],courvil:[17,20],cout:[],cov:[5,6,11,16,18],cov_xi:[5,11],cov_xx:[5,11],cov_yi:[5,11],covari:[0,7,15,16],covariance_matrix:[5,11,14],cover:[0,5,15,17,20],covert:0,covxi:18,covxx:18,covxz:18,covyi:18,covyz:18,covzz:18,cpu:1,cpu_feature_guard:[],craft:3,creat:[1,2,3,4,5,6,9,10,11,12,13,15],create_biases_and_weight:1,create_convolutional_neural_network_kera:3,create_neural_network_kera:1,create_x:[5,11],credit:[0,7],crim:0,crime:0,criteria:[0,4,9,10,14,18],criterion:[9,10,13],critic:6,cross:[0,1,3,7,9,10,13,15,17,18],cross_entropi:4,cross_val_scor:6,cross_valid:[7,10],crossvalid:6,crucial:[1,18],cs231:3,cs:17,csr_matrix:16,cstdlib:[],csv:[0,4,6,7,9],ctnk:1,ctx:[3,4],cubic:0,cumbersom:5,cumsum:[10,11],cumul:[10,18],cumulative_heads_ratio:10,cup:5,current:[1,2,3,4,6,13,14],curs:0,curv:[6,7,10,12],curvatur:13,custom:[5,6,14],custom_cmap2:[9,10],custom_cmap:[9,10],cutpoint:9,cv:[6,7,10],cvxbook:13,cvxopt:[5,8],cyber:20,cycl:[1,12],d1:5,d2:5,d2_g_t:2,d3:5,d670a873ab0c:5,d985fb40c43d:6,d:[1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19],d_f:13,d_g_t:2,d_net_out:2,da:3,dagger:[5,16],dai:[1,9,15],dalen:[],damp:3,darget:9,darkr:18,dat:0,dat_id:[0,6,7,9],data1:14,data2:14,data3:14,data4:14,data:[2,4,5,8,10,12,13,14,16,20],data_handl:[3,4],data_id:[0,6,7,9],data_indic:1,data_modul:[],data_path:[0,6,7,9],data_url:[],databas:1,datafil:[0,6,7,9],datafram:[0,4,5,7,9,11],datapoint:[1,5,6,7,11,13],dataset:[0,4,6,7,8,9,10,11,13,14],datatyp:4,date:0,daughter:10,david:20,dbh:1,dbo:1,dcomposit:16,ddot:2,dead:1,deadlin:17,deal:[0,1,3,5,6,8,11,13,14,16,18],dealt:0,debt:7,debug:[0,5,6],decad:[0,3],decai:[0,13,18],decemb:17,decent:10,decid:[0,2,3,5,6,9],decim:0,decis:[0,1,8,11,15,17,20],decision_funct:8,decision_tre:9,decisiontreeclassifi:[9,10],decisiontreeregressor:[0,9,10],declar:[0,4,16],decompos:[5,6,16],decomposit:[0,6,12,17],decompost:5,deconvolut:3,decorrel:[10,13],decreas:[1,2,4,5,6,10,11,13],deduc:0,deep:[3,7,12,13,15,17,20],deep_neural_network:2,deep_param:2,deep_tree_clf1:9,deep_tree_clf2:9,deep_tree_clf:[9,10],deepen:[5,15],deeper:[0,3,4],deeplearningbook:20,deer:3,def:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,18],def_covari:18,def_funct:[3,4],default_tim:4,defect:5,defici:5,defin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],definit:[1,2,5,6,8,10,11,12,13,16,18],defint:18,defun:[3,4],defvjp:2,degre:[3,5,6,8,9,10,11,18],del:1,delet:6,delimit:4,deliv:17,delta:[0,2,3,6,8,12,13,14],delta_0:3,delta_1:3,delta_2:3,delta_3:3,delta_4:3,delta_5:3,delta_:[1,16],delta_h:[0,1],delta_j:[3,12],delta_k:12,delta_l:[1,3],delta_n:[0,3],delug:15,delv:0,demand:13,demonstr:[0,3,5,6,7,11,12,15],den:4,denomin:[1,5],denot:[1,2,6,7,13,18],dens:[1,3,4],dense_1:4,densiti:[0,2,6,18],depart:19,depend:[0,1,2,4,5,6,7,8,11,12,13,15,16,18],depict:18,deploy:[0,15],deprec:[2,3,6,13],depth:[0,3,9,10,16],deriv:[0,1,2,6,7,8,10,11,13,15],derivati:13,descend:[5,9,11],descent:[0,1,3,7,8,12,17],descr:[],describ:[0,2,4,5,6,8,10,11,12,13,16],descript:[0,8,9],design:[0,1,3,4,5,6,7,10,11,12,13],designmatrix:0,desir:[0,2,4,5,13,14],despit:[1,12],destroi:16,det:[5,16],detail:[0,6,11,13,14,16],detect:[3,8,12],determin:[0,2,3,4,5,6,8,9,10,11,12,13,16,18],determinist:[7,13,18],dev:1,develop:[0,3,5,8,10,11,12,15,16,17],deviat:[0,1,2,4,5,6,18],device_nam:[3,4],devis:12,df:[4,8,11,13],di:[0,5],diag:[5,8],diagnost:[1,10],diagon:[0,5,7,13,16,18],diagonaliz:5,diagram:10,diagsvd:6,dice:[6,18],dict:[6,8],dict_kei:[],dictionari:0,did:[0,1,5,6,7,10,11,14],die:1,diff1:2,diff2:2,diff:2,diff_ag:2,diffeent:8,differ:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,18,20],differenti:[0,3,15,16,17],differential_oper:[2,13],difficult:[0,1,6,10,13,18],difficulti:[0,1,13],diffonedim:2,digit:[0,1,3,4,6,17,19],dilemma:13,dilut:1,dim:[4,11,14,16],dimens:[0,1,2,3,4,5,8,11,14,16],dimension:[0,4,5,6,9,11,13,14,15,16],dimensionless:[0,3],diment:16,dimnsion:4,diod:3,direct:[0,1,2,4,11,12,13,14],directli:[1,4,5,6,18],directori:[],disabl:[3,4],disadvantag:0,disappear:[3,6],disc_loss:4,disc_tap:4,discard:[6,11],disciplin:[0,3,12],disclaim:18,discourag:13,discov:0,discover:5,discret:[1,3,5,7,13],discrimin:[4,7,10,11],discriminator_loss:4,discriminator_loss_list:4,discriminator_model:4,discriminator_optim:4,discuss:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],diseas:7,disguis:6,disord:[1,7],displai:[0,1,3,4,5,6,7,8,9,10,11,12,14,18],displaystyl:[0,5],displot:[],disregard:0,dissimilar:[11,14],dist:14,distanc:[0,8,9,11,14,18],distance_list:9,distinct:[3,7,8,9,10,14],distinctli:8,distinguish:[0,4,7,8,18],distplot:0,distribut:[0,1,4,6,7,10,11,13,14,15,16],distrubut:[0,15],div:5,dive:[0,8,16],diverg:[1,13],divid:[0,1,3,5,6,8,9,11,12,18],divis:[6,8,9,13,16,18],dna:7,dnn1:4,dnn2_gru2:4,dnn:[0,1,2,4,12],dnn_kera:1,dnn_model:1,dnn_numpi:1,dnn_scikit:[0,1],doc:[0,6,15,17,20],document:[4,7,11,13],doe:[0,1,2,3,4,5,6,8,10,11,12,13,16,18],doesn:[3,9,12],dog:[1,3,4],domain:[5,8,13],domin:0,don:[0,1,3,5,6,8,11,13,15],done:[0,2,3,4,5,6,9,10,11,13,16],dot:[0,2,3,5,6,7,8,9,10,11,12,13,16,18],doubl:[3,4,16],doubli:1,down:[0,3,6,9,11,12,13],download:[0,1,3,5,6,16,20],downsampl:3,dozen:1,dq:6,drag:13,dramat:11,drastic:4,draw:[4,6,10,13],drawback:[0,1,3,13],drawn:[1,4,6,7,11,18],drive:[3,4],driven:3,drop:[0,1,5,6,11,13,18],dropna:[0,6],dropout:4,ds:5,dt:[2,3,13,18],dtype:[0,1,2,3,4,14,16],dualiti:6,dub:0,due:[1,2,5,6,8,10,12,13],dummi:0,dure:[0,1,3,4,8,9,11,15],dwell:0,dwh:1,dwo:1,dx:[2,3,8,18],dx_1:18,dx_1p:6,dx_2p:6,dx_mp:6,dx_n:18,dxp:6,dy:[1,8,18],dynam:4,dysth:19,dz:8,e:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19],e_:[0,2],each:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],eager:[3,4],eapprox:0,earli:[1,3,4,13],earlier:[0,5,7,8,9,11,12,13],earthexplor:6,eas:[6,9,14],easi:[0,5,6,7,8,9,10,11,12,13,15,16],easier:[5,6,8,9,13,18],easiest:13,easili:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16],eastern:19,ebind:0,eblock:9,economi:5,ecosystem:15,ect:17,edg:3,edgecolor:6,edu:13,educ:0,eface79dac2c:10,eff:18,effect:[1,4,10,13,18],effic:1,effici:[0,3,10,13,15,16,18],efron:6,egrad:13,eig:[5,11,13,16,18],eigen:18,eigenpair:[5,11],eigenvalu:[0,5,8,11,13,16],eigenvector:[5,11,13],eight:16,eigval:[16,18],eigvalu:[11,13],eigvec:[16,18],eigvector:[11,13],eispack:16,either:[1,5,6,7,8,9,10,11,13,18],ekstrom:[],elabor:18,elarn:3,electr:[0,3,12],electur:20,eleg:11,element:[1,2,3,4,5,6,7,8,11,12,13,15,16,17,20],elementari:[10,13,16],elementwis:[3,13],elementwise_grad:[2,13],elif:[2,3,4,14],elim:16,elimin:[3,5,8],els:[1,2,3,4,7,9,12,13,16],elu:1,elus:0,email:[17,19],embed:[0,11],embodi:6,emit:18,emner:[17,20],emphas:[0,10,15],emphasi:[0,15,20],empir:[1,11,18],emploi:[0,1,5,6,11,13,18],employ:0,empti:[6,10],emul:12,en:[15,20],enabl:11,enbodi:6,encod:[0,3,5,9,11,14],encompass:[0,18],encount:[0,1,5,6,7,13,18],end:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],end_box:[2,13],end_nod:[2,13],end_valu:[2,13],endl:[],endpoint:[3,6],energi:[0,4,6],enet_coordinate_desc:6,enforc:12,eng:20,engin:[0,1,3,4,15],english:20,enorm:3,enough:[0,6,13],ensembl:[1,9,17],ensur:[0,1,2,3,5,6,11,13,18],ensure_initi:[3,4],enter:[5,6],enthought:[0,15],entir:[1,3,7,9,15,18],entiti:[9,12,16],entri:[0,5,8,11,12,16],entropi:[1,3,7,10,13],enumer:[0,1,2,3,4,6,8],env:[0,1,2,3,4,5,6,7,8,11,13,14,18],environ:[2,15,20],eo:[0,6],eol:0,eosfit:0,epoch:[0,1,3,4,12,13],epsilon:[0,5,6,7,13],epsilon_0:0,epsilon_1:0,epsilon_2:0,epsilon_:0,epsilon_i:0,eq:[3,13,14,16,18],eqnarrai:[3,5,6],equal:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],equat:[1,3,4,5,6,7,8,9,10,11,13,14,16,17,18],equilibrium:[2,12],equiv:[3,13,16,18],equival:[0,1,5,8,11,13,15,16],erf:18,err:[0,10],err_:6,err_sqr:2,errat:13,errno:[],erron:2,error:[1,2,4,5,6,7,9,11,12,13,15,16,18],error_estimate_corr_tim:18,error_handl:[3,4],error_hidden:1,error_output:1,escap:13,especi:[1,3,9,12,13],essenti:[0,5,6,9,10,12,14,17,18],establish:[0,6,10,11],estim:[0,1,5,6,7,10,11,13,15,18],estimated_mse_fold:6,estimated_mse_kfold:6,estimated_mse_sklearn:6,et:[0,2,4,17,20],eta0:[8,13],eta:[0,1,3,8,12,13],eta_:13,eta_t:13,eta_v:[0,1,3],etc:[0,1,3,5,7,8,9,11,12,13,14,15,16,18],ethic:15,etsim:6,euclidean:[0,14],evalu:[0,2,3,4,5,6,9,13,18],evalut:13,even:[0,1,3,4,5,6,8,9,10,11,12,13,14,15,16,18],evenli:4,event:[3,4,5,7,10,14,18],eventu:[0,5,6,11,12,13,19],everi:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,18],everyth:[4,12],everywher:[4,13],evolv:0,exact:[0,2,5,11,12,13,16,18],exactli:[0,3,4,6,12,15],examin:6,exampl:[5,11,12,13,15,16,17,18,20],exce:[1,12,13],excel:[0,1,4,5,10,20],except:[3,4,5,6,8,9,16],excess:0,excit:0,exclud:[1,6,12],exclus:[0,1,3,6,18],execut:[2,3,4,5,13],executing_eagerli:[3,4],exemplifi:13,exercis:[5,15,17],exhaust:6,exhibit:[0,5,6,8],exist:[0,1,2,3,5,6,7,8,9,13,16,20],exit:[5,16],exp:[0,1,2,5,6,7,8,10,11,12,13,18],exp_term:1,expand:[5,7,11,13],expans:[0,3,5,8,10,12,13],expect:[0,1,5,6,7,11,12,13,15],expectation_value_of_h_wrt_p:18,expens:[6,10,13],experi:[0,1,6,8,13,15],experiment:[0,3,4,6,9,14,18],experimental_get_tracing_count:[3,4],expert:[1,9],explain:[0,6,9,10,11,13],explained_variance_ratio_:11,explanatori:0,explicit:[0,3,6,13,16],explicitli:[0,4],explod:1,exploit:[0,3,12,13],explor:[1,4,6,8,13,15],expon:1,exponenti:[0,1,5,6,10,13,18],export_graphviz:9,export_text:9,exporttext:9,expos:15,express:[0,2,3,5,6,7,10,12,13,16,18],exptmean:18,exptvari:18,extend:[0,2,5,7,11,13,15],extens:[0,12,15],extent:[0,1,6,20],extern:[3,6,9],extra:[1,3,5],extract:[0,3,5,6,7,8,11,13,16],extrapol:0,extrem:[0,1,4,5,6,7,8,9,13,16],extremum:13,extrins:11,ey:[0,5,6,13,14,16],f11:0,f12:0,f13:0,f1:13,f1_grad:13,f1d:13,f2:13,f2_grad_x1:13,f2_grad_x1_analyt:13,f2_grad_x2:13,f2_grad_x2_analyt:13,f3:13,f3_grad:13,f3_grad_analyt:13,f4:13,f4_grad:13,f4_grad_analyt:13,f5:13,f5_grad:13,f6:13,f6_for:13,f6_for_grad:13,f6_grad_analyt:13,f6_while:13,f6_while_grad:13,f6d7a289d493:[],f7:13,f7_grad:13,f7_grad_analyt:13,f8:13,f8_grad:13,f9:[0,13],f9_altern:13,f9_alternative_grad:13,f9_grad:13,f:[0,1,2,3,4,5,6,7,8,10,12,13,14,16,18,19],f_0:[3,10],f_1:[10,13],f_2:[12,13],f_3:12,f_:10,f_d:18,f_grad:13,f_grad_analyt:13,f_i:[0,6,12],f_m:[3,10],f_n:3,f_raw:2,f_vec:2,f_wrap:2,face:13,facecolor:[6,8,18],facil:[0,15],facilit:12,fact:[0,1,3,5,9,11,12,13],factor:[0,1,3,5,6,9,10,11,13,16,18],factori:13,fade:6,fafab0:[9,10],fail:[0,6,7,8,11,13,19],failur:7,fairli:[1,2,18],fake:4,fake_loss:4,fake_output:4,fall:[8,9,17],fals:[0,1,2,3,4,5,6,7,9,10,13,14,16],famili:[0,7,8,18],familiar:[0,3,5,6,8,15,16,18],famou:[6,12],far:[0,3,4,5,6,8,11,12,13,14],fashion:[0,9,10],fast:[1,3,6,10,12,13,15,18],faster:[1,11,13],fastest:[13,16],favor:7,favorit:18,fc:3,fdf8a5d7c717:2,fdfcc778e1f8:4,fe5b9d300cc0:6,featur:[0,1,3,5,6,7,8,10,11,12,13,15,18],feature_nam:[0,1,7,9],feautur:9,fed:1,feed:[0,2,3,11,15,17],feed_forward:1,feed_forward_out:1,feed_forward_train:1,feedback:4,feeddorward:4,feedforward:[1,4,12],feel:[0,5,6,11,13,15,19],feet:0,fetch:6,fetch_california_h:[],fetch_openml:[],few:[1,3,4,5,9,18],fewer:[0,9,11],ffnn:[1,12],field:[0,3,6,12,15],fifth:[0,6],fig:[0,1,2,3,4,6,7,12,13,14],fig_id:[0,6,7,9],figaxi:18,figsiz:[0,1,2,3,4,6,7,8,9,10],figur:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15],figure_id:[0,6,7,9],figurefil:[0,6,7,9],file:[0,1,2,4,5,6,7,9],file_prefix:4,filenam:[],filenotfounderror:[],fileout:[],filepath_or_buff:0,fill:[5,9],filter:[3,4],filtered_flat_arg:[3,4],filtered_tb:[3,4],financ:0,find:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,18],find_top_boxed_arg:2,fine:[0,14],finish:2,finit:[3,5,6,12,13,18],first:[0,1,2,3,5,6,7,8,9,10,11,13,14,16,17,18,20],firsteigvector:11,fit:[1,3,4,5,6,7,8,9,11,12,13,18],fit_beta:6,fit_intercept:[0,5,6],fit_mod:9,fit_transform:[0,6,8,9,11],fiti:0,five:[0,9],fix:[0,3,4,6,10,11,12,13],fixedformatt:6,fixedloc:6,fkkt:5,flag:4,flat:[12,13],flatten:[1,3,4,5,16],flexibl:[1,6,8,10,12],float32:[4,9],float64:[4,16],flop:[5,16],flow:[1,4,12],fluctuat:5,fly:11,flyvbjerg:[],fm:0,fma:[],fmax:3,fmesh:13,fn:[3,4],focu:[0,3,4,5,6,15,20],focus:[1,6,7,16],fold:[6,9],folder:[0,4,6],follow:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],font:[0,7,18],fontdict:18,fontsiz:[1,6,8,9,10,18],fontweight:1,footprint:3,foral:8,forc:[0,5,6,10,11],forcast:4,forecast:[4,12],forelesningsvideo:17,forest:[0,1,9,15,17],forget:11,form:[0,3,4,5,6,7,8,9,11,12,13,15,16,18],formal:[3,4,14,18],format:[0,1,2,3,4,6,7,8,9,10,11,15,18,20],format_data:4,formatstrformatt:[6,13],formul:[4,6,11,14],formula:[3,13,18],forth:[4,12],fortran2003:15,fortran90:18,fortran:[0,15,16],fortun:[0,11],forward:[0,3,6,15,16,17],forward_backward:[3,4],found:[1,2,4,5,6,12,13],foundat:15,four:[4,5,6,8,12,16,17],fourier:0,fourierdef1:3,fourierdef2:3,fourierseriessign:3,fourth:12,fr:5,frac:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],fractal:[],fraction:9,frame:7,framework:[1,8,10,18],frank:[5,11],frankefunct:[5,6,11],free:[0,6,11,13,15,16,18,19,20],freecodecamp:15,freedom:5,freeli:0,frequenc:[3,6,7,18],frequent:[0,8,9,13],frequentist:15,fresh:10,frida:19,fridai:17,friedman:[6,17,20],friendli:4,frog:3,from:[0,1,2,3,4,6,7,8,9,11,13,14,15,16,17,18,19,20],from_cod:9,from_logit:[3,4],from_tensor_slic:4,fromnumer:2,front:[0,4,5],fstream:[],fulfil:[2,5,12],full:[0,1,3,5,7,9,10,13,18],full_matric:5,fulli:[3,6,12,17,18],fun:[2,13,15],fun_nam:[],func:[0,2],functionali:11,fundament:[0,6,15],funtion:2,further:[2,9],furthermor:[0,3,5,6,7,11,12,13,15],futur:[0,4,8,9],futurewarn:[],fx:5,fy:[17,19],g0:2,g42mrgv128v34gnnhxwk9nrc0000gp:[],g:[0,1,2,3,4,5,6,8,9,10,11,13,18],g_0:2,g_1:[2,10],g_2:[2,10],g_:[2,9,10],g_analyt:2,g_dnn_ag:2,g_euler:2,g_i:2,g_m:[3,10],g_n:3,g_re:2,g_t:2,g_t_d2t:2,g_t_d2x:2,g_t_dt:2,g_t_hessian:2,g_t_hessian_func:2,g_t_jacobian:2,g_t_jacobian_func:2,g_trial:2,g_trial_deep:2,g_vec:2,gain:[1,5,9,10,13],galleri:0,game:4,gamma1:8,gamma2:8,gamma:[0,2,8,9,10,11,13],gamma_0:10,gamma_1:10,gamma_1x:10,gamma_:0,gamma_i:[0,8,18],gamma_j:13,gamma_k:13,gamma_m:10,gamma_x:0,gap:[6,8],gate:[4,12],gather:[0,1,12],gaug:12,gaussbacksub:16,gaussian:[4,5,6,8,14,18],gaussian_point:14,gaussian_rbf:8,gave:13,gbc:17,gca:[2,6,8,13],gd:1,gd_clf:10,gdclassiffiercgain:10,gdclassiffierconfus:10,gdclassiffierroc:10,gdm:13,gdregress:10,ge:[1,5,7,18],gemv:5,gen:[],gen_loss:4,gen_tap:4,gender:0,genener:4,gener:[0,1,2,3,5,6,8,10,11,12,13,14,16,18,20],generallay:12,generate_and_save_imag:4,generate_imag:4,generate_latent_point:4,generate_simple_clustering_dataset:14,generated_imag:4,generator_loss:4,generator_loss_list:4,generator_model:4,generator_optim:4,genexpr:[],genom:15,geodes:11,geometr:[0,13],geometri:5,georg:20,geotif:6,geq:[2,5,8,9,13],geron:[0,17,20],get:[0,1,2,3,4,5,6,7,9,10,11,13,15,16,18],get_dummi:9,get_loc:[],get_next_color:[],get_paramet:2,get_split:9,get_yaxi:8,get_yticklabel:6,getsolutionslic:5,getval:[],gg:[],gibb:15,gif:4,gini:10,gini_index:9,git:[0,15],github:[0,3,4,6,14,15,17,20],gitlab:[0,15],give:[0,1,2,3,5,6,7,8,9,10,12,13,14,15,17,18,20],given:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18],global:[6,7,13],glorot:1,gmail:[],go:[0,1,3,5,6,8,9,11,12,13],goal:[0,7,9],goe:[0,1,2,5,6,13,14,16],golden:13,gone:5,gong:1,good:[1,3,4,5,6,9,10,11,13,15,17,18,20],goodfellow:[4,17,20],googl:[1,3,4,14,15],got:[1,6],gov:6,gp:20,gpu:[1,15],grad:[2,13],grad_analyt:13,grade:17,gradient:[0,3,4,7,8,9,12,15,17],gradient_desc:3,gradientboostingclassifi:10,gradientboostingregressor:10,gradients_of_discrimin:4,gradients_of_gener:4,gradienttap:4,gradual:[1,14],grai:[4,6],graph:[1,9,11,12,13],graph_from_dot_data:9,graph_funct:[3,4],graphic:[0,1,9],grasp:0,gray_r:[1,3],grayscal:3,great:[5,13],greater:[1,7,18],greatli:13,greedi:9,green:[0,3,9,18],grei:4,grid:[1,3,6,7,8,12,18],grossli:13,ground:0,group:[0,6,7,9,14,15,17],groupbi:0,grow:[1,3,9,10],growth:0,gru:4,guarante:[0,3,4,13,18],guess:[1,4,10,13,14],guestrin:10,guid:1,guilherm:19,h1:2,h21:17,h:[0,1,5,6,8,13,18,20],h_1:[2,13],h_2:[2,13],h_:[0,13],h_m:10,ha:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],habit:0,had:[0,1,6,7,13],hadamard:[1,12],half:[1,8,9],halv:10,hand:[0,1,2,3,5,11,12,13,15,16,17,18,20],handi:3,handl:[0,1,2,5,9,11,15],handle_unknown:9,handsid:12,handwrit:12,handwritten:[1,5],happen:[1,2,3,4,5,6,10,13,18],hard:[1,7,8,10,13],hardcopi:15,harder:[0,1],harmon:3,hasn:1,hassl:[0,15],hast:15,hasti:[0,6,17,20],hat:[0,1,5,6,7,9,10,11,12,13,16],have:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],haven:1,he:7,head:[0,4,10,18],header:0,heads_proba:10,health:0,hear:[0,13],heart:[0,7],heatmap:[0,1,3,7],heavili:0,heavisid:1,height:[1,3,6],held:13,help:[0,1,4,12,13],helper:[4,14],henc:[0,5,6,8,9,10,12,13],her:7,here:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],hereaft:[0,8,12],hermitian:16,hessenberg:16,hessian:[0,2,5,13],heterogen:[9,10],hi:7,hidden:[1,3,4,12],hidden_bia:1,hidden_bias_gradi:1,hidden_layer_s:[0,1],hidden_neuron:4,hidden_weight:1,hidden_weights_gradi:1,hierarch:5,high:[0,1,2,3,4,5,6,9,10,11,13,14,15,16],higher:[0,1,3,5,6,8,13],highest:[1,2],highli:[0,3,4,10,15,16,20],highwai:0,hing:8,hint:13,hip:15,hire:0,hist:[4,6,7,18],histogram:[0,6,7,18],histor:[7,11],histori:[3,4,12],histplot:[],hit:[],hitherto:5,hjorth:19,hobbi:18,hoc:5,hoff:20,hold:[1,3,6,13,14],holder:0,home:0,homework:[6,13],homogen:[1,3,9,10,13],honchar:2,hopefulli:[0,11,18],horizont:11,hors:[3,7],hot:[1,9],hour:[1,15,17,18,19],house_pric:[],how:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],howev:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],hs:[],hspace:[0,4,8,10,18],hstack:1,htf:17,html:[0,7,11,15,17,20],http:[0,3,4,6,7,11,13,14,15,16,17,20],huang:0,huber:0,huge:[1,3,4,15],human:[0,1,3,6,9,12],humid:9,hundr:1,hungri:1,hybrid:17,hydrogen:0,hyperbol:[1,4,12],hyperparam:8,hyperparamet:[3,4,5,6,9,13],hyperplan:11,i0:0,i1:[0,6,8,12],i2:[0,8,12],i3:[0,12],i5:0,i:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19],i_1:[5,6],i_2:[5,6],i_:13,ian:20,ic:1,id:[7,13],ida:19,idea:[0,1,2,3,4,6,9,10,12,13,16],ideal:[0,2,6,8,13,18],idem:6,ident:[5,6,12,13,16],identical:5,identifi:[0,1,7,9,11,12,13,14],idum:[],ieor:18,ifi:20,ifs:15,ignor:[0,1,3,9],ii:[16,18],iii:16,ij:[0,1,3,6,8,12,14,16,18],ik:[0,16],illustr:[5,7,10,12,13,14,15],im:6,imag:[1,3,4,6,9,11,12,14,20],image_at_epoch_:4,image_batch:4,image_height:3,image_path:[0,6,7,9],image_width:3,imageio:6,images_from_seed_imag:4,imagin:1,immedi:[0,3,4,6,15],implement:[0,2,3,4,5,6,8,9,10,11,12,13,14,18],impli:[3,5,6,7,13,16],implicit:3,implicitli:[11,18],importantli:3,impos:[0,6,11,12],imposs:[0,5],impress:[0,12],improv:[0,4,5,9,10,11,13],impur:9,imread:6,imshow:[1,3,4,6],in3050:20,in4080:20,in4300:20,in5400:[3,20],in_out_neuron:4,inaccur:13,inacio:19,inact:12,inadequ:0,inch:6,includ:[0,1,2,3,4,5,6,7,11,12,15,18,19,20],include_bia:[6,9],incom:12,incorrect:1,incoveni:8,increas:[0,1,3,4,5,6,7,8,9,11,12,13,18],increasingli:18,ind:6,inde:[0,2,4,5,6],indefinit:4,indent:[],indentationerror:[],independ:[0,5,6,7,8,12,13,18],index:[0,1,3,4,10,14,15,16,18,20],index_col:0,index_of:[],indic:[0,1,3,4,5,6,9,10,11,13],indispens:6,individu:[1,6,7,10,12,18],indu:0,indx1:2,indx2:2,indx3:2,indx:16,ineffici:[3,13],inequ:8,inequaltii:13,inertia:13,inf1000:15,inf1100:15,inf1100l:15,inf1110:15,inf3000:20,inf4490:20,inf5860:20,infeas:9,infer:[0,1,4,6,20],infer_nrow:0,inferenc:1,infil:[0,6,7,9],infin:[5,6,7,11],infinit:3,infinitesim:18,influenc:[6,10],influenti:1,inform:[0,1,3,4,6,9,11,12,13,14,16,20],infti:[3,6,13,18],ingeni:13,ingrad:2,ingredi:[0,9],inher:6,inherit:16,initi:[0,1,2,6,10,13,14,16,18],initial_epoch:[3,4],initialis:[],initialize_root:[],inject:14,inlin:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],inner:[0,13],innov:20,inp:4,inplac:13,input:[0,1,3,4,5,6,7,8,9,10,12,13,14,18],input_dim:1,input_shap:[3,4],inputs:1,inputs_shuffl:[0,1],insert:[3,5,6,8,10,18],insid:[0,4,7],insight:[0,1,5,15,20],insist:[6,13],inspir:[0,1,12,20],instabl:2,instal:[0,1,5,6,9],instanc:[0,1,2,4,6,9,11,13],instanti:10,instead:[0,1,2,3,4,5,6,8,9,11,13,14,16,18],institut:1,instruct:[0,1],int32:10,int64:[],int_0:18,int_:[3,6,18],int_a:18,intak:0,integ:[1,2,13,14,16,18],integer_vector:1,integr:[3,6,18],intellig:[0,14,20],intend:10,intens:1,intention:14,interact:[0,6,9,12,15],intercept:[0,6,8,11,13],intercept_:[0,6,8,9,13],interchang:[5,12,16],interconnect:1,interest:[0,1,2,3,4,5,6,7,8,9,12,15,17,18],interfac:[0,1,16],interior:[0,9],intermedi:16,intern:[1,10,12],interpol:[1,3,4,6,12],interpr:5,interpret:[0,1,6,9,10,12,13,16,18],interv:[0,3,5,6,7,13,18],intial:13,intract:[0,4],intrins:[3,11,16,18],intro:[15,20],introduc:[0,1,5,6,8,10,12,13,16,18],introduct:[1,2,4,13,17,20],introductori:[0,4,16,20],intuit:[0,5,6,8,12,13],inv:[0,5,13],invalid:1,invalu:[0,13,15],invari:1,invd:5,inver:8,invers:[0,3,6,13],invers_period:[],inverse_transform:8,invert:[0,5,7,10],invok:[0,8],involv:[0,2,6,7,11,12],io:[0,15,17,20],iomanip:[],iostream:[],ip:[0,8,18],ipca:11,ipykernel_42331:[],ipykernel_42376:[],ipykernel_42449:[],ipykernel_42456:[],ipykernel_42530:[],ipykernel_42541:[],ipykernel_42553:[],ipykernel_42573:[],ipykernel_42580:[],ipykernel_42586:[],ipykernel_47411:[],ipykernel_47448:[],ipykernel_47647:[],ipykernel_47724:[],ipykernel_47735:[],ipynb:15,ipython:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15],iq:6,iri:[8,9],irreduc:6,irrelev:5,irrespect:0,is_integ:[],isbox:[2,13],iscomplexobj:[],isinst:[2,13],isn:5,isnul:0,isomap:11,issu:[1,3,4,9,14,16],it_arrai:13,item:[0,13],items:16,iter:[1,2,3,4,6,7,8,11,13,14,18],itr:5,its:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],itself:[5,6,12,18],ix:[],j1:16,j:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18,20],j_:6,j_lasso_sk:6,j_ridge_sk:6,j_sk:6,jackknavg:[],jackknif:[6,15],jackknstd:[],jackknvar:[],jackknvec:[],jacobian:[2,13],jacobian_shap:2,jargon:[],jason:4,jax:[3,4,14,15],jensen:19,jerom:20,ji:[12,16],jj:[0,5,6],jk:[0,1,6,12,16],jl:0,jm:16,joao:19,joaogca:19,job:[2,8,10],join:[0,4,6,7,9],joint:[4,5],journal:[],judg:13,judgement:6,julia:[15,16],jump:18,junk:4,jupyt:[0,15,17,20],just:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18],justif:0,justifi:[3,10],jy:[],jydg2xzka5:17,k0:7,k1:7,k:[0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,18],kaggl:6,kappa_d:18,karim:[],karlsen:[],karush:8,keep:[0,1,4,5,6,11,13,14,16],keepdim:[1,6,10,16],kei:[0,1,3,6,12,20],kept:[4,6,14],kera:[0,4,15],kernel:[0,1,3,15],kernel_regular:[1,3],kernel_s:4,kernelpca:11,kev:0,kevin:20,keyboardinterrupt:[2,3,4],keyerror:[],keyword:[6,13,16],kfold:6,kg:1,ki:16,kick:[1,13],kiener:2,kilomet:6,kind:[0,2,3,4,8,12,13,14],kj:[6,12,16],kjm:15,kkt:[5,8],kktsolver:5,kl0m3:17,kl:18,km:12,kmean:14,kmeanspoint:14,kn_k:14,know:[0,1,2,5,6,8,13,15],knowledg:[0,15],known:[1,3,4,5,6,7,8,9,12,16,18,20],kondev:0,kp:18,kpca:11,kroneck:14,kuhn:8,kwarg:[0,2,3,4,13],kwd:[0,3,4],kwown:0,l0:7,l1:[0,1,3,5,7],l1_l2:[1,3],l1regl:5,l1regls_mosek2:5,l1regls_mosek:5,l2:[1,3],l:[0,1,2,3,5,6,7,8,10,11,12,13,16,18],l_1:7,l_2:[7,13],l_:16,l_j:12,la:13,la_i:12,la_k:12,lab:[15,17],label:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,18],label_prob:13,labelencod:[7,10],labels:[6,8,9],labels_shuffl:[0,1],laboratori:17,lack:0,lagari:2,lagrang:[8,11],lambda:[0,1,2,3,5,6,7,8,10,12,13,18],lambda_0:11,lambda_1:[5,8,11],lambda_2:[8,11],lambda_:11,lambda_i:[8,11],lambda_iy_i:8,lambda_jy_iy_j:8,lambda_k:8,lambda_n:[5,8],lamda:1,lamdbda:5,land:[0,8],landmark:8,landscap:13,langl:[0,6,11,18],languag:[0,1,4,8,15,16,20],lapack:[5,16],laplac:5,laptop:15,larg:[0,1,2,4,5,6,8,9,10,11,13,15,16,18,20],larger:[0,3,5,6,8,10,11,13,18],largest:[4,8,11],lasso:[0,7,15,17],lasso_sk:6,last:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,17,18],latent:4,latent_dim:4,latent_point:4,latent_space_value_rang:4,later:[0,1,4,6,7,8,12,13,14,15],latest:[4,15],latest_checkpoint:4,latter:[0,3,5,6,7,8,11,13,16,17,18],lattic:12,law:0,layer:[0,4,13],lbfg:[7,9,10,11],lcc:[5,6],lda:11,ldot:[0,6,11],le:[5,7,10,13,18],lead:[0,1,3,5,6,7,8,9,10,11,12,13,16,18],leaf:9,leaki:1,leakyrelu:4,lear:13,learn:[3,4,5,6,7,8,9,10,12,16,17,20],learnabl:3,learner:10,learning_r:[3,8,10],learning_rate_init:[0,1],learning_schedul:13,least:[0,2,7,8,10,11,15,16,17,18],leat:13,leav:[0,1,3,5,6,9,11],lectur:[0,1,5,10,11,12,13,15,16,17,20],lecturenot:[0,15,17,20],lecturenovember11:[],lecturenovember12:[],lecturenovember19:[],lecturenovember25:[],lecturenovember26:[],lecturenovember4:[],lecturenovember5:[],lectureoctober14:17,lectureoctober15:17,lectureoctober1:[],lectureoctober21:[],lectureoctober22:[],lectureoctober28:[],lectureoctober29:[],lectureoctober7:[],lectureoctober8:[],lectureseptember10:[],lectureseptember16firstpart:[],lectureseptember16secondpart:[],lectureseptember17:[],lectureseptember23:[],lectureseptember24:[],lectureseptember2:[],lectureseptember30:[],lectureseptember3:[],lectureseptember9:[],lecturethursdayaugust26:[],lecturethursdayaugust27:[],left:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],leftarrow:[8,12],legend:[0,2,3,4,5,6,7,8,9,10,13],len:[0,1,2,3,4,5,6,8,9,10,11,12,16],len_index:0,length:[0,1,2,3,4,8,9,13,15],length_of_sequ:4,leq:[0,5,7,8,13,14,18],less:[0,1,3,4,5,6,8,9,13,15,18],lessen:1,let:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],letter:[0,16,18],level:[0,1,5,6,9,15,16,17],li:[8,11],lib:[0,1,2,3,4,6,7,8,11,13,14],liblinear:[8,10],librari:[0,1,2,3,4,5,6,9,10,11,16,18,20],licens:[0,1,15],lie:[0,6,11,18],life:[0,1,8,12],lifetim:13,like:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,18],likelihood:[0,1,5,9,13],lim_:18,limit:[0,5,6,7,8,11,12,16],lin_clf:8,lin_model:0,lin_reg:9,linalg:[0,2,5,6,8,11,13,16,18],line1:8,line2:8,line2d:13,line3:8,line:[0,1,3,6,8,11,13],linear:[1,3,5,6,7,9,10,11,12,15,17,18],linear_model:[0,5,6,7,8,9,10,11,13],linear_regress:6,linearli:5,linearloc:[6,13],linearregress:[0,6,7,9],linearsvc:8,liner:[1,3],linerar:10,linewidth:[0,2,4,6,8,9,10],link:[0,4,9,12,15],linlag:5,linpack:16,linreg:0,linspac:[0,2,3,4,6,8,9,10,13,16,18],linu:4,linuek:[],linux:[0,1,15],liquid:0,list:[0,1,2,3,4,5,9,15],listcomp:2,listedcolormap:[9,10],literatur:[1,7,14,20],littl:[1,3,9,12],live:8,ll:[0,18],lle:0,lloyd:[4,14],lmb:[0,2,5,6],lmbd:[0,1,3],lmbd_val:[0,1,3],lmbda:13,ln:[1,13],lo:5,load:[0,1,4,6,7,9,10],load_boston:0,load_breast_canc:[1,7,9,10,11],load_data:[3,4],load_digit:[1,3],load_iri:[8,9],loc:[0,3,6,7,8,9,10],local:[0,1,3,7,12,13],locat:[2,3,8],lock:[3,4],log10:[0,5,6],log:[0,1,2,4,5,6,7,9,10,11,13,16],log_:0,log_clf:10,logarithm:[0,5,7,16],logic:[0,1,9],logist:[0,1,2,8,9,10,11,12,15,17],logistic_predict:13,logisticregress:[7,9,10,11],logit:7,logreg:[7,9,10,11],logspac:[0,1,3,5,6],longer:[2,3,8,10,14,16,18],loocv:6,look:[0,1,2,3,4,5,6,7,8,9,10,11,13,16,18],loop:[1,4,6,10,12,14,15,16],lose:1,loss:[0,1,3,4,5,6,7,8,10,11,13,16],loss_fil:4,lossfil:4,lost:4,lot:[0,1,4,6],low:[0,6,9,10,11],lower:[0,1,3,6,9,10,16],lowercas:16,lowest:[9,13,18],lr:[1,3,4,10],lstat:0,lstm:4,lstm_2layer:4,lstsq:0,lt:6,lu:[0,5],lubksb:16,luckili:2,ludcmp:16,lux:16,lvert:1,lw:0,m:[0,1,2,3,5,6,8,9,10,11,12,13,16,17,18,19,20],m_1:14,m_:[9,12],m_h:0,m_k:14,m_l:12,m_n:0,m_p:0,m_t:13,ma:11,mac:[3,4,14],machin:[1,3,4,5,6,7,9,10,11,12,14,16,17,20],machinelearn:[0,6,15,17,20],machinelearningmurphi:17,mackai:20,made:[0,1,3,4,5,6,7,9,11,12],mae:0,magic:4,magnitud:[1,6,7,13],mai:[0,1,2,3,5,6,7,8,9,11,12,13,15,16,18],mail:17,main:[0,1,3,4,5,6,7,9,16,20],mainli:[0,5,6,7,9],maintain:6,major:[1,6,9,10,13,16],make:[1,2,3,4,5,6,7,8,11,12,13,15,16,18,20],make_axes_locat:6,make_moon:[8,9,10],make_pipelin:[0,6,10],make_vjp:[2,13],makedir:[0,6,7,9],makeplot:0,malcondit:16,malign:[1,7,9],mammographi:5,manag:[0,2,3,15],mani:[0,1,3,4,5,6,7,8,9,11,13,14,15,16,18,20],manifold:11,manner:3,manual:6,map:[0,1,2,6,7,8,11,12,14,18],margin:[0,5,8],mari:19,marit:0,marker:[0,7,16],markov:15,marsaglia:18,mask:[],mass:[0,1,5,13],massag:0,masses2016:0,masses2016ol:0,masses2016tre:0,masseval2016:0,master:[6,17],mat1100:15,mat1110:15,mat1120:15,mat3155:[],mat4155:[],mat:15,match:[0,1,4,5,13,14],materi:[4,5,7,13,16],math:[3,7,12,13,16,18,20],mathbb:[0,4,5,6,7,8,11,12,13,14,16,18],mathbf:[0,5,6,7,8,13,16],mathcal:[1,5,6,7,13],matheemat:3,mathemat:[0,6,11,12,13,15,16,17,18,20],mathrm:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,18],matmul:[1,2,5],matmul_adjoint_1:2,matmul_vjp_0:2,matmul_vjp_1:2,matnat:[17,19,20],matplotlib:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],matplotlibdeprecationwarn:[6,13],matric:[0,1,3,4,6,7,8,11,13,15],matrix:[0,2,3,4,6,7,8,10,13,18],matshow:1,matter:[2,3,13],max:[0,1,2,3,4,9,10,12,13],max_depth:[0,9,10],max_diff1:2,max_diff2:2,max_diff:2,max_it:[0,1,7,8,11,13],max_iter:14,max_leaf_nod:10,max_queue_s:[3,4],max_sampl:10,maxdegre:[0,6,10],maxdepth:10,maxim:[1,4,5,7,8,11],maximum:[0,1,2,3,5,7,8,9,10,13,14],maxpolydegre:[5,6],maxpooling2d:3,mbox:[5,6],mc:[],mcculloch:12,mcint:[],mcintsqr2:[],md:11,mdoel:4,mean:[1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,18],mean_absolute_error:0,mean_divisor:14,mean_i:18,mean_matrix:14,mean_squared_error:[0,4,6,7,10],mean_squared_log_error:0,mean_vector:14,mean_x:18,meaning:[0,4,7],meansquarederror:0,meant:[2,3,7,10,13],meantempvec:[],meanvec:[],measur:[0,1,2,5,6,9,11,12,14,18],mechan:[0,4,18],median:0,medicin:12,medium:[4,8,13],medv:0,meet:[0,19],mehta:0,memori:[3,4,11,12,13,16],mention:[0,12,13,18],mere:0,mersienn:[],meshgrid:[2,5,6,8,9,10,11],messag:[5,13],messi:2,met:[0,3,8],metadata:2,meteorolog:9,meter:6,method:[0,1,2,3,4,5,7,8,11,12,14,15,16,17,18,20],metion:6,metric:[0,1,3,6,7,9,10,14],metropoli:15,mev:[0,18],mgd:13,mglearn:15,mgrid:13,mhjensen:[1,2,3,4,6,7,8,11,14],mi:10,microsoft:20,mid:1,midel:4,midpoint:9,might:[0,1,2,4,6,9,13],mild:9,miller:[],millimet:6,million:0,mimic:12,min:[0,2,5,8,9],min_:[0,2,5,14],min_samples_leaf:9,mind:[0,6,13],mindboard:4,mine:15,mini:[1,11,12,13],minibatch:[1,11,13],minibathc:13,miniforge3:[0,1,2,3,4,6,7,8,11,13,14],minim:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],minima:[0,1,7,13],minimum:[0,1,2,6,8,9,11,13],minmaxscal:0,minor:[6,13,18],minst:1,minu:7,mirror:9,misc:6,misclassif:[8,9,10],misclassifi:[8,10],miser:0,mismatch:1,miss:[0,10],mistak:4,mit:20,mix:[1,2],mixtur:13,mk:[9,16],mkdir:[0,6,7,9],ml:[0,1,10,13,16],mlab:18,mle:[5,7],mline:[],mlir:[],mlir_graph_optimization_pass:[],mlp:1,mlpclassifi:1,mlpregressor:0,mm:16,mn:[12,18,20],mnist:[1,11],mod:18,mode:17,model:[2,3,5,7,8,9,10,11,13,14,15,18,20],model_select:[0,1,3,5,6,7,9,10,11],moder:10,modern:[0,6,7,15],modif:[2,12,13],modifi:[0,1,3,5,7,8,10,12,13],modul:[0,2,3,4,5,6,7,8,9,10,11,13,16],modular:18,modulenotfounderror:[5,7,8,9],modulo:18,moe:[5,11],moment:[5,6,13,18],monitor:13,monoton:[5,12,18],mont:[0,6,15,18,20],montecarlocycl:[],moor:[5,6],more:[0,1,2,4,5,7,8,9,10,11,12,13,14,15,17,18],moreov:[0,3],morten:19,mortenimac:[],mosek:5,most:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18],mostli:[1,11],motion:[0,13],motiv:[1,4],move:[0,4,5,6,7,9,12,13,14,18],mp4:17,mpl:[0,7],mpl_toolkit:[2,6,13],mplot3d:[2,6,13],mplregressor:1,mse:[0,4,5,6,9,10],mse_simpletre:10,mselassopredict:5,mselassotrain:5,mseownridgepredict:6,msepredict:5,mseridgepredict:[0,5,6],msetrain:5,msg:[],msle:0,mt19937_64:[],mt:[7,12],mu0:18,mu1:18,mu2:18,mu:[0,6,11,13,18],mu_:[6,18],mu_i:6,mu_n:11,mu_x:18,much:[0,1,2,3,4,5,6,8,9,10,11,12,13,16,18],mul:5,multi:[0,1,3,7,15],multiclass:[1,7],multidimension:[11,12],multilay:1,multinomi:7,multipl:[2,4,5,6,7,12,13,18],multipli:[3,5,6,11,13,16,18],multiplum:8,multivari:[0,2,10,11,15,18],multivariate_norm:[11,14],murphi:[11,17,20],must:[0,1,2,5,6,8,10,12,13,14,18],mutat:7,mutual:[1,3,6,13],mx_:18,myenv:[0,1,2,3,4,6,7,8,11,13,14],myriad:[0,15],mz1:18,mz2:18,n1:16,n2:16,n:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],n_0:[12,18],n_:[1,2,3,8,12,18],n_b:[],n_boostrap:[6,10],n_bootstrap:6,n_categori:[1,3],n_cluster:14,n_compon:11,n_epoch:13,n_estim:10,n_examples_to_gener:4,n_featur:1,n_filter:3,n_hidden:2,n_hidden_neuron:[0,1],n_i:18,n_input:[0,1,3],n_instanc:9,n_iter_i:[7,11],n_job:10,n_k:14,n_l:[12,18],n_layer:1,n_m:9,n_neuron:1,n_neurons_connect:3,n_neurons_layer1:1,n_neurons_layer2:1,n_point:14,n_sampl:[6,8,9,10,14],n_split:6,n_step:4,n_t:2,n_x:2,nabla:[1,13],nabla_:[2,13],nabla_w:13,nag:13,naimi:0,naiv:7,naive_kmean:14,nall:0,name:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,16,18,19],nameerror:[6,10],namespac:[],narrow:13,nary_f:[2,13],nary_op_arg:[2,13],nary_op_kwarg:[2,13],nary_oper:[2,13],nation:[1,5],nativ:15,natur:[0,1,4,8,9,12,13,18,20],navier:12,nb:18,nb_:16,nboot:[],nd:14,ndarrai:[2,6],ndim:2,ne:[9,10,16,18],ne_xcl2ctm0:17,nearest:[1,3,6,11],nearli:13,neccesari:6,necess:2,necessari:[0,1,3,4,8,14],necessarili:[0,4,11,18],necesserali:5,neck:7,need:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,16,18],neg:[0,1,3,5,6,7,10,13,16,18],neg_mean_squared_error:6,neglect:18,neglig:18,neighbor:[3,6,11],neither:[4,13],neq:[13,14,18],nervou:12,nest:[2,9,12],nesterov:13,net:[2,4,12],netlib:16,network:[0,9,13,15,17,20],neural:[0,7,13,15,17,20],neural_network:[0,1,2],neuralnetwork:1,neuron:[1,2,3,4,12],neutral:0,neutron:0,never:[1,3,4,6,9,18],new_box:[2,13],new_root:[2,13],new_trac:[2,13],new_tracing_count:[3,4],newaxi:[0,3,6,9],newli:0,newton:[1,7,8,13,18],next:[0,1,2,3,4,5,6,8,9,13,14],next_guess:13,next_input:4,ng:1,ngini:[],ni:14,nian:[],nice:[0,1,5,11],nichola:[],nicholaskarlsen1102:[],niter:13,nitric:0,nlambda:[0,5,6],nlevel:[],nm:18,nm_n:0,nmse:6,nn:[2,5,6,12,16],nn_model:1,nnmin:2,node:[1,2,3,9,10,12],node_constructor:2,nois:[0,4,5,6,8,9,10,13],noise_dimens:4,noisi:[1,6],non:[0,1,3,4,5,6,7,9,10,11,12,13,14,16,18],none:[0,1,2,3,4,5,9,10,13,18],nonlinear:[3,6,8,9,11,12],nonneg:[6,9,13],nonparametr:6,nonsens:18,nonsingular:16,nonumb:[3,7,8,13,16],nor:[1,4,13],norm:[0,1,5,6,8,11,13],normal:[3,4,5,6,7,8,9,10,11,12,13,15,16,18],normali:16,normalize_kwarg:[],norwai:6,notat:[0,2,5,6,13,14,18],note:[0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18,20],notebook:[0,1,3,9,15],noth:[1,2,5,8,12,14,18],notic:[4,5,12,13,16,18],notimplementederror:[],notion:3,notrace_primit:[],novel:[3,6,10],novemb:1,now:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,18],nowadai:[0,1,3,9,15],nox:0,np:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],npr:2,nsampl:6,nspin:[],nt:2,nthi:0,ntrained_model:6,nu:18,nuclear:5,nuclei:[0,18],nucleon:0,nucleu:0,num:4,num_coordin:2,num_hidden_neuron:2,num_it:2,num_neuron:2,num_neurons_hidden:2,num_output:[3,4],num_point:2,num_tre:10,num_valu:2,number:[1,3,4,5,6,7,8,9,10,11,12,13,14,16,17,19],numberid:7,numberparamet:3,numer:[0,5,6,9,10,11,12,13,15,16,20],numpi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18],numpy_vjp:2,numpy_wrapp:2,nunmpi:5,nvalu:[],nx:2,nx_test:6,nx_train:6,nx_train_mean:6,ny:18,ny_pr:6,ny_train:6,ny_train_mean:6,o:[0,6,7,8,9,11,16,20],obei:[6,11,13],object:[0,1,2,4,5,6,8,10,13,16],objsens:5,obliqu:5,observ:[0,1,3,5,6,7,8,9,10,11,12,13,14,18],obtain:[0,1,5,6,7,8,9,10,12,13,14,16,18],obviou:[5,6,11,18],obviouli:0,obvious:[0,4,5,6,16],oc:5,occupi:0,occur:[0,6,8,9,16,18],od:0,odd:[0,3,7],odenum:2,odesi:2,oen:0,off:[1,3,4,5,9,13,18],offer:[6,11,15,16,17],offic:19,offici:17,ofil:[],ofstream:[],often:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],ofter:16,ol:0,old:[1,5,10,13],ols_sk:6,ols_svd:6,olsbeta:[0,5],omega:[2,3,6],omega_0:3,omit:[0,5],on_train_batch_begin:[3,4],onc:[1,6,9,11,13],one:[0,1,3,4,5,6,7,8,9,10,11,13,14,15,16,18],oneapi:[],onednn:[],onehot:1,onehot_vector:1,onehotencod:9,ones:[0,2,5,6,8,9,10,11,13,16,17],ones_lik:4,onl:3,onli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],onlin:[11,17],onto:[5,11],op_nam:[3,4],open:[0,1,4,6,7,9,15,17],oper:[0,1,3,5,6,10,11,12,13,15,18],operation:18,oplu:18,opmiz:13,opportun:0,oppos:[6,13],opposit:[1,5,8],opt:[1,5],optim:[0,2,3,4,5,6,7,9,10,11,14,17],optimis:[1,3],optimizer_v2:3,option:[0,1,3,5,6,7,8,11,16],optionalxlacontext:[3,4],optmiz:[1,8,13],orang:0,order:[0,1,2,3,5,6,7,8,9,10,11,12,13,16,18],ordinari:[0,2,3,7,11,13,15,17],oreilli:20,org:[0,3,4,7,11,15,16,20],organ:[6,7,10,16],orient:[1,5,18],origin:[0,3,5,6,8,11,12,13,16],orthogn:5,orthogon:[0,5,6,8,11,13,16],orthonorm:5,os:[0,1,4,5,6,7,8,9],oscar:1,oscil:[3,13],oslo:[0,15,17,19],osx:[0,15],other:[0,1,2,3,5,6,7,8,10,13,14,15,17,18,20],otherwis:[0,1,4,7,13,16],ouput:[5,7,12],our:[1,2,3,6,7,8,9,10,12,14,15,16,17,18],ourmodel:0,ourselv:[0,5,6,8,11,13],out:[0,1,2,4,5,6,7,8,9,10,11,12,13,15,16,18],out_fil:9,outcom:[0,7,9,10,12,18],outdoor:9,outer:[6,12],outfil:4,outfilenam:[],outgrad:2,outlier:[0,8],outlin:[6,10,11],outlook:9,outperform:10,output:[0,1,3,4,5,6,7,8,9,10,12,13,16,18],output_bia:1,output_bias_gradi:1,output_shap:4,output_weight:1,output_weights_gradi:1,outputlayer1:12,outputlayer2:12,outsid:4,over1:13,over:[0,1,3,4,5,6,9,10,12,13,16],overal:[1,10],overcast:9,overcom:[12,13],overdetermin:0,overfit:[0,1,3,6,9,10,13],overflow:[1,5],overhead:12,overlap:[3,7,8,9],overlin:[0,5,6,9,10,11,14,16],overst:0,overtrain:4,overview:[3,20],own:[4,5,6,8,12,13,15,16],owner:0,ownmsepredict:0,ownmsetrain:0,ownridgebeta:[0,6],ownypredictridg:0,ownytilderidg:0,oxid:0,oyvinssc:19,p0:2,p1:2,p:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],p_:[2,4,8,9],p_hidden:2,p_i:[5,18],p_j:18,p_n:18,p_output:2,p_x:18,pack:0,packag:[0,1,2,3,4,5,6,7,8,11,13,14,15,18],pad:[3,4],page:[0,15],pai:[0,1,9,13],pair:[0,2,3,9,15,18],panda:[0,4,5,6,7,9,11,15],paper:1,paradigm:0,parallel:[10,15,16],param:[2,4],paramat:2,paramet:[0,1,2,3,4,5,6,7,8,9,10,12,13,18],parameter:[0,6,10],parametr:[0,6],paramt:[3,5],parent:2,parent_argnum:[],park:[],parser:0,part:[0,1,3,5,6,10,16,17,18,20],partial:[0,1,5,6,7,8,10,11,12,13,18],particip:[15,17],particl:[0,4,13,18],particular:[0,1,2,3,5,6,9,10,11,12,13,18,20],particularli:[5,6,8,11,13,18],partit:[1,4,9],partli:6,pass:[2,3,12,14],past:[10,18],patch:[6,18],path:[0,4,6,7,9,15],patient:7,patter:4,pattern:[0,3,4,12,17,20],pauli:0,pc:[11,15],pca:[0,7,15,17],pcolor:6,pcolormesh:6,pd:[0,4,5,6,7,9,11],pde:2,pdf:[0,3,4,5,6,9,17,20],pedagog:0,penal:6,penalti:[6,13],penros:[5,6],pentagon:13,peopl:[0,1,9,13,15],per:[0,1,6,17],percentag:[0,10,11],perceptron:[0,1,7],perfect:[0,1],perfectli:[4,6],perform:[0,2,3,4,5,6,8,10,11,12,13,14,15,16,18],performac:4,perhap:[0,5,13],perimet:1,period:[1,4,18],permut:11,persist:13,person:[5,6,7,17,19],perspect:20,pertin:12,petal:[8,9],peter:20,petersen:[],phantom:18,phase:[6,12],phenomena:18,phi:8,phi_k:8,philip:[],philosophi:13,phone:19,photo:4,phrase:0,physic:[0,1,4,7,12,13,18,19,20],pi:[2,3,5,6,7,9,12,13,18],pick:[1,9,10,11,13,14],pickl:1,pictur:0,pie:15,piec:[11,14],pillow:[0,15],pinv:[5,6,13],pip3:[0,1],pip:[0,1,15],pipelin:[0,6,8,10],pit:4,pitfal:6,pitt:12,pixel:[1,3,4],pixel_height:[1,3],pixel_width:[1,3],place:[0,4,6,8,13,16],plai:[0,3,4,5,6,8,11,15],plain:[8,10,12,13,14],plan:[6,9,19,20],plane:[8,9],plateau:5,platform:15,plausibl:12,pleas:[3,4,6,7,11,13,14],plenti:1,plethora:[3,12],plot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],plot_confusion_matrix:[7,10],plot_count:6,plot_cumulative_gain:[7,10],plot_data:1,plot_dataset:8,plot_decision_boundari:[9,10],plot_import:10,plot_max:4,plot_min:4,plot_model:4,plot_numb:4,plot_predict:8,plot_regression_predict:9,plot_result:4,plot_roc:[7,10],plot_surfac:[2,6,13],plot_train:9,plot_tre:[9,10],plt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],plu:[0,3,5,7],pm:8,pmatrix:2,pn:3,png:[0,4,6,7,9],point:[0,1,2,3,5,6,7,8,9,10,11,13,14,16,18,19],point_1:4,point_2:4,poisson:[15,18],poli:[6,8],poly100_kernel_svm_clf:8,poly3:0,poly3_plot:0,poly3dcollect:13,poly_featur:[8,9],poly_features10:9,poly_fit10:9,poly_fit:9,poly_kernel_svm_clf:8,polydegre:[0,5,6,10],polygon:13,polym:12,polynomi:[0,5,6,7,8,9,10,11],polynomial_featur:6,polynomial_svm_clf:8,polynomialfeatur:[0,6,8,9],polytrop:[0,6],pool:3,pool_siz:3,poor:[1,13],poorli:0,pop:2,popul:[0,5],popular:[0,1,3,6,7,8,9,11,12,15,16,18],popularli:0,portabl:10,portion:[11,13],pose:[0,4,5,6,11,18],posit:[0,1,2,3,5,7,8,10,11,13,14,16,18],possibl:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18,19],posterior:5,postpon:0,postul:5,potenti:[0,3,5,6,12,13],potr:5,potrf:5,pott:12,power:[0,1,5,6,8,9,12,13],pp:[5,6],practic:[0,5,6,7,8,17,18],practition:[0,1,3],preced:[1,11,12,18],preceed:4,preceq:8,precis:[0,2,5,11,13,16,18],pred:[6,13],predicit:0,predict:[0,1,5,6,7,8,9,10,15,20],predict_prob:1,predict_proba:[7,10],predictor:[0,5,6,7,9,10,11],prefer:[0,1,6,8,9,11,15],prepar:[0,6,16],preprocess:[0,4,6,7,8,9,10,11],prerequisit:0,presenc:13,present:[0,5,6,9,12,13,16,17,18],preserv:[3,11,16],press:[13,20],pretrain:[1,4],pretti:[0,4,8,9,15],prev_centroid:14,prevent:[13,18],previou:[0,1,2,3,4,5,6,8,10,11,12,13,16,18],previous:[2,3,9,10,18],price:[0,4,9,13],primal:8,primari:[0,7],prime:18,primit:2,princip:[0,5,7,15,17],principl:[0,6,7,8,14],print:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],print_funct:[8,9],printout:0,prior:[0,5,6],privat:0,prob:[1,18],probabilist:[0,20],probabl:[0,1,3,4,6,7,10,13,15,17],problem:[0,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18],proce:[0,5,6,8,9,10,11,13,16],procedur:[2,4,5,6,8,10,11,13],proceed:16,process:[0,2,4,6,9,10,12,13,15,16,18,20],prod:20,prod_:[1,5,7],produc:[0,3,4,5,6,9,10,11,12,13,15,16,18],product:[0,1,3,5,6,7,8,12,13,15,16],profess:0,program:[0,1,4,5,6,8,12,14,15,16,17,18],programm:16,progress:[1,4,14],prohibit:6,project1:6,project:[0,1,2,3,5,11,13,15,17,19],project_root_dir:[0,6,7,9],promin:12,promis:8,prone:9,pronounc:[13,15],proof:[0,11,12,13],propag:[2,3,13,17],proper:[0,2,6],properli:[1,6,8,10,13],properti:[0,1,3,12,13,16],proport:[0,1,5,9,11,13,18],propos:[1,4,6,10],propto:[5,13],protect:[3,4],proton:0,prove:[3,13],provid:[0,1,3,4,5,6,8,9,10,12,13,15,16,18,20],proxi:[1,13],prune:9,pseudo:[16,18],pseudoinv:5,pseudoinvers:[5,6],pseudorandom:[6,18],psycholog:0,pt:13,ptratio:[],punish:[0,1],pure:[3,9,18],purest:9,puriti:9,purpos:[0,3,10,12,14],put:1,putarow:5,putboundslic:5,putclist:5,putobjsens:5,putqobj:5,py:[0,1,2,3,4,5,6,7,8,11,13,14],pydata:15,pydot:9,pylab:[0,7],pylint:[3,4],pypi:15,pyplot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],pythagora:5,python2:0,python3:[0,1,2,3,4,6,7,8,11,13,14,15],python:[1,2,3,4,5,6,8,11,12,13,14,17,18],pytorch:[0,15],pywrap_tf:[3,4],q:[5,6,8,11,18],qp:8,qquad:[2,11,13,16],qr:[5,6,16],quad:[1,13,16],quadrat:[0,5,8,9,13],qualit:[4,9,18],qualiti:[0,9,15],quantifi:1,quantil:10,quantit:[0,6,9],quantiti:[0,2,5,6,7,9,10,11,12,14,16,18],quantum:[4,12],quartil:0,quench:5,queri:9,question:[0,5,6,9,11,12,13],qugan:4,quick:[4,18],quick_execut:[3,4],quickli:[1,3,9,11,13],quit:[1,5,6,9,10,12],quot:4,r2:[0,5,6],r2_score:0,r2score:0,r:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],r_1:9,r_2:9,r_j:9,r_m:9,rad:0,radial:[0,8,12],radioact:18,radiu:[0,1],rag:2,rain:9,rais:[0,2,13],ramp:1,ran0:18,ran1:18,ran2:18,ran3:18,rand:[0,4,5,6,9,10,13,16],rand_max:[],randint:[6,9,13],randn:[0,1,2,5,6,9,11,13],random:[0,1,2,3,4,5,6,8,9,13,14,15,16,17],random_devic:[],random_forest_model:10,random_index:13,random_indic:[1,3],random_st:[0,7,8,9,10,11],randomforestclassifi:10,randomli:[1,6,9,13,14],randomnumbergener:[],rang:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,16,18],rangl:[0,6,11,18],rangle_x:18,rank:5,rankdir:4,raphson:[1,8,13],rapidli:0,rare:[1,13],rate:[0,1,2,3,4,8,9,10,12,13],rather:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],ratio:[4,7,9,10,11],rational:0,ravel:[5,6,7,8,9,10,11,13,16],raw:3,raw_df:[],rbf:[8,11,12],rbf_kernel_svm_clf:8,rbf_pca:11,rc:[0,18],rcond:0,rcparam:[0,1,3,7,8,9,10,18],rd:[],re:[2,4,13],reach:[1,4,5,6,7,9,10,11,12,13,14],read:[0,2,3,4,5,6,7,8,11,12,16,17,18,20],read_csv:[0,6,7,9],read_fwf:0,reader:[0,6,16,18],readi:[0,1,5,6,8,10,11,12,16],readili:1,readthedoc:15,real:[0,1,2,4,7,10,11,12,13,16],real_loss:4,real_output:4,realist:8,realiti:18,realiz:[1,12],realli:[0,1],rearrang:13,reason:[0,1,3,4,10,13,20],reassign:1,rebuild:[],recal:[5,6,9,10,11,12,16,18],recalcul:[],recast:3,receiv:[1,3,10,12,18],recent:[0,2,3,4,5,6,7,8,9,10,13],recept:[3,12],receptive_field:3,recip:[0,6,7,16],reciproc:5,recogn:[0,4,5,10],recognit:[0,1,3,12,17,20],recommend:[0,2,3,4,5,6,8,13,15,16,17,20],reconsid:9,reconstruct:11,record:[10,17],recreat:[],rectangl:[9,13],rectangular:5,rectifi:[1,3,12],recur:[0,15],recurr:[0,1,15,17],recurs:[9,15,16],recycl:[],red:[0,3,4,6,8,9],redefin:[0,10],reduc:[1,3,5,6,9,10,11,13],reduct:[0,10,11,15,18],refer:[0,1,2,3,5,6,7,11,12,13,14,16,20],referenc:2,refin:12,refit:6,reflect:[0,1,4,5,18],refresh:[15,17],reg:[10,11],regard:[1,9,13],regardless:12,region:[3,4,6,9,12],regist:[6,18],reglasso:5,regr_1:[0,9],regr_2:[0,9],regr_3:[0,9],regress:[1,8,11,12,15,16,17],regressor:[0,7,10],regridg:[0,5,6],regular:[0,3,4,5,6,7,9,13],regularis:6,reilli:[0,20],reinforc:[0,8,15],reiter:1,rel:[0,4,6,7,9,12,13,18],relat:[0,1,3,4,5,11,13,14,16,18],relationship:[0,4,9],relativeerror:0,releas:[1,3,4,6,13,15],relev:[0,1,5,7,11,15,17,18],reli:[0,6,8],reliabl:[7,18],relu:[3,4],remain:[1,2,4,6,12,16,18],remaind:18,reman:2,remark:1,rememb:[0,8,13,16],remind:[0,5,11,13,16,17,18],remov:[0,4,5,6],render:0,reorder:[5,7],reorgan:0,repeat:[0,1,3,4,5,6,9,10,11,13,14,16,18],repeated:0,repeatedli:[6,10,13],repet:3,repetit:[6,17],rephras:13,replac:[0,1,3,4,5,6,10,12,13,14,15],replica:6,repositori:[0,4],repres:[0,1,2,3,4,5,6,7,8,9,10,12,13,18],represent:[0,1,3,6,18],representd:3,reproduc:[0,5,6,9,12,15,18],repuls:0,request:[0,13],requir:[0,1,3,4,5,6,8,9,11,12,13,16],res1:2,res2:2,res3:2,res_analyt:2,res_analytical1:2,res_analytical2:2,res_analytical3:2,resaml:6,resampl:[0,7,10,15,17],rescal:[0,11,12],rescu:5,reseach:6,research:[0,4,15,20],resembl:[6,18],reserv:[1,5,6,18],reset:[],reshap:[0,1,2,3,4,6,8,9,10,16],residenti:0,residu:[0,5,13],resiz:5,respect:[0,1,2,3,5,6,7,8,10,11,12,13,14,18],respond:12,respons:[0,7,9,12],rest:[0,5],restat:[0,12],restor:4,restored_discrimin:4,restored_gener:4,restrict:[0,3,9,12],result:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],result_typ:[],retail:0,retain:[5,6],return_data:14,return_kwarg:[],return_sequ:4,return_x_i:9,reus:[1,3,6],reveal:[0,12],revers:[1,16],review:[15,16,17],revisit:14,reward:[0,4],rewrit:[0,3,5,6,7,8,10,11,12,13,16,18],rewritten:[2,6,8,10,18],rewrot:13,rf:10,rgb:3,rgoj5yh7evk:15,rh:[5,6],rho:[0,10],rho_1:10,rho_2:10,rho_m:10,rich:0,ride:9,rideclass:9,ridedata:9,ridg:[7,11,13,15,17],ridge_sk:6,ridgebeta:5,right:[0,1,2,3,5,6,7,8,9,10,12,13,14,16,18],right_sid:2,rightarrow:[0,1,5,6,8,11,12,13,18],rigor:0,ring:6,rise:0,risk:[0,13],rival:4,river:0,rm:[0,18],rmse:0,rmsporp:13,rmsprop:[1,3,4,13],rnd_clf:10,rng:18,rnn1:4,rnn2:4,rnn:[4,12,17],rnn_2layer:4,rnn_input:4,rnn_output:4,rnn_train:4,rntrick1:18,rntrick2:18,rntrick3:18,rntrick4:18,ro:[0,13],robert:20,robust:0,robustscal:0,roc:10,role:[0,2,5,6,8,15],roll:6,room:[0,19],root:[0,5,9,13,18],rotat:[1,8,9,10],rotation_matrix:9,roughli:[1,3],round:[0,7,9,13],routin:[13,16],row:[0,1,2,5,6,7,9,11,16],rr:5,rrr:5,rthe:5,rug:13,rule:[0,1,5,6,13],run:[0,1,2,3,4,5,6,8,9,11,13,15],runtim:[1,6,14],runtimewarn:[1,6],rust:[0,15,16],rustad:19,rvert:1,rvert_2:1,s:[0,1,2,3,4,5,6,7,9,11,12,13,15,16,17,18,19],s_1:6,s_:[3,6],s_i:[6,7],s_j:6,s_k:6,saddl:13,safe:[],sai:[0,1,2,3,4,5,6,7,8,9,10,11,12,16,18],said:[6,9,13],sake:[0,5,7,11],sale:0,same:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],samm:10,sampl:[0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,18],sample_vari:14,sample_weight:[3,4],sampleexptvari:18,sastri:11,satisfactori:0,satisfi:[1,2,3,6,8,13,16,18],satur:[1,6],save:[0,4,6,7,9],save_fig:[0,6,7,9,10],savefig:[0,4,6,7,9,18],savetxt:4,saw:5,scalabl:10,scalar:[2,5,6,10,13],scale:[0,1,3,5,6,7,8,9,10,11,12,13,15,16,19],scale_mean:4,scale_std:4,scalei:[],scaler:[0,7,8,9,10,11],scalex:[],scan:[5,7],scari:5,scatter:[0,1,6,7,8,9,14],scenario:[6,13],schedul:13,scheme:[1,13],schrage:18,scienc:[0,1,10,12,13,15,17,18,20],scientif:[0,15],scientist:0,scikit:[3,5,6,7,8,9,10,13,15,16,17,20],scikit_learn:0,scikitplot:[7,10],scipi:[0,3,5,6,13,15,16],scl:6,score:[0,1,3,6,7,9,10,11,19],scores_kfold:6,scratch:1,sdg:13,seaborn:[0,1,3,6,7],seamless:[0,15],search:[0,1,3,5,9,13],sec:6,second:[0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,18],secondeigvector:11,secondli:12,section:[4,11,16,17,18],sector:0,see:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18],seed:[0,1,2,3,4,5,6,8,9,11,13,14,18],seed_imag:4,seek:[1,2,8],seem:[1,3,4],seemingli:0,seen:[0,1,3,5,10,12,18],segment:13,seismic:6,seldomli:0,select:[1,5,6,8,9,10,11,17,18,20],self:[1,3,4,5,20],sell:4,semest:[7,17],semi:[8,13],semilogx:6,send:[5,12,13,19],senior:17,sens:[0,4,6,8],sensibl:3,sensit:[0,5,6,9,13],sent:2,sentenc:[4,12],sep:[],separ:[0,1,2,4,6,8,9,12,14,15,18],sequenc:[2,3,4,7,9,10,12,13,15,16,18],sequenti:[1,3,4,10,12,18],seri:[0,1,2,3,4,5,6,10,11,12,13,16,17],serif:[0,7,18],serv:[0,1,2,3,5,7,13,20],session:[1,17],set:[1,4,5,6,7,8,10,11,13,14,15,16,18],set_major_formatt:6,set_major_loc:6,set_stream:5,set_tick:[1,8],set_ticklabel:1,set_titl:[0,1,2,3,7,12,14],set_xlabel:[0,1,2,3,7,12],set_xlim:[7,12],set_xticklabel:1,set_ylabel:[0,1,2,3,7],set_ylim:[7,12],set_ytick:7,set_yticklabel:[1,6],set_zlim:6,seth:4,setiosflag:[],setminu:6,setosa:[8,9],setosa_or_versicolor:8,setp:6,setprecis:[],setse:5,setup:[1,4,5,6,8,15],setw:[],sever:[0,3,5,6,7,8,9,11,12,13,15,16,17,18],sgd:[1,3],sgd_clf:8,sgdclassifi:8,sgdreg:13,sgdregressor:13,sgn:5,sh:[],shallow:13,shape:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16],share:[1,3],she:7,shift:[1,6,12,18],ship:3,shortcom:13,shorten:4,shorter:18,shortli:16,should:[0,2,3,5,6,8,9,11,12,13,16,18],should_sync:[3,4],show:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],show_shap:4,shown:[0,4,5,7,8,11,12,13,16],showpoint:[],shrink:[3,5,6,8,11],shrinkag:[5,6],shrunk:11,shuffl:[0,1,3,4,6,13],side:[0,2,5,8,12,13,16],sigh:15,sigma0:18,sigma1:18,sigma2:18,sigma:[0,1,5,6,7,10,11,12,13,16,18],sigma_0:5,sigma_1:5,sigma_2:5,sigma_:[5,16],sigma_fn:[7,12],sigma_i:[0,5],sigma_j:5,sigma_m:[6,18],sigma_n:[11,18],sigma_t:13,sigma_x:18,sigmoid:[1,2,4,7,8,10,12,13],sigmundson:[6,19],sign:[1,2,7,8,10,18],signal:[1,3,10,12],signatur:[3,4],signifi:4,signific:1,significantli:[1,13,18],sigurd:19,sim:[4,5,6,13,18],similar:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16],similarli:[0,1,3,5,8,10,18],simpl:[1,2,3,5,6,7,8,10,11,12,14,15,16,18],simple_rnn:4,simplepredict:10,simpler:[0,1,5,6,13,15],simplernn:4,simplest:[0,1,3,4,9,10,12,14],simpletre:10,simpli:[0,1,2,4,5,6,8,9,10,11,12,15,16,18],simplic:[2,5,6,7,8,9,10,11,12,14],simplicti:5,simplifi:[0,6,9,15],simplist:[3,6,18],simul:6,simultan:6,sin:[0,1,2,3,4,9,12,13,16],sinc:[0,1,2,3,5,6,7,8,9,10,11,13,16,18,20],sine:[3,12],singl:[0,1,2,3,5,6,7,8,9,12,13,16,18],singular:[0,6,13,16,17],sinusoid:3,site:[0,1,2,3,4,6,7,8,11,13,14,17],situat:[0,4,5,7,13,18],six:[3,18],size:[0,1,2,3,4,5,6,8,9,10,11,13,16,18],sketch:10,ski:9,skill:0,skip:[3,4,11],skiprow:[],skl:[0,6],sklearn:[0,1,3,5,6,7,8,9,10,11,13,14],skplt:[7,10],sl:6,slack:8,slice:[2,16],slide:[0,3,18],slight:[6,13],slightli:[1,2,3,5,6,7,10,18],slope:[8,11,12],slow:[0,2,8,13],slower:[5,16],slowest:16,slowli:12,slp:1,small:[0,1,2,3,5,6,8,9,10,11,12,13,15,16,18],smaller:[0,1,2,5,6,8,9,11,13,18],smallest:[0,4,14],smallest_row_index:14,smooth:[0,3,6,13],sn:[0,1,3,6,7],sne:11,so:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],soar:6,social:0,soft:[1,7,10,12],soften:8,softmax:[3,7],softwar:[0,8,15,16,17],sol:8,sole:[0,6],solid:[0,7],solitem:5,soltyp:5,solut:[0,1,2,3,5,6,8,10,11,13,16,18],solutionsummari:5,soluton:2,solv:[0,1,3,5,6,8,10,11,12,13,16,17],solve_expdec:2,solve_ode_deep_neural_network:2,solve_ode_neural_network:2,solve_pde_deep_neural_network:2,solveod:2,solveode_popul:2,solver:[2,5,7,8,9,10,11,16],some:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,17,18],some_model:6,somehow:4,someth:[0,1,3,4,7,9,11,18],sometim:[0,1,11,12,13,14],soon:16,sophist:0,sopt:13,sort:[5,6,9,11,18],sound:[3,5],sourc:[0,1,3,6,15,16,18],space:[0,1,4,5,8,9,11,12,13,14,18],span:[0,3,5,9,11,16],spare:1,spars:[3,5,6,16],sparse_mtx:16,sparsecategoricalcrossentropi:3,sparsiti:10,spatial:[1,2,3,12],spdiag:5,speak:18,special:[6,7,10,12,13,16,18],specif:[0,1,2,3,4,5,6,7,8,9,11,12,15,16,18],specifi:[0,3,5,6,7,9,11,13,14,18],specifici:[0,10],spectacular:3,spectral:1,speech:[0,1,3,4,12],speed:[1,2,4,13],spend:18,sphere:0,spin:6,spite:0,spline:8,split:[1,3,4,5,6,8,9,10,11,14,18],splite:0,splitter:[1,10],spmatrix:5,spontan:18,spot:3,spread:[0,11,18],springer:20,spuriou:13,sqquar:5,sqrsignal:3,sqrt:[0,3,4,5,6,8,10,11,13,18],squar:[1,2,3,4,7,8,9,11,13,14,15,16,17,18],squarederror:10,squaredeuclidean:14,squash:12,squeez:2,srand:[],srtm:6,srtm_data_norway_1:6,sse4:[],stabil:5,stabl:[0,4,5,6,7,9,11,15],stack:[2,3,4],stacklevel:0,stage:[5,13],stai:[0,2,4,5,11],stand:[0,5,9,12],standard:[0,1,4,5,6,7,8,10,12,16,18],standard_basi:2,standardscal:[0,6,7,8,9,10,11],stanford:13,start:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,16,17,18],start_box:[2,13],start_nod:[2,13],start_tim:14,startpoint:[],stat:6,state:[1,2,4,5,6,7,8,10,11,12,13,15,18],statement:[0,7,16],statist:[0,1,3,4,7,9,10,11,12,13,14,16,17,20],statu:[0,7,11],stavang:6,std:[0,4,6],stdev:[],stdout:5,steep:13,step:[0,1,2,3,4,6,7,9,10,11,12,13,14,16],step_fn:[7,12],step_length:13,steps_list:9,steps_per_epoch:[3,4],stereo:3,stian:19,still:[0,2,3,5,6,11,13,18],stimuli:12,stk2100:20,stk3155:17,stk4021:20,stk4051:20,stk4155:17,stk5000:20,stk:20,stochast:[0,1,5,6,8,11,12,17],stock:4,stoke:12,stone:[0,7],stop:[1,4,7,9,11,13,14],storag:5,store:[0,1,2,3,6,11,13,18],storehaug:19,str:[1,3,4],straight:[0,6,8,13],straightforward:[0,2,3,5,6,8,9,10,13,16],strategi:[0,1,9],stratifi:6,streamtyp:5,strength:[0,5,14],stretch:11,strict:[8,13],strictli:[8,13],stride:[4,16],strike:6,string:1,stroke:7,strong:[3,6,9,10,12,16,18],strongli:[0,8,15,16],stronli:0,structur:[0,1,2,3,6,9,10,12,15],stuck:[1,13],student:[0,17,19,20],studi:[0,3,4,5,6,7,8,11,12,13,15,20],studier:[17,20],style:[0,7,9,16],sub:[9,12],subarg:[2,13],subdivid:[0,16],subfield:0,subject:[5,6,8,18],subplot:[0,1,3,4,6,7,8,9,10,13,14],subplots_adjust:[8,18],subprogram:16,subract:0,subroutin:0,subscript:1,subsequ:[1,4,5,6,12,16,18],subset:[1,6,9,12,13,15],subspac:[0,8,11],substanti:[9,10],substep:11,substitut:[3,6,12,16],subsubset:9,subtask:6,subtl:1,subtract:[0,4,5,6,11,13,16,18],subtre:9,subval:[2,13],succeed:[0,4],success:[3,7,9,13,18],successfulli:[4,9],sucess:[],sudo:[0,15],suffer:[0,1,2,5,10],suffici:[1,6,8,11,13],suggest:[1,13,20],suit:[8,12],suitabl:[0,18],sum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],sum_:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],sum_i:[0,2,5,6,8,13],sum_j:6,sum_ja_:0,sum_k:[6,8,12,16],sum_m:3,sum_n:3,sum_nx_:3,summar:[5,6,9],summari:[1,3,4,10,17],summat:[0,3],sunni:9,superfici:3,superscript:[1,12],supervis:[0,5,6,7,9,12,15],supplement:7,support:[0,1,9,10,11,13,15,17],suppos:[0,5,6,7,8,10,11,12,13,16],suppress:[5,13],sure:[0,1,4,6],surf:6,surfac:[0,6],surpass:6,surpris:0,surround:[3,15],survei:[0,5,6],suyrzm0:17,svc:[8,9,10],svd:[0,6,11,17],svdinv:5,svm:[8,9,10,11],svm_clf:[8,10],swap:2,swapax:2,swath:5,sy:[5,13],symbol:[1,5,11,13,15,18],symmeteri:1,symmetr:[0,5,8,11,12,13,16],symmetri:6,sympi:[0,15],synonim:18,syntax:[1,13],syntaxerror:1,syrk:5,system:[0,1,3,4,5,6,7,9,10,12,13,15,16,20],systemat:[4,6],t0:[3,6,13],t1:[2,13],t2:2,t3:2,t:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],t_0:[2,9,13],t_1:13,t_:2,t_b:10,t_i:[1,2,12],t_j:[5,12],t_k:9,tabl:[9,18,19],tabul:0,tackl:4,tag:[2,3,4,5,6,7,12,13,14,16,18],taht:0,tail:18,tailor:[2,8,11],taiwan:0,take:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18],taken:[0,1,3,6,10,13,16],tan:3,tangent:[1,4,12,13],tanh:[1,4,7,8,12,13],tape:[3,4],target:[0,1,3,4,5,6,7,8,9,10,11,12,13],target_nam:9,task:[0,1,3,5,6,9,11,12,14],tau:[3,5,18],tax:0,taylor:[2,13],taylornr:13,tc:8,team:1,teaser:0,technic:[0,5,6,13],techniqu:[0,1,8,10,13,15,17,18,20],technolog:[0,1],tek5040:20,tell:[0,4,6,10,11,13,18],temp1:1,temp2:1,temp:1,temperatur:[0,9],temporarili:1,ten:3,tend:[3,5,6,8,9,10,12,13,14],tendenc:0,tension:6,tensor:[3,4],tensorflow:[0,2,4,8,14,15,16,17,20],term1:[5,6,11],term2:[5,6,11],term3:[5,6,11],term4:[5,6,11],term:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18],termin:[0,4,5,9,10,13],terrain1:6,terrain:6,test:[3,4,5,6,7,8,9,10,13,14,16,18],test_acc:3,test_accuraci:[1,3],test_error:6,test_imag:[3,4],test_ind:6,test_input:4,test_label:[3,4],test_loss:3,test_pr:1,test_predict:1,test_rnn:4,test_scor:[7,10],test_siz:[0,1,3,5,6,10],test_split:9,testerror:[0,6],testi:4,testpredict:4,testx:4,text:[0,1,2,4,5,8,9,11,13,16,17,18,20],textbook:17,textual:9,textur:1,tf:[1,3,4,13,14],tfe_py_execut:[3,4],th:[0,1,2,5,6,7,9,12,13,14,16,18],than:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,18],thank:[4,6],theano:[1,15],thei:[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18],them:[0,1,3,4,6,8,9,10,11,12,13,16],theme:0,themselv:[0,18],thenc:6,theorem:[2,6,7],theoret:[0,4,10],theori:[0,1,3,8,9,12,13,15,17,20],thereaft:[0,5,6,11,12,16],therebi:[0,5,7,11],therefor:[0,1,2,3,4,6,7,8,11,13,18],therein:11,thereof:[0,6,13],theta:[1,4,13,18],theta_:[1,13],theta_i:1,theta_k:[],theta_linreg:13,theta_t:13,thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],thing:[0,1,2,4,5,7,9,18],think:[0,1,3,4,6,9,12,13,14,18],third:[0,3,6,13],thirti:7,those:[0,3,5,6,8,9,10,11,16,17],though:[1,2,3,4,13,16,18],thought:[6,14,18],thousand:[0,1],thread:[3,4],three:[0,1,3,5,6,8,9,12,16,17,18,19],threshold:[1,3,9,10,11,12,13],through:[0,1,2,3,4,5,6,8,11,12,13,14,15,16,18],throughout:[0,4,5,14,15,16,18],thu:[0,1,2,5,6,7,8,10,11,12,13,19],thumb:[0,6],thursdai:17,tibshirani:[6,17,20],tick_param:6,ticker:[6,13,18],tif:6,tight_layout:[1,7],tightli:11,tild:[0,5,6,11,18],till:[0,4,7,8,9,10,12,16],time:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],timefunct:[],timeit:4,timer:4,tini:1,tip:3,titl:[0,1,2,3,4,6,7,8,9,10,13,18],tmp:13,tmp_log:[3,4],tn:[2,3],to_categor:[1,3,4],to_categorical_numpi:1,to_numer:[0,6],to_str:[],todai:3,togeth:[0,3,6,8,11,15],toi:[13,14],told:13,toler:[2,6,14],tolist:4,tomographi:12,too:[0,2,4,5,6,9,11,13,18,20],took:8,tool:[0,1,3,6,13,15],toolbox:8,top:[0,3,5,6,9,10,15],top_node_typ:2,top_trac:2,topic:[0,5,6,7,8,15,17,20],topolog:[1,3,12],toposort:2,torkjellsdatt:19,toss:[10,18],total:[0,1,2,3,4,6,7,8,10,11,12,13,14,16,18,19],total_loss:4,totalclustervari:14,totalscatt:14,totalvari:[],toward:[1,2,7,12,13],town:0,tp:4,tpng:9,tpu:15,tqdm:6,tr:[],trace:[2,13],trace_stack:[2,13],traceback:[0,2,3,4,5,6,7,8,9,10,13],traceback_util:[3,4],tracer:[2,13],track:[3,13,14,16],tract:0,tractabl:0,trade:[5,9],tradeoff:[0,5,17],tradit:[0,1,4,6],train:[2,3,5,6,8,9,10,11,12,13],train_accuraci:[0,1,3],train_dataset:4,train_end:[0,1],train_error:6,train_funct:[3,4],train_imag:[3,4],train_ind:6,train_label:[3,4],train_pr:1,train_siz:[0,1,3],train_step:4,train_test_split:[0,1,3,5,6,7,9,10,11],train_test_split_numpi:[0,1],trainabl:4,trainable_vari:4,trained_model:6,trainerror:0,traini:4,training_checkpoint:4,training_dataset:4,training_gradi:13,training_gradient_fun:13,training_loss:13,trainingerror:6,trainpredict:4,trainscor:4,trainx:4,trait:0,trajectori:4,tran:5,transfer:9,transform:[0,5,6,7,8,9,10,11,12,13,15,16],transit:[6,12],translat:[1,4,6,10],transpos:[1,5,11,16],travers:[0,5],treat:[0,1,3,6,12,13,18],tree:[0,1,6,15,17],tree_clf:[9,10],tree_clf_:9,tree_clf_sr:9,tree_reg1:9,tree_reg2:9,tree_reg:9,trend:18,trevor:20,tri:[2,3,4,9,13],triain:0,trial:[0,2,4,6,13,18],triangl:13,triangular:16,trick:[3,4,8,11,13,18],trickier:18,tridiagon:16,trillion:15,trivial:[0,1,5,11,18],troubl:[0,8,12],truck:3,true_beta:6,true_divid:1,true_fun:6,tucker:8,tumor:[7,9],tumour:7,tunabl:1,tune:[4,9,13,16],tup:[],tupl:[2,13],turn:[0,1,5,6,7,8,9,10,11,12,13,16,18],tutori:[1,4],tv:2,tveito:2,tweak:[1,4,10,18],twice:13,twist:11,twister:[],two:[0,1,2,4,5,6,7,9,10,11,12,13,16,17,18,20],tx:13,tx_1:13,txt:4,ty:13,type:[0,1,3,6,8,10,13,16,18],typeerror:[2,13],typic:[0,1,2,3,4,5,7,9,10,12,13,18],u:[0,2,5,6,10,11,12,16],u_:16,u_i:12,u_m:10,ua:0,ubuntu:[0,15],uci:0,uio:[17,19,20],un:14,unari:16,unary_f:[2,13],unary_oper:[2,13],unary_to_nari:2,unbalanc:[6,9],unbias:[0,5,6],uncent:6,uncertainti:[0,5],uncertitud:18,unchang:[1,3],uncorrel:[10,18],undefin:5,under:[0,1,5,6,10,13,15],underdetermin:0,underfit:[1,6],underflowproblem:5,undergo:5,undergradu:17,underli:[0,1,9,13,18],underset:[4,14],understand:[0,1,3,5,6,10,13,14,15],understood:[8,13],undesir:8,undetermin:[5,8],undo:4,unexpect:6,unexpected:18,unfair:6,unfortun:[1,8,9,10],unicode_liter:[8,9],uniform:[0,1,5,6,11,13,18],uniform_real_distribut:[],uniformli:[13,18],unifrompdf:18,unimport:13,union:[5,6],uniqu:[0,2,6,13,14,16],unique_cluster_label:14,unit:[0,1,3,4,5,10,12,18],unitari:[5,6,16],unitarili:16,uniti:18,univari:18,univers:[0,1,2,13,15,17,19],unix:1,unknow:[0,16],unknown:[0,1,3,4,5,6,8,10,16],unknowwn:12,unlabel:1,unless:[0,3,6,11,13],unlik:[1,3,8,13],unnecessarili:9,unord:3,unravel:1,unrol:[3,11],unseen:[0,7,9],unstabl:1,unsupervis:[0,1,4,12,15,17],unsymmetr:16,until:[1,2,4,9,12,13,14],untouch:0,unusu:12,up:[1,3,4,5,6,8,10,11,13,14,15,16,17,18],updat:[1,2,10,12,13,14],upload:[15,20],upon:[0,1,6,11,16],upper:[0,8,9,16],uppercas:16,upsampl:4,upscal:4,us:[4,5,6,8,9,10,11,12,14,16,17,18,20],usag:[0,8,15],usd10000:0,usd:0,use_bia:4,use_multiprocess:[3,4],usecol:0,useless:1,user:[0,1,2,3,4,6,7,8,11,14,15,16],userwarn:[3,4,6,14],usetex:18,usg:6,usr:18,usual:[0,3,4,7,12,13,14],ut:5,util:[0,1,3,4,6,7,10,14],ux:16,v0:18,v1:18,v2:18,v:[2,4,5,6,11,13,15],v_0:11,va:1,val:13,val_accuraci:3,val_loss:4,vale:2,valid:[0,1,4,7,9,10,13,15,17,18],validation_batch_s:[3,4],validation_data:[3,4],validation_freq:[3,4],validation_split:[3,4],validation_step:[3,4],valu:[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,17],valuat:9,valueerror:[0,2],valy:4,van:0,vandenbergh:[8,13],vandermond:0,vanilla:[0,6,11,14],vanish:[1,4,13,18],var_x:18,varabl:8,varepsilon:[5,6],varepsilon_:[5,6],varepsilon_i:[5,6],vari:[0,1,3,5,6,10],variabl:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16],varianc:[0,1,5,7,9,10,11,13,14,15,16,17,18],variance_i:[5,11],variance_x:[5,11],variant:[0,1,6,8,12,13],variat:[3,4,11],varieti:[0,3,12,15],variou:[1,3,5,6,7,8,9,11,12,13,15,16,18],vartempvec:[],varvec:[],varydimens:4,vastli:3,vaue:1,vault:0,vdot:[2,13],vec:6,vector:[0,1,2,3,4,5,6,7,9,10,11,13,14,15,17],vector_mean:14,ventur:[0,8,15],verbos:[1,3,4],veri:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,20],verifi:[3,11,16],versatil:8,versicolor:[8,9],version:[0,3,4,10,13,14,15,16,18],versu:1,vert:[0,1,5,6,7,8,9,11,13],vert_1:[5,6],vert_2:[5,6,11],via:[0,5,6,7,8,9,10,11,12,15,16,17,18],vidal:11,video:[0,1,12,15,17],view:[1,3,5,6,12,13,17,18,20],violat:8,virginica:9,viridi:[0,1,2,3],virtual:1,viscos:13,viscou:13,visibledeprecationwarn:2,vision:[0,3],visual:[0,3,11,12,15],visualis:1,viz:[6,8,18],vjp:[2,13],vjp_0:[],vjp_0_fun:[],vjp_1:[],vjp_1_fun:[],vjp_argnum:[],vjpfun:2,vjpmaker:[],vjpnode:[2,13],vmax:[1,6],vmc:[],vmin:[1,6],voic:3,volum:[0,3],vote:10,voting_clf:10,votingclassifi:10,votingsimpl:10,vrtx:17,vs:[0,4,6],vspace:[2,13],vstack:[5,11,16,18],vt:5,w1:8,w2:[8,11],w3:8,w:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],w_1:[8,16],w_1x_1:8,w_1x_:8,w_2:[8,16],w_2x_2:8,w_2x_:8,w_3:16,w_4:16,w_:[1,12],w_hidden:2,w_i:[1,2,10],w_ix_i:12,w_j:16,w_m:16,w_output:2,w_px_:8,w_px_p:8,wa:[0,1,3,4,5,6,7,10,11,12,13,14,16],wai:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],walk:9,walker:18,wang:0,want:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,18],warn:[1,3,4,8,14],warrant:6,wast:3,watch:[3,4,15],wave:3,wavelet:8,we:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],weak:[9,10,14],weather:[1,12],web:[15,17],webpag:17,websit:[6,16,17],wedg:[8,18],wednesdai:17,wee:11,week:[0,5,6,7],weekli:[15,20],weight:[0,1,2,3,6,7,9,10,12,13,18],weigth:2,welcom:[8,15],well:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,20],went:8,were:[0,1,3,4,5,6,7,8,10,11,12,14,18],wessel:0,westbi:19,westby:19,what:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],whatev:3,when:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],whenev:[13,18],where:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],wherea:[6,18],wherein:[1,12],whether:[0,3,5,7,9,18],which:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],whichev:[1,3],white:9,who:[0,17],whole:[1,3,4,5,9,11,13],whose:[0,6,10,18],whow:[5,11],why:[0,1,3,6,13],wide:[0,1,3,6,7,12,15,16],widehat:6,width:[0,3,8,9],wieringen:0,win:10,wind:9,wing:19,winther:2,wiothout:6,wiscons:7,wisconsin:10,wisdom:6,wise:[0,1,5,12,13],wish:[0,2,5,7,8,11,13,14,16],with_std:0,wither:6,within:[0,2,3,4,7,9,12,13,14,18,20],withinclust:14,without:[0,1,5,6,8,9,11,12,13],won:0,wonder:8,word:[0,1,3,4,5,6,14,18],work:[0,1,4,6,7,8,9,13,15,17,18],worker:[3,4],workshop:17,world:[0,8],worldwid:0,wors:[0,1,3,4,6],worst:[],worth:9,would:[0,1,3,5,6,7,8,9,10,11,12,13,16,18],wrap:[2,6,16,17],wrap_util:[2,13],wrapper:0,write:[0,1,2,3,5,6,7,8,12,13,16],written:[0,2,3,5,11,12,13,15,16,18],wrong:[1,8],wrongli:10,wrote:[5,11],wrt:[2,10,13],wth:10,www:[15,16,17,20],wx_1:8,x0:8,x1:[4,8,9,10,13],x1_exampl:8,x1d:8,x2:[8,9,10,13],x2d:[8,11],x2d_train:11,x2dsl:11,x3:8,x:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],x_0:[0,5,11,16],x_1:[0,2,5,6,7,8,9,10,11,13,16,18],x_2:[0,2,5,6,7,8,9,10,11,13,16,18],x_3:[8,16,18],x_4:16,x_:[0,2,3,5,6,8,10,11,13,14,16,18],x_center:11,x_data:1,x_data_ful:1,x_hidden:2,x_i:[0,1,2,5,6,7,8,9,10,11,12,13,14,16,18],x_input:2,x_ix_:0,x_iy_i:8,x_j:[0,2,8,9,12,18],x_jy_j:8,x_k:[12,14,16,18],x_l:18,x_m:[6,12,16,18],x_n:[0,2,3,6,8,11,12,13,16,18],x_new:[9,10],x_offset:6,x_output:2,x_p:[3,7,9],x_poli:9,x_poly10:9,x_pred:4,x_prev:2,x_reduc:11,x_scale:8,x_test:[0,1,3,5,6,7,9,10,11],x_test_own:6,x_test_scal:[0,6,7,9,10,11],x_tot:4,x_train:[0,1,3,4,5,6,7,9,10,11],x_train_mean:6,x_train_own:6,x_train_scal:[0,6,7,9,10,11],x_val:1,xarrai:15,xavier:1,xbnew:13,xcode:[0,15],xdclassiffierconfus:10,xdclassiffierroc:10,xg_clf:10,xgb:10,xgbclassifi:10,xgboost:9,xgboot:10,xgbregressor:10,xgparam:10,xgtree:10,xi:[8,13],xi_1:8,xi_:8,xi_i:8,xk:8,xla:15,xlabel:[0,1,2,3,4,5,6,7,8,9,10,13,18],xlim:[6,10],xm:9,xmesh:13,xnew:[0,13],xp:18,xpanda:0,xpd:[5,11],xplot:0,xs:9,xscale:0,xsr:9,xt_x:13,xtest:6,xtick:[3,6,8,9],xtrain:6,xu:0,xx:[0,5,16],xy:[0,6,8,16],xytext:8,xz:16,y1:4,y2:4,y3:4,y:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,18],y_0:[0,5,11,16],y_1:[0,5,8,9,11,13,16],y_1y_1:8,y_1y_1k:8,y_1y_2:8,y_1y_2k:8,y_1y_n:8,y_1y_nk:8,y_2:[0,5,8,9,11,16],y_2y_1:8,y_2y_1k:8,y_2y_2:8,y_2y_2k:8,y_3:[0,9,16],y_4:16,y_:[0,1,5,6,10,11,16],y_data:[0,1,5,6],y_data_ful:1,y_decis:8,y_fit:0,y_i:[0,1,5,6,7,8,9,10,11,12,13,16],y_if_:10,y_ix_:0,y_ix_i:[7,8,13],y_iy_jk:8,y_j:[6,8,12],y_k:12,y_m:16,y_model:[0,4,5,6],y_n:[8,13],y_ny_1:8,y_ny_1k:8,y_ny_2:8,y_ny_2k:8,y_ny_n:8,y_ny_nk:8,y_offset:6,y_plot:9,y_pred1:9,y_pred2:9,y_pred:[0,1,4,6,7,8,9,10],y_pred_rf:10,y_pred_tre:10,y_proba:[7,10],y_scaler:6,y_test:[0,1,3,4,5,6,7,9,10,11],y_test_onehot:1,y_test_predict:0,y_tot:4,y_train:[0,1,3,4,5,6,7,9,10,11],y_train_mean:6,y_train_onehot:1,y_train_predict:0,y_train_scal:6,y_val:1,ye:[3,6,7],year:[0,15],yet:[0,1,6,8,11,13],yhd5w:17,yi:13,yield:[0,2,5,6,8,10,12,13,14,16,18],yk:8,ylabel:[0,1,2,3,4,5,6,7,8,9,10,13,18],ylim:[3,6],ym:9,ymesh:13,yn:0,yo:[8,9,10],yoshua:[1,20],you:[0,1,2,3,4,5,6,8,9,10,11,13,15,16,18,20],young:0,your:[1,2,4,5,6,8,11,13,15,16],yourself:[11,13],youtu:17,youtub:15,ypred:6,ypredict2:13,ypredict:[0,13],ypredictlasso:5,ypredictol:[0,5],ypredictown:6,ypredictownridg:6,ypredictridg:[0,5,6],ypredictskl:6,ys:9,ytest:6,ytick:[3,6,8,9],ytild:[0,6],ytildelasso:5,ytildenp:0,ytildeol:[0,5],ytildeownridg:6,ytilderidg:[5,6],ytrain:6,yx:16,yy:16,yz:16,z:[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18],z_0:16,z_1:16,z_2:16,z_:[1,2,12,16],z_c:1,z_h:1,z_hidden:2,z_i:[1,12],z_j:[1,12],z_k:12,z_m:1,z_mod:9,z_o:1,z_output:2,zaman:18,zaxi:6,zero:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],zeros_lik:4,zfill:4,zip:[2,4,6,13],zl:5,zm_h:0,zn:0,zone:0,zx:16,zy:16,zz:16},titles:["3. Linear Regression","14. Building a Feed Forward Neural Network","15. Solving Differential Equations with Deep Learning","16. Convolutional Neural Networks","17. Recurrent neural networks: Overarching view","4. Ridge and Lasso Regression","5. Resampling Methods","6. Logistic Regression","8. Support Vector Machines, overarching aims","9. Decision trees, overarching aims","10. Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods","11. Basic ideas of the Principal Component Analysis (PCA)","13. Neural networks","7. Optimization, the central part of any Machine Learning algortithm","12. Clustering and Unsupervised Learning","Applied Data Analysis and Machine Learning","2. Linear Algebra, Handling of Arrays and more Python Features","Teaching schedule with links to material","1. Elements of Probability Theory and Statistical Data Analysis","Teachers and Grading","Textbooks"],titleterms:{"1":0,"10":17,"11":17,"12":17,"13":[],"14":17,"15":[],"16":17,"17":17,"18":17,"19":17,"2":[0,17],"20":[],"2021":[],"2022":19,"21":17,"22":17,"23":17,"24":17,"25":17,"26":17,"27":[],"28":17,"29":17,"3":[0,17],"30":17,"31":17,"34":17,"35":17,"36":17,"37":17,"38":17,"39":17,"4":[0,17],"40":17,"41":17,"4155":[],"42":17,"43":17,"44":17,"45":17,"46":17,"47":17,"5":[0,17],"6":[],"7":17,"8":[],"9":17,"case":[8,10,18],"do":1,"final":12,"function":[0,1,6,7,8,10,11,12,13,18],"import":[5,16],"new":4,A:[0,1,4,8,9],And:13,Ising:6,The:[0,1,2,3,5,6,7,8,9,11,12,15],With:4,activ:[1,12],actual:[],ad:[0,6],adaboost:10,adam:13,adapt:10,adjust:1,adversari:4,again:[3,9],aim:[8,9],algebra:16,algorithm:[9,10,11,12],algortithm:13,all:8,an:[0,4,10],analys:5,analysi:[0,5,6,11,15,18],analyt:0,ani:13,anoth:9,appli:15,approach:[0,8,14],approxim:12,architectur:1,arrai:16,assist:19,august:17,autocorrel:18,autograd:[2,13],automat:13,back:[1,11,12],background:15,bag:10,base:13,basic:[0,5,7,9,10,11,16],batch:1,bay:5,befor:11,better:8,bia:6,binari:1,binomi:[],bird:10,block:[],boost:10,bootstrap:[6,10],boston:0,breast:1,bring:12,build:[1,3,9],calcul:[],cancer:[1,7,9,11],cart:9,central:[13,15,18],chain:12,chang:10,chi:0,choos:1,cifar01:3,classic:11,classif:[1,9,10],classifi:8,clip:1,cluster:14,cnn:3,code:[0,1,2,5,9,11,12,14],collect:[1,3],compar:[2,10],complex:[0,6],complic:6,compon:11,comput:9,con:9,concept:18,conjug:13,continu:[],convex:[8,13],convolut:[3,12],correl:11,cost:[1,10],cours:[15,20],covari:[5,11,18],cross:6,cumul:[],data:[0,1,3,6,7,9,11,15,18],dataset:[1,3],decai:2,decis:[9,10],decomposit:[5,11,16],deep:[1,2],defin:1,definit:[],degre:0,demonstr:[],dens:0,deriv:[5,12],descent:[2,10,13],detail:3,develop:1,deviat:[],diagon:11,dice:[],differ:8,differenti:[2,13],diffus:2,dimension:[2,3,8],disadvantag:9,discret:18,disguis:[],distribut:[5,18],domain:18,down:1,dropout:1,element:[0,18],elimin:16,ensembl:10,entropi:9,environ:0,equat:[0,2,12],error:[0,10],euler:2,evalu:1,event:[],exampl:[0,1,2,3,4,6,7,8,9,10],exercis:[0,6],expect:18,experi:18,explor:0,exponenti:2,extrapol:4,extrem:10,ey:10,fall:19,famili:1,famou:16,featur:[9,16],feed:[1,12],fine:1,first:[4,12],fit:[0,10],forc:3,forest:10,forward:[1,2,12],fourier:3,frank:6,freedom:0,frequentist:0,from:[5,10,12],full:2,further:[3,5],fy:[],gan:4,gaussian:16,gd:13,gener:[4,9],geometr:11,gini:9,good:0,grade:19,gradient:[1,2,10,13],growth:2,ha:15,handl:16,hidden:2,hous:0,how:[],hyperparamet:1,hyperplan:8,i:1,id3:9,idea:11,implement:1,implic:5,improv:1,includ:13,increment:11,index:9,inform:19,input:2,instal:15,instructor:19,interpret:[5,11],introduc:11,introduct:[0,6,15,16],invers:[5,16],iter:10,its:[],jackknif:[],jungl:10,kera:[1,3],kernel:[8,11],lagrangian:8,lasso:[5,6],later:5,layer:[1,2,3,12],learn:[0,1,2,11,13,14,15],least:[5,6],level:10,librari:15,likelihood:7,limit:[1,13,18],linear:[0,8,13,16],link:[5,11,17,20],logist:[7,13],lu:16,machin:[0,8,13,15],main:18,make:[0,9,10],mani:[10,12],materi:17,math:5,mathemat:[3,5,8],matric:[5,16],matrix:[1,5,11,12,16],matter:0,mean:0,meet:[5,10,18],mercer:8,mersenn:[],method:[6,9,10,13],mlp:12,mnist:[3,4],model:[0,1,4,6,12],moment:[],momentum:13,moon:[8,9],more:[3,6,16],multilay:12,multipl:[1,3],multipli:8,name:[],network:[1,2,3,4,7,12],neural:[1,2,3,4,12],non:8,normal:[0,1],norwai:[],notat:12,novemb:17,now:[1,9],nuclear:0,nueral:7,number:[0,2,18],numer:[2,18],numpi:16,object:3,observ:[],obtain:11,octob:17,od:2,off:6,ol:[5,6,13],one:[2,12],oper:16,optim:[1,8,13,15],ordinari:[5,6],organ:0,oslo:20,other:[4,9,11,12,16],our:[0,4,5,11,13],outcom:15,output:2,overarch:[0,4,8,9],overview:10,own:[0,10,11],packag:16,part:[13,15],partial:2,pass:1,pca:11,pdf:18,perceptron:12,perform:[1,9],period:3,perspect:1,point:4,poisson:2,polynomi:3,popul:2,practic:13,pre:[1,3],predict:4,prerequisit:[3,15],princip:11,principl:3,pro:9,probabl:[5,18],problem:[1,2,13],procedur:9,process:[1,3],program:[2,13],project:6,prop:13,propag:[1,12],properti:[5,18],pseudo:[],python:[0,9,15,16],quick:8,ran0:[],random:[10,11,18],read:9,real:6,recip:[],recurr:[4,12],reduc:0,reduct:3,reformul:2,regress:[0,5,6,7,9,10,13],regular:1,relev:20,relu:1,remark:3,remind:[6,8],requir:[2,15],resampl:6,rescal:6,resourc:2,revisit:13,ridg:[0,5,6],rm:13,rng:[],rule:12,s:[8,10],sampl:11,schedul:17,schemat:9,scheme:2,scikit:[0,1,11],select:[],semest:19,septemb:17,set:[0,2,3,9,12],sgd:13,should:1,simpl:[0,4,9,13],singl:10,singular:[5,11],situat:[],soft:8,softmax:1,solv:2,solver:13,some:[13,16],specifi:2,split:0,squar:[0,5,6,10],standard:13,state:0,statist:[5,6,15,18],steepest:[10,13],stk3155:[],stochast:[13,18],superposit:3,supervis:1,support:8,svd:5,systemat:3,teach:[17,19],teacher:19,techniqu:[6,11],technolog:15,tensorflow:[1,3],test:[0,1],textbook:20,theorem:[5,8,11,12,18],theori:18,three:[],tip:13,togeth:12,top:1,toss:[],toward:11,trade:6,tradeoff:6,train:[0,1,4],transform:3,tree:[9,10],tune:1,two:[3,8,15],type:[2,4,12],uncorrel:[],uniform:[],univers:[12,20],unsupervis:14,up:[0,2,9,12],us:[0,1,2,3,7,13,15],valid:6,valu:[5,11,18],variabl:18,varianc:6,variou:0,vector:[8,12,16],view:[0,4,10],visual:[1,9],vs:3,wai:9,wave:2,week:17,weekli:17,what:0,which:1,why:[],wisconsin:7,write:[4,11],xgboost:10,your:[0,10]}}) \ No newline at end of file +Search.setIndex({docnames:["chapter1","chapter10","chapter11","chapter12","chapter13","chapter2","chapter3","chapter4","chapter5","chapter6","chapter7","chapter8","chapter9","chapteroptimization","clustering","intro","linalg","schedule","statistics","teachers","textbooks"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["chapter1.ipynb","chapter10.ipynb","chapter11.ipynb","chapter12.ipynb","chapter13.ipynb","chapter2.ipynb","chapter3.ipynb","chapter4.ipynb","chapter5.ipynb","chapter6.ipynb","chapter7.ipynb","chapter8.ipynb","chapter9.ipynb","chapteroptimization.ipynb","clustering.ipynb","intro.md","linalg.ipynb","schedule.md","statistics.ipynb","teachers.md","textbooks.md"],objects:{},objnames:{},objtypes:{},terms:{"0":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19],"00":[0,1,3,5,6,11,18],"000":[1,3],"0000":[],"00000":[],"000000":[5,11],"00000000e":5,"0000e":3,"0001":[1,3],"000148":[],"00019998":5,"00024087":5,"00028369228101198006":[],"00029012":5,"0003043256065368937":9,"00031535148309580783":6,"0003153514830958081":[],"0003153514830958126":[],"0003153514830958235":6,"00034944":5,"000417932":2,"00042089":5,"000464088":2,"00050694":5,"00058016":6,"000599":[],"00060705":[],"00060708":6,"00061058":5,"00062582":6,"00062595":[],"00066668":6,"00068734":6,"00068941":6,"00069103":[],"00073541":5,"00076495":6,"00076919":6,"00076925":[],"0007698473260556325":6,"0007698473260556334":[],"0007698473260556339":[],"0007698473260556344":6,"00079123":[],"00079130":6,"00079968":5,"00084705":[],"00084711":6,"00085883":6,"00085884":[],"00087697":6,"00088573":5,"00092645":6,"00092646":[],"00096314":5,"001":[1,2,8,13],"00100519":6,"0010479245355337968":[],"0010479245887943952":6,"00105081":6,"00106677":5,"00107405":6,"00111756":6,"0011526":6,"00115999":5,"0011828302640124":[],"00118504":6,"00118527":[],"001263":[],"00128479":5,"001323":6,"00137823":6,"00137835":[],"00139705":5,"00149311":6,"00149956":6,"00152117":6,"00154733":5,"00156379":[],"00156382":6,"00168251":5,"00174276":6,"00175331":6,"00186347":5,"001880":5,"001988":[],"00198806":[],"00200":8,"00202624":5,"00202756":6,"00217499":6,"00224413":5,"00228741":6,"0023548":6,"002381316302584885":[],"002381316302584886":6,"0023813163025848865":6,"00242999":6,"00243186":6,"0024401":5,"00249435":6,"002526":[],"00266858":2,"00270244":5,"00274989":6,"00275135":[],"00289724":6,"00293838":5,"002948":[],"0030828":[],"003083":[],"00310113":2,"00312361":6,"00315593":6,"003215318065760509":[],"0032153180657605125":6,"00323332":6,"0032542":5,"003301":6,"003395515459204093":6,"0033955154592040944":[],"00353823":5,"0036237":6,"0036367":6,"00369758":6,"003704":[],"003717":[],"003759":[],"003774":[],"003788":[],"0038335":6,"00390021":[],"003909404072811217":6,"003909404072811231":[],"00391839":5,"0039987":6,"004":5,"004091940707753948":6,"0040919407077539514":[],"00410387":6,"00410478":6,"004113634617443116":6,"0041136346174431284":[],"004113634617443131":6,"004113634617443135":[],"00411363461744314":6,"004113634617443141":[],"004155986345861364":6,"004155986345861374":[],"00415763":[],"00424909":2,"00424967":6,"00426027":5,"00433417":11,"00440346":6,"00443743":6,"00445655":11,"004579219539673834":6,"004579219539673836":[],"00458878":6,"004610275230656187":6,"004610275230656294":[],"00462287":6,"00471782":5,"00472199":6,"00472512":6,"0049544":6,"004999999999999984":[],"004999999999999994":[],"004999999999999996":[],"005000000000000011":0,"00512927":5,"00517114":6,"00526348":6,"0053018":6,"00554552":6,"00556826":6,"0056799":5,"00577441":[],"00579953":6,"00588657":6,"00607783":6,"006162":6,"00617499":5,"00630331":6,"00642221":6,"00660427":6,"00672607":6,"00673393":13,"00673407":6,"00676387":6,"0068011":6,"00683748":5,"00683964":6,"007012403613997257":[],"007024126888936694":[],"0070241268889382116":6,"00719176":6,"00727646693":0,"007315":[],"0074331":5,"00751823":[],"00759119":6,"00784393":6,"00803064":6,"0080866254785146":[],"00813803":6,"00817631":6,"00823002":5,"00827728":6,"00831018":6,"00834567":6,"00848904":6,"0086649156":0,"008675369724975977":5,"008675369724976501":[],"00894639":5,"00905423":6,"009163470508352211":[],"009163470508352218":5,"009164545680330616":6,"00917248":6,"00934499":6,"009450756365829578":[],"0096208":6,"00990475":5,"00992331":6,"00996754":6,"00it":6,"01":[0,1,2,5,6,9,11,13,18,20],"010018312644139205":6,"010018312644139347":[],"0100706":6,"010331721306655144":6,"01033172130665515":[],"010516485576646513":6,"010516485576652856":[],"01066519":6,"01076611":5,"0110":18,"0110407067093945":[],"01104071":[],"011076219011339788":[],"01107621901137465":6,"011225":2,"0113104":6,"01179792":6,"01191824":5,"01199624e":18,"012073649439965807":[],"012073649472576395":6,"01212754811385597":18,"01219292":6,"01223198":6,"01231917":6,"012633802944855959":[],"01290947":6,"01295356":5,"013121573975499602":[],"013121573975499604":[],"01312157406137079":6,"013121574061370796":6,"01318643":6,"01347916":6,"01348565":6,"01367553":6,"01397146":6,"01405935":6,"01416528":6,"014209325470380275":[],"01433809":5,"014436800088896274":6,"014436800088969727":[],"01449782":6,"01458337":6,"0146081":6,"01463049":6,"015072388895177088":[],"0150723888951771":6,"015072388895177109":[],"015072388895177239":6,"01509543":13,"01530715721129232":[],"01531845":6,"01538461538462":[],"01549377":6,"01558197":5,"01591355407242949":5,"016285782696017055":6,"016285782696075054":[],"01633913":6,"01640891":6,"01655318":6,"016587414993037307":[],"016587414993045405":6,"01691985":6,"0169643":5,"01708781":6,"01708852":6,"01713366":6,"01724499":5,"01735584819559184":[],"017355848195591845":[],"017355848195593354":6,"01756972":[],"017665":5,"01799917e":18,"01817152":[],"018232":[],"01831036e":6,"01831130e":[],"01831200e":[],"01831207e":6,"01866537":6,"01869785e":18,"01873344":11,"01873869":5,"01898855":6,"01905883":6,"01908936":6,"019587":[],"01963611":6,"01969145":6,"019754165271682844":6,"01975416527179247":[],"01975848":6,"02":[0,4,6,7,12,18],"02024962":6,"02054837e":6,"02068067":6,"02073509":5,"0209518407597062":18,"02098261":6,"02123176":6,"021250026482402":11,"02159270458799264":[],"021592704587992645":[],"021592704588021164":6,"021592704588021167":6,"02198702e":6,"022022882954618364":[],"02208512":6,"02228115":6,"02229529":6,"02252765":5,"022556":11,"02255619":11,"02299949826036602":[],"0229994982603662":6,"02348765":6,"02365049":6,"0245528":6,"02492265":5,"02493054":[],"02498832":6,"02503753":6,"02511518":6,"02522069":6,"025709":11,"02586427":6,"0260906":6,"02625193":8,"02625928":13,"026408391362671896":[],"02642055e":18,"026605727637176654":[],"02660572763718461":6,"026605727637184613":6,"026986":5,"02698605":5,"02707227":5,"02723445":6,"027609773491022314":[],"027609773491022387":6,"027609773491022407":6,"02786488":11,"027865":11,"02857":4,"02917662":11,"029177":11,"02926396":[],"029483":5,"029613363972682966":[],"029733":[],"02976145":6,"02994311":5,"02f":6,"03":[1,6],"03032441e":6,"03056589":[],"030566":[],"03071040e":18,"03076923076924":[],"03077640549":4,"03099776":5,"031":5,"03187339273559067":[],"03196357":6,"03251863":5,"03256632e":1,"03267527":6,"03278964":[],"032790":[],"03279636":6,"0330308045180234":[],"0330308045183163":[],"0330308045183219":6,"0330308045190182":6,"03308408":5,"033657685071527485":[],"033657685071527624":6,"03382304823545749":11,"03447512":6,"03562355":6,"03568439":6,"03570747":0,"0358909447132981":[],"0359565":5,"03630548":6,"03707133":11,"037559":11,"03755944":11,"03761519":[],"03781367141738885":[],"03781367141738886":[],"037813671417388985":6,"03781367141738899":6,"03794112":16,"03814292":6,"03815288":6,"038300":11,"03850557":11,"038506":11,"039039":5,"03981057":16,"0399676689527968":6,"0399676689527975":6,"04":[1,6,11,18],"040102":5,"04010697":6,"04063602":6,"041":[],"041148729430502":6,"041148729430523":6,"0411487294305246":[],"0411487294305746":[],"04179719":[],"041797190646905":[],"04220758":6,"04284519":[],"043":[],"04315108":5,"0433816":[],"04346721":5,"04355837":6,"04362":[],"04368707":16,"0437499":2,"04389027":6,"043927769551648":[],"04423486":6,"044334":[],"0444119":[],"044613":6,"04483457":[],"04537385":6,"04543942":6,"04566964":6,"0458":9,"04615384615386":[],"04621521":[],"04648335":5,"046491":5,"04649105":5,"0466":[],"04683565":5,"04775904":16,"04784395":6,"04818727730430296":[],"048187277304303056":6,"048653428302840175":16,"04892055":6,"04909093":6,"04912436":6,"04930820e":18,"0495569966278238":6,"0495569966278269":6,"0495569966278315":[],"049747":5,"04it":[],"05":[1,3,4,6,13],"05009826":6,"05087958":[],"05100875":6,"051418":5,"051649":11,"0517473":5,"05227921801205691":[],"05227921801205692":[],"052279218012057004":6,"052372":5,"05255759":[],"05263":[],"05290417684691035":[],"05302":[],"05364854":8,"05383795":6,"053849":5,"05434571":16,"05447415":6,"054491":5,"054585":[],"054785":[],"054963":[],"05505310046362":[],"05505310046363":2,"055137":[],"055320":[],"05533":[],"055344":5,"055676":[],"05614483":5,"05623":[],"056235":5,"056468":5,"05648":[],"05651951":6,"056528":11,"05667":[],"057088709963182":[],"057163681553428394":6,"05716368155351588":[],"0572":[],"05756733":[],"05785343":6,"05789007":6,"057899":11,"05796251":6,"058033":5,"058038":5,"05807125":6,"058715":5,"05883":[],"05884":[],"058948":5,"058955":5,"059013":[],"059294":11,"059378":11,"059601":[],"059783":[],"059795":5,"059824":5,"059933":5,"05999":[],"06":[6,13],"060080":[],"060183":[],"06020587":6,"06021285":[],"060213":[],"060228":11,"060309":[],"06043581":6,"060507":[],"060655":[],"060781":[],"060841":[],"060963":5,"061025":[],"061048":5,"061149":[],"061321":[],"061390":[],"061509":[],"061538":5,"061604":[],"06160438":[],"061685":5,"061701":[],"061716":5,"061745":[],"061765":5,"061898":[],"061917":[],"061923":11,"06200174":5,"062061":5,"062062":5,"06208238634231944":6,"06208238634231953":[],"062136":[],"062142":[],"062292565":4,"062294":[],"062391":[],"062409":11,"062411":11,"062435":[],"062451":[],"062534":[],"062551":5,"062640":5,"062676":11,"062706":11,"062773":5,"062834":[],"062884":[],"062888":5,"063052":[],"063078":[],"063192":5,"063250":[],"063343":[],"063364":[],"063401":5,"063493":5,"063513":[],"063631":[],"063657":[],"063752":11,"063851":[],"063857":5,"063872":[],"063874":[],"06388888888888888":[],"063977":5,"064052":[],"064108":[],"064110":[],"064184":[],"064274":[],"064384":[],"064388":5,"06444":[],"064459":5,"064461":5,"064469":[],"06453579006728315":[],"06453579006728322":6,"064538":11,"064604":11,"064618":5,"064623":5,"064648":[],"064658":[],"064681":[],"064838":[],"064880":5,"06491736":6,"064918":[],"064931":11,"064964":[],"06497046":[],"065020":[],"065106":[],"065249":11,"065314":11,"065348":[],"06547790180152352":6,"06547790180152353":6,"06547790180152357":[],"06547790180152363":[],"065514":5,"065557":[],"065575":[],"065641":11,"065680":5,"065730":11,"065826":[],"065892":[],"065974":[],"06602663":[],"066051":5,"066110":[],"066194":[],"066223":5,"066309":[],"066348":5,"06637":[],"066449":[],"066558":[],"066609":[],"066654":5,"066670":11,"0666807":2,"066729":11,"066753":[],"066789":[],"066837":11,"066954":[],"067079":[],"067162":5,"067213":[],"067236":[],"067240":[],"06724062":5,"067282":11,"067392":11,"067402":11,"067432":11,"067506":5,"067544":[],"067597":[],"067599":[],"067612":[],"067620":[],"067622":[],"067675":[],"067714":[],"067723":[],"067767":5,"067769":[],"067787":5,"067856":5,"067908":5,"067956":11,"068059":11,"068093":11,"068094":[],"068103":[],"068120":[],"068210":5,"068318":[],"068345":5,"068363":[],"068376":[],"068417":5,"06844519414009438":[],"06844519414009442":6,"06844519414009444":6,"068461":11,"068500":5,"068505":5,"068538":11,"068573":5,"06858699":[],"068608":[],"068642":[],"068659":[],"068735":[],"068806":[],"068809":[],"068831":[],"068852":5,"068937":[],"068965":[],"068991":[],"068992":[],"069044":5,"069085":11,"069091":[],"069181":[],"069275":11,"069285":5,"069408":[],"069409":[],"069441":[],"069455":[],"069578":5,"069584":[],"069654":5,"069672":[],"069685":11,"069754":[],"069796":[],"069847":[],"069877":11,"069884":11,"069888":[],"069912":[],"06it":6,"07":6,"070028":[],"070043":[],"070071":[],"070074":[],"070150":[],"07016":[],"070163":11,"07017":[],"070343":11,"070379":[],"07039":[],"070419":11,"070429":11,"070491":[],"070492":11,"070576":[],"070612":[],"07062318":6,"070630":[],"070635":[],"070775":5,"070889":11,"070911":[],"070950":11,"070959":5,"070972":11,"07099747918547346":[],"071022":11,"071086":[],"071112":[],"071136":[],"07115":[],"07129539":[],"0712953943627344":[],"0713":0,"071387":[],"07145103":11,"071467":[],"071480":5,"0714956":16,"071515":5,"071529":[],"071547":5,"07160048164232467":6,"07160048164248561":[],"071614":[],"071632":[],"071698":[],"071705":[],"071741":5,"071767":[],"071906":5,"071921":[],"071935":[],"072008":5,"07201957":[],"072216":11,"072242":[],"072348":[],"072352":5,"072442":11,"072492":[],"072521":5,"072530":[],"072597":5,"072611":5,"072617":[],"072620":[],"072750":[],"07285":3,"0728785":[],"07291729":18,"072918":5,"072928":[],"073016":[],"073062":11,"073136":11,"073225":[],"073230":11,"073238":5,"073280":11,"073303":5,"073320":5,"073362":[],"073368":[],"073380":5,"073423":[],"073436":11,"073449":[],"07345504":[],"073531":[],"073548":5,"073575":11,"073583":11,"073598":11,"073629":11,"073647":5,"073695":[],"073699":[],"073719":[],"073761":11,"073810":11,"073816":[],"073827":11,"073907":[],"073949":[],"074034":[],"074067":11,"074111":11,"07413172":[],"074149":11,"07421084":5,"074237":[],"074336":[],"074375":[],"074488":[],"074530":11,"07456491":5,"074573":11,"074666":[],"074693":[],"074881":5,"07490892":6,"074945":[],"075195":[],"075241":[],"075573":[],"075594":[],"075760":[],"075820":[],"075959":[],"076121":5,"076130":11,"076204":[],"076216":11,"076338":[],"0764924":6,"07656896":[],"076589":[],"076604":11,"076628":[],"07678":[],"076780":11,"076804":11,"076821":5,"076895":11,"076905":11,"076938":11,"076955":[],"077003":[],"077013":11,"077015":11,"077022":[],"077083":11,"077131":5,"077211":11,"077291":5,"077349":11,"07735703":16,"077375":5,"077402":[],"077425":[],"077452":11,"077467":[],"077620":5,"07777777777777778":1,"077793":[],"077948":5,"077978":5,"078040":[],"078042":5,"0782":6,"07820":[],"078253":[],"078254":11,"078269":11,"078299":11,"078314":11,"078436":11,"078548":[],"07864":[],"078667":[],"078697":5,"07871":[],"078725":5,"07878641":16,"078911":[],"078992":[],"07903849":16,"079157":[],"079281":[],"079347":[],"079383":[],"079389":[],"079405":[],"079406":[],"07944154":16,"079483":5,"079558":5,"079609":5,"07968918676726029":[],"0796891867672603":6,"079729":[],"079839":[],"079847":[],"079893":[],"07989327":[],"07999999999998":[],"07e":17,"08":[13,18],"080106":[],"080137":[],"080256":[],"080297":[],"080312":[],"080319":[],"080334":[],"080347":[],"080370":[],"080406":[],"080410":[],"08041015":[],"08043851":5,"080517":[],"080582":11,"080593":11,"080647":11,"080706":11,"080738":11,"080801":[],"080847":[],"08085812":[],"080916":[],"080984":11,"081046":11,"081072":11,"081140":[],"081144":11,"081233":[],"081253":[],"08131003":6,"081388":11,"081431":[],"081483":[],"081533":[],"081540":[],"08156108":6,"081773":[],"082174":[],"082183":[],"082267":5,"082295":11,"0823185":[],"082451":[],"082503":11,"08251519":6,"082536":11,"082874":5,"082896":11,"082900":[],"08299273e":6,"083015":[],"083053":[],"08318298e":1,"083220":[],"083227":[],"083276":11,"08328216846752691":11,"08333333333333333":1,"083361":5,"08336233266":4,"083404":[],"083441":[],"083506":[],"083527":[],"083579":5,"083600":[],"083692":[],"083694":5,"08376632":6,"083766322923899":6,"0837663229239016":[],"0837663229239025":[],"0837663229239043":6,"083799":[],"083829":[],"083977":[],"084000":[],"084101":[],"084184":[],"084224":[],"084226":[],"08426840630693411":[],"08426840630693412":6,"08426840630693413":6,"08428156":16,"084282":[],"084364":[],"084400":[],"084408":[],"084414":[],"084444":[],"084484":11,"084536":[],"084549":[],"08455":[],"084570":[],"084604":[],"084629":[],"08464758160254343":[],"084670":[],"084683":[],"084702":[],"08474":[],"084777":[],"084846":5,"084862":11,"084904":[],"084909":[],"084965":[],"085018":[],"085044":[],"085163":11,"085167":[],"085184":[],"085185":[],"085361":[],"085416":[],"08551306":6,"085764":[],"08576932":6,"085879":11,"08593216":6,"086074":11,"086076":[],"08611111111111111":1,"086112":11,"08612280083325631":5,"086262":5,"086303":[],"08630331":[],"086567":[],"086679":5,"08673755293381497":[],"086807":[],"086872":[],"086890":11,"08690":[],"086956":11,"087501":[],"08758":[],"08759":[],"087834":[],"08816688":[],"088176":[],"0881981":5,"088212":[],"088460":5,"088526":11,"088611":[],"088631":[],"08871404":5,"088809":[],"088816":[],"088825":[],"088853":[],"08888888888888889":1,"088926":[],"08902":[],"089059":[],"08917679":[],"089177":[],"089212":[],"089329":[],"089425":[],"089501":11,"089614":[],"0896981":6,"08996":[],"09":1,"090028":[],"090229":[],"090356":5,"09085624":16,"090929":[],"091051":11,"091060":[],"09117221":[],"091224":[],"091236":[],"091340":[],"091349":[],"091363":[],"091414":[],"091416":[],"091426":[],"09149881":[],"091630":[],"09166666666666666":1,"091696":11,"0917":9,"09170751":[],"09172408":6,"091891":[],"092066":16,"09216046":[],"0923":[],"09251":[],"09297039":[],"093247":[],"0934597075922044":[],"0938":[],"094082198961999e":6,"0940821989624095e":[],"094082198966615e":6,"0940821989673748e":[],"09440475":18,"094404754965417":18,"09444444444444444":1,"094472507965532":11,"094619":5,"095510":[],"095702":[],"095871":[],"09609807":5,"096173":[],"096472":11,"096623":[],"09672929714683368":[],"097360":[],"09744":[],"09744272":6,"09780":[],"09791":[],"09849763":11,"098498":11,"09856879":16,"09861229":16,"098802859381565":16,"099":[],"09903804":8,"0991919894927399":6,"099191989493334":[],"09951287404314545":1,"0n":0,"0s":[3,4],"0x11da42d90":13,"0x11e031e50":13,"0x7fad10f9a280":[],"0x7fad20f69be0":[],"0x7fd098df3280":[],"0x7fd0a9063be0":[],"1":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20],"10":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],"100":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19],"1000":[0,1,2,4,5,8,11,13,14,15,18],"10000":[2,5,6,10,11,18],"100000":8,"10001":10,"1001":18,"1002":18,"1003":18,"10030":[],"10044225464078282":[],"1005":18,"10077114273548984":6,"1009":18,"1011":18,"1013":18,"1013904243":18,"10141413e":6,"1015":18,"102":3,"1022233262115424":[],"10222333":[],"1023":18,"10230":[],"1023111":16,"1024":3,"1026":18,"1027":18,"1028":[],"103":1,"1030":18,"10302062":16,"10340":[],"1037":18,"10378326e":1,"1038":18,"10391807":6,"10398646080125035":[],"10398646080125036":6,"10398646080125037":6,"1040":18,"10405456":11,"10430":[],"104411":[],"10455924":[],"1047":18,"10505137":16,"10520":[],"10555555555555556":1,"1056":[],"10589577":5,"106":[],"106095":11,"10620135":16,"108":6,"109":[],"10913":6,"10931453":6,"10960":[],"1096767776832326":18,"10967678":18,"10th":9,"10x":0,"11":[0,2,3,4,5,6,7,8,9,10,11,12,13,16,18,20],"110":[],"1100":18,"1101":18,"11022302e":5,"11046771":16,"111":[1,7,12],"11100":[],"1122558214":[],"112383":11,"1124":[],"1125":3,"11297834":[],"1136":3,"11362930e":[],"11388888888888889":1,"1139":3,"11390":[],"114":3,"11402309":16,"114437":[],"11462415":5,"11482289e":6,"11499517":[],"11507992e":1,"11547777218875695":6,"11547777218875696":6,"11547777218940905":[],"11547777218940906":[],"115822":6,"11590":[],"11598862":18,"11598862273198":18,"11604844":[],"116048442683864":[],"11660":[],"11666666666666667":1,"11674401539815678":18,"117":8,"11744554e":6,"11780":[],"11790868":[],"117986":[],"118":2,"1182":[],"1183":[],"118318":[],"1184":4,"11840":[],"1185":[],"1186":[],"11890":[],"119":2,"1199":[],"119936":2,"119999999999976":[],"11it":6,"12":[0,1,2,3,4,5,6,8,9,11,12,13,16,18,20],"120":[2,3],"1203":[],"1203284":8,"1206":8,"12069773":16,"121":[2,8,9,10],"12182967":6,"12196674":[],"122":[2,8,9,10],"12222222222222222":1,"122439":[],"1224392":[],"12288563":[],"122886":[],"123":[],"12318726e":6,"12333649":6,"12345260617257443":9,"123459876":[],"123711":6,"12380":[],"124":0,"12400":[],"125":[],"1250":[],"125000":[],"12552073e":6,"126":[],"1261":[],"12618549":5,"1265":[],"127":4,"1270":[],"127043":[],"1271":6,"1277":6,"127773":[],"12777777777777777":1,"12788968":[],"12790":[],"128":[3,4,13],"128664":6,"12898627064868978":[],"12937662":[],"12945452":[],"1297":[],"1298":9,"12adb44b1c20":7,"12m":3,"13":[0,2,4,5,6,9,11,12,13,16,18],"130":[],"13003291":6,"13055555555555556":1,"131":[],"13117061":[],"1314":[],"132":[],"13220608e":6,"13229545716505003":16,"132360":[],"1323603":[],"1326":[],"13280":[],"133":7,"13333333333333333":[],"135":[],"13519106":[],"13535942":6,"136":[],"1360":[],"13609760e":18,"1361":[],"1362":[],"1363":[],"1364":[],"13646574":5,"13661243e":6,"13679863":6,"1371":6,"13740":[],"137400784702911":[],"137652":11,"1378":[],"1382":[3,4],"1383":[3,4],"1384":[3,4],"1385":[3,4],"1386":[3,4],"13865173":5,"13876586436927824":[],"138775":11,"1388888888888889":1,"13890":[],"1392559581788775e":[],"1392559584983597e":[],"1392559585048734e":6,"13925595925919e":6,"14":[0,2,4,5,6,8,9,10,11,12,13,16,18,20],"140":[],"14021063":6,"1404":[],"14042769":[],"140428":[],"141":2,"14100":[],"1416398":6,"14174745":6,"1418":[],"142":2,"14250":[],"142857":[],"143":[2,7],"1435666":[],"14360598":[],"1437":1,"144":2,"14400":[],"1440501043841336":1,"14440":[],"1446729567":4,"14484695":16,"145":2,"146":[],"147":[],"14710":[],"14722222222222223":1,"147400":11,"14741468":[],"147420":11,"14783702":[],"1479":[],"148":[3,4],"14812206":6,"14818":[],"1484256":[],"148564":6,"14859":6,"148768":[],"149":[3,4],"149213":6,"14932651":[],"14988578":[],"149886":[],"14g":6,"14it":6,"15":[0,2,4,6,7,8,9,12,13,16,18],"150":[3,4,8],"15005476":5,"15098090e":6,"151":[3,4],"15130074e":6,"151986":[],"152":[3,4],"15200":[],"15258907":[],"1527777777777778":1,"153036":[],"153106":[],"1533795":[],"153760":[],"15384615384616":[],"154":[],"15454301":[],"154720":[],"15483121":[],"154911":[],"155":[],"155491":[],"155687":[],"155883":[],"156":[],"1562":[],"15629539":[],"15680777":16,"156956":5,"157":[],"15717291":16,"1575":[],"158":[],"1583767":16,"15843769515580663":18,"1586300629904382":[],"1587":[],"15891336":16,"159":[],"1590":[],"15990":[],"15g":6,"15it":[],"16":[1,2,3,4,5,6,8,9,10,13,18],"160":[],"1603":3,"1604":[],"1605":[],"160539":[],"1606":[],"1607":[],"16111111111111112":1,"1612":[],"16211139":5,"16220":[],"162246":5,"16231451":4,"1625":[],"1628":[],"163":[],"1630775253":[],"16342407":5,"16343471":6,"16384":3,"16500":[],"166":[],"16660817":[],"166667":[],"167":[],"16740002":16,"167787":5,"168":[],"16805821e":6,"16807":[],"16827044":[],"16832385":[],"16b8e3cda33a":1,"17":[1,2,4,5,6,8,13,18],"17084902":[],"1709":[],"17174962e":1,"17222222222222222":1,"1726":[],"17300":[],"1731":[],"17339342":[],"17446471":6,"1752":[],"175300":[],"17641709":6,"176880142835407":[],"17777777777777778":1,"17801022":5,"17861098":6,"17917768":5,"17930649":16,"17949575":5,"17953942":11,"1797":[1,3],"18":[2,4,6,7,8,9,10,13,18],"180":[],"18029127":5,"1807":4,"1809":[],"181":[],"1810":4,"1812":[],"18156717":16,"1821":[],"18276924":[],"18327677":[],"18333333333333332":1,"18393678":[],"184":[],"184519":[],"184895":[],"185":[],"1851":[3,4],"1852":[3,4],"18526":[],"185278747229417":[],"1853":[3,4],"1854":[3,4],"1855":[3,4],"186":[],"1860":[],"1861":[],"18611111111111112":1,"18613217e":6,"18660":[],"18673098":11,"18682538":[],"1887":6,"18912963":16,"189496":[],"189622":[],"18it":[],"19":[2,4,6,13,18],"19003":6,"191262820314401":[],"19166666666666668":1,"19207979":5,"19213479":[],"19220":[],"193":[],"19354258":[],"19379506":[],"19394283":[],"194":[],"1940":0,"19404282648955e":6,"194042826653172e":[],"194042826815498e":[],"1940428268204826e":6,"1943":12,"1944":[],"19444444444444445":[],"19466812":[],"1950915150":[],"1954":[],"1956":[],"19569961":6,"1961":[],"1962":[],"1963":[],"1964":[],"1965":[],"1970":16,"1973":9,"197370":11,"19740":[],"1979":6,"19800":[],"19853775e":18,"1989":[],"199":[],"19937":[],"19994371":6,"1_1":12,"1_2":12,"1_3":12,"1cm":[0,8,10,18],"1d":[1,2,3],"1e":[1,2,3,4,14],"1e10":14,"1e4":6,"1f":1,"1k":16,"1n":0,"1s":3,"1x":0,"2":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],"20":[0,1,2,4,6,7,8,13,18],"200":[0,2,3,4,8,9,10],"2000":0,"200000":[],"20015436":6,"2004":13,"2006":20,"2010":1,"2011":1,"2014":4,"2015":1,"2016":0,"20174121":16,"2018":[0,6],"2018906331":[],"2019":[],"2021":[6,14],"2022":17,"2027":[],"20277777777777778":1,"203":6,"20320502":[],"20375361":[],"203753611274545":[],"20500":[],"20509391":[],"206":[],"2060":[],"20661216":[],"2069":[],"207545":11,"20756638":[],"20833333333333334":1,"20867052175006306":6,"20867052175109335":[],"20980":[],"21":[0,1,2,4,5,6,7,9,12,13,16,18],"210340":11,"21058097":5,"21130":[],"2116753732":4,"21169159e":6,"21265216":[],"213":6,"213103":11,"213743":11,"21472683":16,"2147483647":[],"21519063":16,"21596432":6,"216290":11,"216683":11,"21786964":16,"2188":[],"21919813":[],"21944444444444444":[],"2195":3,"21985165":13,"21997099":16,"22":[0,1,2,4,5,6,12,13,16],"22044605e":5,"220506557673408":18,"22094791":[],"221":8,"221180":[],"2216":[],"2218":[],"221805":2,"221921":5,"222400":[],"2225":3,"225":4,"2259440937":[],"226124657522696":[],"22612466":[],"226856":5,"22685646":5,"22690428":5,"2284246870217459":6,"22842468702288576":[],"22842468702288582":[],"22847924":5,"22929905e":18,"2299":3,"22it":6,"23":[1,2,4,6,7,12,13,16],"23002365e":6,"23014274e":18,"231":[],"23103285":[],"2315033":[],"23167717":5,"2321528":[],"232153":[],"232435":[],"23297056":[],"23333333333333334":1,"233528":[],"234":6,"23522201":[],"2357089093":[],"2360682191515046":[],"2361111111111111":[],"2364":[],"237038":[],"23703839":[],"2379":6,"2397":[],"24":[0,1,2,4,6,13,16],"24140":[],"2416":[],"24175744e":6,"2419":[],"24276315":16,"2430":[],"24390":[],"24444444444444444":1,"244858":[],"24485843":[],"24512498":16,"246":2,"2470":[],"24770094":6,"24829908":5,"24906604e":6,"24924624":[],"2495":[],"25":[2,3,4,5,6,7,8,9,11,13],"250":[2,4,7,9],"2500":[],"25000":0,"250000":[],"250154":[],"2517560119":[],"251879":[],"252436":[],"25259666":16,"2526":3,"252866":[],"25286618":[],"253775":[],"255":3,"255001":[],"256":[2,4],"25617654e":6,"25617657e":[],"25617658e":6,"256962":[],"257":[],"2572":[],"2572495066":[],"2572e3a4b38d":1,"2575":[],"25792767":16,"25845e8df859":6,"259153":11,"2597":[],"25976336":[],"26":[2,4,6,13],"26079358":[],"26153846153846":[],"26186844":16,"2619":[],"26290036":[],"26294938":[],"2629493813057833":[],"26301436":5,"26306244":[],"264":4,"26409315307910025":6,"2640931530791003":[],"2640931530791005":[],"26409315307910053":6,"265":[],"2650":[],"265109911":4,"26531223e":18,"2654":[],"266":[],"26610075":[],"26666667":13,"26710969":5,"26780278":5,"268":[],"268227":[],"26822717":[],"269":[],"27":[0,1,2,4,6,13],"270":[],"2703":3,"27092897":6,"2750":[],"275341":[],"27562809e":18,"27621662e":18,"276263":11,"27692307692308":[],"27700":[],"2772":3,"2775623201":[],"27760":[],"278036":[],"27803645":[],"27924636":5,"27n_":18,"28":[1,3,4,6],"28001319":[],"28047021":16,"280573":5,"280647":11,"28067036":16,"28097861":[],"280979":[],"2812":[],"282727":11,"283":[],"2830637392":4,"28336218e":6,"2836":[],"28390":[],"28475098":8,"28590743":[],"2861":18,"28634473":11,"286345":11,"2871":[],"2873":9,"2882":18,"2886":18,"2886847885377843":[],"28868479":[],"28875373":16,"2890":0,"2892":18,"28967287":16,"29":[4,6,7],"29149329":[],"2915":18,"29167186":5,"29229741":13,"2923076923077":[],"29512284":11,"295123":11,"2954":[3,4],"2955":[3,4],"2956":[3,4],"2957":[3,4],"2958":[3,4],"29588901":13,"29592539":[],"296247":[],"297":[],"2971492148":[],"2972":[],"29822833":6,"298273":[],"298375":[],"299267190588216":11,"299748":[],"2_":12,"2_1":12,"2_2":12,"2_3":12,"2_i":12,"2_m":[6,18],"2_t":13,"2_x":18,"2b":18,"2cm":8,"2d":[1,3,11,12,15],"2e":6,"2f":[0,7,9,10,11,12],"2ff97f4bf03b":[],"2g":2,"2g_i":2,"2k":3,"2m":6,"2n":[0,2,3],"2nd":9,"2p":18,"2pt":4,"2s":4,"2x":[0,3,8,13],"2x_ix_jy_iy_j":8,"2x_j":8,"2y_i":10,"2y_j":8,"3":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],"30":[0,1,4,6,7,10,13],"30000":0,"30010":[],"30119421":8,"3017":[],"3018":[],"3019":[],"301927":[],"3020":[],"3021":[],"30258509":16,"302m":4,"303":6,"3037":[],"3038":[],"30384239":16,"3039":[],"303m":4,"3040":[],"3041":[],"30466214e":6,"304m":4,"30535506":[],"30552077":16,"30559547":[],"305m":4,"3063":[],"306m":4,"3072":3,"30761405e":18,"30787294":6,"307m":4,"308m":4,"309":0,"30940":[],"30b53504a633":0,"31":[4,6,12,16,18],"310":0,"311":0,"31120247":5,"311m":4,"312":0,"3120271598582915":18,"3123314713548606":6,"31276579e":6,"312m":4,"313":0,"31318084":5,"314":[],"31457796":5,"315":6,"3155":[0,5,6],"315977":5,"31597731":5,"316":[],"31605061":16,"31614188e":18,"317":[],"31718909":11,"317367":11,"317m":4,"31866499":13,"31896852":8,"319m":4,"32":[3,4,6,12,13,16,18],"3200":1,"32039227e":18,"32047562":[],"3208":2,"320m":4,"32149601703519115":6,"3214960170351912":6,"3215":[],"32179365":[],"32309075":[],"32320052":16,"324":2,"32458459":[],"324m":4,"3250":[1,6],"32512":[],"326238":[],"326m":4,"32721178":11,"327212":11,"32750531e":18,"32816737":[],"32903042":[],"3297":[],"32992274":[],"329923":[],"33":[3,4,12,14,16],"3303":[],"33066907e":5,"3310":[],"33166055e":5,"331939":[],"331m":4,"332331":[],"333":7,"3331":[],"33327369":[],"333274":[],"33333333":13,"3337":[],"33611111111111114":[],"33711888":[],"3384":[],"33900713":[],"33m":4,"34":[4,7,16],"3403":[],"34040204e":18,"340782":11,"34114547":5,"341m":4,"342680":[],"34305928":[],"3436":0,"3437":0,"3456":[],"34568872":16,"34569596":5,"3457":[],"3458":[],"34585355":16,"3459":[],"3460":[],"346810":[],"3469819128513336":[],"34740615":[],"3498":[],"34it":6,"35":[0,2,4,6,7],"3514":[],"35140":[],"35147135":16,"351636":11,"35182854":5,"35203688":16,"3522":[],"3525":[],"3528556":[],"352856":[],"3529":[],"3530606977":[],"3538":[],"35396404e":18,"35401056e":18,"3543":[],"3544313922":[],"3546":[],"35470445e":5,"3548":[],"355":[],"3551":[],"35533773":6,"35533774":[],"3556":[],"35562617e":18,"3558":[],"3560":[],"356399":[],"3567":[],"3572":[],"35724288e":18,"3575":[],"357508":[],"3576":[],"3577":[],"35771842":6,"3581341341":4,"3585":[],"3587":[],"35892474":16,"359":5,"3593":[],"3594821":13,"3595":[],"3598":[],"359999999999985":[],"36":[0,2,4,5,6,7,18],"360":1,"3604":[],"3605":[],"3606":[],"360688":[],"3609":[],"36102113":[],"36117602":[],"3613":[],"3615":[],"361556":[],"3617":[],"3621311":5,"3624":[],"3627":[],"3628":[],"363295916323784e":6,"363295916414895e":[],"3632959170548605e":[],"363295924430451e":6,"363834":11,"36383443":11,"363936":5,"36393643":5,"3643":[],"364418e97433":1,"3645":[],"3646":[],"3647":[],"3655":[],"3655222":5,"3659":[],"3668":[],"36689784":[],"366898":[],"3669":[],"367":2,"3672":[],"3673":[],"3674":[],"3679":[],"3684":[],"3687":[],"3688":[],"368m":4,"369139":11,"36it":[],"37":[2,4,6,7],"3704":[],"370782966":4,"3711":[],"3713":[],"3718":[],"3721":[],"3722":[],"3725":[],"3729":[],"37307168":16,"3739":[],"37396662":6,"37415316":16,"374291":[],"37429133":[],"3748":[],"3749":[],"3753":[],"3759":[],"3760":[],"3765":[],"376559":[],"37655936":[],"37692363":[],"37703055":[],"3772":[],"3773":[],"37732":[],"3776":[],"3777801602":[],"3779":[],"37835429e":[],"3784":[],"378664":5,"37866422":5,"37900111":6,"3791":[],"3794":[],"379647":11,"37964744":11,"37992857":[],"38":[2,4,7,18],"380":[],"3802":[],"3803":[],"3804":[],"3805":[],"380739":[],"38073947":[],"3811":[],"38135733e":6,"3815":4,"381627865854956":[],"38162787":[],"3817475779":[],"3818":[],"3819":[],"3820":[],"38246359":[],"3827":[],"382951":11,"38295101":11,"3830":4,"3833":[],"38336316":16,"3834":4,"3837":4,"3838":4,"3839":4,"3842":[],"3850":[],"3851":4,"38533184":6,"3854":[],"3858":4,"386":[],"3861":4,"3862":4,"38629436":16,"3864":4,"3867":[],"3869":4,"387":[],"3871":4,"3872":4,"387482":[],"38748219":[],"3876":[],"388":[],"3881":4,"3882":[],"3885":[],"38868469":16,"3888":4,"3889":4,"389":[],"38901478":[],"3891":4,"38916861e":6,"38962192e":6,"3898":[],"39":[0,2,4,13,19],"390":[],"3906":4,"39095416":[],"3914":4,"3915":4,"3916":4,"391602":[],"3917":4,"3922":4,"3925515884752442":[],"3928":4,"3931":[],"39311435":16,"3943":4,"3944":4,"39456996":16,"3950":4,"3955":4,"39560937":16,"39579407":5,"3958":[],"3960":4,"3962":4,"3970":4,"39706038":5,"39724390e":18,"3975":4,"397700":11,"39789527":16,"3979":4,"39794864e":18,"3980313467":[],"3983":4,"3994":4,"3996":4,"399836":[],"3d":[2,3,4,6,13],"3f":[1,3,9],"3n":16,"3x":[2,8],"3x_i":2,"3y":8,"4":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],"40":[1,4,6,19],"400":4,"4000":20,"4005":4,"4011":4,"40116777":[],"401168":[],"4012":4,"4017":4,"401842":11,"40214433":16,"4022":[],"40236901e":18,"4027":4,"4030":4,"40340043":[],"4034668048":[],"4038":4,"4039":4,"404":[],"4045":4,"4048":4,"4055":4,"405890":11,"4059":4,"40599799":[],"4068":4,"4069":4,"4075":4,"4077":[],"408":2,"4082":[4,6],"4084":4,"4087":[],"4087793":5,"4088":4,"4089":4,"409":2,"40927184e":6,"40a38ad763f1":6,"41":[2,4,16],"410":2,"4100":4,"4107":[],"410815":5,"41081513":5,"411":2,"4115":4,"4117":4,"412":2,"4128":4,"4131":4,"41357064":[],"4143":4,"41433969":5,"4144":4,"4146":4,"41511965e":1,"4155":2,"4162706317":[],"4167":4,"4176":4,"4177":4,"418506":11,"4186":4,"41876267":[],"418763":[],"41882036e":6,"41882037e":6,"4192423635":[],"41958102e":18,"4198":4,"41990268":[],"41it":6,"42":[0,1,2,4,8,9,10,16],"420":[],"42037468e":18,"42078103":[],"421":2,"4212":4,"422":2,"4224":4,"423":2,"42340403e":18,"42394972":16,"424":2,"42441033":5,"42449643":[],"42450":[],"425":2,"4255":[],"4258989918":[],"426":[6,7],"42615374e":18,"42631342":[],"427017":11,"4275":4,"43":[0,1,2,4,7,16],"43054282":5,"43135183":16,"43294696e":18,"43330971e":6,"434932":11,"43493232":11,"435163":[],"43552433":16,"43579948e":6,"436462435":4,"43761347":[],"43766686":11,"4379":4,"438060758":[],"438136":[],"43876695":5,"438767":5,"439230":6,"44":[0,1,2,4,16],"44089210e":5,"4410":[],"4411":[],"442600":11,"443217":[],"444":[],"44688507e":18,"44970586e":1,"45":[2,4,19],"450":[],"450257":11,"4504":[],"45290829":16,"45393214e":18,"4543859":[],"4557763":11,"455947":[],"456":[],"456418966187335":[],"457":[2,4],"457770268480242":[],"458027":[],"458078":11,"45960079":5,"45985488":5,"459855":5,"46":[2,4,19],"4601":[],"461":[],"461175":16,"462":7,"46383925e":6,"464424":[],"4644244":[],"46508305":16,"46567887":16,"466":[],"46602982":[],"46696223":[],"469":[],"46932688":[],"4694":[],"46984697e":6,"469868":[],"46986815":[],"47":[4,19],"4703":4,"47042744":5,"470714":[],"47075725":6,"47116868e":6,"47125748":5,"47132891":5,"47245463":5,"472455":5,"47387858":[],"47400238":[],"47432993":[],"4744":[],"47478057":[],"47485224":[],"475311":[],"47531107":[],"47610036":6,"47815203":11,"47920156":[],"47942814":[],"479465113":4,"48":4,"48089797":[],"48133064":[],"481979":6,"48212873":16,"48257387":19,"48316523e":18,"483257001":[],"4837":[],"48420165":[],"48476997":11,"48574149":16,"486873":[],"48687342":[],"489":[],"48994188":5,"49":[4,5,6,11,13],"490":[],"491":[],"49152":3,"492":[],"493":[],"49385454e":18,"4940954":0,"4959161509356135e":6,"495916150936645e":6,"495916150936654e":[],"495916150938325e":[],"49614357":18,"49636583":[],"497":[3,4],"498":[3,4],"499":[3,4],"4990":18,"4992":18,"4997":18,"49992743e":18,"4c4c7f":[9,10],"4d":3,"4f":6,"4y":8,"4y_i":10,"5":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],"50":[1,2,3,4,6,7,8,10,13],"500":[1,3,4,6,9,10,13],"500000":[],"50000455":5,"50000553":5,"50000718":5,"50000855":5,"50000969":5,"50001063":5,"50001142":5,"50001207":5,"50001261":5,"50001306":5,"50001343":5,"50001374":5,"500014":5,"50001414":5,"50001422":5,"50001439":5,"50001454":5,"50001466":5,"50001476":5,"50001485":5,"50001492":5,"50001498":5,"50001502":5,"50001506":5,"5000151":5,"50001512":5,"50001515":5,"50001517":5,"50001518":5,"50001519":5,"50001521":5,"50001522":5,"50001523":5,"50001524":5,"50001525":5,"501":[3,4],"50105159":[],"5018":18,"50227564e":6,"5031474174499113":18,"50314742":18,"50321091":5,"504167":[],"50416731":[],"506":0,"50680321e":18,"50727059":16,"50769230769231":[],"507d50":[9,10],"50846111e":6,"50846112e":6,"50it":6,"50j":13,"50x10":1,"51":[4,10],"510":1,"51004249":16,"51126895e":18,"511888":5,"512132":[],"51214899":6,"51265232":16,"51289697":11,"512897":11,"5138":[],"51389553":16,"514219":[],"51561271":16,"517350858882083":[],"5177783846":4,"518030":11,"51803019":11,"519842":[],"52":[3,4,13],"5222222222222223":1,"522758":[],"52307692307693":[],"5260627":[],"526744":11,"52723079":[],"52773051":[],"52799362":11,"528115":11,"52811546":11,"52874252":5,"529":[],"52911941":[],"52945798e":[],"53":[3,4,9],"5303329":11,"5305555555555556":1,"5312":[],"531280":[],"53189647":[],"53312754":16,"53423784":16,"53603432":[],"53611562":[],"53697476":[],"53703498":6,"5378811":11,"53794784":11,"537948":11,"53846153846155":[],"539261":11,"54":[3,4,6,18],"540":[],"54016188":11,"540162":11,"54039921":5,"54041041e":5,"541605":[],"54163136":13,"544439":[],"546166676":[],"54780216":[],"54it":[],"55":[1,3,4],"5501":[3,4,14],"550321":[],"5539":[],"55505907":16,"5555555555555556":1,"55578041":[],"5566":[],"557795":11,"55854694":11,"5594":6,"56":[1,3,4],"56033697":5,"561":[],"5611":[],"5615":[],"56198284":5,"5625":[],"56302854":16,"5639":[],"564":[],"564374":11,"565":[],"56536":0,"566":[],"56636616e":6,"567":[],"568":[],"569":1,"56912044e":6,"56939714":5,"56992937":[],"57":[0,4,8,19],"570":[],"5700":[],"571":5,"571105947979336e":6,"571105947979394e":6,"571105947979395e":[],"571105947979439e":[],"57154252":[],"57174058":[],"57201944e":6,"57266138":[],"57361898":[],"574465":11,"57673618":16,"57842073e":18,"57it":[],"58":[4,10,19],"583595":[],"58395707":[],"58428804":[],"584804":[],"5888888888888889":1,"589":[],"58986647":[],"59":[2,4],"590":[],"591":[],"591317992":4,"591594":[],"59159438":[],"592":[],"593":[],"593040":5,"59304008":5,"5944444444444444":1,"59591979":[],"595920":[],"59592669":[],"59766":[],"597660":[],"59833875":13,"598392":[],"59839245":[],"59955801":13,"5cm":18,"5dd54edf2138":6,"5f":8,"5x":8,"5y":8,"6":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,17,18],"60":[1,2,3,4,6],"60000":4,"6019067271":4,"60236938":16,"60293962":5,"603494":5,"60349429":5,"60420593":5,"60538875":16,"60619654":6,"6063219":[],"606439":[],"60673226":11,"606760":5,"60685864":6,"60791699":[],"6079169911277265":[],"60943791":16,"61":[2,4,7],"61033524":[],"6111111111111112":1,"612939":[],"613579":[],"61399851":11,"613999":11,"61463451":16,"614808":11,"6149274949460215":5,"61576236e":18,"618":[],"61808351":[],"618982":[],"6199381169260247":[],"62":[2,3,4],"62168613":[],"62364974":[],"62373464":11,"625":7,"626635268":[],"62767384":[],"62894215":5,"629961":[],"63":[0,1,2,3,4,6,7],"6300745149331701":[],"630224":[],"63025821e":6,"63207808":18,"63249532e":6,"63270833":[],"63395187":[],"63498144":5,"63675140":[],"6371293350711955":[],"63860687":16,"63901111":[],"63it":[],"64":[1,3,4,7,13,16],"64012627":5,"64113381e":18,"64141716e":18,"64293754":[],"64425009":[],"645":[],"64615384615385":[],"646283":11,"647":6,"64742912e":6,"647473":11,"649339":[],"64933923":[],"649382":11,"64x50":1,"65":[1,2,3,4,7,8,9],"65136857":[],"6530742540053943":[],"6562":[],"65626043":[],"65628853":16,"65885453":5,"659306":[],"66":[2,3,4],"66054752":[],"66087937":[],"66204648":6,"66226149":6,"66247212":[],"662854":5,"66285434":5,"6628996975186953":[],"66292841":[],"66310422":[],"6638":[],"66410989":[],"66560":[],"66619972":11,"666200":11,"667":[],"668172":[],"668186":[],"66818635":[],"66934291":5,"66it":6,"67":[2,4],"67047975e":6,"671089":[],"672721":[],"67314874e":5,"67588315":[],"67591616":[],"67697934":11,"67838309":[],"67882608":[],"68":[2,4],"6808538439837775":5,"68176047e":18,"68192193":5,"68246089":16,"68279358":16,"6834195":[],"68534263e":6,"68542204":5,"68545647e":[],"6869":[],"6887363571":4,"68929213e":6,"68944595":[],"689519":11,"69":[2,4,7,18],"690":[],"690569639355314":[],"69061276":11,"690617":[],"69069n_":18,"692":1,"69295955":[],"69484813e":5,"69493539":16,"69504801":6,"69634577e":6,"69695259":5,"69985355":[],"6999536":11,"69it":[],"6e75736fdab1":6,"6f7a6bd7d79f":6,"6m":[3,4],"6n_":18,"7":[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18,20],"70":[1,2,4,6,7],"70127680":6,"701370":5,"70179437":[],"70205195":16,"70354373":[],"703716d317a7":8,"70434005":[],"7050":[],"70598996":[],"70653767":4,"70710678":5,"70769586":[],"70831425":[],"70832814":5,"70980493":16,"71":[1,2,4],"71131626":16,"7119":[],"712018":11,"7134":[],"713487":5,"71348713":5,"71350226":[],"7151":[],"71721168":[],"718165":5,"718697":[],"71869727":[],"72":[2,4],"72174172":11,"722047011333792":[],"72271878e":6,"72347283":[],"7236674":5,"72373129":[],"724":3,"72522848":[],"72859758":5,"7293182":[],"72981762":8,"73":[4,6],"731000":[],"73174557":[],"73287103e":18,"733096":[],"73406033e":18,"73484667":[],"735738558766299":[],"73573856":[],"73752910":[],"73it":6,"74":[4,6,13],"740":[],"74081822":8,"74368436":16,"743u":[],"7448615806559786":[],"7469898175164704":[],"74840212":5,"749765":[],"75":[4,5,6,8,11],"7501749450963715":[],"750445":[],"750u":[],"75106135":16,"75118364":[],"751699":11,"75170092":5,"753846153846155":[],"75517445":[],"756352":[],"75703965":5,"757040":5,"75838233":[],"75it":[],"76":[2,4,19],"76060096":[],"76066069":16,"763u":[],"7643536":13,"765":7,"76529528":[],"76674796":16,"76731400e":18,"76802186":[],"76923076923077":[],"76936315":5,"7694444444444445":1,"77":[2,4,13,19],"77034458":[],"770345":[],"77152076":5,"7718":9,"773329728649545":[],"77332973":[],"77333117e":18,"774300":[],"775":[],"77627886":13,"77632220e":18,"77636e":13,"77662945":[],"7767978193240488":11,"77714169":8,"77754132e":18,"7782028952":4,"77865169":[],"78":[2,4],"78011544":[],"78156479e":5,"78184120e":6,"7846153846154":[],"78941903":5,"78988962e":18,"79":[2,4],"79009329":16,"79093776":[],"79111643":5,"791123":[],"79145214e":18,"793167":[],"79394867":[],"7939646":[],"794282":11,"79449156":[],"79602861":[],"79754246":[],"797e":6,"79856831e":18,"7c394b1e8b71":9,"7d7d58":[9,10],"7f2b3a6174c2":13,"7m":4,"8":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18],"80":[0,1,2,4,5,6,8],"800":[4,7],"80315282":[],"803153":[],"80354994":6,"80469739":5,"8055555555555556":1,"80561191":[],"80609615e":6,"80609616e":6,"8064":[],"80734875":[],"807349":[],"80738685":16,"80747253":16,"80842254":11,"808423":11,"80847477e":6,"81":[1,2,4],"81048318e":6,"8108619":[],"81160425":5,"81187794":16,"81333804":6,"81333805":[],"81388724e":18,"814":[7,11],"815563":[],"81633628":11,"816454":[],"81671821":[],"816847":[],"8175":[],"82":[2,4],"8219235992494145":[],"8219236":[],"82198978":5,"82650876":[],"826509":[],"8265786":5,"82747653":[],"827477":[],"82773778":[],"829648415811072":18,"82964842":18,"83":4,"8305555555555556":1,"83512277":5,"836874":[],"83687444":[],"83698677":16,"83999999999999":[],"84":4,"84062065":[],"84228957e":[],"84232163":16,"842436":[],"84292394":[],"842u":[],"84355903e":1,"84443254e":1,"84569271":13,"84780262":6,"84854738":[],"84923989e":6,"84924834":11,"84994524":5,"85":[1,4],"850164":5,"8503720991789538":[],"85091337":[],"85263220":6,"8527777777777777":[],"85278920e":5,"853241":[],"85324115":[],"853u":[],"85601992":5,"85758696":16,"858":[],"8583333333333333":1,"85953586":6,"85959007":[],"86":2,"8608479":[],"860848":[],"861":[],"86117291":5,"86134827":5,"86145244":11,"8638888888888889":1,"86478158":[],"86546962":[],"86623151":13,"86630":[],"8666666666666667":1,"86810":[],"869":0,"86905621":[],"86925797":[],"869258":[],"87":2,"870":0,"8702784034":4,"871":0,"872":0,"8722222222222222":1,"873":0,"87327414":[],"87381451":5,"875":1,"8759":13,"876":6,"87625493":[],"87647541":[],"8768":[],"878297":[],"87836018":[],"87940752":16,"87it":6,"88":[0,2,13],"88017651":11,"880177":11,"88031314":[],"88046261":5,"8805555555555555":1,"88118231":[],"88168312e":6,"881788":[],"883":[],"88336879":5,"884":[],"88477619":[],"885":[],"88512489":[],"88529063e":6,"8855417382991412":[],"88554174":[],"886":[],"88679947":[],"887":[],"887366":5,"88736621":5,"8879":6,"88871662":16,"8888888888888888":1,"8894":6,"89":2,"8916666666666667":[],"89274639":16,"89288636":11,"893489":[],"89348922":[],"89410423":5,"8944444444444445":1,"89550839":16,"89565264":[],"8962476":[],"896248":[],"89873772":16,"89876748":[],"8991514":16,"89944994":[],"899450":[],"8f":6,"8g":6,"8n":16,"8x8":1,"9":[0,1,2,3,4,5,6,7,8,9,11,12,13,14,16,18],"90":[1,2,6],"900449":[],"90054363":[],"90075537":5,"9011":6,"90220243":5,"90266948":5,"90268858":[],"9027777777777778":1,"903824":[],"90382431":[],"9040":9,"90475506e":6,"90540529":11,"9055555555555556":1,"90559087":5,"905591":5,"906747":5,"9083333333333333":[],"90884627":16,"90895045":16,"90940378":16,"90999452e":18,"91":19,"910":[],"9111111111111111":1,"91128596":5,"912u":[],"913":[3,4],"91379157":[],"913791573406831":[],"91383439":16,"91396388":[],"914":[3,4],"91416375":[],"91479093":[],"91492986e":6,"915":[3,4],"91549644":[],"916":[3,4],"9166666666666666":[],"917":[3,4],"91760278":5,"918":[],"91812702":5,"918992":[],"919":[],"92":[6,19],"92272314":[],"922u":[],"92343595":[],"924018":[],"92477093":[],"924e":6,"925":1,"92507116e":1,"9252772":11,"92578916":5,"92603747":16,"92626212":16,"926583":5,"92658312":5,"92754397":[],"927544":[],"9277777777777778":1,"92819235":[],"92857143":7,"93":[],"9305555555555556":1,"930583":11,"931":0,"93155188":5,"93158979":5,"93248252":[],"932483":[],"932u":[],"933":5,"93414191":[],"93492130e":6,"93579127":16,"935u":[],"9361111111111111":[],"937":18,"937082":[],"93799826":5,"938":18,"9387":[],"939":[0,18],"94":[7,18],"9400":[],"941866404575299":[],"94226022e":6,"94284104":5,"94320205":5,"9444444444444444":1,"945":[3,4],"94548496":[],"94591015":16,"946":[3,4],"94639099":11,"94659383":[],"946957":5,"947":[3,4],"9472222222222222":1,"94735055":[],"947903":[],"94790323":[],"948":[3,4],"9482527":5,"948641":5,"949":[3,4],"95":[1,7,11],"95008046":6,"95079764":6,"95231424":5,"9527777777777777":1,"95284275":5,"953065564":[],"95351665":5,"954":18,"9549351910143222":[],"954u":[],"9555555555555556":1,"95569422":[],"955820c21e8b":4,"956563":11,"95684892":5,"95703":13,"95714723":[],"957147232685324":[],"958228616652075":5,"95it":[],"96":[6,7,11],"960":18,"9601304850018328e":6,"960130485007504e":6,"960130485007934e":[],"9601304850213484e":[],"96024953":5,"96032148":16,"96084663":5,"961":18,"962":18,"9637117593816477":6,"96390357":5,"9640435":5,"964268":5,"96426825":5,"96489434":[],"9649652536":4,"96527903":16,"96551427e":18,"965548":[],"96606158":16,"96653373":[],"96686324e":18,"96688672":5,"9674916":5,"967809":11,"96863851":[],"96987657":[],"96992454":[],"97":7,"97005689":5,"97065296":[],"97108e":13,"9722222222222222":1,"97230501":[],"97243128":5,"97300836":5,"97497404e":6,"975":1,"97507735":5,"97547354":18,"97547354476579":18,"975510299261579":9,"9760832":[],"97705827":5,"977418":[],"97758848":5,"9777777777777777":1,"977880":[],"97788031":[],"9780387310732":20,"9780387848570":20,"9781492032632":20,"978553":5,"97898392":6,"97926491":5,"98":[0,1,7],"980":[],"98017611":13,"98036405":[],"9805555555555555":1,"98091621":5,"981321":[],"98139097":5,"98249059":5,"982491":5,"98266587":16,"98275501":5,"983310":[],"98346748":[],"98399675":[],"98413059":5,"98454786":5,"985":18,"98566191":5,"986":18,"9861111111111112":1,"986699":5,"98680716":5,"98716878":5,"98756882":13,"98794823":16,"9879924":[],"98808176":5,"98822371":6,"9888888888888889":1,"989":18,"9890348":5,"9893149172528393":[],"9893447":5,"9898254753574576":[],"98982548":[],"9898ff":[9,10],"99":[6,7,11,13],"990":[],"99009525":5,"9902552771282336":[],"99049330":6,"99088801":5,"991":18,"99115119":5,"99157584":5,"99176998":5,"992":18,"99242921":5,"99265097":5,"99274513":0,"993":18,"99316252":5,"99353454":[],"993535":[],"99371056":5,"99389612":5,"993972":[],"99397245":[],"9943201":5,"99435648":[],"9947756":5,"99492986":5,"99519225":13,"99528218":5,"99539415":5,"9955282554647219":[],"99566069":5,"99578809":5,"996":5,"99608161":5,"9963961":5,"99650061":5,"9967458":5,"99700706":5,"99709215":5,"99724883":[],"99729756":5,"99751458":5,"99758326":5,"99775587":5,"99775949":[],"99793613":5,"99799099":5,"99813653":5,"99828624":5,"99829953":[],"9983295":5,"99845267":5,"998577":5,"99861053":5,"99871521":5,"99881845":5,"99884384":5,"99893323":5,"999":[9,18],"99901896":5,"99903755":5,"99911427":5,"99918546":5,"99919837":5,"99926459":5,"9993237":5,"99933188":5,"99938942":5,"9994385":5,"99944272":5,"99949306":5,"99953381":5,"99953475":5,"99957911":5,"99961294":5,"99965056":5,"99967865":5,"99970988":5,"9997332":5,"99975913":5,"99977416":[],"99977849":5,"99980002":5,"9998161":5,"99984732":5,"99987324":5,"99989476":5,"99991263":5,"99992746":5,"99993978":5,"99995":5,"9999555851685968":6,"999955585168597":6,"9999840939906267":[],"9999858320366368":[],"9x":6,"9y":6,"\u00f8yvind":[6,19],"abstract":1,"boolean":4,"break":[0,4,6,11,14],"byte":16,"case":[0,1,2,3,4,5,6,7,11,12,13,14,15,16,17],"catch":0,"char":[],"class":[0,1,3,4,6,7,8,9,11,12,13,18],"const":[],"default":[0,1,2,4,6,7,13,16],"do":[0,2,3,4,5,6,8,9,10,11,12,13,14,16],"ekstr\u00f8m":4,"eng\u00f8i":19,"export":9,"f\u00f8470":19,"final":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,17,18,19],"float":[0,3,4,5,9,11,13,14,16],"function":[2,3,4,5,9,14,15,16],"import":[0,1,2,3,4,6,7,8,9,10,11,12,13,14,18],"int":[0,1,2,3,4,5,6,11,13,14,16,18],"long":[0,1,3,4,12,13],"m\u00f8svatn":6,"new":[0,1,2,3,5,6,7,8,9,10,11,13,14,16],"null":[],"public":[0,15],"return":[0,1,2,3,4,5,6,7,8,9,11,13,14,16,18],"s\u00f8rli":[],"s\u00f8rlie":19,"sch\u00f8yen":[6,19],"short":[4,5],"steinsv\u00e5g":[],"super":[3,5],"switch":0,"throw":[3,6,18],"true":[0,1,2,3,4,5,6,7,8,9,10,12,13,14,16,18],"try":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,18],"var":[5,6,10,11,18],"while":[0,1,3,4,5,6,7,8,9,11,12,13,18],A:[2,3,5,6,7,10,11,12,13,15,16,17,18,19,20],AND:2,And:[0,3,4,5,6,9,15,18],As:[0,1,2,3,4,5,6,8,10,12,13,16,18],At:[0,4,6,13],BE:0,Be:[2,15],Being:13,But:[0,1,2,3,5,6,9,10,18],By:[0,3,5,6,12,13,16],For:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],IF:6,IN:20,If:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18],In:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],Is:11,Ising:[5,12],It:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],Its:[1,2,4,11],NO:[7,11],No:[3,4,6,7,8,9],Not:[0,1,5,6,17],OR:18,Of:18,On:[0,3,17,18,20],One:[0,1,3,4,5,6,7,8,11,12,13,18],Or:[0,1,6],Such:[0,6,12,18],That:[0,5,7,10,11,12,14,18],The:[4,10,13,14,16,17,18,19,20],Then:[0,1,6,8,9,10,11,12,13,14,16],There:[0,3,4,5,6,8,9,11,12,14,16,17,18,19],These:[0,3,4,5,8,9,10,11,12,13,14,16,18],To:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],With:[0,5,6,8,9,10,11,12,14,16,18],_0:[5,8,10,11,13],_1:[2,5,6,8,10,11,12,13,14,16],_2:[2,5,8,11,12,13,16],_3:16,_4:16,_9:13,_:[0,1,2,4,5,6,7,8,9,10,11,12,13,16],_________________________________________________________________:4,__call__:[3,4],__class__:10,__doc__:6,__future__:[8,9],__getitem__:[],__init__:[1,3,4,14],__main__:2,__mosek:[],__name__:[2,10],__traceback__:[3,4],_asarrai:[],_auto10:[6,12],_auto12:6,_auto1:[2,3,4,5,6,7,12,13,16,18],_auto2:[2,3,4,5,6,12,13,16,18],_auto3:[3,4,5,6,12,13,16],_auto4:[4,6,12,13,16],_auto5:[4,6,12,13,16],_auto6:[4,6,12,16],_auto7:[4,6,12,16],_auto8:[6,12],_auto9:[6,12],_ax:[],_base:8,_build:[0,15,17,20],_build_call_output:[3,4],_c:1,_call:[3,4],_call_flat:[3,4],_check_1d:[],_check_optimize_result:[7,11],_compon:11,_coordinate_desc:6,_copy_docstring_and_deprec:[],_decor:0,_depth:9,_fraction:9,_get_lin:[],_getitem_multilevel:[],_handl:[3,4],_i:[0,1,2,5,6,8,11,12,13],_inference_funct:[3,4],_interpolatefunctionerror:[3,4],_is_primit:[],_j:[0,1,2,3,5,6,8,13],_jit_compil:[3,4],_k:13,_l:12,_lambda:6,_leaf:9,_logist:[7,11],_m:10,_make_vjp:[2,13],_maybe_define_funct:[3,4],_multilayer_perceptron:1,_n:[2,5,8,11,13],_node:[2,9,13],_notokstatusexcept:[3,4],_np:[],_num_output:[3,4],_p:[5,8],_plot_arg:[],_process_traceback_fram:[3,4],_r:[3,4],_ratio:11,_sampl:9,_select_forward_and_backward_funct:[3,4],_split:[6,9],_src:[3,4,14],_stateful_fn:[3,4],_stateless_fn:[3,4],_t:13,_test:6,_trace:[2,13],_valu:[2,13],_varianc:11,_weight:9,a0:3,a0faa0:[9,10],a1:0,a2:0,a3:0,a4:0,a_0:0,a_1a:0,a_2a:0,a_3:0,a_3a:0,a_4:0,a_4a:0,a_:[0,1,16],a_h:1,a_i:[0,1,2,12],a_j:[1,12],a_k:[0,1,12],a_ndim:2,aaron:20,ab:[0,2,5,13,14],ab_channel:15,abandon:1,abbrevi:17,abid:18,abil:[0,10],abl:[0,1,4,5,6,7,10,12,13],abort:[],about:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,20],abov:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,18],abovement:6,abscissa:13,absolut:[0,2,5,6,13],acceler:13,accept:[0,3,6,9],access:[0,3,4,11,18],accid:[4,6],accmod:[],accompani:0,accomplish:[8,9,13],accord:[0,1,2,5,6,9,12,13,14,18],accordingli:11,account:[0,3,5,13,18],accumul:[12,18],accur:[0,3,4,6,10,13],accuraci:[0,1,3,4,5,6,7,9,10,11,12],accuracy_scor:[0,1,10],accuracy_score_numpi:1,achiev:[0,1,5,6,8,12,16],aco:18,acquaint:15,acquir:[1,15],acr:0,across:[1,3,6,9,15],act:[1,3,16],action:18,activ:[0,2,3,4,9,17],actual:[0,1,4,5,6,8,11,16,18],ad:[1,3,4,5,8,13,16],ada_clf:10,adaboostclassifi:10,adadelta:13,adagrad:13,adam:[1,3,4],adapt:[4,6,13,20],add:[0,1,2,3,4,5,6,8,10,11,12,18],add_lin:[],add_outgrad:2,add_subplot:[1,7,12,14],addendum:5,addit:[0,2,3,5,6,7,8,9,10,12,13,15,16,18,19,20],addition:[12,13],address:[1,9,11,13,20],adjac:[3,12],adjoint:5,adjust:[0,5,12,13],admir:0,advanc:[4,6,12,20],advantag:[1,3,5,6,10,13,16],affect:3,affin:[0,3,8,11],afford:3,aforement:14,african:0,after:[0,1,2,4,5,6,9,11,12,13,15,16,18],afterward:0,ag:[0,7,17],ag_0:2,again:[0,1,4,5,6,7,8,10,11,12,13,18],against:[1,4,7,10],agegroup:7,agegroupmean:7,aggreg:[9,10],agorithm:10,agre:[5,6,18],ahead:9,ai:[0,20],aid:11,aim:[0,1,4,6,7,11,14,15,16],ainv:5,airplan:3,aka:5,al:[0,2,4,17,20],alarm:5,algebra:[0,3,5,13,15,17],algo:[],algorithm:[0,1,2,4,5,6,7,8,13,14,15,16,17,18,20],align:[0,2,5,6,7,8,13,18],all:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20],allevi:[1,13],alloc:[3,16],allow:[0,1,2,3,5,6,8,10,13,15,16],almost:[0,1,6,8,11,13,18],alon:[2,9],along:[2,3,4,5,6,9,10,11,15,16],alpha:[0,1,2,3,4,6,7,8,9,10,13,14,18],alpha_0:3,alpha_1:3,alpha_2:3,alpha_:10,alpha_i:[3,13],alpha_k:13,alpha_m:10,alpha_n:3,alpha_opt:13,alreadi:[2,3,4,5,6,10,12,15,16,18],also:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],alter:1,altern:[0,1,4,5,6,7,8,9,11,13,16],although:[0,1,5,6,8,10,13],alwai:[0,3,5,6,12,13,18],am:4,ame2016:0,american:0,among:[0,3,5,9,10,12,16],amongst:5,amount:[0,1,3,4,6,8,10,14,15],an:[1,2,3,5,6,7,8,9,11,12,13,14,15,16,18,19,20],an_:18,anaconda3:[],anaconda:[0,1,15],analog:13,analys:6,analysi:[1,3,4,7,14,16,17,20],analyt:[2,3,5,6,7,12,13,15],analyz:[0,1,3,4,5,6,18],andrew:1,angl:[0,3,9],anharmon:3,ani:[0,1,2,3,4,5,6,7,8,9,10,12,14,18],anim:[4,12],ann:12,annot:[0,1,3,7,8],anoth:[0,1,3,4,5,6,7,8,10,11,12,13,16,18],anp:2,ans_vspac:2,ansatz:0,answer:[0,1,3,5,6,16],antialias:[2,6],anticip:4,anymor:[1,8],anyon:[4,8],anyth:[1,18],anytim:19,apach:1,apart:[11,13],api:[1,15],appar:2,appear:[0,1,3,13,16,18],append:[1,3,4,8,9,13],appendcon:[],appendvar:[],appli:[0,1,2,3,4,6,7,8,9,10,11,12,13,18,20],applic:[0,1,3,4,5,6,7,9,12,13,16,17,18,20],apply_gradi:4,approach:[1,2,4,5,6,9,10,11,12,13,15,18,20],appropri:[2,6,9,12,13,15,18],approx:[0,2,3,6,10,11,13,18],approxim:[0,1,2,3,4,5,6,7,10,11,13,18],apt:[0,15],aq:18,ar:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],arang:[1,3,4,6,7,9,10,12],arbitrari:[1,4,6,8,12,13,18],arbitrarili:[0,1,11],arc:6,architectur:[3,4,12,20],area:[0,3,6,20],arg:[0,2,3,4,13],argc:[],argmax:[1,11],argmin:[4,10,14],argnum:[2,13],argnum_0:2,argnum_1:2,argsort:11,argu:[1,13],argument:[0,2,3,5,6,11,12,13],argv:[],argval:2,aris:[0,6,12,13,18],arithmet:[0,13,16],arm:[3,4,6,14],arma:[],armadillo:16,around:[0,1,4,5,6,11,18],arr:2,arrai:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,15,18],arrang:3,arraybox:13,arriv:[0,6,9,11,16,18],arrow:12,arrowprop:8,art3d:13,art:[0,1,15],articl:[0,3,4,6,10],artifici:[0,2,7,12,20],artificialneuron:12,arug:13,arxiv:[3,4],as_fram:[],asarrai:[0,2,6,9],asc:[],ascii:[],ashrafi:19,ask:[5,6,11,12],aspect:[0,6,15],assembl:[0,3],assert:4,assess:[0,6],assici:4,assign:[0,7,8,9,12,13,14,17,20],associ:[0,6,9,12,14,18],assum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],assumpt:[0,3,5,6,9,11,18],ast:[0,5,6],astyp:[4,9,10],asymmetri:0,asymptot:[4,6],async_wait:[3,4],atoi:[],atom:0,attempt:[0,4,6,7,8,10],attend:17,attent:[0,16],attr:[3,4],attract:[0,10],attribut:[0,9],attributeerror:[],audi:0,audio:[3,4],aurelien:[0,17,20],austfjel:6,author:[0,1,10,18],authour:0,auto:[6,9,10,18],autocor:18,autocorrelation_tim:18,autocorrelform:18,autocovari:18,autoencod:[4,15],autoencond:15,autograd:15,autom:[0,15],automac:16,automat:[0,1,2,3,4,11,15,16,17],automobil:3,autonom:[4,20],avail:[0,1,4,6,10,11,15,16,17,20],averag:[0,1,3,6,9,10,13,14,18,19],avg:[],avoid:[0,4,5,6,9,11,13,16],avx2:[],avx:[],awai:[2,3,6],awar:[2,10],award:19,ax:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16],axes3d:[2,6,13],axes_grid1:6,axessubplot:[],axhlin:8,axi:[0,1,2,3,4,6,7,8,9,10,11,12,13,14,16,18],axiom:5,axlabel:0,axvlin:[4,8],axvspan:4,b1:8,b2:8,b3:8,b:[0,1,2,3,4,5,6,8,9,10,12,13,14,18,19],b_0:0,b_1:[0,2,12,13],b_2:[0,13],b_5:13,b_:[0,1,16],b_group:9,b_i:[0,1,2,12],b_ia_:0,b_ia_i:0,b_index:9,b_is_vec:2,b_j:[1,12],b_k:[0,1,12,13],b_m:12,b_meta:2,b_score:9,b_valu:9,bachelor:17,back:[0,3,4,5,6,8,9,10,16,17,18],backbon:16,backend:[1,4],background:[17,20],backpropag:1,backtrack:9,backup:16,backward:[1,2,4,12,16],backward_pass:2,bad:6,badli:18,bag:[9,15,17],bag_clf:10,baggingboot:10,baggingclassifi:10,baggingtre:10,balanc:6,band:16,bandwidth:16,bar:[0,6,11],barber:20,bare:[4,10],base:[0,1,3,4,5,7,8,9,10,14,15,18,19,20],basi:[5,7,8,10,11,12,13,16],basic:[6,8,12,13,14,15,17,18],batch:[3,4,11,12,13],batch_shap:4,batch_siz:[1,3,4],batchnorm:4,bay:7,bayesian:[5,15,20],bc298b802fe2:6,becaus:[0,1,2,3,4,5,6,8,9,12,13,14],becom:[0,1,2,5,6,7,9,12,13,18],been:[0,1,2,3,4,5,6,11,12,13,15,16],befor:[0,1,2,3,4,5,6,7,8,12,13,14,16,18],beforehand:[0,18],begin:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,16,18],behav:[1,6,13],behavior:[0,1,13],behaviour:12,behind:[0,1,6,8,13],behnoosh:19,being:[0,1,2,3,4,5,7,8,10,11,12,13,18],believ:[9,16],belong:[5,7,8,9,13,14],below:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],benchmark:10,bendik:[],benefici:[1,13],benefit:[0,1,4,11,13,15],bengio:[1,17,20],benign:[1,7],bennosh:19,besid:[4,5],bessel:5,best:[0,1,2,3,4,5,6,7,8,9,10,12,13,19],beta:[0,1,3,5,6,7,10,11,13],beta_0:[0,1,3,5,6,7,13],beta_0x_:0,beta_1:[0,1,3,5,6,7,10,13],beta_1x_0:0,beta_1x_1:[0,7],beta_1x_2:0,beta_1x_:0,beta_1x_i:[7,13],beta_2:[0,3,13],beta_2x_0:0,beta_2x_1:0,beta_2x_2:[0,7],beta_2x_:0,beta_3:3,beta_:[0,3,6,7,13],beta_i:[0,3,5],beta_j:[0,5,6,13],beta_k:13,beta_linreg:13,beta_m:10,beta_mg_m:10,beta_n:3,beta_p:7,beta_px_p:7,betavalu:5,better:[0,1,2,3,4,6,9,10,11,12,13],between:[0,1,2,3,4,5,6,7,8,9,11,12,13,14,18],beyond:[0,1,5,6,8,13],bf:[13,14,16,18],bgd:13,bia:[0,1,2,3,5,8,9,10,12,13,17],bias:[1,2,3,5,6,9,12],big:[0,1,2,5,6,14],bigger:[1,6],bigr:12,bike:9,bilek:19,billion:[3,12,15],bin:[0,7,18],binari:[0,3,5,7,9,10,12,17],binarycrossentropi:4,bind:0,binomi:[15,18],binsboot:6,bioinformat:0,biolog:[1,12,20],bios1100:15,bird:[0,3],bishop:[17,20],bit:[1,4,16,18],bitwis:18,bivari:2,bk:[0,13],bla:16,black:[8,9,14],blob:17,block:[6,10,15,16,18],blockingavg:[],blockingstd:[],blockingvar:[],blocksiz:[],blocksizemax:[],blocksizemin:[],blogpost:4,blue:[0,3],bmatrix:[0,1,3,5,7,8,11,13,16],bmi:1,bodi:[0,1,4,12],bold:1,boldfac:[0,5],boldsymbol:[0,1,2,3,5,6,7,8,10,11,13,14],boltzmann:[12,15],book:[17,20],boost:[1,9,15,17],boostrap:10,bootavg:[],bootstd:[],bootstrap:[1,13,15,17],bootvar:[],bootvec:[],boston_dataset:0,bot:8,both:[0,1,4,5,6,8,9,10,13,14,15,16,18,19],bottl:7,bound:[0,8,12],boundari:[2,4,8,11,12],boundkei:[],box:[2,4,9],boxed_arg:2,boyd:[8,13],bracket:[4,18],brain:[1,7,12],branch:9,breast:[5,7,11],breviti:13,brew:[0,15],brg:8,briefli:0,bring:[0,5,6,10],broad:[0,3,4],brought:15,brownle:4,brute:[3,5,11],bs:[8,9,10],buffer_s:4,bui:4,build:[0,4,5,6,10,13,16,18],built:[0,1,3,4,6],bunch:11,busi:0,bx:[],bzl:[],c1:[8,11],c2:[8,11],c95af3df0cdd:3,c:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20],c_0:18,c_1:12,c_2:12,c_3:12,c_4:12,c_:[0,8,9,10,13,18],c_i:[12,13],c_k:18,ca:1,cabc613b8702:13,cach:10,cal:[0,8,10,12,13],calcul:[0,1,2,4,5,6,8,9,10,11,12,13,14,16,18],california:[],call:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],callabl:[3,4],callback:[3,4],calor:0,cambridg:[13,20],can:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],cancel:[0,13],cancellation_manag:[3,4],cancer:[5,10],cancerpd:7,candid:[8,9,10],cannot:[0,1,4,5,6,7,8,9,17,18],canopi:[0,15],cap:5,capabl:[0,1,8,13,15],capac:2,capita:0,captur:[4,11,12],captured_input:[3,4],car:[3,4],card:[0,7],cardin:1,care:11,carefulli:13,carlo:[0,6,15,18,20],carri:[2,6,7],cart:10,carvalho:19,casella:20,cast:1,cat:[3,4],categor:[0,1,3,9,11],categori:[0,1,3,7,10,12,14,17],categorical_crossentropi:[1,3],caus:[0,5,6,18],causal:0,causat:0,cax:1,cb:6,cbar:1,cbook:[],cc:[0,1,5,13],ccc:[5,12],cd_fast:6,cdf:18,cdot:[0,2,6,12,13,14,16,18],celebr:13,cell:4,center:[0,1,6,7,8,9,11,14,18],centr:20,central:[0,3,5,6,8,16],centroid:[14,18],centroid_differ:14,centuri:3,certain:[0,3,6,7,9,18],cg:13,cha:0,chain:[0,1,13,15,18],chanc:[1,5,13,18],chang:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],channel:3,chapter3:0,chapter:[0,6,10,11,16,17,20],charact:[0,3,5],character:[8,9,10,12,18],characterist:[0,1,3,10,13],charg:0,charl:0,chase:4,chd:7,chddata:7,cheap:5,cheaper:[1,13],check:[0,1,3,4,5,6,11,13,16],checkmark:3,checkpoint:4,checkpoint_dir:4,checkpoint_prefix:4,chemic:[],chen:10,chiaramont:2,choic:[0,1,2,3,4,6,9,12,13,14,16],choleski:[5,16],choos:[2,3,6,9,10,11,13,14],chosen:[0,1,2,6,8,9,10,13,18],chosen_datapoint:1,christian:20,christoph:[17,20],cifar10:3,cifar:3,cin:[],circ:[1,12],circl:[0,8,12],circuit:3,circumfer:9,circumv:[1,5,13],ckpt:4,clariti:18,class_nam:[3,9],class_val:9,class_valu:9,class_weight:[3,4],classic:[7,9,13],classif:[0,3,5,6,7,8,11,12,15,17,20],classifi:[0,1,4,7,9,10,11],classificaton:1,classifii:10,clean:1,clear:[1,5,10,12,13],clearli:[0,3,5,6,7,8,18],clever:[1,10],clf3:0,clf:[0,6,8,9,10],clf_lasso:6,clf_ridg:6,clip:[3,18],close:[0,1,2,4,6,8,9,11,12,13,14,18,20],closer:[3,5,13],closest:[8,11,13,14],closur:15,cloud:15,cluster:[0,1,4,6,11,15,17],cluster_label:14,cm:[1,2,3,6,8,13],cmap:[0,1,2,3,4,6,8,9,10],cmap_arg:6,cmath:[],cmb:17,cmd:9,cmu:[],cn_:18,cnn:[12,17],cnn_kera:3,cntk:15,co:[0,2,3,6,9,13],code:[3,4,6,7,8,13,15,16,17,18,20],coef0:8,coef:0,coef_:[0,5,6,8,9,13],coeff:5,coeffici:[0,3,5,6,7,8,9,13,16],coerc:[0,6],coin:[10,18],coin_toss:10,col:[0,11],colab:15,cold:9,colinear:0,collaps:8,collect:[0,2,6,10,11,15,18,20],collinear:5,color:[0,3,4,6,8,9,10,18],color_channel:3,color_cod:6,colorbar:[1,6],colsample_bytre:10,colsaobject:10,colspec:0,column:[0,1,2,5,6,7,8,9,11,12,16],columntransform:9,com:[3,4,6,14,15,17,20],combin:[1,2,5,6,7,10,18],come:[0,1,3,4,5,12,13,14,17],command:[0,1],comment:[0,4,5,6],commerci:[0,15],commod:0,common:[0,1,3,5,6,7,9,11,13,14,18],commonli:[0,1,4,6,7,9,13,14],commun:[0,12],commut:3,commutatitav:3,compact:[0,1,3,5,6,7,9,11,12,13,14],compair:0,compar:[0,3,4,5,6,11,13,16],comparison:[2,4,13],compat:7,compet:0,competit:10,compil:[0,1,3,4,15,16],complet:[0,2,3,4,9,12],completenn:12,complex:[1,5,8,9,11,12,13],complic:[0,1,9,13],compon:[0,1,3,4,5,6,7,9,14,15,17],components_:11,compos:[9,12,14,15],compphys:[0,6,15,17,20],compress:0,compris:6,compromis:5,compulsori:15,comput:[0,1,2,3,4,5,6,7,8,10,11,12,13,15,16,17,18,20],computation:[0,3,6,9,13,18],con:[],concaten:[2,4,6,14],concav:[1,13],concentr:[0,10],concept:[0,2,15],conceptu:[12,13],concern:[0,1,4,7],conclud:[0,5,13],conclus:1,cond:2,conda:[0,1,15],condit:[0,2,4,5,6,8,9,11,13,18],conduct:15,condwav:2,coneqp:[],confid:[0,5,6,7,8],configur:3,confirm:[5,12],confus:[5,6,10,16],confusion_matrix:9,congruenti:18,conjug:[4,8],conjugaci:13,conjunct:3,connect:[0,1,3,4,9,11,12,13,16],consequ:[5,6,8,10,12,13],conserv:[5,14],consid:[0,1,2,3,5,6,7,8,9,10,12,13,16,18],consider:[0,1,5,13],consist:[0,1,2,3,4,6,12,13,18],constant:[0,2,4,5,6,8,12,13,18],constitu:0,constitut:[2,6],constrain:[1,3,5,7,11],constraint:[5,6,8,13],construct:[0,1,2,3,5,6,7,8,9,10,11,16,18,20],contact:0,contain:[0,2,3,4,5,6,7,8,9,11,12,13,16,18,20],contemporari:20,content:[1,15,16],context:[3,4,6,10,13],contigu:16,continu:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,18],contour:[9,10,13],contourf:[8,9,10],contrast:[1,4,9,10,12],contribut:[0,3,5,13,18],contributor:0,control:[0,1,3,9,13,15],conv2d:[3,4],conv2dtranspos:4,conv:[3,4],conveni:[0,5,6,12,13,16],convent:12,converg:[1,2,4,5,6,7,8,11,13,14],convergencewarn:[1,6,7,8,11],convert:[0,1,4,5,9,11,13,16],converttomatrix:4,convex:[4,5,7],convinc:13,convolut:[1,4,15,17],cool:[4,9],coolwarm:6,coordin:[5,12,14],coorel:0,copi:[0,1,14],core:[2,3,4,10,13],corel:0,coronari:7,corr:[0,5,7,11],correalt:[11,15],correct:[0,1,2,3,4,5,13,16,18],correctli:[1,2,6,10],correl:[0,1,3,5,6,7,10,12,13,15,18],correlation_matrix:[0,5,7,11],correspond:[0,3,5,6,8,9,11,12,15,16,18],cortex:12,cosin:[3,6],cost:[0,2,3,5,6,7,8,9,12,13],cost_deep_grad:2,cost_funct:2,cost_function_deep:2,cost_function_deep_grad:2,cost_function_grad:2,cost_grad:2,cost_sum:2,costol:13,could:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],coulomb:0,count:[0,9,17,18,19],countor:13,coupl:[4,5,6],cours:[0,1,3,5,11,17],courvil:[17,20],cout:[],cov:[5,6,11,16,18],cov_xi:[5,11],cov_xx:[5,11],cov_yi:[5,11],covari:[0,7,15,16],covariance_matrix:[5,11,14],cover:[0,5,15,17,20],covert:0,covxi:18,covxx:18,covxz:18,covyi:18,covyz:18,covzz:18,cpu:1,cpu_feature_guard:[],craft:3,creat:[1,2,3,4,5,6,9,10,11,12,13,15],create_biases_and_weight:1,create_convolutional_neural_network_kera:3,create_neural_network_kera:1,create_x:[5,11],credit:[0,7],crim:0,crime:0,criteria:[0,4,9,10,14,18],criterion:[9,10,13],critic:6,cross:[0,1,3,7,9,10,13,15,17,18],cross_entropi:4,cross_val_scor:6,cross_valid:[7,10],crossvalid:6,crucial:[1,18],cs231:3,cs:17,csr_matrix:16,cstdlib:[],csv:[0,4,6,7,9],ctnk:1,ctx:[3,4],cubic:0,cumbersom:5,cumsum:[10,11],cumul:[10,18],cumulative_heads_ratio:10,cup:5,current:[1,2,3,4,6,13,14],curs:0,curv:[6,7,10,12],curvatur:13,custom:[6,14],custom_cmap2:[9,10],custom_cmap:[9,10],cutpoint:9,cv:[6,7,10],cvxbook:13,cvxopt:[5,8],cyber:20,cycl:[1,12],d1:[],d2:[],d2_g_t:2,d3:[],d670a873ab0c:[],d985fb40c43d:6,d:[1,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19],d_f:13,d_g_t:2,d_net_out:2,da:3,dagger:[5,16],dai:[1,9,15],dalen:[],damp:3,darget:9,darkr:18,dat:0,dat_id:[0,6,7,9],data1:14,data2:14,data3:14,data4:14,data:[2,4,5,8,10,12,13,14,16,20],data_handl:[3,4],data_id:[0,6,7,9],data_indic:1,data_modul:[],data_path:[0,6,7,9],data_url:[],databas:1,datafil:[0,6,7,9],datafram:[0,4,5,7,9,11],datapoint:[1,5,6,7,11,13],dataset:[0,4,6,7,8,9,10,11,13,14],datatyp:4,date:0,daughter:10,david:20,dbh:1,dbo:1,dcomposit:16,ddot:2,dead:1,deadlin:17,deal:[0,1,3,5,6,8,11,13,14,16,18],dealt:0,debt:7,debug:[0,5,6],decad:[0,3],decai:[0,13,18],decemb:17,decent:10,decid:[0,2,3,5,6,9],decim:0,decis:[0,1,8,11,15,17,20],decision_funct:8,decision_tre:9,decisiontreeclassifi:[9,10],decisiontreeregressor:[0,9,10],declar:[0,4,16],decompos:[5,6,16],decomposit:[0,6,12,17],decompost:5,deconvolut:3,decorrel:[10,13],decreas:[1,2,4,5,6,10,11,13],deduc:0,deep:[3,7,12,13,15,17,20],deep_neural_network:2,deep_param:2,deep_tree_clf1:9,deep_tree_clf2:9,deep_tree_clf:[9,10],deepen:[5,15],deeper:[0,3,4],deeplearningbook:20,deer:3,def:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,18],def_covari:18,def_funct:[3,4],default_tim:4,defect:5,defici:5,defin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],definit:[1,2,5,6,8,10,11,12,13,16,18],defint:18,defun:[3,4],defvjp:2,degre:[3,5,6,8,9,10,11,18],del:1,delet:6,delimit:4,deliv:17,delta:[0,2,3,6,8,12,13,14],delta_0:3,delta_1:3,delta_2:3,delta_3:3,delta_4:3,delta_5:3,delta_:[1,16],delta_h:[0,1],delta_j:[3,12],delta_k:12,delta_l:[1,3],delta_n:[0,3],delug:15,delv:0,demand:13,demonstr:[0,3,5,6,7,11,12,15],den:4,denomin:[1,5],denot:[1,2,6,7,13,18],dens:[1,3,4],dense_1:4,densiti:[0,2,6,18],depart:19,depend:[0,1,2,4,5,6,7,8,11,12,13,15,16,18],depict:18,deploy:[0,15],deprec:[2,3,6,13],depth:[0,3,9,10,16],deriv:[0,1,2,6,7,8,10,11,13,15],derivati:13,descend:[5,9,11],descent:[0,1,3,7,8,12,17],descr:[],describ:[0,2,4,5,6,8,10,11,12,13,16],descript:[0,8,9],design:[0,1,3,4,5,6,7,10,11,12,13],designmatrix:0,desir:[0,2,4,5,13,14],despit:[1,12],destroi:16,det:[5,16],detail:[0,6,11,13,14,16],detect:[3,8,12],determin:[0,2,3,4,5,6,8,9,10,11,12,13,16,18],determinist:[7,13,18],dev:1,develop:[0,3,5,8,10,11,12,15,16,17],deviat:[0,1,2,4,5,6,18],device_nam:[3,4],devis:12,df:[4,8,11,13],di:0,diag:[5,8],diagnost:[1,10],diagon:[0,5,7,13,16,18],diagonaliz:5,diagram:10,diagsvd:6,dice:[6,18],dict:[6,8],dict_kei:[],dictionari:0,did:[0,1,5,6,7,10,11,14],die:1,diff1:2,diff2:2,diff:2,diff_ag:2,diffeent:8,differ:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,18,20],differenti:[0,3,15,16,17],differential_oper:[2,13],difficult:[0,1,6,10,13,18],difficulti:[0,1,13],diffonedim:2,digit:[0,1,3,4,6,17,19],dilemma:13,dilut:1,dim:[4,11,14,16],dimens:[0,1,2,3,4,5,8,11,14,16],dimension:[0,4,5,6,9,11,13,14,15,16],dimensionless:[0,3],diment:16,dimnsion:4,diod:3,direct:[0,1,2,4,11,12,13,14],directli:[1,4,5,6,18],directori:[],disabl:[3,4],disadvantag:0,disappear:[3,6],disc_loss:4,disc_tap:4,discard:[6,11],disciplin:[0,3,12],disclaim:18,discourag:13,discov:0,discover:5,discret:[1,3,5,7,13],discrimin:[4,7,10,11],discriminator_loss:4,discriminator_loss_list:4,discriminator_model:4,discriminator_optim:4,discuss:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],diseas:7,disguis:6,disord:[1,7],displai:[0,1,3,4,5,6,7,8,9,10,11,12,14,18],displaystyl:[0,5],displot:[],disregard:0,dissimilar:[11,14],dist:14,distanc:[0,8,9,11,14,18],distance_list:9,distinct:[3,7,8,9,10,14],distinctli:8,distinguish:[0,4,7,8,18],distplot:0,distribut:[0,1,4,6,7,10,11,13,14,15,16],distrubut:[0,15],div:[],dive:[0,8,16],diverg:[1,13],divid:[0,1,3,5,6,8,9,11,12,18],divis:[6,8,9,13,16,18],dna:7,dnn1:4,dnn2_gru2:4,dnn:[0,1,2,4,12],dnn_kera:1,dnn_model:1,dnn_numpi:1,dnn_scikit:[0,1],doc:[0,6,15,17,20],document:[4,7,11,13],doe:[0,1,2,3,4,5,6,8,10,11,12,13,16,18],doesn:[3,9,12],dog:[1,3,4],domain:[5,8,13],domin:0,don:[0,1,3,5,6,8,11,13,15],done:[0,2,3,4,5,6,9,10,11,13,16],dot:[0,2,3,5,6,7,8,9,10,11,12,13,16,18],doubl:[3,4,16],doubli:1,down:[0,3,6,9,11,12,13],download:[0,1,3,5,6,16,20],downsampl:3,dozen:1,dq:6,drag:13,dramat:11,drastic:4,draw:[4,6,10,13],drawback:[0,1,3,13],drawn:[1,4,6,7,11,18],drive:[3,4],driven:3,drop:[0,1,5,6,11,13,18],dropna:[0,6],dropout:4,ds:[],dt:[2,3,13,18],dtype:[0,1,2,3,4,14,16],dualiti:6,dub:0,due:[1,2,5,6,8,10,12,13],dummi:0,dure:[0,1,3,4,8,9,11,15],dwell:0,dwh:1,dwo:1,dx:[2,3,8,18],dx_1:18,dx_1p:6,dx_2p:6,dx_mp:6,dx_n:18,dxp:6,dy:[1,8,18],dynam:4,dysth:19,dz:8,e:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19],e_:[0,2],each:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],eager:[3,4],eapprox:0,earli:[1,3,4,13],earlier:[0,5,7,8,9,11,12,13],earthexplor:6,eas:[6,9,14],easi:[0,5,6,7,8,9,10,11,12,13,15,16],easier:[5,6,8,9,13,18],easiest:13,easili:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16],eastern:19,ebind:0,eblock:9,economi:5,ecosystem:15,ect:17,edg:3,edgecolor:6,edu:13,educ:0,eface79dac2c:10,eff:18,effect:[1,4,10,13,18],effic:1,effici:[0,3,10,13,15,16,18],efron:6,egrad:13,eig:[5,11,13,16,18],eigen:18,eigenpair:[5,11],eigenvalu:[0,5,8,11,13,16],eigenvector:[5,11,13],eight:16,eigval:[16,18],eigvalu:[11,13],eigvec:[16,18],eigvector:[11,13],eispack:16,either:[1,5,6,7,8,9,10,11,13,18],ekstrom:[],elabor:18,elarn:3,electr:[0,3,12],electur:20,eleg:11,element:[1,2,3,4,5,6,7,8,11,12,13,15,16,17,20],elementari:[10,13,16],elementwis:[3,13],elementwise_grad:[2,13],elif:[2,3,4,14],elim:16,elimin:[3,8],els:[1,2,3,4,7,9,12,13,16],elu:1,elus:0,email:[17,19],embed:[0,11],embodi:6,emit:18,emner:[17,20],emphas:[0,10,15],emphasi:[0,15,20],empir:[1,11,18],emploi:[0,1,5,6,11,13,18],employ:0,empti:[6,10],emul:12,en:[15,20],enabl:11,enbodi:6,encod:[0,3,5,9,11,14],encompass:[0,18],encount:[0,1,5,6,7,13,18],end:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],end_box:[2,13],end_nod:[2,13],end_valu:[2,13],endl:[],endpoint:[3,6],energi:[0,4,6],enet_coordinate_desc:6,enforc:12,eng:20,engin:[0,1,3,4,15],english:20,enorm:3,enough:[0,6,13],ensembl:[1,9,17],ensur:[0,1,2,3,5,6,11,13,18],ensure_initi:[3,4],enter:[5,6],enthought:[0,15],entir:[1,3,7,9,15,18],entiti:[9,12,16],entri:[0,5,8,11,12,16],entropi:[1,3,7,10,13],enumer:[0,1,2,3,4,6,8],env:[0,1,2,3,4,6,7,8,11,13,14,18],environ:[2,15,20],eo:[0,6],eol:0,eosfit:0,epoch:[0,1,3,4,12,13],epsilon:[0,5,6,7,13],epsilon_0:0,epsilon_1:0,epsilon_2:0,epsilon_:0,epsilon_i:0,eq:[3,13,14,16,18],eqnarrai:[3,5,6],equal:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],equat:[1,3,4,5,6,7,8,9,10,11,13,14,16,17,18],equilibrium:[2,12],equiv:[3,13,16,18],equival:[0,1,5,8,11,13,15,16],erf:18,err:[0,10],err_:6,err_sqr:2,errat:13,errno:[],erron:2,error:[1,2,4,5,6,7,9,11,12,13,15,16,18],error_estimate_corr_tim:18,error_handl:[3,4],error_hidden:1,error_output:1,escap:13,especi:[1,3,9,12,13],essenti:[0,5,6,9,10,12,14,17,18],establish:[0,6,10,11],estim:[0,1,5,6,7,10,11,13,15,18],estimated_mse_fold:6,estimated_mse_kfold:6,estimated_mse_sklearn:6,et:[0,2,4,17,20],eta0:[8,13],eta:[0,1,3,8,12,13],eta_:13,eta_t:13,eta_v:[0,1,3],etc:[0,1,3,5,7,8,9,11,12,13,14,15,16,18],ethic:15,etsim:6,euclidean:[0,14],evalu:[0,2,3,4,5,6,9,13,18],evalut:13,even:[0,1,3,4,5,6,8,9,10,11,12,13,14,15,16,18],evenli:4,event:[3,4,5,7,10,14,18],eventu:[0,5,6,11,12,13,19],everi:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,18],everyth:[4,12],everywher:[4,13],evolv:0,exact:[0,2,5,11,12,13,16,18],exactli:[0,3,4,6,12,15],examin:6,exampl:[5,11,12,13,15,16,17,18,20],exce:[1,12,13],excel:[0,1,4,5,10,20],except:[3,4,6,8,9,16],excess:0,excit:0,exclud:[1,6,12],exclus:[0,1,3,6,18],execut:[2,3,4,5,13],executing_eagerli:[3,4],exemplifi:13,exercis:[5,15,17],exhaust:6,exhibit:[0,5,6,8],exist:[0,1,2,3,5,6,7,8,9,13,16,20],exit:[5,16],exp:[0,1,2,5,6,7,8,10,11,12,13,18],exp_term:1,expand:[5,7,11,13],expans:[0,3,5,8,10,12,13],expect:[0,1,5,6,7,11,12,13,15],expectation_value_of_h_wrt_p:18,expens:[6,10,13],experi:[0,1,6,8,13,15],experiment:[0,3,4,6,9,14,18],experimental_get_tracing_count:[3,4],expert:[1,9],explain:[0,6,9,10,11,13],explained_variance_ratio_:11,explanatori:0,explicit:[0,3,6,13,16],explicitli:[0,4],explod:1,exploit:[0,3,12,13],explor:[1,4,6,8,13,15],expon:1,exponenti:[0,1,5,6,10,13,18],export_graphviz:9,export_text:9,exporttext:9,expos:15,express:[0,2,3,5,6,7,10,12,13,16,18],exptmean:18,exptvari:18,extend:[0,2,7,11,13,15],extens:[0,12,15],extent:[0,1,6,20],extern:[3,6,9],extra:[1,3,5],extract:[0,3,5,6,7,8,11,13,16],extrapol:0,extrem:[0,1,4,5,6,7,8,9,13,16],extremum:13,extrins:11,ey:[0,5,6,13,14,16],f11:0,f12:0,f13:0,f1:13,f1_grad:13,f1d:13,f2:13,f2_grad_x1:13,f2_grad_x1_analyt:13,f2_grad_x2:13,f2_grad_x2_analyt:13,f3:13,f3_grad:13,f3_grad_analyt:13,f4:13,f4_grad:13,f4_grad_analyt:13,f5:13,f5_grad:13,f6:13,f6_for:13,f6_for_grad:13,f6_grad_analyt:13,f6_while:13,f6_while_grad:13,f6d7a289d493:[],f7:13,f7_grad:13,f7_grad_analyt:13,f8:13,f8_grad:13,f9:[0,13],f9_altern:13,f9_alternative_grad:13,f9_grad:13,f:[0,1,2,3,4,5,6,7,8,10,12,13,14,16,18,19],f_0:[3,10],f_1:[10,13],f_2:[12,13],f_3:12,f_:10,f_d:18,f_grad:13,f_grad_analyt:13,f_i:[0,6,12],f_m:[3,10],f_n:3,f_raw:2,f_vec:2,f_wrap:2,face:13,facecolor:[6,8,18],facil:[0,15],facilit:12,fact:[0,1,3,5,9,11,12,13],factor:[0,1,3,5,6,9,10,11,13,16,18],factori:13,fade:6,fafab0:[9,10],fail:[0,6,7,8,11,13,19],failur:7,fairli:[1,2,18],fake:4,fake_loss:4,fake_output:4,fall:[8,9,17],fals:[0,1,2,3,4,5,6,7,9,10,13,14,16],famili:[0,7,8,18],familiar:[0,3,5,6,8,15,16,18],famou:[6,12],far:[0,3,4,5,6,8,11,12,13,14],fashion:[0,9,10],fast:[1,3,6,10,12,13,15,18],faster:[1,11,13],fastest:[13,16],favor:7,favorit:18,fc:3,fdf8a5d7c717:2,fdfcc778e1f8:4,fe5b9d300cc0:6,featur:[0,1,3,5,6,7,8,10,11,12,13,15,18],feature_nam:[0,1,7,9],feautur:9,fed:1,feed:[0,2,3,11,15,17],feed_forward:1,feed_forward_out:1,feed_forward_train:1,feedback:4,feeddorward:4,feedforward:[1,4,12],feel:[0,5,6,11,13,15,19],feet:0,fetch:6,fetch_california_h:[],fetch_openml:[],few:[1,3,4,5,9,18],fewer:[0,9,11],ffnn:[1,12],field:[0,3,6,12,15],fifth:[0,6],fig:[0,1,2,3,4,6,7,12,13,14],fig_id:[0,6,7,9],figaxi:18,figsiz:[0,1,2,3,4,6,7,8,9,10],figur:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15],figure_id:[0,6,7,9],figurefil:[0,6,7,9],file:[0,1,2,4,5,6,7,9],file_prefix:4,filenam:[],filenotfounderror:[],fileout:[],filepath_or_buff:0,fill:[5,9],filter:[3,4],filtered_flat_arg:[3,4],filtered_tb:[3,4],financ:0,find:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,18],find_top_boxed_arg:2,fine:[0,14],finish:2,finit:[3,5,6,12,13,18],first:[0,1,2,3,5,6,7,8,9,10,11,13,14,16,17,18,20],firsteigvector:11,fit:[1,3,4,5,6,7,8,9,11,12,13,18],fit_beta:6,fit_intercept:[0,5,6],fit_mod:9,fit_transform:[0,6,8,9,11],fiti:0,five:[0,9],fix:[0,3,4,6,10,11,12,13],fixedformatt:6,fixedloc:6,fkkt:[],flag:4,flat:[12,13],flatten:[1,3,4,5,16],flexibl:[1,6,8,10,12],float32:[4,9],float64:[4,16],flop:[5,16],flow:[1,4,12],fluctuat:5,fly:11,flyvbjerg:[],fm:0,fma:[],fmax:3,fmesh:13,fn:[3,4],focu:[0,3,4,5,6,15,20],focus:[1,6,7,16],fold:[6,9],folder:[0,4,6],follow:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],font:[0,7,18],fontdict:18,fontsiz:[1,6,8,9,10,18],fontweight:1,footprint:3,foral:8,forc:[0,5,6,10,11],forcast:4,forecast:[4,12],forelesningsvideo:17,forest:[0,1,9,15,17],forget:11,form:[0,3,4,5,6,7,8,9,11,12,13,15,16,18],formal:[3,4,14,18],format:[0,1,2,3,4,6,7,8,9,10,11,15,18,20],format_data:4,formatstrformatt:[6,13],formul:[4,6,11,14],formula:[3,13,18],forth:[4,12],fortran2003:15,fortran90:18,fortran:[0,15,16],fortun:[0,11],forward:[0,3,6,15,16,17],forward_backward:[3,4],found:[1,2,4,5,6,12,13],foundat:15,four:[4,5,6,8,12,16,17],fourier:0,fourierdef1:3,fourierdef2:3,fourierseriessign:3,fourth:12,fr:[],frac:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],fractal:[],fraction:9,frame:7,framework:[1,8,10,18],frank:[5,11],frankefunct:[5,6,11],free:[0,6,11,13,15,16,18,19,20],freecodecamp:15,freedom:5,freeli:0,frequenc:[3,6,7,18],frequent:[0,8,9,13],frequentist:15,fresh:10,frida:19,fridai:17,friedman:[6,17,20],friendli:4,frog:3,from:[0,1,2,3,4,6,7,8,9,11,13,14,15,16,17,18,19,20],from_cod:9,from_logit:[3,4],from_tensor_slic:4,fromnumer:2,front:[0,4,5],fstream:[],fulfil:[2,5,12],full:[0,1,3,5,7,9,10,13,18],full_matric:5,fulli:[3,6,12,17,18],fun:[2,13,15],fun_nam:[],func:[0,2],functionali:11,fundament:[0,6,15],funtion:2,further:[2,9],furthermor:[0,3,5,6,7,11,12,13,15],futur:[0,4,8,9],futurewarn:[],fx:[],fy:[17,19],g0:2,g42mrgv128v34gnnhxwk9nrc0000gp:[],g:[0,1,2,3,4,6,8,9,10,11,13,18],g_0:2,g_1:[2,10],g_2:[2,10],g_:[2,9,10],g_analyt:2,g_dnn_ag:2,g_euler:2,g_i:2,g_m:[3,10],g_n:3,g_re:2,g_t:2,g_t_d2t:2,g_t_d2x:2,g_t_dt:2,g_t_hessian:2,g_t_hessian_func:2,g_t_jacobian:2,g_t_jacobian_func:2,g_trial:2,g_trial_deep:2,g_vec:2,gain:[1,5,9,10,13],galleri:0,game:4,gamma1:8,gamma2:8,gamma:[0,2,8,9,10,11,13],gamma_0:10,gamma_1:10,gamma_1x:10,gamma_:0,gamma_i:[0,8,18],gamma_j:13,gamma_k:13,gamma_m:10,gamma_x:0,gap:[6,8],gate:[4,12],gather:[0,1,12],gaug:12,gaussbacksub:16,gaussian:[4,5,6,8,14,18],gaussian_point:14,gaussian_rbf:8,gave:13,gbc:17,gca:[2,6,8,13],gd:1,gd_clf:10,gdclassiffiercgain:10,gdclassiffierconfus:10,gdclassiffierroc:10,gdm:13,gdregress:10,ge:[1,5,7,18],gemv:[],gen:[],gen_loss:4,gen_tap:4,gender:0,genener:4,gener:[0,1,2,3,5,6,8,10,11,12,13,14,16,18,20],generallay:12,generate_and_save_imag:4,generate_imag:4,generate_latent_point:4,generate_simple_clustering_dataset:14,generated_imag:4,generator_loss:4,generator_loss_list:4,generator_model:4,generator_optim:4,genexpr:[],genom:15,geodes:11,geometr:[0,13],geometri:5,georg:20,geotif:6,geq:[2,5,8,9,13],geron:[0,17,20],get:[0,1,2,3,4,5,6,7,9,10,11,13,15,16,18],get_dummi:9,get_loc:[],get_next_color:[],get_paramet:2,get_split:9,get_yaxi:8,get_yticklabel:6,getsolutionslic:[],getval:[],gg:[],gibb:15,gif:4,gini:10,gini_index:9,git:[0,15],github:[0,3,4,6,14,15,17,20],gitlab:[0,15],give:[0,1,2,3,5,6,7,8,9,10,12,13,14,15,17,18,20],given:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18],global:[6,7,13],glorot:1,gmail:[],go:[0,1,3,5,6,8,9,11,12,13],goal:[0,7,9],goe:[0,1,2,5,6,13,14,16],golden:13,gone:5,gong:1,good:[1,3,4,5,6,9,10,11,13,15,17,18,20],goodfellow:[4,17,20],googl:[1,3,4,14,15],got:[1,6],gov:6,gp:20,gpu:[1,15],grad:[2,13],grad_analyt:13,grade:17,gradient:[0,3,4,7,8,9,12,15,17],gradient_desc:3,gradientboostingclassifi:10,gradientboostingregressor:10,gradients_of_discrimin:4,gradients_of_gener:4,gradienttap:4,gradual:[1,14],grai:[4,6],graph:[1,9,11,12,13],graph_from_dot_data:9,graph_funct:[3,4],graphic:[0,1,9],grasp:0,gray_r:[1,3],grayscal:3,great:[5,13],greater:[1,7,18],greatli:13,greedi:9,green:[0,3,9,18],grei:4,grid:[1,3,6,7,8,12,18],grossli:13,ground:0,group:[0,6,7,9,14,15,17],groupbi:0,grow:[1,3,9,10],growth:0,gru:4,guarante:[0,3,4,13,18],guess:[1,4,10,13,14],guestrin:10,guid:1,guilherm:19,h1:2,h21:17,h:[0,1,5,6,8,13,18,20],h_1:[2,13],h_2:[2,13],h_:[0,13],h_m:10,ha:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],habit:0,had:[0,1,6,7,13],hadamard:[1,12],half:[1,8,9],halv:10,hand:[0,1,2,3,5,11,12,13,15,16,17,18,20],handi:3,handl:[0,1,2,5,9,11,15],handle_unknown:9,handsid:12,handwrit:12,handwritten:[1,5],happen:[1,2,3,4,5,6,10,13,18],hard:[1,7,8,10,13],hardcopi:15,harder:[0,1],harmon:3,hasn:1,hassl:[0,15],hast:15,hasti:[0,6,17,20],hat:[0,1,5,6,7,9,10,11,12,13,16],have:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],haven:1,he:7,head:[0,4,10,18],header:0,heads_proba:10,health:0,hear:[0,13],heart:[0,7],heatmap:[0,1,3,7],heavili:0,heavisid:1,height:[1,3,6],held:13,help:[0,1,4,12,13],helper:[4,14],henc:[0,5,6,8,9,10,12,13],her:7,here:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],hereaft:[0,8,12],hermitian:16,hessenberg:16,hessian:[0,2,5,13],heterogen:[9,10],hi:7,hidden:[1,3,4,12],hidden_bia:1,hidden_bias_gradi:1,hidden_layer_s:[0,1],hidden_neuron:4,hidden_weight:1,hidden_weights_gradi:1,hierarch:5,high:[0,1,2,3,4,5,6,9,10,11,13,14,15,16],higher:[0,1,3,5,6,8,13],highest:[1,2],highli:[0,3,4,10,15,16,20],highwai:0,hing:8,hint:13,hip:15,hire:0,hist:[4,6,7,18],histogram:[0,6,7,18],histor:[7,11],histori:[3,4,12],histplot:[],hit:[],hitherto:5,hjorth:19,hobbi:18,hoc:5,hoff:20,hold:[1,3,6,13,14],holder:0,home:0,homework:[6,13],homogen:[1,3,9,10,13],honchar:2,hopefulli:[0,11,18],horizont:11,hors:[3,7],hot:[1,9],hour:[1,15,17,18,19],house_pric:[],how:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],howev:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],hs:[],hspace:[0,4,8,10,18],hstack:1,htf:17,html:[0,7,11,15,17,20],http:[0,3,4,6,7,11,13,14,15,16,17,20],huang:0,huber:0,huge:[1,3,4,15],human:[0,1,3,6,9,12],humid:9,hundr:1,hungri:1,hybrid:17,hydrogen:0,hyperbol:[1,4,12],hyperparam:8,hyperparamet:[3,4,5,6,9,13],hyperplan:11,i0:0,i1:[0,6,8,12],i2:[0,8,12],i3:[0,12],i5:0,i:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19],i_1:[5,6],i_2:[5,6],i_:13,ian:20,ic:1,id:[7,13],ida:19,idea:[0,1,2,3,4,6,9,10,12,13,16],ideal:[0,2,6,8,13,18],idem:6,ident:[5,6,12,13,16],identical:5,identifi:[0,1,7,9,11,12,13,14],idum:[],ieor:18,ifi:20,ifs:15,ignor:[0,1,3,9],ii:[16,18],iii:16,ij:[0,1,3,6,8,12,14,16,18],ik:[0,16],illustr:[5,7,10,12,13,14,15],im:6,imag:[1,3,4,6,9,11,12,14,20],image_at_epoch_:4,image_batch:4,image_height:3,image_path:[0,6,7,9],image_width:3,imageio:6,images_from_seed_imag:4,imagin:1,immedi:[0,3,4,6,15],implement:[0,2,3,4,5,6,8,9,10,11,12,13,14,18],impli:[3,5,6,7,13,16],implicit:3,implicitli:[11,18],importantli:3,impos:[0,6,11,12],imposs:[0,5],impress:[0,12],improv:[0,4,5,9,10,11,13],impur:9,imread:6,imshow:[1,3,4,6],in3050:20,in4080:20,in4300:20,in5400:[3,20],in_out_neuron:4,inaccur:13,inacio:19,inact:12,inadequ:0,inch:6,includ:[0,1,2,3,4,5,6,7,11,12,15,18,19,20],include_bia:[6,9],incom:12,incorrect:1,incoveni:8,increas:[0,1,3,4,5,6,7,8,9,11,12,13,18],increasingli:18,ind:6,inde:[0,2,4,5,6],indefinit:4,indent:[],indentationerror:[],independ:[0,5,6,7,8,12,13,18],index:[0,1,3,4,10,14,15,16,18,20],index_col:0,index_of:[],indic:[0,1,3,4,5,6,9,10,11,13],indispens:6,individu:[1,6,7,10,12,18],indu:0,indx1:2,indx2:2,indx3:2,indx:16,ineffici:[3,13],inequ:8,inequaltii:13,inertia:13,inf1000:15,inf1100:15,inf1100l:15,inf1110:15,inf3000:20,inf4490:20,inf5860:20,infeas:9,infer:[0,1,4,6,20],infer_nrow:0,inferenc:1,infil:[0,6,7,9],infin:[5,6,7,11],infinit:3,infinitesim:18,influenc:[6,10],influenti:1,inform:[0,1,3,4,6,9,11,12,13,14,16,20],infti:[3,6,13,18],ingeni:13,ingrad:2,ingredi:[0,9],inher:6,inherit:16,initi:[0,1,2,6,10,13,14,16,18],initial_epoch:[3,4],initialis:[],initialize_root:[],inject:14,inlin:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],inner:[0,13],innov:20,inp:4,inplac:13,input:[0,1,3,4,5,6,7,8,9,10,12,13,14,18],input_dim:1,input_shap:[3,4],inputs:1,inputs_shuffl:[0,1],insert:[3,5,6,8,10,18],insid:[0,4,7],insight:[0,1,5,15,20],insist:[6,13],inspir:[0,1,12,20],instabl:2,instal:[0,1,5,6,9],instanc:[0,1,2,4,6,9,11,13],instanti:10,instead:[0,1,2,3,4,5,6,8,9,11,13,14,16,18],institut:1,instruct:[0,1],int32:10,int64:[],int_0:18,int_:[3,6,18],int_a:18,intak:0,integ:[1,2,13,14,16,18],integer_vector:1,integr:[3,6,18],intellig:[0,14,20],intend:10,intens:1,intention:14,interact:[0,6,9,12,15],intercept:[0,6,8,11,13],intercept_:[0,6,8,9,13],interchang:[5,12,16],interconnect:1,interest:[0,1,2,3,4,5,6,7,8,9,12,15,17,18],interfac:[0,1,16],interior:[0,9],intermedi:16,intern:[1,10,12],interpol:[1,3,4,6,12],interpr:5,interpret:[0,1,6,9,10,12,13,16,18],interv:[0,3,5,6,7,13,18],intial:13,intract:[0,4],intrins:[3,11,16,18],intro:[15,20],introduc:[0,1,5,6,8,10,12,13,16,18],introduct:[1,2,4,13,17,20],introductori:[0,4,16,20],intuit:[0,5,6,8,12,13],inv:[0,5,13],invalid:1,invalu:[0,13,15],invari:1,invd:5,inver:8,invers:[0,3,6,13],invers_period:[],inverse_transform:8,invert:[0,5,7,10],invok:[0,8],involv:[0,2,6,7,11,12],io:[0,15,17,20],iomanip:[],iostream:[],ip:[0,8,18],ipca:11,ipykernel_42331:[],ipykernel_42376:[],ipykernel_42449:[],ipykernel_42456:[],ipykernel_42530:[],ipykernel_42541:[],ipykernel_42553:[],ipykernel_42573:[],ipykernel_42580:[],ipykernel_42586:[],ipykernel_47411:[],ipykernel_47448:[],ipykernel_47647:[],ipykernel_47724:[],ipykernel_47735:[],ipynb:15,ipython:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15],iq:6,iri:[8,9],irreduc:6,irrelev:5,irrespect:0,is_integ:[],isbox:[2,13],iscomplexobj:[],isinst:[2,13],isn:5,isnul:0,isomap:11,issu:[1,3,4,9,14,16],it_arrai:13,item:[0,13],items:16,iter:[1,2,3,4,6,7,8,11,13,14,18],itr:[],its:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20],itself:[5,6,12,18],ix:[],j1:16,j:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18,20],j_:6,j_lasso_sk:6,j_ridge_sk:6,j_sk:6,jackknavg:[],jackknif:[6,15],jackknstd:[],jackknvar:[],jackknvec:[],jacobian:[2,13],jacobian_shap:2,jargon:[],jason:4,jax:[3,4,14,15],jensen:19,jerom:20,ji:[12,16],jj:[0,5,6],jk:[0,1,6,12,16],jl:0,jm:16,joao:19,joaogca:19,job:[2,8,10],join:[0,4,6,7,9],joint:[4,5],journal:[],judg:13,judgement:6,julia:[15,16],jump:18,junk:4,jupyt:[0,15,17,20],just:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18],justif:0,justifi:[3,10],jy:[],jydg2xzka5:17,k0:7,k1:7,k:[0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,18],kaggl:6,kappa_d:18,karim:[],karlsen:[],karush:8,keep:[0,1,4,5,6,11,13,14,16],keepdim:[1,6,10,16],kei:[0,1,3,6,12,20],kept:[4,6,14],kera:[0,4,15],kernel:[0,1,3,15],kernel_regular:[1,3],kernel_s:4,kernelpca:11,kev:0,kevin:20,keyboardinterrupt:[2,3,4],keyerror:[],keyword:[6,13,16],kfold:6,kg:1,ki:16,kick:[1,13],kiener:2,kilomet:6,kind:[0,2,3,4,8,12,13,14],kj:[6,12,16],kjm:15,kkt:8,kktsolver:[],kl0m3:17,kl:18,km:12,kmean:14,kmeanspoint:14,kn_k:14,know:[0,1,2,5,6,8,13,15],knowledg:[0,15],known:[1,3,4,5,6,7,8,9,12,16,18,20],kondev:0,kp:18,kpca:11,kroneck:14,kuhn:8,kwarg:[0,2,3,4,13],kwd:[0,3,4],kwown:0,l0:7,l1:[0,1,3,7],l1_l2:[1,3],l1regl:5,l1regls_mosek2:[],l1regls_mosek:[],l2:[1,3],l:[0,1,2,3,5,6,7,8,10,11,12,13,16,18],l_1:7,l_2:[7,13],l_:16,l_j:12,la:13,la_i:12,la_k:12,lab:[15,17],label:[0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,18],label_prob:13,labelencod:[7,10],labels:[6,8,9],labels_shuffl:[0,1],laboratori:17,lack:0,lagari:2,lagrang:[8,11],lambda:[0,1,2,3,5,6,7,8,10,12,13,18],lambda_0:11,lambda_1:[5,8,11],lambda_2:[8,11],lambda_:11,lambda_i:[8,11],lambda_iy_i:8,lambda_jy_iy_j:8,lambda_k:8,lambda_n:[5,8],lamda:1,lamdbda:5,land:[0,8],landmark:8,landscap:13,langl:[0,6,11,18],languag:[0,1,4,8,15,16,20],lapack:16,laplac:5,laptop:15,larg:[0,1,2,4,5,6,8,9,10,11,13,15,16,18,20],larger:[0,3,5,6,8,10,11,13,18],largest:[4,8,11],lasso:[0,7,15,17],lasso_sk:6,last:[0,1,2,3,4,5,6,7,8,9,10,12,13,16,17,18],latent:4,latent_dim:4,latent_point:4,latent_space_value_rang:4,later:[0,1,4,6,7,8,12,13,14,15],latest:[4,15],latest_checkpoint:4,latter:[0,3,6,7,8,11,13,16,17,18],lattic:12,law:0,layer:[0,4,13],lbfg:[7,9,10,11],lcc:[5,6],lda:11,ldot:[0,6,11],le:[5,7,10,13,18],lead:[0,1,3,5,6,7,8,9,10,11,12,13,16,18],leaf:9,leaki:1,leakyrelu:4,lear:13,learn:[3,4,5,6,7,8,9,10,12,16,17,20],learnabl:3,learner:10,learning_r:[3,8,10],learning_rate_init:[0,1],learning_schedul:13,least:[0,2,7,8,10,11,15,16,17,18],leat:13,leav:[0,1,3,5,6,9,11],lectur:[0,1,5,10,11,12,13,15,16,17,20],lecturenot:[0,15,17,20],lecturenovember11:[],lecturenovember12:[],lecturenovember19:[],lecturenovember25:[],lecturenovember26:[],lecturenovember4:[],lecturenovember5:[],lectureoctober14:17,lectureoctober15:17,lectureoctober1:[],lectureoctober21:[],lectureoctober22:[],lectureoctober28:[],lectureoctober29:[],lectureoctober7:[],lectureoctober8:[],lectureseptember10:[],lectureseptember16firstpart:[],lectureseptember16secondpart:[],lectureseptember17:[],lectureseptember23:[],lectureseptember24:[],lectureseptember2:[],lectureseptember30:[],lectureseptember3:[],lectureseptember9:[],lecturethursdayaugust26:[],lecturethursdayaugust27:[],left:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],leftarrow:[8,12],legend:[0,2,3,4,5,6,7,8,9,10,13],len:[0,1,2,3,4,5,6,8,9,10,11,12,16],len_index:0,length:[0,1,2,3,4,8,9,13,15],length_of_sequ:4,leq:[0,5,7,8,13,14,18],less:[0,1,3,4,5,6,8,9,13,15,18],lessen:1,let:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],letter:[0,16,18],level:[0,1,5,6,9,15,16,17],li:[8,11],lib:[0,1,2,3,4,6,7,8,11,13,14],liblinear:[8,10],librari:[0,1,2,3,4,5,6,9,10,11,16,18,20],licens:[0,1,15],lie:[0,6,11,18],life:[0,1,8,12],lifetim:13,like:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,16,18],likelihood:[0,1,5,9,13],lim_:18,limit:[0,5,6,7,8,11,12,16],lin_clf:8,lin_model:0,lin_reg:9,linalg:[0,2,5,6,8,11,13,16,18],line1:8,line2:8,line2d:13,line3:8,line:[0,1,3,6,8,11,13],linear:[1,3,5,6,7,9,10,11,12,15,17,18],linear_model:[0,5,6,7,8,9,10,11,13],linear_regress:6,linearli:5,linearloc:[6,13],linearregress:[0,6,7,9],linearsvc:8,liner:[1,3],linerar:10,linewidth:[0,2,4,6,8,9,10],link:[0,4,9,12,15],linlag:5,linpack:16,linreg:0,linspac:[0,2,3,4,6,8,9,10,13,16,18],linu:4,linuek:[],linux:[0,1,15],liquid:0,list:[0,1,2,3,4,9,15],listcomp:2,listedcolormap:[9,10],literatur:[1,7,14,20],littl:[1,3,9,12],live:8,ll:[0,18],lle:0,lloyd:[4,14],lmb:[0,2,5,6],lmbd:[0,1,3],lmbd_val:[0,1,3],lmbda:13,ln:[1,13],lo:[],load:[0,1,4,6,7,9,10],load_boston:0,load_breast_canc:[1,7,9,10,11],load_data:[3,4],load_digit:[1,3],load_iri:[8,9],loc:[0,3,6,7,8,9,10],local:[0,1,3,7,12,13],locat:[2,3,8],lock:[3,4],log10:[0,5,6],log:[0,1,2,4,5,6,7,9,10,11,13,16],log_:0,log_clf:10,logarithm:[0,5,7,16],logic:[0,1,9],logist:[0,1,2,8,9,10,11,12,15,17],logistic_predict:13,logisticregress:[7,9,10,11],logit:7,logreg:[7,9,10,11],logspac:[0,1,3,5,6],longer:[2,3,8,10,14,16,18],loocv:6,look:[0,1,2,3,4,5,6,7,8,9,10,11,13,16,18],loop:[1,4,6,10,12,14,15,16],lose:1,loss:[0,1,3,4,5,6,7,8,10,11,13,16],loss_fil:4,lossfil:4,lost:4,lot:[0,1,4,6],low:[0,6,9,10,11],lower:[0,1,3,6,9,10,16],lowercas:16,lowest:[9,13,18],lr:[1,3,4,10],lstat:0,lstm:4,lstm_2layer:4,lstsq:0,lt:6,lu:[0,5],lubksb:16,luckili:2,ludcmp:16,lux:16,lvert:1,lw:0,m:[0,1,2,3,5,6,8,9,10,11,12,13,16,17,18,19,20],m_1:14,m_:[9,12],m_h:0,m_k:14,m_l:12,m_n:0,m_p:0,m_t:13,ma:11,mac:[3,4,14],machin:[1,3,4,5,6,7,9,10,11,12,14,16,17,20],machinelearn:[0,6,15,17,20],machinelearningmurphi:17,mackai:20,made:[0,1,3,4,5,6,7,9,11,12],mae:0,magic:4,magnitud:[1,6,7,13],mai:[0,1,2,3,5,6,7,8,9,11,12,13,15,16,18],mail:17,main:[0,1,3,4,5,6,7,9,16,20],mainli:[0,5,6,7,9],maintain:6,major:[1,6,9,10,13,16],make:[1,2,3,4,5,6,7,8,11,12,13,15,16,18,20],make_axes_locat:6,make_moon:[8,9,10],make_pipelin:[0,6,10],make_vjp:[2,13],makedir:[0,6,7,9],makeplot:0,malcondit:16,malign:[1,7,9],mammographi:5,manag:[0,2,3,15],mani:[0,1,3,4,5,6,7,8,9,11,13,14,15,16,18,20],manifold:11,manner:3,manual:6,map:[0,1,2,6,7,8,11,12,14,18],margin:[0,5,8],mari:19,marit:0,marker:[0,7,16],markov:15,marsaglia:18,mask:[],mass:[0,1,5,13],massag:0,masses2016:0,masses2016ol:0,masses2016tre:0,masseval2016:0,master:[6,17],mat1100:15,mat1110:15,mat1120:15,mat3155:[],mat4155:[],mat:15,match:[0,1,4,5,13,14],materi:[4,5,7,13,16],math:[3,7,12,13,16,18,20],mathbb:[0,4,5,6,7,8,11,12,13,14,16,18],mathbf:[0,5,6,7,8,13,16],mathcal:[1,5,6,7,13],matheemat:3,mathemat:[0,6,11,12,13,15,16,17,18,20],mathrm:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,18],matmul:[1,2,5],matmul_adjoint_1:2,matmul_vjp_0:2,matmul_vjp_1:2,matnat:[17,19,20],matplotlib:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],matplotlibdeprecationwarn:[6,13],matric:[0,1,3,4,6,7,8,11,13,15],matrix:[0,2,3,4,6,7,8,10,13,18],matshow:1,matter:[2,3,13],max:[0,1,2,3,4,9,10,12,13],max_depth:[0,9,10],max_diff1:2,max_diff2:2,max_diff:2,max_it:[0,1,7,8,11,13],max_iter:14,max_leaf_nod:10,max_queue_s:[3,4],max_sampl:10,maxdegre:[0,6,10],maxdepth:10,maxim:[1,4,5,7,8,11],maximum:[0,1,2,3,5,7,8,9,10,13,14],maxpolydegre:[5,6],maxpooling2d:3,mbox:[5,6],mc:[],mcculloch:12,mcint:[],mcintsqr2:[],md:11,mdoel:4,mean:[1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,18],mean_absolute_error:0,mean_divisor:14,mean_i:18,mean_matrix:14,mean_squared_error:[0,4,6,7,10],mean_squared_log_error:0,mean_vector:14,mean_x:18,meaning:[0,4,7],meansquarederror:0,meant:[2,3,7,10,13],meantempvec:[],meanvec:[],measur:[0,1,2,5,6,9,11,12,14,18],mechan:[0,4,18],median:0,medicin:12,medium:[4,8,13],medv:0,meet:[0,19],mehta:0,memori:[3,4,11,12,13,16],mention:[0,12,13,18],mere:0,mersienn:[],meshgrid:[2,5,6,8,9,10,11],messag:[5,13],messi:2,met:[0,3,8],metadata:2,meteorolog:9,meter:6,method:[0,1,2,3,4,5,7,8,11,12,14,15,16,17,18,20],metion:6,metric:[0,1,3,6,7,9,10,14],metropoli:15,mev:[0,18],mgd:13,mglearn:15,mgrid:13,mhjensen:[1,2,3,4,6,7,8,11,14],mi:10,microsoft:20,mid:1,midel:4,midpoint:9,might:[0,1,2,4,6,9,13],mild:9,miller:[],millimet:6,million:0,mimic:12,min:[0,2,5,8,9],min_:[0,2,5,14],min_samples_leaf:9,mind:[0,6,13],mindboard:4,mine:15,mini:[1,11,12,13],minibatch:[1,11,13],minibathc:13,miniforge3:[0,1,2,3,4,6,7,8,11,13,14],minim:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],minima:[0,1,7,13],minimum:[0,1,2,6,8,9,11,13],minmaxscal:0,minor:[6,13,18],minst:1,minu:7,mirror:9,misc:6,misclassif:[8,9,10],misclassifi:[8,10],miser:0,mismatch:1,miss:[0,10],mistak:4,mit:20,mix:[1,2],mixtur:13,mk:[9,16],mkdir:[0,6,7,9],ml:[0,1,10,13,16],mlab:18,mle:[5,7],mline:[],mlir:[],mlir_graph_optimization_pass:[],mlp:1,mlpclassifi:1,mlpregressor:0,mm:16,mn:[12,18,20],mnist:[1,11],mod:18,mode:17,model:[2,3,5,7,8,9,10,11,13,14,15,18,20],model_select:[0,1,3,5,6,7,9,10,11],moder:10,modern:[0,6,7,15],modif:[2,12,13],modifi:[0,1,3,5,7,8,10,12,13],modul:[0,2,3,4,6,7,8,9,10,11,13,16],modular:18,modulenotfounderror:[7,8,9],modulo:18,moe:[5,11],moment:[5,6,13,18],monitor:13,monoton:[5,12,18],mont:[0,6,15,18,20],montecarlocycl:[],moor:[5,6],more:[0,1,2,4,5,7,8,9,10,11,12,13,14,15,17,18],moreov:[0,3],morten:19,mortenimac:[],mosek:[],most:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18],mostli:[1,11],motion:[0,13],motiv:[1,4],move:[0,4,5,6,7,9,12,13,14,18],mp4:17,mpl:[0,7],mpl_toolkit:[2,6,13],mplot3d:[2,6,13],mplregressor:1,mse:[0,4,5,6,9,10],mse_simpletre:10,mselassopredict:5,mselassotrain:5,mseownridgepredict:6,msepredict:5,mseridgepredict:[0,5,6],msetrain:5,msg:[],msle:0,mt19937_64:[],mt:[7,12],mu0:18,mu1:18,mu2:18,mu:[0,6,11,13,18],mu_:[6,18],mu_i:6,mu_n:11,mu_x:18,much:[0,1,2,3,4,5,6,8,9,10,11,12,13,16,18],mul:[],multi:[0,1,3,7,15],multiclass:[1,7],multidimension:[11,12],multilay:1,multinomi:7,multipl:[2,4,5,6,7,12,13,18],multipli:[3,5,6,11,13,16,18],multiplum:8,multivari:[0,2,10,11,15,18],multivariate_norm:[11,14],murphi:[11,17,20],must:[0,1,2,5,6,8,10,12,13,14,18],mutat:7,mutual:[1,3,6,13],mx_:18,myenv:[0,1,2,3,4,6,7,8,11,13,14],myriad:[0,15],mz1:18,mz2:18,n1:16,n2:16,n:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],n_0:[12,18],n_:[1,2,3,8,12,18],n_b:[],n_boostrap:[6,10],n_bootstrap:6,n_categori:[1,3],n_cluster:14,n_compon:11,n_epoch:13,n_estim:10,n_examples_to_gener:4,n_featur:1,n_filter:3,n_hidden:2,n_hidden_neuron:[0,1],n_i:18,n_input:[0,1,3],n_instanc:9,n_iter_i:[7,11],n_job:10,n_k:14,n_l:[12,18],n_layer:1,n_m:9,n_neuron:1,n_neurons_connect:3,n_neurons_layer1:1,n_neurons_layer2:1,n_point:14,n_sampl:[6,8,9,10,14],n_split:6,n_step:4,n_t:2,n_x:2,nabla:[1,13],nabla_:[2,13],nabla_w:13,nag:13,naimi:0,naiv:7,naive_kmean:14,nall:0,name:[0,1,3,4,5,6,7,8,9,10,12,13,14,15,16,18,19],nameerror:[6,10],namespac:[],narrow:13,nary_f:[2,13],nary_op_arg:[2,13],nary_op_kwarg:[2,13],nary_oper:[2,13],nation:[1,5],nativ:15,natur:[0,1,4,8,9,12,13,18,20],navier:12,nb:18,nb_:16,nboot:[],nd:14,ndarrai:[2,6],ndim:2,ne:[9,10,16,18],ne_xcl2ctm0:17,nearest:[1,3,6,11],nearli:13,neccesari:6,necess:2,necessari:[0,1,3,4,8,14],necessarili:[0,4,11,18],necesserali:5,neck:7,need:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,16,18],neg:[0,1,3,5,6,7,10,13,16,18],neg_mean_squared_error:6,neglect:18,neglig:18,neighbor:[3,6,11],neither:[4,13],neq:[13,14,18],nervou:12,nest:[2,9,12],nesterov:13,net:[2,4,12],netlib:16,network:[0,9,13,15,17,20],neural:[0,7,13,15,17,20],neural_network:[0,1,2],neuralnetwork:1,neuron:[1,2,3,4,12],neutral:0,neutron:0,never:[1,3,4,6,9,18],new_box:[2,13],new_root:[2,13],new_trac:[2,13],new_tracing_count:[3,4],newaxi:[0,3,6,9],newli:0,newton:[1,7,8,13,18],next:[0,1,2,3,4,5,6,8,9,13,14],next_guess:13,next_input:4,ng:1,ngini:[],ni:14,nian:[],nice:[0,1,5,11],nichola:[],nicholaskarlsen1102:[],niter:13,nitric:0,nlambda:[0,5,6],nlevel:[],nm:18,nm_n:0,nmse:6,nn:[2,5,6,12,16],nn_model:1,nnmin:2,node:[1,2,3,9,10,12],node_constructor:2,nois:[0,4,5,6,8,9,10,13],noise_dimens:4,noisi:[1,6],non:[0,1,3,4,5,6,7,9,10,11,12,13,14,16,18],none:[0,1,2,3,4,5,9,10,13,18],nonlinear:[3,6,8,9,11,12],nonneg:[6,9,13],nonparametr:6,nonsens:18,nonsingular:16,nonumb:[3,7,8,13,16],nor:[1,4,13],norm:[0,1,5,6,8,11,13],normal:[3,4,5,6,7,8,9,10,11,12,13,15,16,18],normali:16,normalize_kwarg:[],norwai:6,notat:[0,2,5,6,13,14,18],note:[0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18,20],notebook:[0,1,3,9,15],noth:[1,2,5,8,12,14,18],notic:[4,5,12,13,16,18],notimplementederror:[],notion:3,notrace_primit:[],novel:[3,6,10],novemb:1,now:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,18],nowadai:[0,1,3,9,15],nox:0,np:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],npr:2,nsampl:6,nspin:[],nt:2,nthi:0,ntrained_model:6,nu:18,nuclear:5,nuclei:[0,18],nucleon:0,nucleu:0,num:4,num_coordin:2,num_hidden_neuron:2,num_it:2,num_neuron:2,num_neurons_hidden:2,num_output:[3,4],num_point:2,num_tre:10,num_valu:2,number:[1,3,4,5,6,7,8,9,10,11,12,13,14,16,17,19],numberid:7,numberparamet:3,numer:[0,5,6,9,10,11,12,13,15,16,20],numpi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18],numpy_vjp:2,numpy_wrapp:2,nunmpi:5,nvalu:[],nx:2,nx_test:6,nx_train:6,nx_train_mean:6,ny:18,ny_pr:6,ny_train:6,ny_train_mean:6,o:[0,6,7,8,9,11,16,20],obei:[6,11,13],object:[0,1,2,4,6,8,10,13,16],objsens:[],obliqu:5,observ:[0,1,3,5,6,7,8,9,10,11,12,13,14,18],obtain:[0,1,5,6,7,8,9,10,12,13,14,16,18],obviou:[5,6,11,18],obviouli:0,obvious:[0,4,5,6,16],oc:5,occupi:0,occur:[0,6,8,9,16,18],od:0,odd:[0,3,7],odenum:2,odesi:2,oen:0,off:[1,3,4,5,9,13,18],offer:[6,11,15,16,17],offic:19,offici:17,ofil:[],ofstream:[],often:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],ofter:16,ol:0,old:[1,5,10,13],ols_sk:6,ols_svd:6,olsbeta:[0,5],omega:[2,3,6],omega_0:3,omit:[0,5],on_train_batch_begin:[3,4],onc:[1,6,9,11,13],one:[0,1,3,4,5,6,7,8,9,10,11,13,14,15,16,18],oneapi:[],onednn:[],onehot:1,onehot_vector:1,onehotencod:9,ones:[0,2,5,6,8,9,10,11,13,16,17],ones_lik:4,onl:3,onli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],onlin:[11,17],onto:[5,11],op_nam:[3,4],open:[0,1,4,6,7,9,15,17],oper:[0,1,3,5,6,10,11,12,13,15,18],operation:18,oplu:18,opmiz:13,opportun:0,oppos:[6,13],opposit:[1,5,8],opt:[1,5],optim:[0,2,3,4,5,6,7,9,10,11,14,17],optimis:[1,3],optimizer_v2:3,option:[0,1,3,5,6,7,8,11,16],optionalxlacontext:[3,4],optmiz:[1,8,13],orang:0,order:[0,1,2,3,5,6,7,8,9,10,11,12,13,16,18],ordinari:[0,2,3,7,11,13,15,17],oreilli:20,org:[0,3,4,7,11,15,16,20],organ:[6,7,10,16],orient:[1,5,18],origin:[0,3,5,6,8,11,12,13,16],orthogn:5,orthogon:[0,5,6,8,11,13,16],orthonorm:5,os:[0,1,4,5,6,7,8,9],oscar:1,oscil:[3,13],oslo:[0,15,17,19],osx:[0,15],other:[0,1,2,3,5,6,7,8,10,13,14,15,17,18,20],otherwis:[0,1,4,7,13,16],ouput:[5,7,12],our:[1,2,3,6,7,8,9,10,12,14,15,16,17,18],ourmodel:0,ourselv:[0,5,6,8,11,13],out:[0,1,2,4,5,6,7,8,9,10,11,12,13,15,16,18],out_fil:9,outcom:[0,7,9,10,12,18],outdoor:9,outer:[6,12],outfil:4,outfilenam:[],outgrad:2,outlier:[0,8],outlin:[6,10,11],outlook:9,outperform:10,output:[0,1,3,4,5,6,7,8,9,10,12,13,16,18],output_bia:1,output_bias_gradi:1,output_shap:4,output_weight:1,output_weights_gradi:1,outputlayer1:12,outputlayer2:12,outsid:4,over1:13,over:[0,1,3,4,5,6,9,10,12,13,16],overal:[1,10],overcast:9,overcom:[12,13],overdetermin:0,overfit:[0,1,3,6,9,10,13],overflow:[1,5],overhead:12,overlap:[3,7,8,9],overlin:[0,5,6,9,10,11,14,16],overst:0,overtrain:4,overview:[3,20],own:[4,5,6,8,12,13,15,16],owner:0,ownmsepredict:0,ownmsetrain:0,ownridgebeta:[0,6],ownypredictridg:0,ownytilderidg:0,oxid:0,oyvinssc:19,p0:2,p1:2,p:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],p_:[2,4,8,9],p_hidden:2,p_i:[5,18],p_j:18,p_n:18,p_output:2,p_x:18,pack:0,packag:[0,1,2,3,4,5,6,7,8,11,13,14,15,18],pad:[3,4],page:[0,15],pai:[0,1,9,13],pair:[0,2,3,9,15,18],panda:[0,4,5,6,7,9,11,15],paper:1,paradigm:0,parallel:[10,15,16],param:[2,4],paramat:2,paramet:[0,1,2,3,4,5,6,7,8,9,10,12,13,18],parameter:[0,6,10],parametr:[0,6],paramt:[3,5],parent:2,parent_argnum:[],park:[],parser:0,part:[0,1,3,5,6,10,16,17,18,20],partial:[0,1,5,6,7,8,10,11,12,13,18],particip:[15,17],particl:[0,4,13,18],particular:[0,1,2,3,5,6,9,10,11,12,13,18,20],particularli:[5,6,8,11,13,18],partit:[1,4,9],partli:6,pass:[2,3,12,14],past:[10,18],patch:[6,18],path:[0,4,6,7,9,15],patient:7,patter:4,pattern:[0,3,4,12,17,20],pauli:0,pc:[11,15],pca:[0,7,15,17],pcolor:6,pcolormesh:6,pd:[0,4,5,6,7,9,11],pde:2,pdf:[0,3,4,5,6,9,17,20],pedagog:0,penal:6,penalti:[6,13],penros:[5,6],pentagon:13,peopl:[0,1,9,13,15],per:[0,1,6,17],percentag:[0,10,11],perceptron:[0,1,7],perfect:[0,1],perfectli:[4,6],perform:[0,2,3,4,5,6,8,10,11,12,13,14,15,16,18],performac:4,perhap:[0,5,13],perimet:1,period:[1,4,18],permut:11,persist:13,person:[5,6,7,17,19],perspect:20,pertin:12,petal:[8,9],peter:20,petersen:[],phantom:18,phase:[6,12],phenomena:18,phi:8,phi_k:8,philip:[],philosophi:13,phone:19,photo:4,phrase:0,physic:[0,1,4,7,12,13,18,19,20],pi:[2,3,5,6,7,9,12,13,18],pick:[1,9,10,11,13,14],pickl:1,pictur:0,pie:15,piec:[11,14],pillow:[0,15],pinv:[5,6,13],pip3:[0,1],pip:[0,1,15],pipelin:[0,6,8,10],pit:4,pitfal:6,pitt:12,pixel:[1,3,4],pixel_height:[1,3],pixel_width:[1,3],place:[0,4,6,8,13,16],plai:[0,3,4,5,6,8,11,15],plain:[8,10,12,13,14],plan:[6,9,19,20],plane:[8,9],plateau:5,platform:15,plausibl:12,pleas:[3,4,6,7,11,13,14],plenti:1,plethora:[3,12],plot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],plot_confusion_matrix:[7,10],plot_count:6,plot_cumulative_gain:[7,10],plot_data:1,plot_dataset:8,plot_decision_boundari:[9,10],plot_import:10,plot_max:4,plot_min:4,plot_model:4,plot_numb:4,plot_predict:8,plot_regression_predict:9,plot_result:4,plot_roc:[7,10],plot_surfac:[2,6,13],plot_train:9,plot_tre:[9,10],plt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],plu:[0,3,5,7],pm:8,pmatrix:2,pn:3,png:[0,4,6,7,9],point:[0,1,2,3,5,6,7,8,9,10,11,13,14,16,18,19],point_1:4,point_2:4,poisson:[15,18],poli:[6,8],poly100_kernel_svm_clf:8,poly3:0,poly3_plot:0,poly3dcollect:13,poly_featur:[8,9],poly_features10:9,poly_fit10:9,poly_fit:9,poly_kernel_svm_clf:8,polydegre:[0,5,6,10],polygon:13,polym:12,polynomi:[0,5,6,7,8,9,10,11],polynomial_featur:6,polynomial_svm_clf:8,polynomialfeatur:[0,6,8,9],polytrop:[0,6],pool:3,pool_siz:3,poor:[1,13],poorli:0,pop:2,popul:[0,5],popular:[0,1,3,6,7,8,9,11,12,15,16,18],popularli:0,portabl:10,portion:[11,13],pose:[0,4,5,6,11,18],posit:[0,1,2,3,5,7,8,10,11,13,14,16,18],possibl:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18,19],posterior:5,postpon:0,postul:5,potenti:[0,3,5,6,12,13],potr:[],potrf:[],pott:12,power:[0,1,5,6,8,9,12,13],pp:[5,6],practic:[0,5,6,7,8,17,18],practition:[0,1,3],preced:[1,11,12,18],preceed:4,preceq:8,precis:[0,2,5,11,13,16,18],pred:[6,13],predicit:0,predict:[0,1,5,6,7,8,9,10,15,20],predict_prob:1,predict_proba:[7,10],predictor:[0,5,6,7,9,10,11],prefer:[0,1,6,8,9,11,15],prepar:[0,6,16],preprocess:[0,4,6,7,8,9,10,11],prerequisit:0,presenc:13,present:[0,5,6,9,12,13,16,17,18],preserv:[3,11,16],press:[13,20],pretrain:[1,4],pretti:[0,4,8,9,15],prev_centroid:14,prevent:[13,18],previou:[0,1,2,3,4,5,6,8,10,11,12,13,16,18],previous:[2,3,9,10,18],price:[0,4,9,13],primal:8,primari:[0,7],prime:18,primit:2,princip:[0,5,7,15,17],principl:[0,6,7,8,14],print:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16,18],print_funct:[8,9],printout:0,prior:[0,5,6],privat:0,prob:[1,18],probabilist:[0,20],probabl:[0,1,3,4,6,7,10,13,15,17],problem:[0,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18],proce:[0,5,6,8,9,10,11,13,16],procedur:[2,4,5,6,8,10,11,13],proceed:16,process:[0,2,4,6,9,10,12,13,15,16,18,20],prod:20,prod_:[1,5,7],produc:[0,3,4,5,6,9,10,11,12,13,15,16,18],product:[0,1,3,5,6,7,8,12,13,15,16],profess:0,program:[0,1,4,5,6,8,12,14,15,16,17,18],programm:16,progress:[1,4,14],prohibit:6,project1:6,project:[0,1,2,3,5,11,13,15,17,19],project_root_dir:[0,6,7,9],promin:12,promis:8,prone:9,pronounc:[13,15],proof:[0,11,12,13],propag:[2,3,13,17],proper:[0,2,6],properli:[1,6,8,10,13],properti:[0,1,3,12,13,16],proport:[0,1,5,9,11,13,18],propos:[1,4,6,10],propto:[5,13],protect:[3,4],proton:0,prove:[3,13],provid:[0,1,3,4,5,6,8,9,10,12,13,15,16,18,20],proxi:[1,13],prune:9,pseudo:[16,18],pseudoinv:5,pseudoinvers:[5,6],pseudorandom:[6,18],psycholog:0,pt:13,ptratio:[],punish:[0,1],pure:[3,9,18],purest:9,puriti:9,purpos:[0,3,10,12,14],put:1,putarow:[],putboundslic:[],putclist:[],putobjsens:[],putqobj:[],py:[0,1,2,3,4,5,6,7,8,11,13,14],pydata:15,pydot:9,pylab:[0,7],pylint:[3,4],pypi:15,pyplot:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],pythagora:5,python2:0,python3:[0,1,2,3,4,6,7,8,11,13,14,15],python:[1,2,3,4,5,6,8,11,12,13,14,17,18],pytorch:[0,15],pywrap_tf:[3,4],q:[5,6,8,11,18],qp:8,qquad:[2,11,13,16],qr:[5,6,16],quad:[1,13,16],quadrat:[0,8,9,13],qualit:[4,9,18],qualiti:[0,9,15],quantifi:1,quantil:10,quantit:[0,6,9],quantiti:[0,2,5,6,7,9,10,11,12,14,16,18],quantum:[4,12],quartil:0,quench:5,queri:9,question:[0,5,6,9,11,12,13],qugan:4,quick:[4,18],quick_execut:[3,4],quickli:[1,3,9,11,13],quit:[1,5,6,9,10,12],quot:4,r2:[0,5,6],r2_score:0,r2score:0,r:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],r_1:9,r_2:9,r_j:9,r_m:9,rad:0,radial:[0,8,12],radioact:18,radiu:[0,1],rag:2,rain:9,rais:[0,2,13],ramp:1,ran0:18,ran1:18,ran2:18,ran3:18,rand:[0,4,5,6,9,10,13,16],rand_max:[],randint:[6,9,13],randn:[0,1,2,5,6,9,11,13],random:[0,1,2,3,4,5,6,8,9,13,14,15,16,17],random_devic:[],random_forest_model:10,random_index:13,random_indic:[1,3],random_st:[0,7,8,9,10,11],randomforestclassifi:10,randomli:[1,6,9,13,14],randomnumbergener:[],rang:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,16,18],rangl:[0,6,11,18],rangle_x:18,rank:5,rankdir:4,raphson:[1,8,13],rapidli:0,rare:[1,13],rate:[0,1,2,3,4,8,9,10,12,13],rather:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,16,18],ratio:[4,7,9,10,11],rational:0,ravel:[5,6,7,8,9,10,11,13,16],raw:3,raw_df:[],rbf:[8,11,12],rbf_kernel_svm_clf:8,rbf_pca:11,rc:[0,18],rcond:0,rcparam:[0,1,3,7,8,9,10,18],rd:[],re:[2,4,13],reach:[1,4,5,6,7,9,10,11,12,13,14],read:[0,2,3,4,5,6,7,8,11,12,16,17,18,20],read_csv:[0,6,7,9],read_fwf:0,reader:[0,6,16,18],readi:[0,1,5,6,8,10,11,12,16],readili:1,readthedoc:15,real:[0,1,2,4,7,10,11,12,13,16],real_loss:4,real_output:4,realist:8,realiti:18,realiz:[1,12],realli:[0,1],rearrang:13,reason:[0,1,3,4,10,13,20],reassign:1,rebuild:[],recal:[5,6,9,10,11,12,16,18],recalcul:[],recast:3,receiv:[1,3,10,12,18],recent:[0,2,3,4,6,7,8,9,10,13],recept:[3,12],receptive_field:3,recip:[0,6,7,16],reciproc:5,recogn:[0,4,5,10],recognit:[0,1,3,12,17,20],recommend:[0,2,3,4,5,6,8,13,15,16,17,20],reconsid:9,reconstruct:11,record:[10,17],recreat:[],rectangl:[9,13],rectangular:5,rectifi:[1,3,12],recur:[0,15],recurr:[0,1,15,17],recurs:[9,15,16],recycl:[],red:[0,3,4,6,8,9],redefin:[0,10],reduc:[1,3,5,6,9,10,11,13],reduct:[0,10,11,15,18],refer:[0,1,2,3,5,6,7,11,12,13,14,16,20],referenc:2,refin:12,refit:6,reflect:[0,1,4,5,18],refresh:[15,17],reg:[10,11],regard:[1,9,13],regardless:12,region:[3,4,6,9,12],regist:[6,18],reglasso:5,regr_1:[0,9],regr_2:[0,9],regr_3:[0,9],regress:[1,8,11,12,15,16,17],regressor:[0,7,10],regridg:[0,5,6],regular:[0,3,4,5,6,7,9,13],regularis:6,reilli:[0,20],reinforc:[0,8,15],reiter:1,rel:[0,4,6,7,9,12,13,18],relat:[0,1,3,4,5,11,13,14,16,18],relationship:[0,4,9],relativeerror:0,releas:[1,3,4,6,13,15],relev:[0,1,5,7,11,15,17,18],reli:[0,6,8],reliabl:[7,18],relu:[3,4],remain:[1,2,4,6,12,16,18],remaind:18,reman:2,remark:1,rememb:[0,8,13,16],remind:[0,5,11,13,16,17,18],remov:[0,4,5,6],render:0,reorder:[5,7],reorgan:0,repeat:[0,1,3,4,5,6,9,10,11,13,14,16,18],repeated:0,repeatedli:[6,10,13],repet:3,repetit:[6,17],rephras:13,replac:[0,1,3,4,5,6,10,12,13,14,15],replica:6,repositori:[0,4],repres:[0,1,2,3,4,5,6,7,8,9,10,12,13,18],represent:[0,1,3,6,18],representd:3,reproduc:[0,5,6,9,12,15,18],repuls:0,request:[0,13],requir:[0,1,3,4,5,6,8,9,11,12,13,16],res1:2,res2:2,res3:2,res_analyt:2,res_analytical1:2,res_analytical2:2,res_analytical3:2,resaml:6,resampl:[0,7,10,15,17],rescal:[0,11,12],rescu:5,reseach:6,research:[0,4,15,20],resembl:[6,18],reserv:[1,5,6,18],reset:[],reshap:[0,1,2,3,4,6,8,9,10,16],residenti:0,residu:[0,5,13],resiz:5,respect:[0,1,2,3,5,6,7,8,10,11,12,13,14,18],respond:12,respons:[0,7,9,12],rest:[0,5],restat:[0,12],restor:4,restored_discrimin:4,restored_gener:4,restrict:[0,3,9,12],result:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],result_typ:[],retail:0,retain:[5,6],return_data:14,return_kwarg:[],return_sequ:4,return_x_i:9,reus:[1,3,6],reveal:[0,12],revers:[1,16],review:[15,16,17],revisit:14,reward:[0,4],rewrit:[0,3,5,6,7,8,10,11,12,13,16,18],rewritten:[2,6,8,10,18],rewrot:13,rf:10,rgb:3,rgoj5yh7evk:15,rh:6,rho:[0,10],rho_1:10,rho_2:10,rho_m:10,rich:0,ride:9,rideclass:9,ridedata:9,ridg:[7,11,13,15,17],ridge_sk:6,ridgebeta:5,right:[0,1,2,3,5,6,7,8,9,10,12,13,14,16,18],right_sid:2,rightarrow:[0,1,5,6,8,11,12,13,18],rigor:0,ring:6,rise:0,risk:[0,13],rival:4,river:0,rm:[0,18],rmse:0,rmsporp:13,rmsprop:[1,3,4,13],rnd_clf:10,rng:18,rnn1:4,rnn2:4,rnn:[4,12,17],rnn_2layer:4,rnn_input:4,rnn_output:4,rnn_train:4,rntrick1:18,rntrick2:18,rntrick3:18,rntrick4:18,ro:[0,13],robert:20,robust:0,robustscal:0,roc:10,role:[0,2,5,6,8,15],roll:6,room:[0,19],root:[0,5,9,13,18],rotat:[1,8,9,10],rotation_matrix:9,roughli:[1,3],round:[0,7,9,13],routin:[13,16],row:[0,1,2,5,6,7,9,11,16],rr:5,rrr:5,rthe:5,rug:13,rule:[0,1,5,6,13],run:[0,1,2,3,4,5,6,8,9,11,13,15],runtim:[1,6,14],runtimewarn:[1,6],rust:[0,15,16],rustad:19,rvert:1,rvert_2:1,s:[0,1,2,3,4,5,6,7,9,11,12,13,15,16,17,18,19],s_1:6,s_:[3,6],s_i:[6,7],s_j:6,s_k:6,saddl:13,safe:[],sai:[0,1,2,3,4,5,6,7,8,9,10,11,12,16,18],said:[6,9,13],sake:[0,5,7,11],sale:0,same:[0,1,2,3,4,5,6,8,9,11,12,13,14,16,18],samm:10,sampl:[0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,18],sample_vari:14,sample_weight:[3,4],sampleexptvari:18,sastri:11,satisfactori:0,satisfi:[1,2,3,6,8,13,16,18],satur:[1,6],save:[0,4,6,7,9],save_fig:[0,6,7,9,10],savefig:[0,4,6,7,9,18],savetxt:4,saw:5,scalabl:10,scalar:[2,5,6,10,13],scale:[0,1,3,5,6,7,8,9,10,11,12,13,15,16,19],scale_mean:4,scale_std:4,scalei:[],scaler:[0,7,8,9,10,11],scalex:[],scan:[5,7],scari:5,scatter:[0,1,6,7,8,9,14],scenario:[6,13],schedul:13,scheme:[1,13],schrage:18,scienc:[0,1,10,12,13,15,17,18,20],scientif:[0,15],scientist:0,scikit:[3,5,6,7,8,9,10,13,15,16,17,20],scikit_learn:0,scikitplot:[7,10],scipi:[0,3,5,6,13,15,16],scl:6,score:[0,1,3,6,7,9,10,11,19],scores_kfold:6,scratch:1,sdg:13,seaborn:[0,1,3,6,7],seamless:[0,15],search:[0,1,3,5,9,13],sec:6,second:[0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,18],secondeigvector:11,secondli:12,section:[4,11,16,17,18],sector:0,see:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18],seed:[0,1,2,3,4,5,6,8,9,11,13,14,18],seed_imag:4,seek:[1,2,8],seem:[1,3,4],seemingli:0,seen:[0,1,3,5,10,12,18],segment:13,seismic:6,seldomli:0,select:[1,5,6,8,9,10,11,17,18,20],self:[1,3,4,5,20],sell:4,semest:[7,17],semi:[8,13],semilogx:6,send:[5,12,13,19],senior:17,sens:[0,4,6,8],sensibl:3,sensit:[0,5,6,9,13],sent:2,sentenc:[4,12],sep:[],separ:[0,1,2,4,6,8,9,12,14,15,18],sequenc:[2,3,4,7,9,10,12,13,15,16,18],sequenti:[1,3,4,10,12,18],seri:[0,1,2,3,4,5,6,10,11,12,13,16,17],serif:[0,7,18],serv:[0,1,2,3,5,7,13,20],session:[1,17],set:[1,4,5,6,7,8,10,11,13,14,15,16,18],set_major_formatt:6,set_major_loc:6,set_stream:[],set_tick:[1,8],set_ticklabel:1,set_titl:[0,1,2,3,7,12,14],set_xlabel:[0,1,2,3,7,12],set_xlim:[7,12],set_xticklabel:1,set_ylabel:[0,1,2,3,7],set_ylim:[7,12],set_ytick:7,set_yticklabel:[1,6],set_zlim:6,seth:4,setiosflag:[],setminu:6,setosa:[8,9],setosa_or_versicolor:8,setp:6,setprecis:[],setse:[],setup:[1,4,6,8,15],setw:[],sever:[0,3,5,6,7,8,9,11,12,13,15,16,17,18],sgd:[1,3],sgd_clf:8,sgdclassifi:8,sgdreg:13,sgdregressor:13,sgn:5,sh:[],shallow:13,shape:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,16],share:[1,3],she:7,shift:[1,6,12,18],ship:3,shortcom:13,shorten:4,shorter:18,shortli:16,should:[0,2,3,5,6,8,9,11,12,13,16,18],should_sync:[3,4],show:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],show_shap:4,shown:[0,4,5,7,8,11,12,13,16],showpoint:[],shrink:[3,5,6,8,11],shrinkag:[5,6],shrunk:11,shuffl:[0,1,3,4,6,13],side:[0,2,5,8,12,13,16],sigh:15,sigma0:18,sigma1:18,sigma2:18,sigma:[0,1,5,6,7,10,11,12,13,16,18],sigma_0:5,sigma_1:5,sigma_2:5,sigma_:[5,16],sigma_fn:[7,12],sigma_i:[0,5],sigma_j:5,sigma_m:[6,18],sigma_n:[11,18],sigma_t:13,sigma_x:18,sigmoid:[1,2,4,7,8,10,12,13],sigmundson:[6,19],sign:[1,2,7,8,10,18],signal:[1,3,10,12],signatur:[3,4],signifi:4,signific:1,significantli:[1,13,18],sigurd:19,sim:[4,5,6,13,18],similar:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16],similarli:[0,1,3,5,8,10,18],simpl:[1,2,3,5,6,7,8,10,11,12,14,15,16,18],simple_rnn:4,simplepredict:10,simpler:[0,1,5,6,13,15],simplernn:4,simplest:[0,1,3,4,9,10,12,14],simpletre:10,simpli:[0,1,2,4,5,6,8,9,10,11,12,15,16,18],simplic:[2,5,6,7,8,9,10,11,12,14],simplicti:5,simplifi:[0,6,9,15],simplist:[3,6,18],simul:6,simultan:6,sin:[0,1,2,3,4,9,12,13,16],sinc:[0,1,2,3,5,6,7,8,9,10,11,13,16,18,20],sine:[3,12],singl:[0,1,2,3,5,6,7,8,9,12,13,16,18],singular:[0,6,13,16,17],sinusoid:3,site:[0,1,2,3,4,6,7,8,11,13,14,17],situat:[0,4,5,7,13,18],six:[3,18],size:[0,1,2,3,4,5,6,8,9,10,11,13,16,18],sketch:10,ski:9,skill:0,skip:[3,4,11],skiprow:[],skl:[0,6],sklearn:[0,1,3,5,6,7,8,9,10,11,13,14],skplt:[7,10],sl:6,slack:8,slice:[2,16],slide:[0,3,18],slight:[6,13],slightli:[1,2,3,5,6,7,10,18],slope:[8,11,12],slow:[0,2,8,13],slower:[5,16],slowest:16,slowli:12,slp:1,small:[0,1,2,3,5,6,8,9,10,11,12,13,15,16,18],smaller:[0,1,2,5,6,8,9,11,13,18],smallest:[0,4,14],smallest_row_index:14,smooth:[0,3,6,13],sn:[0,1,3,6,7],sne:11,so:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18],soar:6,social:0,soft:[1,7,10,12],soften:8,softmax:[3,7],softwar:[0,8,15,16,17],sol:8,sole:[0,6],solid:[0,7],solitem:[],soltyp:[],solut:[0,1,2,3,5,6,8,10,11,13,16,18],solutionsummari:[],soluton:2,solv:[0,1,3,5,6,8,10,11,12,13,16,17],solve_expdec:2,solve_ode_deep_neural_network:2,solve_ode_neural_network:2,solve_pde_deep_neural_network:2,solveod:2,solveode_popul:2,solver:[2,7,8,9,10,11,16],some:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,17,18],some_model:6,somehow:4,someth:[0,1,3,4,7,9,11,18],sometim:[0,1,11,12,13,14],soon:16,sophist:0,sopt:13,sort:[5,6,9,11,18],sound:[3,5],sourc:[0,1,3,6,15,16,18],space:[0,1,4,5,8,9,11,12,13,14,18],span:[0,3,5,9,11,16],spare:1,spars:[3,6,16],sparse_mtx:16,sparsecategoricalcrossentropi:3,sparsiti:10,spatial:[1,2,3,12],spdiag:[],speak:18,special:[6,7,10,12,13,16,18],specif:[0,1,2,3,4,5,6,7,8,9,11,12,15,16,18],specifi:[0,3,5,6,7,9,11,13,14,18],specifici:[0,10],spectacular:3,spectral:1,speech:[0,1,3,4,12],speed:[1,2,4,13],spend:18,sphere:0,spin:6,spite:0,spline:8,split:[1,3,4,5,6,8,9,10,11,14,18],splite:0,splitter:[1,10],spmatrix:[],spontan:18,spot:3,spread:[0,11,18],springer:20,spuriou:13,sqquar:5,sqrsignal:3,sqrt:[0,3,4,5,6,8,10,11,13,18],squar:[1,2,3,4,7,8,9,11,13,14,15,16,17,18],squarederror:10,squaredeuclidean:14,squash:12,squeez:2,srand:[],srtm:6,srtm_data_norway_1:6,sse4:[],stabil:5,stabl:[0,4,5,6,7,9,11,15],stack:[2,3,4],stacklevel:0,stage:[5,13],stai:[0,2,4,5,11],stand:[0,5,9,12],standard:[0,1,4,5,6,7,8,10,12,16,18],standard_basi:2,standardscal:[0,6,7,8,9,10,11],stanford:13,start:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,16,17,18],start_box:[2,13],start_nod:[2,13],start_tim:14,startpoint:[],stat:6,state:[1,2,4,5,6,7,8,10,11,12,13,15,18],statement:[0,7,16],statist:[0,1,3,4,7,9,10,11,12,13,14,16,17,20],statu:[0,7,11],stavang:6,std:[0,4,6],stdev:[],stdout:[],steep:13,step:[0,1,2,3,4,6,7,9,10,11,12,13,14,16],step_fn:[7,12],step_length:13,steps_list:9,steps_per_epoch:[3,4],stereo:3,stian:19,still:[0,2,3,5,6,11,13,18],stimuli:12,stk2100:20,stk3155:17,stk4021:20,stk4051:20,stk4155:17,stk5000:20,stk:20,stochast:[0,1,5,6,8,11,12,17],stock:4,stoke:12,stone:[0,7],stop:[1,4,7,9,11,13,14],storag:5,store:[0,1,2,3,6,11,13,18],storehaug:19,str:[1,3,4],straight:[0,6,8,13],straightforward:[0,2,3,5,6,8,9,10,13,16],strategi:[0,1,9],stratifi:6,streamtyp:[],strength:[0,5,14],stretch:11,strict:[8,13],strictli:[8,13],stride:[4,16],strike:6,string:1,stroke:7,strong:[3,6,9,10,12,16,18],strongli:[0,8,15,16],stronli:0,structur:[0,1,2,3,6,9,10,12,15],stuck:[1,13],student:[0,17,19,20],studi:[0,3,4,5,6,7,8,11,12,13,15,20],studier:[17,20],style:[0,7,9,16],sub:[9,12],subarg:[2,13],subdivid:[0,16],subfield:0,subject:[6,8,18],subplot:[0,1,3,4,6,7,8,9,10,13,14],subplots_adjust:[8,18],subprogram:16,subract:0,subroutin:0,subscript:1,subsequ:[1,4,5,6,12,16,18],subset:[1,6,9,12,13,15],subspac:[0,8,11],substanti:[9,10],substep:11,substitut:[3,6,12,16],subsubset:9,subtask:6,subtl:1,subtract:[0,4,5,6,11,13,16,18],subtre:9,subval:[2,13],succeed:[0,4],success:[3,7,9,13,18],successfulli:[4,9],sucess:[],sudo:[0,15],suffer:[0,1,2,5,10],suffici:[1,6,8,11,13],suggest:[1,13,20],suit:[8,12],suitabl:[0,18],sum:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],sum_:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,18],sum_i:[0,2,5,6,8,13],sum_j:6,sum_ja_:0,sum_k:[6,8,12,16],sum_m:3,sum_n:3,sum_nx_:3,summar:[5,6,9],summari:[1,3,4,10,17],summat:[0,3],sunni:9,superfici:3,superscript:[1,12],supervis:[0,5,6,7,9,12,15],supplement:7,support:[0,1,9,10,11,13,15,17],suppos:[0,5,6,7,8,10,11,12,13,16],suppress:[5,13],sure:[0,1,4,6],surf:6,surfac:[0,6],surpass:6,surpris:0,surround:[3,15],survei:[0,5,6],suyrzm0:17,svc:[8,9,10],svd:[0,6,11,17],svdinv:5,svm:[8,9,10,11],svm_clf:[8,10],swap:2,swapax:2,swath:5,sy:13,symbol:[1,5,11,13,15,18],symmeteri:1,symmetr:[0,5,8,11,12,13,16],symmetri:6,sympi:[0,15],synonim:18,syntax:[1,13],syntaxerror:1,syrk:[],system:[0,1,3,4,6,7,9,10,12,13,15,16,20],systemat:[4,6],t0:[3,6,13],t1:[2,13],t2:2,t3:2,t:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],t_0:[2,9,13],t_1:13,t_:2,t_b:10,t_i:[1,2,12],t_j:[5,12],t_k:9,tabl:[9,18,19],tabul:0,tackl:4,tag:[2,3,4,5,6,7,12,13,14,16,18],taht:0,tail:18,tailor:[2,8,11],taiwan:0,take:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,18],taken:[0,1,3,6,10,13,16],tan:3,tangent:[1,4,12,13],tanh:[1,4,7,8,12,13],tape:[3,4],target:[0,1,3,4,5,6,7,8,9,10,11,12,13],target_nam:9,task:[0,1,3,6,9,11,12,14],tau:[3,5,18],tax:0,taylor:[2,13],taylornr:13,tc:8,team:1,teaser:0,technic:[0,5,6,13],techniqu:[0,1,8,10,13,15,17,18,20],technolog:[0,1],tek5040:20,tell:[0,4,6,10,11,13,18],temp1:1,temp2:1,temp:1,temperatur:[0,9],temporarili:1,ten:3,tend:[3,5,6,8,9,10,12,13,14],tendenc:0,tension:6,tensor:[3,4],tensorflow:[0,2,4,8,14,15,16,17,20],term1:[5,6,11],term2:[5,6,11],term3:[5,6,11],term4:[5,6,11],term:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18],termin:[0,4,5,9,10,13],terrain1:6,terrain:6,test:[3,4,5,6,7,8,9,10,13,14,16,18],test_acc:3,test_accuraci:[1,3],test_error:6,test_imag:[3,4],test_ind:6,test_input:4,test_label:[3,4],test_loss:3,test_pr:1,test_predict:1,test_rnn:4,test_scor:[7,10],test_siz:[0,1,3,5,6,10],test_split:9,testerror:[0,6],testi:4,testpredict:4,testx:4,text:[0,1,2,4,5,8,9,11,13,16,17,18,20],textbook:17,textual:9,textur:1,tf:[1,3,4,13,14],tfe_py_execut:[3,4],th:[0,1,2,5,6,7,9,12,13,14,16,18],than:[0,1,2,3,4,5,6,7,9,10,11,12,13,15,18],thank:[4,6],theano:[1,15],thei:[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18],them:[0,1,3,4,6,8,9,10,11,12,13,16],theme:0,themselv:[0,18],thenc:6,theorem:[2,6,7],theoret:[0,4,10],theori:[0,1,3,8,9,12,13,15,17,20],thereaft:[0,5,6,11,12,16],therebi:[0,5,7,11],therefor:[0,1,2,3,4,6,7,8,11,13,18],therein:11,thereof:[0,6,13],theta:[1,4,13,18],theta_:[1,13],theta_i:1,theta_k:[],theta_linreg:13,theta_t:13,thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],thing:[0,1,2,4,5,7,9,18],think:[0,1,3,4,6,9,12,13,14,18],third:[0,3,6,13],thirti:7,those:[0,3,5,6,8,9,10,11,16,17],though:[1,2,3,4,13,16,18],thought:[6,14,18],thousand:[0,1],thread:[3,4],three:[0,1,3,5,6,8,9,12,16,17,18,19],threshold:[1,3,9,10,11,12,13],through:[0,1,2,3,4,5,6,8,11,12,13,14,15,16,18],throughout:[0,4,5,14,15,16,18],thu:[0,1,2,5,6,7,8,10,11,12,13,19],thumb:[0,6],thursdai:17,tibshirani:[6,17,20],tick_param:6,ticker:[6,13,18],tif:6,tight_layout:[1,7],tightli:11,tild:[0,5,6,11,18],till:[0,4,7,8,9,10,12,16],time:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],timefunct:[],timeit:4,timer:4,tini:1,tip:3,titl:[0,1,2,3,4,6,7,8,9,10,13,18],tmp:13,tmp_log:[3,4],tn:[2,3],to_categor:[1,3,4],to_categorical_numpi:1,to_numer:[0,6],to_str:[],todai:3,togeth:[0,3,6,8,11,15],toi:[13,14],told:13,toler:[2,6,14],tolist:4,tomographi:12,too:[0,2,4,5,6,9,11,13,18,20],took:8,tool:[0,1,3,6,13,15],toolbox:8,top:[0,3,5,6,9,10,15],top_node_typ:2,top_trac:2,topic:[0,5,6,7,8,15,17,20],topolog:[1,3,12],toposort:2,torkjellsdatt:19,toss:[10,18],total:[0,1,2,3,4,6,7,8,10,11,12,13,14,16,18,19],total_loss:4,totalclustervari:14,totalscatt:14,totalvari:[],toward:[1,2,7,12,13],town:0,tp:4,tpng:9,tpu:15,tqdm:6,tr:[],trace:[2,13],trace_stack:[2,13],traceback:[0,2,3,4,6,7,8,9,10,13],traceback_util:[3,4],tracer:[2,13],track:[3,13,14,16],tract:0,tractabl:0,trade:[5,9],tradeoff:[0,5,17],tradit:[0,1,4,6],train:[2,3,5,6,8,9,10,11,12,13],train_accuraci:[0,1,3],train_dataset:4,train_end:[0,1],train_error:6,train_funct:[3,4],train_imag:[3,4],train_ind:6,train_label:[3,4],train_pr:1,train_siz:[0,1,3],train_step:4,train_test_split:[0,1,3,5,6,7,9,10,11],train_test_split_numpi:[0,1],trainabl:4,trainable_vari:4,trained_model:6,trainerror:0,traini:4,training_checkpoint:4,training_dataset:4,training_gradi:13,training_gradient_fun:13,training_loss:13,trainingerror:6,trainpredict:4,trainscor:4,trainx:4,trait:0,trajectori:4,tran:[],transfer:9,transform:[0,5,6,7,8,9,10,11,12,13,15,16],transit:[6,12],translat:[1,4,6,10],transpos:[1,5,11,16],travers:[0,5],treat:[0,1,3,6,12,13,18],tree:[0,1,6,15,17],tree_clf:[9,10],tree_clf_:9,tree_clf_sr:9,tree_reg1:9,tree_reg2:9,tree_reg:9,trend:18,trevor:20,tri:[2,3,4,9,13],triain:0,trial:[0,2,4,6,13,18],triangl:13,triangular:16,trick:[3,4,8,11,13,18],trickier:18,tridiagon:16,trillion:15,trivial:[0,1,5,11,18],troubl:[0,8,12],truck:3,true_beta:6,true_divid:1,true_fun:6,tucker:8,tumor:[7,9],tumour:7,tunabl:1,tune:[4,9,13,16],tup:[],tupl:[2,13],turn:[0,1,5,6,7,8,9,10,11,12,13,16,18],tutori:[1,4],tv:2,tveito:2,tweak:[1,4,10,18],twice:13,twist:11,twister:[],two:[0,1,2,4,5,6,7,9,10,11,12,13,16,17,18,20],tx:13,tx_1:13,txt:4,ty:13,type:[0,1,3,6,8,10,13,16,18],typeerror:[2,13],typic:[0,1,2,3,4,5,7,9,10,12,13,18],u:[0,2,5,6,10,11,12,16],u_:16,u_i:12,u_m:10,ua:0,ubuntu:[0,15],uci:0,uio:[17,19,20],un:14,unari:16,unary_f:[2,13],unary_oper:[2,13],unary_to_nari:2,unbalanc:[6,9],unbias:[0,5,6],uncent:6,uncertainti:[0,5],uncertitud:18,unchang:[1,3],uncorrel:[10,18],undefin:5,under:[0,1,5,6,10,13,15],underdetermin:0,underfit:[1,6],underflowproblem:5,undergo:5,undergradu:17,underli:[0,1,9,13,18],underset:[4,14],understand:[0,1,3,5,6,10,13,14,15],understood:[8,13],undesir:8,undetermin:[5,8],undo:4,unexpect:6,unexpected:18,unfair:6,unfortun:[1,8,9,10],unicode_liter:[8,9],uniform:[0,1,5,6,11,13,18],uniform_real_distribut:[],uniformli:[13,18],unifrompdf:18,unimport:13,union:[5,6],uniqu:[0,2,6,13,14,16],unique_cluster_label:14,unit:[0,1,3,4,5,10,12,18],unitari:[5,6,16],unitarili:16,uniti:18,univari:18,univers:[0,1,2,13,15,17,19],unix:1,unknow:[0,16],unknown:[0,1,3,4,5,6,8,10,16],unknowwn:12,unlabel:1,unless:[0,3,6,11,13],unlik:[1,3,8,13],unnecessarili:9,unord:3,unravel:1,unrol:[3,11],unseen:[0,7,9],unstabl:1,unsupervis:[0,1,4,12,15,17],unsymmetr:16,until:[1,2,4,9,12,13,14],untouch:0,unusu:12,up:[1,3,4,5,6,8,10,11,13,14,15,16,17,18],updat:[1,2,10,12,13,14],upload:[15,20],upon:[0,1,6,11,16],upper:[0,8,9,16],uppercas:16,upsampl:4,upscal:4,us:[4,5,6,8,9,10,11,12,14,16,17,18,20],usag:[0,8,15],usd10000:0,usd:0,use_bia:4,use_multiprocess:[3,4],usecol:0,useless:1,user:[0,1,2,3,4,6,7,8,11,14,15,16],userwarn:[3,4,6,14],usetex:18,usg:6,usr:18,usual:[0,3,4,7,12,13,14],ut:5,util:[0,1,3,4,6,7,10,14],ux:16,v0:18,v1:18,v2:18,v:[2,4,5,6,11,13,15],v_0:11,va:1,val:13,val_accuraci:3,val_loss:4,vale:2,valid:[0,1,4,7,9,10,13,15,17,18],validation_batch_s:[3,4],validation_data:[3,4],validation_freq:[3,4],validation_split:[3,4],validation_step:[3,4],valu:[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,17],valuat:9,valueerror:[0,2],valy:4,van:0,vandenbergh:[8,13],vandermond:0,vanilla:[0,6,11,14],vanish:[1,4,13,18],var_x:18,varabl:8,varepsilon:[5,6],varepsilon_:[5,6],varepsilon_i:[5,6],vari:[0,1,3,5,6,10],variabl:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16],varianc:[0,1,5,7,9,10,11,13,14,15,16,17,18],variance_i:[5,11],variance_x:[5,11],variant:[0,1,6,8,12,13],variat:[3,4,11],varieti:[0,3,12,15],variou:[1,3,5,6,7,8,9,11,12,13,15,16,18],vartempvec:[],varvec:[],varydimens:4,vastli:3,vaue:1,vault:0,vdot:[2,13],vec:6,vector:[0,1,2,3,4,5,6,7,9,10,11,13,14,15,17],vector_mean:14,ventur:[0,8,15],verbos:[1,3,4],veri:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,20],verifi:[3,11,16],versatil:8,versicolor:[8,9],version:[0,3,4,10,13,14,15,16,18],versu:1,vert:[0,1,5,6,7,8,9,11,13],vert_1:[5,6],vert_2:[5,6,11],via:[0,5,6,7,8,9,10,11,12,15,16,17,18],vidal:11,video:[0,1,12,15,17],view:[1,3,5,6,12,13,17,18,20],violat:8,virginica:9,viridi:[0,1,2,3],virtual:1,viscos:13,viscou:13,visibledeprecationwarn:2,vision:[0,3],visual:[0,3,11,12,15],visualis:1,viz:[6,8,18],vjp:[2,13],vjp_0:[],vjp_0_fun:[],vjp_1:[],vjp_1_fun:[],vjp_argnum:[],vjpfun:2,vjpmaker:[],vjpnode:[2,13],vmax:[1,6],vmc:[],vmin:[1,6],voic:3,volum:[0,3],vote:10,voting_clf:10,votingclassifi:10,votingsimpl:10,vrtx:17,vs:[0,4,6],vspace:[2,13],vstack:[5,11,16,18],vt:5,w1:8,w2:[8,11],w3:8,w:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],w_1:[8,16],w_1x_1:8,w_1x_:8,w_2:[8,16],w_2x_2:8,w_2x_:8,w_3:16,w_4:16,w_:[1,12],w_hidden:2,w_i:[1,2,10],w_ix_i:12,w_j:16,w_m:16,w_output:2,w_px_:8,w_px_p:8,wa:[0,1,3,4,5,6,7,10,11,12,13,14,16],wai:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,16,18],walk:9,walker:18,wang:0,want:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,18],warn:[1,3,4,8,14],warrant:6,wast:3,watch:[3,4,15],wave:3,wavelet:8,we:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],weak:[9,10,14],weather:[1,12],web:[15,17],webpag:17,websit:[6,16,17],wedg:[8,18],wednesdai:17,wee:11,week:[0,5,6,7],weekli:[15,20],weight:[0,1,2,3,6,7,9,10,12,13,18],weigth:2,welcom:[8,15],well:[0,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,20],went:8,were:[0,1,3,4,5,6,7,8,10,11,12,14,18],wessel:0,westbi:19,westby:19,what:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],whatev:3,when:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],whenev:[13,18],where:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19],wherea:[6,18],wherein:[1,12],whether:[0,3,5,7,9,18],which:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],whichev:[1,3],white:9,who:[0,17],whole:[1,3,4,5,9,11,13],whose:[0,6,10,18],whow:[5,11],why:[0,1,3,6,13],wide:[0,1,3,6,7,12,15,16],widehat:6,width:[0,3,8,9],wieringen:0,win:10,wind:9,wing:19,winther:2,wiothout:6,wiscons:7,wisconsin:10,wisdom:6,wise:[0,1,5,12,13],wish:[0,2,5,7,8,11,13,14,16],with_std:0,wither:6,within:[0,2,3,4,7,9,12,13,14,18,20],withinclust:14,without:[0,1,5,6,8,9,11,12,13],won:0,wonder:8,word:[0,1,3,4,5,6,14,18],work:[0,1,4,6,7,8,9,13,15,17,18],worker:[3,4],workshop:17,world:[0,8],worldwid:0,wors:[0,1,3,4,6],worst:[],worth:9,would:[0,1,3,5,6,7,8,9,10,11,12,13,16,18],wrap:[2,6,16,17],wrap_util:[2,13],wrapper:0,write:[0,1,2,3,5,6,7,8,12,13,16],written:[0,2,3,5,11,12,13,15,16,18],wrong:[1,8],wrongli:10,wrote:[5,11],wrt:[2,10,13],wth:10,www:[15,16,17,20],wx_1:8,x0:8,x1:[4,8,9,10,13],x1_exampl:8,x1d:8,x2:[8,9,10,13],x2d:[8,11],x2d_train:11,x2dsl:11,x3:8,x:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],x_0:[0,5,11,16],x_1:[0,2,5,6,7,8,9,10,11,13,16,18],x_2:[0,2,5,6,7,8,9,10,11,13,16,18],x_3:[8,16,18],x_4:16,x_:[0,2,3,5,6,8,10,11,13,14,16,18],x_center:11,x_data:1,x_data_ful:1,x_hidden:2,x_i:[0,1,2,5,6,7,8,9,10,11,12,13,14,16,18],x_input:2,x_ix_:0,x_iy_i:8,x_j:[0,2,8,9,12,18],x_jy_j:8,x_k:[12,14,16,18],x_l:18,x_m:[6,12,16,18],x_n:[0,2,3,6,8,11,12,13,16,18],x_new:[9,10],x_offset:6,x_output:2,x_p:[3,7,9],x_poli:9,x_poly10:9,x_pred:4,x_prev:2,x_reduc:11,x_scale:8,x_test:[0,1,3,5,6,7,9,10,11],x_test_own:6,x_test_scal:[0,6,7,9,10,11],x_tot:4,x_train:[0,1,3,4,5,6,7,9,10,11],x_train_mean:6,x_train_own:6,x_train_scal:[0,6,7,9,10,11],x_val:1,xarrai:15,xavier:1,xbnew:13,xcode:[0,15],xdclassiffierconfus:10,xdclassiffierroc:10,xg_clf:10,xgb:10,xgbclassifi:10,xgboost:9,xgboot:10,xgbregressor:10,xgparam:10,xgtree:10,xi:[8,13],xi_1:8,xi_:8,xi_i:8,xk:8,xla:15,xlabel:[0,1,2,3,4,5,6,7,8,9,10,13,18],xlim:[6,10],xm:9,xmesh:13,xnew:[0,13],xp:18,xpanda:0,xpd:[5,11],xplot:0,xs:9,xscale:0,xsr:9,xt_x:13,xtest:6,xtick:[3,6,8,9],xtrain:6,xu:0,xx:[0,16],xy:[0,6,8,16],xytext:8,xz:16,y1:4,y2:4,y3:4,y:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,16,18],y_0:[0,5,11,16],y_1:[0,5,8,9,11,13,16],y_1y_1:8,y_1y_1k:8,y_1y_2:8,y_1y_2k:8,y_1y_n:8,y_1y_nk:8,y_2:[0,5,8,9,11,16],y_2y_1:8,y_2y_1k:8,y_2y_2:8,y_2y_2k:8,y_3:[0,9,16],y_4:16,y_:[0,1,5,6,10,11,16],y_data:[0,1,5,6],y_data_ful:1,y_decis:8,y_fit:0,y_i:[0,1,5,6,7,8,9,10,11,12,13,16],y_if_:10,y_ix_:0,y_ix_i:[7,8,13],y_iy_jk:8,y_j:[6,8,12],y_k:12,y_m:16,y_model:[0,4,5,6],y_n:[8,13],y_ny_1:8,y_ny_1k:8,y_ny_2:8,y_ny_2k:8,y_ny_n:8,y_ny_nk:8,y_offset:6,y_plot:9,y_pred1:9,y_pred2:9,y_pred:[0,1,4,6,7,8,9,10],y_pred_rf:10,y_pred_tre:10,y_proba:[7,10],y_scaler:6,y_test:[0,1,3,4,5,6,7,9,10,11],y_test_onehot:1,y_test_predict:0,y_tot:4,y_train:[0,1,3,4,5,6,7,9,10,11],y_train_mean:6,y_train_onehot:1,y_train_predict:0,y_train_scal:6,y_val:1,ye:[3,6,7],year:[0,15],yet:[0,1,6,8,11,13],yhd5w:17,yi:13,yield:[0,2,5,6,8,10,12,13,14,16,18],yk:8,ylabel:[0,1,2,3,4,5,6,7,8,9,10,13,18],ylim:[3,6],ym:9,ymesh:13,yn:0,yo:[8,9,10],yoshua:[1,20],you:[0,1,2,3,4,5,6,8,9,10,11,13,15,16,18,20],young:0,your:[1,2,4,5,6,8,11,13,15,16],yourself:[11,13],youtu:17,youtub:15,ypred:6,ypredict2:13,ypredict:[0,13],ypredictlasso:5,ypredictol:[0,5],ypredictown:6,ypredictownridg:6,ypredictridg:[0,5,6],ypredictskl:6,ys:9,ytest:6,ytick:[3,6,8,9],ytild:[0,6],ytildelasso:5,ytildenp:0,ytildeol:[0,5],ytildeownridg:6,ytilderidg:[5,6],ytrain:6,yx:16,yy:16,yz:16,z:[0,1,2,3,4,5,6,7,8,9,11,12,13,16,18],z_0:16,z_1:16,z_2:16,z_:[1,2,12,16],z_c:1,z_h:1,z_hidden:2,z_i:[1,12],z_j:[1,12],z_k:12,z_m:1,z_mod:9,z_o:1,z_output:2,zaman:18,zaxi:6,zero:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18],zeros_lik:4,zfill:4,zip:[2,4,6,13],zl:[],zm_h:0,zn:0,zone:0,zx:16,zy:16,zz:16},titles:["3. Linear Regression","14. Building a Feed Forward Neural Network","15. Solving Differential Equations with Deep Learning","16. Convolutional Neural Networks","17. Recurrent neural networks: Overarching view","4. Ridge and Lasso Regression","5. Resampling Methods","6. Logistic Regression","8. Support Vector Machines, overarching aims","9. Decision trees, overarching aims","10. Ensemble Methods: From a Single Tree to Many Trees and Extreme Boosting, Meet the Jungle of Methods","11. Basic ideas of the Principal Component Analysis (PCA)","13. Neural networks","7. Optimization, the central part of any Machine Learning algortithm","12. Clustering and Unsupervised Learning","Applied Data Analysis and Machine Learning","2. Linear Algebra, Handling of Arrays and more Python Features","Teaching schedule with links to material","1. Elements of Probability Theory and Statistical Data Analysis","Teachers and Grading","Textbooks"],titleterms:{"1":0,"10":17,"11":17,"12":17,"13":[],"14":17,"15":[],"16":17,"17":17,"18":17,"19":17,"2":[0,17],"20":[],"2021":[],"2022":19,"21":17,"22":17,"23":17,"24":17,"25":17,"26":17,"27":[],"28":17,"29":17,"3":[0,17],"30":17,"31":17,"34":17,"35":17,"36":17,"37":17,"38":17,"39":17,"4":[0,17],"40":17,"41":17,"4155":[],"42":17,"43":17,"44":17,"45":17,"46":17,"47":17,"5":[0,17],"6":[],"7":17,"8":[],"9":17,"case":[8,10,18],"do":1,"final":12,"function":[0,1,6,7,8,10,11,12,13,18],"import":[5,16],"new":4,A:[0,1,4,8,9],And:13,Ising:6,The:[0,1,2,3,5,6,7,8,9,11,12,15],With:4,activ:[1,12],actual:[],ad:[0,6],adaboost:10,adam:13,adapt:10,adjust:1,adversari:4,again:[3,9],aim:[8,9],algebra:16,algorithm:[9,10,11,12],algortithm:13,all:8,an:[0,4,10],analys:5,analysi:[0,5,6,11,15,18],analyt:0,ani:13,anoth:9,appli:15,approach:[0,8,14],approxim:12,architectur:1,arrai:16,assist:19,august:17,autocorrel:18,autograd:[2,13],automat:13,back:[1,11,12],background:15,bag:10,base:13,basic:[0,5,7,9,10,11,16],batch:1,bay:5,befor:11,better:8,bia:6,binari:1,binomi:[],bird:10,block:[],boost:10,bootstrap:[6,10],boston:0,breast:1,bring:12,build:[1,3,9],calcul:[],cancer:[1,7,9,11],cart:9,central:[13,15,18],chain:12,chang:10,chi:0,choos:1,cifar01:3,classic:11,classif:[1,9,10],classifi:8,clip:1,cluster:14,cnn:3,code:[0,1,2,5,9,11,12,14],collect:[1,3],compar:[2,10],complex:[0,6],complic:6,compon:11,comput:9,con:9,concept:18,conjug:13,continu:[],convex:[8,13],convolut:[3,12],correl:11,cost:[1,10],cours:[15,20],covari:[5,11,18],cross:6,cumul:[],data:[0,1,3,6,7,9,11,15,18],dataset:[1,3],decai:2,decis:[9,10],decomposit:[5,11,16],deep:[1,2],defin:1,definit:[],degre:0,demonstr:[],dens:0,deriv:[5,12],descent:[2,10,13],detail:3,develop:1,deviat:[],diagon:11,dice:[],differ:8,differenti:[2,13],diffus:2,dimension:[2,3,8],disadvantag:9,discret:18,disguis:[],distribut:[5,18],domain:18,down:1,dropout:1,element:[0,18],elimin:16,ensembl:10,entropi:9,environ:0,equat:[0,2,12],error:[0,10],euler:2,evalu:1,event:[],exampl:[0,1,2,3,4,6,7,8,9,10],exercis:[0,6],expect:18,experi:18,explor:0,exponenti:2,extrapol:4,extrem:10,ey:10,fall:19,famili:1,famou:16,featur:[9,16],feed:[1,12],fine:1,first:[4,12],fit:[0,10],forc:3,forest:10,forward:[1,2,12],fourier:3,frank:6,freedom:0,frequentist:0,from:[5,10,12],full:2,further:[3,5],fy:[],gan:4,gaussian:16,gd:13,gener:[4,9],geometr:11,gini:9,good:0,grade:19,gradient:[1,2,10,13],growth:2,ha:15,handl:16,hidden:2,hous:0,how:[],hyperparamet:1,hyperplan:8,i:1,id3:9,idea:11,implement:1,implic:5,improv:1,includ:13,increment:11,index:9,inform:19,input:2,instal:15,instructor:19,interpret:[5,11],introduc:11,introduct:[0,6,15,16],invers:[5,16],iter:10,its:[],jackknif:[],jungl:10,kera:[1,3],kernel:[8,11],lagrangian:8,lasso:[5,6],later:5,layer:[1,2,3,12],learn:[0,1,2,11,13,14,15],least:[5,6],level:10,librari:15,likelihood:7,limit:[1,13,18],linear:[0,8,13,16],link:[5,11,17,20],logist:[7,13],lu:16,machin:[0,8,13,15],main:18,make:[0,9,10],mani:[10,12],materi:17,math:5,mathemat:[3,5,8],matric:[5,16],matrix:[1,5,11,12,16],matter:0,mean:0,meet:[5,10,18],mercer:8,mersenn:[],method:[6,9,10,13],mlp:12,mnist:[3,4],model:[0,1,4,6,12],moment:[],momentum:13,moon:[8,9],more:[3,6,16],multilay:12,multipl:[1,3],multipli:8,name:[],network:[1,2,3,4,7,12],neural:[1,2,3,4,12],non:8,normal:[0,1],norwai:[],notat:12,novemb:17,now:[1,9],nuclear:0,nueral:7,number:[0,2,18],numer:[2,18],numpi:16,object:3,observ:[],obtain:11,octob:17,od:2,off:6,ol:[5,6,13],one:[2,12],oper:16,optim:[1,8,13,15],ordinari:[5,6],organ:0,oslo:20,other:[4,9,11,12,16],our:[0,4,5,11,13],outcom:15,output:2,overarch:[0,4,8,9],overview:10,own:[0,10,11],packag:16,part:[13,15],partial:2,pass:1,pca:11,pdf:18,perceptron:12,perform:[1,9],period:3,perspect:1,point:4,poisson:2,polynomi:3,popul:2,practic:13,pre:[1,3],predict:4,prerequisit:[3,15],princip:11,principl:3,pro:9,probabl:[5,18],problem:[1,2,13],procedur:9,process:[1,3],program:[2,13],project:6,prop:13,propag:[1,12],properti:[5,18],pseudo:[],python:[0,9,15,16],quick:8,ran0:[],random:[10,11,18],read:9,real:6,recip:[],recurr:[4,12],reduc:0,reduct:3,reformul:2,regress:[0,5,6,7,9,10,13],regular:1,relev:20,relu:1,remark:3,remind:[6,8],requir:[2,15],resampl:6,rescal:6,resourc:2,revisit:13,ridg:[0,5,6],rm:13,rng:[],rule:12,s:[8,10],sampl:11,schedul:17,schemat:9,scheme:2,scikit:[0,1,11],select:[],semest:19,septemb:17,set:[0,2,3,9,12],sgd:13,should:1,simpl:[0,4,9,13],singl:10,singular:[5,11],situat:[],soft:8,softmax:1,solv:2,solver:13,some:[13,16],specifi:2,split:0,squar:[0,5,6,10],standard:13,state:0,statist:[5,6,15,18],steepest:[10,13],stk3155:[],stochast:[13,18],superposit:3,supervis:1,support:8,svd:5,systemat:3,teach:[17,19],teacher:19,techniqu:[6,11],technolog:15,tensorflow:[1,3],test:[0,1],textbook:20,theorem:[5,8,11,12,18],theori:18,three:[],tip:13,togeth:12,top:1,toss:[],toward:11,trade:6,tradeoff:6,train:[0,1,4],transform:3,tree:[9,10],tune:1,two:[3,8,15],type:[2,4,12],uncorrel:[],uniform:[],univers:[12,20],unsupervis:14,up:[0,2,9,12],us:[0,1,2,3,7,13,15],valid:6,valu:[5,11,18],variabl:18,varianc:6,variou:0,vector:[8,12,16],view:[0,4,10],visual:[1,9],vs:3,wai:9,wave:2,week:17,weekli:17,what:0,which:1,why:[],wisconsin:7,write:[4,11],xgboost:10,your:[0,10]}}) \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/chapter2.ipynb b/doc/LectureNotes/_build/jupyter_execute/chapter2.ipynb index d6bad4e44..b42aac22d 100644 --- a/doc/LectureNotes/_build/jupyter_execute/chapter2.ipynb +++ b/doc/LectureNotes/_build/jupyter_execute/chapter2.ipynb @@ -2,23 +2,45 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "id": "7146aabe", + "metadata": { + "editable": true + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "383d5dba", + "metadata": { + "editable": true + }, + "source": [ + "# Ridge and Lasso Regression" + ] + }, + { + "cell_type": "markdown", + "id": "08812109", + "metadata": { + "editable": true + }, "source": [ - "# Ridge and Lasso Regression\n", - "\n", - "\n", - "\n", "## Mathematical Interpretation of Ordinary Least Squares\n", "\n", "What is presented here is a mathematical analysis of various regression algorithms (ordinary least squares, Ridge and Lasso Regression). The analysis is based on an important algorithm in linear algebra, the so-called Singular Value Decomposition (SVD). \n", "\n", - "\n", "We have shown that in ordinary least squares (OLS) the optimal parameters $\\beta$ are given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "04ce00fc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -27,7 +49,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "88d4cd43", + "metadata": { + "editable": true + }, "source": [ "The **hat** over $\\boldsymbol{\\beta}$ means we have the optimal parameters after minimization of the cost function.\n", "\n", @@ -36,7 +61,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b95f6106", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -45,14 +73,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2ee3b8e9", + "metadata": { + "editable": true + }, "source": [ "We now define a matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "72f7dde8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T.\n", @@ -61,14 +95,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b092bc7", + "metadata": { + "editable": true + }, "source": [ "We can rewrite" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "44b3e758", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{A}\\boldsymbol{y}.\n", @@ -77,20 +117,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6cec4c92", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{A}$ has the important property that $\\boldsymbol{A}^2=\\boldsymbol{A}$. This is the definition of a [projection matrix](https://en.wikipedia.org/wiki/Projection_matrix).\n", "We can then interpret our optimal model $\\tilde{\\boldsymbol{y}}$ as being represented by an orthogonal projection of $\\boldsymbol{y}$ onto a space defined by the column vectors of $\\boldsymbol{X}$. In our case here the matrix $\\boldsymbol{A}$ is a square matrix. If it is a general rectangular matrix we have an oblique projection matrix.\n", "\n", - "\n", - "\n", - "\n", "We have defined the residual error as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef64424c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=\\left[\\boldsymbol{I}-\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\right]\\boldsymbol{y}.\n", @@ -99,17 +142,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cad57da0", + "metadata": { + "editable": true + }, "source": [ "The residual errors are then the projections of $\\boldsymbol{y}$ onto the orthogonal component of the space defined by the column vectors of $\\boldsymbol{X}$.\n", "\n", - "\n", "If the matrix $\\boldsymbol{X}$ is an orthogonal (or unitary in case of complex values) matrix, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "94355d54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{X}\\boldsymbol{X}^T = \\boldsymbol{I}.\n", @@ -118,14 +166,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c1ccdf5", + "metadata": { + "editable": true + }, "source": [ "In this case the matrix $\\boldsymbol{A}$ becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0d943ee1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T)=\\boldsymbol{I},\n", @@ -134,14 +188,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f951392", + "metadata": { + "editable": true + }, "source": [ "and we have the obvious case" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce1a6d6f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=0.\n", @@ -150,16 +210,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2861bd8e", + "metadata": { + "editable": true + }, + "source": [ + "This serves also as a useful test of our codes." + ] + }, + { + "cell_type": "markdown", + "id": "1dfaffdb", + "metadata": { + "editable": true + }, "source": [ - "This serves also as a useful test of our codes. \n", - "\n", - "\n", - "\n", - "\n", "## The singular value decomposition\n", "\n", - "\n", "The examples we have looked at so far are cases where we normally can\n", "invert the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$. Using a polynomial expansion where we fit of various functions leads to\n", "row vectors of the design matrix which are essentially orthogonal due\n", @@ -167,7 +234,6 @@ "design matrix is then often done via a so-called LU, QR or Cholesky\n", "decomposition.\n", "\n", - "\n", "As we will also see in the first project, \n", "this may\n", "however not the be case in general and a standard matrix inversion\n", @@ -191,9 +257,6 @@ "in the principal component analysis where high-dimensional data can be\n", "reduced to the statistically relevant features.\n", "\n", - "\n", - "\n", - "\n", "One of the typical problems we encounter with linear regression, in particular \n", "when the matrix $\\boldsymbol{X}$ (our so-called design matrix) is high-dimensional, \n", "are problems with near singular or singular matrices. The column vectors of $\\boldsymbol{X}$ \n", @@ -204,7 +267,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3e091b51", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -224,7 +290,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fcbdb36", + "metadata": { + "editable": true + }, "source": [ "The columns of $\\boldsymbol{X}$ are linearly dependent. We see this easily since the \n", "the first column is the row-wise sum of the other two columns. The rank (more correct,\n", @@ -238,7 +307,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f35594a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -254,19 +326,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "093183cd", + "metadata": { + "editable": true + }, "source": [ "We see easily that $\\mbox{det}(\\boldsymbol{X}) = x_{11} x_{22} - x_{12} x_{21} = 1 \\times (-1) - 1 \\times (-1) = 0$. Hence, $\\mathbf{X}$ is singular and its inverse is undefined.\n", "This is equivalent to saying that the matrix $\\boldsymbol{X}$ has at least an eigenvalue which is zero.\n", "\n", - "\n", - "\n", "If our design matrix $\\boldsymbol{X}$ which enters the linear regression problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7a22cf10", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -281,7 +357,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a66feb94", + "metadata": { + "editable": true + }, "source": [ "has linearly dependent column vectors, we will not be able to compute the inverse\n", "of $\\boldsymbol{X}^T\\boldsymbol{X}$ and we cannot find the parameters (estimators) $\\beta_i$. \n", @@ -294,7 +373,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5b5978a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^{T} \\boldsymbol{X} \\rightarrow \\boldsymbol{X}^{T} \\boldsymbol{X}+\\lambda \\boldsymbol{I},\n", @@ -303,16 +385,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bed64679", + "metadata": { + "editable": true + }, + "source": [ + "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later." + ] + }, + { + "cell_type": "markdown", + "id": "860c9b6d", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later. \n", - "\n", - "\n", - "\n", - "\n", "## Basic math of the SVD\n", "\n", - "\n", "From standard linear algebra we know that a square matrix $\\boldsymbol{X}$ can be diagonalized if and only it is \n", "a so-called [normal matrix](https://en.wikipedia.org/wiki/Normal_matrix), that is if $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$\n", "we have $\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ or if $\\boldsymbol{X}\\in {\\mathbb{C}}^{n\\times n}$ we have $\\boldsymbol{X}\\boldsymbol{X}^{\\dagger}=\\boldsymbol{X}^{\\dagger}\\boldsymbol{X}$.\n", @@ -321,7 +410,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "724355a3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\lambda_1,\\boldsymbol{u}_1),\\dots, (\\lambda_n,\\boldsymbol{u}_n),\n", @@ -330,14 +422,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "80fea225", + "metadata": { + "editable": true + }, "source": [ "and the eigenvalues are given by the diagonal matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a7bc845", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\\mathrm{Diag}(\\lambda_1, \\dots,\\lambda_n).\n", @@ -346,14 +444,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "789f1977", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ can be written in terms of an orthogonal/unitary transformation $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "56e422f4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -362,7 +466,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f015c981", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{I}$ or $\\boldsymbol{U}\\boldsymbol{U}^{\\dagger}=\\boldsymbol{I}$.\n", "\n", @@ -371,7 +478,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "dfd219d0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\begin{bmatrix} \n", @@ -383,15 +493,14 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9992b4d2", + "metadata": { + "editable": true + }, "source": [ "is not diagonalizable, it is a so-called [defective matrix](https://en.wikipedia.org/wiki/Defective_matrix). It is easy to see that the condition\n", "$\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ is not fulfilled. \n", "\n", - "\n", - "\n", - "\n", - "\n", "However, and this is the strength of the SVD algorithm, any general\n", "matrix $\\boldsymbol{X}$ can be decomposed in terms of a diagonal matrix and\n", "two orthogonal/unitary matrices. The [Singular Value Decompostion\n", @@ -405,7 +514,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e41ce3a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\n", @@ -414,14 +526,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "916148d2", + "metadata": { + "editable": true + }, "source": [ "As an example, the above defective matrix can be decomposed as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8488b628", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& 1 \\\\ 1& -1\\\\ \\end{bmatrix} \\begin{bmatrix} 2& 0 \\\\ 0& 0\\\\ \\end{bmatrix} \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& -1 \\\\ 1& 1\\\\ \\end{bmatrix}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -430,7 +548,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb7bb105", + "metadata": { + "editable": true + }, "source": [ "with eigenvalues $\\sigma_1=2$ and $\\sigma_2=0$. \n", "The SVD exits always! \n", @@ -453,7 +574,6 @@ "\n", "The columns of $\\boldsymbol{U}$ are called the left singular vectors while the columns of $\\boldsymbol{V}$ are the right singular vectors.\n", "\n", - "\n", "If we assume that $n > p$, then our matrix $\\boldsymbol{U}$ has dimension $n\n", "\\times n$. The last $n-p$ columns of $\\boldsymbol{U}$ become however\n", "irrelevant in our calculations since they are multiplied with the\n", @@ -469,14 +589,23 @@ "If $n > p$, we keep only the first $p$ columns of $\\boldsymbol{U}$ and $\\boldsymbol{\\Sigma}$ has dimension $p\\times p$. \n", "If $p > n$, then only the first $n$ columns of $\\boldsymbol{V}$ are computed and $\\boldsymbol{\\Sigma}$ has dimension $n\\times n$.\n", "The $n=p$ case is obvious, we retain the full SVD. \n", - "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy.\n", - "\n", + "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy." + ] + }, + { + "cell_type": "markdown", + "id": "86e39aa0", + "metadata": { + "editable": true + }, + "source": [ "## Codes for the SVD" ] }, { "cell_type": "code", "execution_count": 1, + "id": "9c3ae0cf", "metadata": { "collapsed": false, "editable": true @@ -538,7 +667,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5e02d16", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ has columns that are linearly dependent. The first\n", "column is the row-wise sum of the other two columns. The rank of a\n", @@ -549,8 +681,6 @@ "inversion algorithm for matrix inversion with $\\boldsymbol{X}^T\\boldsymbol{X}$ results\n", "in the program terminating due to a singular matrix.\n", "\n", - "\n", - "\n", "The $U$, $S$, and $V$ matrices returned from the **svd()** function\n", "cannot be multiplied directly.\n", "\n", @@ -562,9 +692,16 @@ "\n", "If you wish to include the zero singular values, you will need to\n", "resize the matrices and set up a diagonal matrix as done in the above\n", - "example\n", - "\n", - "\n", + "example" + ] + }, + { + "cell_type": "markdown", + "id": "ceac1ca3", + "metadata": { + "editable": true + }, + "source": [ "## Code for SVD and Inversion of Matrices\n", "\n", "How do we use the SVD to invert a matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ which is singular or near singular?\n", @@ -574,6 +711,7 @@ { "cell_type": "code", "execution_count": 2, + "id": "15a9c8e8", "metadata": { "collapsed": false, "editable": true @@ -585,7 +723,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a6e5469", + "metadata": { + "editable": true + }, "source": [ "Let us first look at a matrix which does not causes problems and write our own function where we just use the SVD." ] @@ -593,6 +734,7 @@ { "cell_type": "code", "execution_count": 3, + "id": "ef3b6935", "metadata": { "collapsed": false, "editable": true @@ -653,7 +795,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "155ca008", + "metadata": { + "editable": true + }, "source": [ "Although our matrix to invert $\\boldsymbol{X}^T\\boldsymbol{X}$ is a square matrix, our matrix may be singular. \n", "\n", @@ -668,7 +813,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "da493b94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}_{\\mathrm{PI}}= \\boldsymbol{V}\\boldsymbol{D}_{\\mathrm{PI}}\\boldsymbol{U}^T,\n", @@ -677,14 +825,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8bf214ea", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." + "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{\\Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." ] }, { "cell_type": "code", "execution_count": 4, + "id": "e437b5d9", "metadata": { "collapsed": false, "editable": true @@ -733,14 +885,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e711d30f", + "metadata": { + "editable": true + }, + "source": [ + "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**." + ] + }, + { + "cell_type": "markdown", + "id": "a0ba9d2f", + "metadata": { + "editable": true + }, "source": [ - "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**.\n", - "\n", - "\n", - "\n", - "\n", - "\n", "## Mathematics of the SVD and implications\n", "\n", "Let us take a closer look at the mathematics of the SVD and the various implications for machine learning studies.\n", @@ -750,7 +909,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "90951d11", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -766,14 +928,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91ff188a", + "metadata": { + "editable": true + }, "source": [ "We can SVD decompose our matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "61b2e6d7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -782,7 +950,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a5bf286", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{U}$ is an orthogonal matrix of dimension $n\\times n$, meaning that $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{U}^T\\boldsymbol{U}=\\boldsymbol{I}_n$. Here $\\boldsymbol{I}_n$ is the unit matrix of dimension $n \\times n$.\n", "\n", @@ -793,7 +964,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1bd0e480", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sigma_0 > \\sigma_1 > \\sigma_2 > \\dots > \\sigma_{p-1} > 0.\n", @@ -802,17 +976,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6133bbea", + "metadata": { + "editable": true + }, "source": [ "All values beyond $p-1$ are all zero.\n", "\n", - "\n", "As an example, consider the following $3\\times 2$ example for the matrix $\\boldsymbol{\\Sigma}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2f4ec9c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -826,14 +1005,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d8e91a1a", + "metadata": { + "editable": true + }, "source": [ "The singular values are $\\sigma_0=2$ and $\\sigma_1=1$. It is common to rewrite the matrix $\\boldsymbol{\\Sigma}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66510064", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -846,14 +1031,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0de239cf", + "metadata": { + "editable": true + }, "source": [ "where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae4894a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{\\Sigma}}=\n", @@ -866,14 +1057,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "928421c0", + "metadata": { + "editable": true + }, "source": [ "contains only the singular values. Note also (and we will use this below) that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f707ba94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\n", @@ -886,14 +1083,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2169a96", + "metadata": { + "editable": true + }, "source": [ "which is a $2\\times 2 $ matrix while" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd7213a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T=\n", @@ -907,20 +1110,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "014bf918", + "metadata": { + "editable": true + }, "source": [ "is a $3\\times 3 $ matrix. The last row and column of this last matrix\n", "contain only zeros. This will have important consequences for our SVD\n", "decomposition of the design matrix.\n", "\n", - "\n", - "\n", "The matrix that may cause problems for us is $\\boldsymbol{X}^T\\boldsymbol{X}$. Using the SVD we can rewrite this matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5b371d72", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -929,14 +1136,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5fdd06fb", + "metadata": { + "editable": true + }, "source": [ "and using the orthogonality of the matrix $\\boldsymbol{U}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "416109ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -945,32 +1158,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "38a7766d", + "metadata": { + "editable": true + }, "source": [ "We define $\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\\tilde{\\boldsymbol{\\Sigma}}^2$ which is a diagonal matrix containing only the singular values squared. It has dimensionality $p \\times p$.\n", "\n", - "This means, using the orthogonality of $\\boldsymbol{V}$, that we get" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\boldsymbol{X}^T\\boldsymbol{X}=\\tilde{\\boldsymbol{\\Sigma}}^2.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ "We can now insert the result for the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ into our equation for ordinary least squares where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "18839f7b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -979,30 +1182,42 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b743da67", + "metadata": { + "editable": true + }, "source": [ "and using our SVD decomposition of $\\boldsymbol{X}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b91982c5", + "metadata": { + "editable": true + }, "source": [ "$$\n", - "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\tilde{\\boldsymbol{\\Sigma}}^{-2}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", + "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\left(\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^{2}(\\boldsymbol{V}^T\\right)^{-1}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", "$$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "310034bb", + "metadata": { + "editable": true + }, "source": [ - "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$," + "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$,," ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "efadf88e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_i\\boldsymbol{u}^T_j\\boldsymbol{y},\n", @@ -1011,14 +1226,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "293eece5", + "metadata": { + "editable": true + }, "source": [ "Note here that when we perform the multiplication of the various matrices, the orthogonal vectors of the matrix $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66ead26c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{U}=[\\boldsymbol{u}_0,\\boldsymbol{u}_1,\\dots,\\boldsymbol{u}_{n-1}],\n", @@ -1027,13 +1248,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "67b71310", + "metadata": { + "editable": true + }, "source": [ "that belong to $i>p-1$, result in only zeros when we perform the multiplications. This means that the sum above has non-zero elements only up to $i=p-1$. This corresponds also to the number of singular values (these are all non-zero).\n", "\n", - "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$.\n", - "\n", - "\n", + "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$." + ] + }, + { + "cell_type": "markdown", + "id": "fa804884", + "metadata": { + "editable": true + }, + "source": [ "## Further properties (important for our analyses later)\n", "\n", "Let us study again $\\boldsymbol{X}^T\\boldsymbol{X}$ in terms of our SVD," @@ -1041,7 +1272,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ac661f44", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -1050,14 +1284,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1d195b3c", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "38865678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}.\n", @@ -1066,7 +1306,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "07a7126d", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$ are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$\n", "with eigenvalues given by the singular values squared, that is" @@ -1074,7 +1317,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1375bb2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1083,14 +1329,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b32590d", + "metadata": { + "editable": true + }, "source": [ "Similarly, if we use the SVD decomposition for the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bfefb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T.\n", @@ -1099,14 +1351,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9a62b75", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{U}$ (using the orthogonality of $\\boldsymbol{U}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c591bfc0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{U}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T.\n", @@ -1115,7 +1373,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d7fa31d3", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{u}_i$ of the orthogonal matrix $\\boldsymbol{U}$ are the eigenvectors of the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$\n", "with eigenvalues given by the singular values squared, that is" @@ -1123,7 +1384,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d132cee3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{u}_i=\\boldsymbol{u}_i\\sigma_i^2.\n", @@ -1132,7 +1396,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7aa7f89c", + "metadata": { + "editable": true + }, "source": [ "**Important note**: we have defined our design matrix $\\boldsymbol{X}$ to be an\n", "$n\\times p$ matrix. In most supervised learning cases we have that $n\n", @@ -1142,12 +1409,18 @@ "always refer to the number of features in our data set, while the\n", "number of rows represents the number of data inputs. Note that in\n", "other texts you may find the opposite notation. This has consequences\n", - "for the definition of for example the covariance matrix and its relation to the SVD.\n", - "\n", - "\n", + "for the definition of for example the covariance matrix and its relation to the SVD." + ] + }, + { + "cell_type": "markdown", + "id": "8e546bb5", + "metadata": { + "editable": true + }, + "source": [ "## Meet the Covariance Matrix\n", "\n", - "\n", "Before we move on to a discussion of Ridge and Lasso regression, we want to show an important example of the above.\n", "\n", "We have already noted that the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ in ordinary\n", @@ -1157,7 +1430,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "96d8b53c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial^2 C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}^T\\partial \\boldsymbol{\\beta}} =\\frac{2}{n}\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1166,7 +1442,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7e05a9b", + "metadata": { + "editable": true + }, "source": [ "This quantity defines was what is called the Hessian matrix (the second derivative of a function we want to optimize).\n", "\n", @@ -1175,7 +1454,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "55fd14e4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H}=\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1184,15 +1466,16 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "09320523", + "metadata": { + "editable": true + }, "source": [ "The Hessian matrix for ordinary least squares is also proportional to\n", "the covariance matrix. This means also that we can use the SVD to find\n", "the eigenvalues of the covariance matrix and the Hessian matrix in\n", "terms of the singular values. Let us develop these arguments, as they will play an important role in our machine learning studies.\n", "\n", - "\n", - "\n", "Before we discuss the link between for example Ridge regression and the singular value decomposition, we need to remind ourselves about\n", "the definition of the covariance and the correlation function. These are quantities that play a central role in machine learning methods.\n", "\n", @@ -1202,7 +1485,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "23b5cf2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1213,14 +1499,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "136c43bc", + "metadata": { + "editable": true + }, "source": [ "where for example" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b52fc8e3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] =\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})(y_i- \\overline{y}).\n", @@ -1229,14 +1521,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fe153c88", + "metadata": { + "editable": true + }, "source": [ "With this definition and recalling that the variance is defined as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea57dd81", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{var}[\\boldsymbol{x}]=\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})^2,\n", @@ -1245,14 +1543,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8154bc8", + "metadata": { + "editable": true + }, "source": [ "we can rewrite the covariance matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "081adf91", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1263,7 +1567,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d61424f0", + "metadata": { + "editable": true + }, "source": [ "**Note:** we have used $1/n$ in the above definitions of the *sample* variance and covariance. We assume then that we can calculate the exact mean value. \n", "What you will find in essentially all statistics texts are equations\n", @@ -1274,7 +1581,6 @@ "**Scikit-Learn** or **nunmpy's** function calculate the covariance, this\n", "quantity will be computed with a factor $1/(n-1)$.\n", "\n", - "\n", "The covariance takes values between zero and infinity and may thus\n", "lead to problems with loss of numerical precision for particularly\n", "large values. It is common to scale the covariance matrix by\n", @@ -1284,7 +1590,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f517794", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]=\\frac{\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}]}{\\sqrt{\\mathrm{var}[\\boldsymbol{x}] \\mathrm{var}[\\boldsymbol{y}]}}.\n", @@ -1293,7 +1602,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "27c43f34", + "metadata": { + "editable": true + }, "source": [ "The correlation function is then given by values $\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]\n", "\\in [-1,1]$. This avoids eventual problems with too large values. We\n", @@ -1303,7 +1615,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "35ac64e2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} 1 & \\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1314,19 +1629,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ec11e59", + "metadata": { + "editable": true + }, "source": [ "In the above example this is the function we constructed using **pandas**.\n", "\n", - "\n", - "\n", "In our derivation of the various regression algorithms like **Ordinary Least Squares** or **Ridge regression**\n", "we defined the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d1a1a24", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1342,7 +1661,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b12f1560", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors/features $p$ refering to the column numbers and the\n", "entries $n$ being the row elements.\n", @@ -1351,7 +1673,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7975e5ec", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix} \\boldsymbol{x}_0 & \\boldsymbol{x}_1 & \\boldsymbol{x}_2 & \\dots & \\dots & \\boldsymbol{x}_{p-1}\\end{bmatrix},\n", @@ -1360,14 +1685,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4628dae3", + "metadata": { + "editable": true + }, "source": [ "with a given vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "6acd55ed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_i^T = \\begin{bmatrix}x_{0,i} & x_{1,i} & x_{2,i}& \\dots & \\dots x_{n-1,i}\\end{bmatrix}.\n", @@ -1376,7 +1707,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "15268d5e", + "metadata": { + "editable": true + }, "source": [ "With these definitions, we can now rewrite our $2\\times 2$\n", "correlation/covariance matrix in terms of a moe general design/feature\n", @@ -1386,7 +1720,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f7cc7e46", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1402,14 +1739,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91f506bb", + "metadata": { + "editable": true + }, "source": [ "and the correlation matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f65d15d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1425,7 +1768,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4dda44f3", + "metadata": { + "editable": true + }, "source": [ "The Numpy function **np.cov** calculates the covariance elements using\n", "the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have\n", @@ -1438,7 +1784,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a6e7b9b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{W} = \\begin{bmatrix} x_0 & x_1 & x_2 & \\dots & x_{n-2} & x_{n-1} \\\\\n", @@ -1449,7 +1798,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d907b263", + "metadata": { + "editable": true + }, "source": [ "which in turn is converted into into the $2\\times 2$ covariance matrix\n", "$\\boldsymbol{C}$ via the Numpy function **np.cov()**. We note that we can also calculate\n", @@ -1461,6 +1813,7 @@ { "cell_type": "code", "execution_count": 5, + "id": "8dbb102f", "metadata": { "collapsed": false, "editable": true @@ -1470,10 +1823,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "-0.13876586436927824\n", - "3.722047011333792\n", - "[[ 1.233528 3.58428804]\n", - " [ 3.58428804 11.47942814]]\n" + "-0.01591355407242949\n", + "3.6808538439837775\n", + "[[ 0.96390357 2.99157584]\n", + " [ 2.99157584 10.31120247]]\n" ] } ], @@ -1492,7 +1845,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "25852e86", + "metadata": { + "editable": true + }, "source": [ "The previous example can be converted into the correlation matrix by\n", "simply scaling the matrix elements with the variances. We should also\n", @@ -1504,6 +1860,7 @@ { "cell_type": "code", "execution_count": 6, + "id": "cb3ee7b6", "metadata": { "collapsed": false, "editable": true @@ -1513,10 +1870,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.08464758160254343\n", - "1.8503720991789538\n", - "[[1. 0.65626043]\n", - " [0.65626043 1. ]]\n" + "0.08612280083325631\n", + "1.6149274949460215\n", + "[[1. 0.66934291]\n", + " [0.66934291 1. ]]\n" ] } ], @@ -1546,7 +1903,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6f2860ea", + "metadata": { + "editable": true + }, "source": [ "We see that the matrix elements along the diagonal are one as they\n", "should be and that the matrix is symmetric. Furthermore, diagonalizing\n", @@ -1554,14 +1914,13 @@ "\n", "The above procedure with **numpy** can be made more compact if we use **pandas**.\n", "\n", - "\n", - "\n", "We whow here how we can set up the correlation matrix using **pandas**, as done in this simple code" ] }, { "cell_type": "code", "execution_count": 7, + "id": "48781620", "metadata": { "collapsed": false, "editable": true @@ -1571,30 +1930,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[-1.41876267 -4.93248252]\n", - " [ 1.83687444 5.28097861]\n", - " [ 0.37429133 0.59766 ]\n", - " [ 0.59159438 1.71869727]\n", - " [-0.80315282 -0.89348922]\n", - " [-0.38748219 -2.12288563]\n", - " [-2.08917679 -5.64933923]\n", - " [ 0.27803645 0.89944994]\n", - " [ 1.23703839 3.2321528 ]\n", - " [ 0.38073947 1.86925797]]\n", + "[[-1.04649105 -2.92658312]\n", + " [ 0.45985488 1.43876695]\n", + " [-0.41081513 -1.96426825]\n", + " [ 1.75703965 4.88736621]\n", + " [ 1.02698605 3.59304008]\n", + " [-0.71348713 -1.98249059]\n", + " [-0.22685646 0.37866422]\n", + " [-0.90559087 -1.31597731]\n", + " [-0.60349429 -3.47245463]\n", + " [ 0.66285434 1.36393643]]\n", " 0 1\n", - "0 -1.418763 -4.932483\n", - "1 1.836874 5.280979\n", - "2 0.374291 0.597660\n", - "3 0.591594 1.718697\n", - "4 -0.803153 -0.893489\n", - "5 -0.387482 -2.122886\n", - "6 -2.089177 -5.649339\n", - "7 0.278036 0.899450\n", - "8 1.237038 3.232153\n", - "9 0.380739 1.869258\n", + "0 -1.046491 -2.926583\n", + "1 0.459855 1.438767\n", + "2 -0.410815 -1.964268\n", + "3 1.757040 4.887366\n", + "4 1.026986 3.593040\n", + "5 -0.713487 -1.982491\n", + "6 -0.226856 0.378664\n", + "7 -0.905591 -1.315977\n", + "8 -0.603494 -3.472455\n", + "9 0.662854 1.363936\n", " 0 1\n", - "0 1.000000 0.977418\n", - "1 0.977418 1.000000\n" + "0 1.000000 0.948641\n", + "1 0.948641 1.000000\n" ] } ], @@ -1617,7 +1976,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4ccdedad", + "metadata": { + "editable": true + }, "source": [ "We expand this model to the Franke function discussed earlier." ] @@ -1625,6 +1987,7 @@ { "cell_type": "code", "execution_count": 8, + "id": "e4090257", "metadata": { "collapsed": false, "editable": true @@ -1636,37 +1999,37 @@ "text": [ " 0 1 2 3 4 5 6 7 \\\n", "0 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "1 0.0 0.081253 0.083015 0.080297 0.079157 0.078040 0.071112 0.069847 \n", - "2 0.0 0.083015 0.086807 0.084909 0.084904 0.084702 0.076955 0.076338 \n", - "3 0.0 0.080297 0.084909 0.084414 0.084862 0.085018 0.077793 0.077402 \n", - "4 0.0 0.079157 0.084904 0.084862 0.086076 0.086872 0.079281 0.079383 \n", - "5 0.0 0.078040 0.084702 0.085018 0.086872 0.088212 0.080319 0.080847 \n", - "6 0.0 0.071112 0.076955 0.077793 0.079281 0.080319 0.073719 0.074034 \n", - "7 0.0 0.069847 0.076338 0.077402 0.079383 0.080847 0.074034 0.074693 \n", - "8 0.0 0.068735 0.075760 0.077003 0.079405 0.081233 0.074237 0.075195 \n", - "9 0.0 0.067769 0.075241 0.076628 0.079389 0.081533 0.074375 0.075594 \n", - "10 0.0 0.062136 0.068318 0.069888 0.071921 0.073449 0.067622 0.068376 \n", - "11 0.0 0.061149 0.067723 0.069408 0.071767 0.073583 0.067612 0.068608 \n", - "12 0.0 0.060309 0.067213 0.068991 0.071632 0.073699 0.067599 0.068806 \n", - "13 0.0 0.059601 0.066789 0.068642 0.071529 0.073816 0.067597 0.068992 \n", - "14 0.0 0.059013 0.066449 0.068363 0.071467 0.073949 0.067620 0.069181 \n", + "1 0.0 0.084846 0.071547 0.086679 0.078725 0.071480 0.079609 0.073320 \n", + "2 0.0 0.071547 0.061716 0.073647 0.067908 0.062640 0.068417 0.063857 \n", + "3 0.0 0.086679 0.073647 0.094619 0.086262 0.078697 0.090356 0.083579 \n", + "4 0.0 0.078725 0.067908 0.086262 0.079483 0.073303 0.082874 0.077375 \n", + "5 0.0 0.071480 0.062640 0.078697 0.073303 0.068345 0.076121 0.071741 \n", + "6 0.0 0.079609 0.068417 0.090356 0.082874 0.076121 0.088460 0.082267 \n", + "7 0.0 0.073320 0.063857 0.083579 0.077375 0.071741 0.082267 0.077131 \n", + "8 0.0 0.067787 0.059824 0.077620 0.072521 0.067856 0.076821 0.072597 \n", + "9 0.0 0.062888 0.056235 0.072352 0.068210 0.064388 0.072008 0.068573 \n", + "10 0.0 0.071906 0.062551 0.083694 0.077291 0.071515 0.083361 0.077978 \n", + "11 0.0 0.066654 0.058715 0.077948 0.072611 0.067767 0.078042 0.073548 \n", + "12 0.0 0.062061 0.055344 0.072918 0.068500 0.064461 0.073380 0.069654 \n", + "13 0.0 0.058033 0.052372 0.068505 0.064880 0.061538 0.069285 0.066223 \n", + "14 0.0 0.054491 0.049747 0.064623 0.061685 0.058948 0.065680 0.063192 \n", "\n", " 8 9 10 11 12 13 14 \n", "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "1 0.068735 0.067769 0.062136 0.061149 0.060309 0.059601 0.059013 \n", - "2 0.075760 0.075241 0.068318 0.067723 0.067213 0.066789 0.066449 \n", - "3 0.077003 0.076628 0.069888 0.069408 0.068991 0.068642 0.068363 \n", - "4 0.079405 0.079389 0.071921 0.071767 0.071632 0.071529 0.071467 \n", - "5 0.081233 0.081533 0.073449 0.073583 0.073699 0.073816 0.073949 \n", - "6 0.074237 0.074375 0.067622 0.067612 0.067599 0.067597 0.067620 \n", - "7 0.075195 0.075594 0.068376 0.068608 0.068806 0.068992 0.069181 \n", - "8 0.075959 0.076589 0.068965 0.069409 0.069796 0.070150 0.070491 \n", - "9 0.076589 0.077425 0.069441 0.070074 0.070630 0.071136 0.071614 \n", - "10 0.068965 0.069441 0.063052 0.063364 0.063631 0.063874 0.064110 \n", - "11 0.069409 0.070074 0.063364 0.063851 0.064274 0.064658 0.065020 \n", - "12 0.069796 0.070630 0.063631 0.064274 0.064838 0.065348 0.065826 \n", - "13 0.070150 0.071136 0.063874 0.064658 0.065348 0.065974 0.066558 \n", - "14 0.070491 0.071614 0.064110 0.065020 0.065826 0.066558 0.067240 \n" + "1 0.067787 0.062888 0.071906 0.066654 0.062061 0.058033 0.054491 \n", + "2 0.059824 0.056235 0.062551 0.058715 0.055344 0.052372 0.049747 \n", + "3 0.077620 0.072352 0.083694 0.077948 0.072918 0.068505 0.064623 \n", + "4 0.072521 0.068210 0.077291 0.072611 0.068500 0.064880 0.061685 \n", + "5 0.067856 0.064388 0.071515 0.067767 0.064461 0.061538 0.058948 \n", + "6 0.076821 0.072008 0.083361 0.078042 0.073380 0.069285 0.065680 \n", + "7 0.072597 0.068573 0.077978 0.073548 0.069654 0.066223 0.063192 \n", + "8 0.068852 0.065514 0.073238 0.069578 0.066348 0.063493 0.060963 \n", + "9 0.065514 0.062773 0.069044 0.066051 0.063401 0.061048 0.058955 \n", + "10 0.073238 0.069044 0.079558 0.074881 0.070775 0.067162 0.063977 \n", + "11 0.069578 0.066051 0.074881 0.070959 0.067506 0.064459 0.061765 \n", + "12 0.066348 0.063401 0.070775 0.067506 0.064618 0.062062 0.059795 \n", + "13 0.063493 0.061048 0.067162 0.064459 0.062062 0.059933 0.058038 \n", + "14 0.060963 0.058955 0.063977 0.061765 0.059795 0.058038 0.056468 \n" ] } ], @@ -1718,7 +2081,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6547bf2f", + "metadata": { + "editable": true + }, "source": [ "We note here that the covariance is zero for the first rows and\n", "columns since all matrix elements in the design matrix were set to one\n", @@ -1729,14 +2095,15 @@ "drop these elements and construct a correlation\n", "matrix without these elements. \n", "\n", - "\n", - "\n", "We can rewrite the covariance matrix in a more compact form in terms of the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4e26eab7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}= \\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}].\n", @@ -1745,14 +2112,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7f6a0df9", + "metadata": { + "editable": true + }, "source": [ "To see this let us simply look at a design matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{2\\times 2}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff73ba2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1766,14 +2139,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae6e2e42", + "metadata": { + "editable": true + }, "source": [ "If we then compute the expectation value (note the $1/n$ factor instead of $1/(n-1)$)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "87a8dccc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}=\\frac{1}{n}\\begin{bmatrix}\n", @@ -1785,14 +2164,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1db8e000", + "metadata": { + "editable": true + }, "source": [ "which is just" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "59e0c46d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]=\\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}_0] & \\mathrm{cov}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] \\\\\n", @@ -1803,14 +2188,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce39f8d0", + "metadata": { + "editable": true + }, "source": [ - "where we wrote $$\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]$$ to indicate that this is the covariance of the vectors $\\boldsymbol{x}$ of the design/feature matrix $\\boldsymbol{X}$.\n", - "\n", - "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$.\n", - "\n", - "\n", + "where we wrote $\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1]=\\boldsymbol{C}[\\boldsymbol{x}]$ to indicate\n", + "that this is the covariance of the vectors $\\boldsymbol{x}$ of the\n", + "design/feature matrix $\\boldsymbol{X}$.\n", "\n", + "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$." + ] + }, + { + "cell_type": "markdown", + "id": "526f22b3", + "metadata": { + "editable": true + }, + "source": [ "## Linking with the SVD\n", "\n", "We saw earlier that" @@ -1818,7 +2214,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5d16d7c8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -1827,14 +2226,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11a74368", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $p\\times p$, with $p$ corresponding to the singular values, we defined earlier the matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0ca3614f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma} = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1843,14 +2248,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b98abb6c", + "metadata": { + "editable": true + }, "source": [ "where the tilde-matrix $\\tilde{\\boldsymbol{\\Sigma}}$ is a matrix of dimension $p\\times p$ containing only the singular values $\\sigma_i$, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "813567cc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{\\Sigma}}=\\begin{bmatrix} \\sigma_0 & 0 & 0 & \\dots & 0 & 0 \\\\\n", @@ -1864,14 +2275,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ed905c7b", + "metadata": { + "editable": true + }, "source": [ "meaning we can write" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0136bdac", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2\\boldsymbol{V}^T.\n", @@ -1880,14 +2297,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d43e6609", + "metadata": { + "editable": true + }, "source": [ "Multiplying from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "15d2bb49", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2.\n", @@ -1896,7 +2319,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "374104f4", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$\n", "are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ with eigenvalues\n", @@ -1905,7 +2331,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "86f4db59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1914,7 +2343,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9d007f11", + "metadata": { + "editable": true + }, "source": [ "In other words, each non-zero singular value of $\\boldsymbol{X}$ is a positive\n", "square root of an eigenvalue of $\\boldsymbol{X}^T\\boldsymbol{X}$. It means also that\n", @@ -1924,7 +2356,6 @@ "$\\boldsymbol{v}_i$ are hierarchically ordered by how much correlation they\n", "encode from the columns of $\\boldsymbol{X}$. \n", "\n", - "\n", "Note that these are also the eigenvectors and eigenvalues of the\n", "Hessian matrix.\n", "\n", @@ -1934,7 +2365,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03c93eed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{X}]=\\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X},\n", @@ -1943,7 +2377,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3ee37fac", + "metadata": { + "editable": true + }, "source": [ "meaning that every squared non-singular value of $\\boldsymbol{X}$ divided by $n$ (\n", "the number of samples) are the eigenvalues of the covariance\n", @@ -1952,13 +2389,15 @@ "self-adjoint, the singular values of $\\boldsymbol{X}$ are equal to the\n", "absolute value of the eigenvalues of $\\boldsymbol{X}$.\n", "\n", - "\n", "For $\\boldsymbol{X}\\boldsymbol{X}^T$ we found" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "13290881", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{U}^T.\n", @@ -1967,14 +2406,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3896b3e6", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $n\\times n$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ca47bd66", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\boldsymbol{0}\\\\ \\end{bmatrix}=\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1983,14 +2428,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1513e1d0", + "metadata": { + "editable": true + }, "source": [ "leading to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b9bf25a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\boldsymbol{U}^T.\n", @@ -1999,14 +2450,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2eeb03c8", + "metadata": { + "editable": true + }, "source": [ "Multiplying with $\\boldsymbol{U}$ from the right gives us the eigenvalue problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "da278d8e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{X}\\boldsymbol{X}^T)\\boldsymbol{U}=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}.\n", @@ -2015,7 +2472,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2b341903", + "metadata": { + "editable": true + }, "source": [ "It means that the eigenvalues of $\\boldsymbol{X}\\boldsymbol{X}^T$ are again given by\n", "the non-zero singular values plus now a series of zeros. The column\n", @@ -2024,11 +2484,16 @@ "\n", "Since we will mainly be interested in the correlations among the features\n", "of our data (the columns of $\\boldsymbol{X}$, the quantity of interest for us are the non-zero singular\n", - "values and the column vectors of $\\boldsymbol{V}$.\n", - "\n", - "\n", - "\n", - "\n", + "values and the column vectors of $\\boldsymbol{V}$." + ] + }, + { + "cell_type": "markdown", + "id": "e66723d1", + "metadata": { + "editable": true + }, + "source": [ "## Ridge and Lasso Regression\n", "\n", "Let us remind ourselves about the expression for the standard Mean Squared Error (MSE) which we used to define our cost function and the equations for the ordinary least squares (OLS) method, that is \n", @@ -2037,7 +2502,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "85cff01a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n", @@ -2046,14 +2514,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c3bdf4f5", + "metadata": { + "editable": true + }, "source": [ "or we can state it as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1306ed38", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -2063,14 +2537,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "00474af5", + "metadata": { + "editable": true + }, "source": [ "where we have used the definition of a norm-2 vector, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "346ae1ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_2 = \\sqrt{\\sum_i x_i^2}.\n", @@ -2079,7 +2559,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "36f83c2a", + "metadata": { + "editable": true + }, "source": [ "By minimizing the above equation with respect to the parameters\n", "$\\boldsymbol{\\beta}$ we could then obtain an analytical expression for the\n", @@ -2089,7 +2572,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb246827", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -2099,7 +2585,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d38c34b0", + "metadata": { + "editable": true + }, "source": [ "which leads to the Ridge regression minimization problem where we\n", "require that $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2^2\\le t$, where $t$ is\n", @@ -2108,7 +2597,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e3f2141f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\frac{1}{n}\\vert\\vert \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\vert\\vert_2^2+\\lambda\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -2117,14 +2609,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "74f56599", + "metadata": { + "editable": true + }, "source": [ "we have a new optimization equation" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea246d4b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -2134,7 +2632,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c6b1faa8", + "metadata": { + "editable": true + }, "source": [ "which leads to Lasso regression. Lasso stands for least absolute shrinkage and selection operator. \n", "\n", @@ -2143,7 +2644,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2fc09f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_1 = \\sum_i \\vert x_i\\vert.\n", @@ -2152,14 +2656,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a9f2c69a", + "metadata": { + "editable": true + }, "source": [ "Using the matrix-vector expression for Ridge regression and dropping the parameter $1/n$ in front of the standard means squared error equation, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fb35c59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\boldsymbol{\\beta}^T\\boldsymbol{\\beta},\n", @@ -2168,7 +2678,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2e7636c6", + "metadata": { + "editable": true + }, "source": [ "and \n", "taking the derivatives with respect to $\\boldsymbol{\\beta}$ we obtain then\n", @@ -2179,7 +2692,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51bd5332", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{Ridge}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2188,14 +2704,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbd07896", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{I}$ being a $p\\times p$ identity matrix with the constraint that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "39cd7db8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sum_{i=0}^{p-1} \\beta_i^2 \\leq t,\n", @@ -2204,7 +2726,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "245333af", + "metadata": { + "editable": true + }, "source": [ "with $t$ a finite positive number. \n", "\n", @@ -2213,7 +2738,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ea29678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2222,26 +2750,29 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ad883534", + "metadata": { + "editable": true + }, "source": [ "which can lead to singular matrices. However, with the SVD, we can always compute the inverse of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$.\n", "\n", - "\n", "We see that Ridge regression is nothing but the standard OLS with a\n", "modified diagonal term added to $\\boldsymbol{X}^T\\boldsymbol{X}$. The consequences, in\n", "particular for our discussion of the bias-variance tradeoff are rather\n", "interesting. We will see that for specific values of $\\lambda$, we may\n", "even reduce the variance of the optimal parameters $\\boldsymbol{\\beta}$. These topics and other related ones, will be discussed after the more linear algebra oriented analysis here.\n", "\n", - "\n", - "\n", "Using our insights about the SVD of the design matrix $\\boldsymbol{X}$ \n", "We have already analyzed the OLS solutions in terms of the eigenvectors (the columns) of the right singular value matrix $\\boldsymbol{U}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "54e5791f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{OLS}}=\\boldsymbol{X}\\boldsymbol{\\beta} =\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}.\n", @@ -2250,14 +2781,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c406bcb3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression this becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1a6f9659", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{Ridge}}=\\boldsymbol{X}\\boldsymbol{\\beta}_{\\mathrm{Ridge}} = \\boldsymbol{U\\Sigma V^T}\\left(\\boldsymbol{V}\\boldsymbol{\\Sigma}^2\\boldsymbol{V}^T+\\lambda\\boldsymbol{I} \\right)^{-1}(\\boldsymbol{U\\Sigma V^T})^T\\boldsymbol{y}=\\sum_{j=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda}\\boldsymbol{y},\n", @@ -2266,18 +2803,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e2edbb3a", + "metadata": { + "editable": true + }, "source": [ "with the vectors $\\boldsymbol{u}_j$ being the columns of $\\boldsymbol{U}$ from the SVD of the matrix $\\boldsymbol{X}$. \n", "\n", - "\n", - "\n", "Since $\\lambda \\geq 0$, it means that compared to OLS, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "402353ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda} \\leq 1.\n", @@ -2286,7 +2827,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "423b6396", + "metadata": { + "editable": true + }, "source": [ "Ridge regression finds the coordinates of $\\boldsymbol{y}$ with respect to the\n", "orthonormal basis $\\boldsymbol{U}$, it then shrinks the coordinates by\n", @@ -2296,14 +2840,15 @@ "\n", "For small eigenvalues $\\sigma_i$ it means that their contributions become less important, a fact which can be used to reduce the number of degrees of freedom. More about this when we have covered the material on a statistical interpretation of various linear regression methods.\n", "\n", - "\n", - "\n", "For the sake of simplicity, let us assume that the design matrix is orthonormal, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f1d49878", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=(\\boldsymbol{X}^T\\boldsymbol{X})^{-1} =\\boldsymbol{I}.\n", @@ -2312,14 +2857,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "29e021c6", + "metadata": { + "editable": true + }, "source": [ "In this case the standard OLS results in" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ea41670", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{OLS}} = \\boldsymbol{X}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\boldsymbol{y},\n", @@ -2328,14 +2879,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5c24d1b", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5cde9430", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{Ridge}} = \\left(\\boldsymbol{I}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}=\\left(1+\\lambda\\right)^{-1}\\boldsymbol{\\beta}^{\\mathrm{OLS}},\n", @@ -2344,7 +2901,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8725e06", + "metadata": { + "editable": true + }, "source": [ "that is the Ridge estimator scales the OLS estimator by the inverse of a factor $1+\\lambda$, and\n", "the Ridge estimator converges to zero when the hyperparameter goes to\n", @@ -2352,14 +2912,15 @@ "\n", "We will come back to more interpreations after we have gone through some of the statistical analysis part. \n", "\n", - "\n", - "\n", "Using the matrix-vector expression for Lasso regression and dropping the parameter $1/n$ in front of the standard mean squared error equation, we have the following **cost** function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "77595d78", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -2368,14 +2929,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "30d6a0a4", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative with respect to $\\boldsymbol{\\beta}$ and recalling that the derivative of the absolute value is (we drop the boldfaced vector symbol for simplicty)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e6aaeb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{d \\vert \\beta\\vert}{d \\boldsymbol{\\beta}}=\\mathrm{sgn}(\\boldsymbol{\\beta})=\\left\\{\\begin{array}{cc} 1 & \\beta > 0 \\\\ 0 & \\beta =0\\\\-1 & \\beta < 0, \\end{array}\\right.\n", @@ -2384,14 +2951,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "61f8860b", + "metadata": { + "editable": true + }, "source": [ "we have that the derivative of the cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "848fab1b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{X},\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}=-2\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})+\\lambda sgn(\\boldsymbol{\\beta})=0,\n", @@ -2400,14 +2973,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b3f9c65", + "metadata": { + "editable": true + }, "source": [ "and reordering we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a4535489", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta}+\\lambda sgn(\\boldsymbol{\\beta})=2\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2416,14 +2995,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "08d1dcfc", + "metadata": { + "editable": true + }, "source": [ "This equation does not lead to a nice analytical equation as in Ridge regression or ordinary least squares. This equation can however be solved by using standard convex optimization algorithms using for example the Python package [CVXOPT](https://cvxopt.org/). We will discuss this later. \n", "\n", - "\n", - "\n", - "\n", - "\n", "Let us assume that our design matrix is given by unit (identity) matrix, that is a square diagonal matrix with ones only along the\n", "diagonal. In this case we have an equal number of rows and columns $n=p$.\n", "\n", @@ -2432,7 +3010,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bfad6360", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2,\n", @@ -2441,14 +3022,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ececd781", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "834ae242", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{OLS}} = y_i.\n", @@ -2457,14 +3044,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef16a3d3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a40a2bf7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\beta_i^2,\n", @@ -2473,14 +3066,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c6b14af", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "d9fb8933", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{Ridge}} = \\frac{y_i}{1+\\lambda}.\n", @@ -2489,14 +3088,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "272cb2f8", + "metadata": { + "editable": true + }, "source": [ "For Lasso regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "fadce691", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\vert\\beta_i\\vert=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\sqrt{\\beta_i^2},\n", @@ -2505,14 +3110,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7cd5640", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "463185a0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2\\sum_{i=0}^{p-1}(y_i-\\beta_i)+\\lambda \\sum_{i=0}^{p-1}\\frac{(\\beta_i)}{\\vert\\beta_i\\vert}=0,\n", @@ -2521,14 +3132,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2748c6", + "metadata": { + "editable": true + }, "source": [ "which leads to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "14027ed3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_i^{\\mathrm{Lasso}} = \\left\\{\\begin{array}{ccc}y_i-\\frac{\\lambda}{2} &\\mathrm{if} & y_i> \\frac{\\lambda}{2}\\\\\n", @@ -2539,18 +3156,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6ee85f1d", + "metadata": { + "editable": true + }, "source": [ "Plotting these results ([figure in handwritten notes for week 36](https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2021/NotesSeptember9.pdf)) shows clearly that Lasso regression suppresses (sets to zero) values of $\\beta_i$ for specific values of $\\lambda$. Ridge regression reduces on the other hand the values of $\\beta_i$ as function of $\\lambda$.\n", "\n", - "\n", "As another examples, \n", "let us assume we have a data set with outputs/targets given by the vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5208771", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y}=\\begin{bmatrix}4 \\\\ 2 \\\\3\\end{bmatrix},\n", @@ -2559,14 +3181,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1b21b70", + "metadata": { + "editable": true + }, "source": [ "and our inputs as a $3\\times 2$ design matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7f60db1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}2 & 0\\\\ 0 & 1 \\\\ 0 & 0\\end{bmatrix},\n", @@ -2575,17 +3203,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "908ab8d8", + "metadata": { + "editable": true + }, "source": [ "meaning that we have two features and two unknown parameters $\\beta_0$ and $\\beta_1$ to be determined either by ordinary least squares, Ridge or Lasso regression.\n", "\n", - "\n", "For ordinary least squares (OLS) we know that the optimal solution is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "aebb6349", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2594,14 +3227,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c5e7c53f", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2197be2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\begin{bmatrix}2 \\\\ 2\\end{bmatrix},\n", @@ -2610,17 +3249,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d6f2196", + "metadata": { + "editable": true + }, "source": [ "The code which implements this simpler case is presented after the discussion of Ridge and Lasso.\n", "\n", - "\n", "For Ridge regression we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f340903", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2629,14 +3273,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11b0427e", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "963a0089", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\begin{bmatrix}\\frac{8}{4+\\lambda} \\\\ \\frac{2}{1+\\lambda}\\end{bmatrix},\n", @@ -2645,21 +3295,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7db2daaa", + "metadata": { + "editable": true + }, "source": [ "There is normally a constraint on the value of $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2$ via the parameter $\\lambda$.\n", "Let us for simplicity assume that $\\beta_0^2+\\beta_1^2=1$ as constraint. This will allow us to find an expression for the optimal values of $\\beta$ and $\\lambda$.\n", "\n", "To see this, let us write the cost function for Ridge regression. \n", "\n", - "\n", - "\n", "We define the MSE without the $1/n$ factor and have then, using that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "688d8588", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{\\beta}=\\begin{bmatrix} 2\\beta_0 \\\\ \\beta_1 \\\\0 \\end{bmatrix},\n", @@ -2668,7 +3322,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "711738d9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\beta_0^2+\\beta_1^2),\n", @@ -2677,14 +3334,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c949f8e", + "metadata": { + "editable": true + }, "source": [ "and taking the derivative with respect to $\\beta_0$ we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bbc3b07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{8}{4+\\lambda},\n", @@ -2693,14 +3356,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1cbf8a76", + "metadata": { + "editable": true + }, "source": [ "and for $\\beta_1$ we obtain" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8f10e5bd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{2}{1+\\lambda},\n", @@ -2709,14 +3378,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b547328c", + "metadata": { + "editable": true + }, "source": [ "Using the constraint for $\\beta_0^2+\\beta_1^2=1$ we can constrain $\\lambda$ by solving" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "707c1a57", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\frac{8}{4+\\lambda}\\right)^2+\\left(\\frac{2}{1+\\lambda}\\right)^2=1,\n", @@ -2725,18 +3400,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b90e6997", + "metadata": { + "editable": true + }, "source": [ "which gives $\\lambda=4.571$ and $\\beta_0=0.933$ and $\\beta_1=0.359$.\n", "\n", - "\n", "For Lasso we need now, keeping a constraint on $\\vert\\beta_0\\vert+\\vert\\beta_1\\vert=1$, to take the derivative of the absolute values of $\\beta_0$\n", "and $\\beta_1$. This gives us the following derivatives of the cost function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e4f6ca20", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\vert\\beta_0\\vert+\\vert\\beta_1\\vert),\n", @@ -2745,7 +3425,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b3d7018c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_0}=-4(4-2\\beta_0)+\\lambda\\mathrm{sgn}(\\beta_0)=0,\n", @@ -2754,14 +3437,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9e6f1823", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea3b2bf0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_1}=-2(2-\\beta_1)+\\lambda\\mathrm{sgn}(\\beta_1)=0.\n", @@ -2770,7 +3459,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "484b5cd4", + "metadata": { + "editable": true + }, "source": [ "We have now four cases to solve besides the trivial cases $\\beta_0$ and/or $\\beta_1$ are zero, namely\n", "1. $\\beta_0 > 0$ and $\\beta_1 > 0$,\n", @@ -2786,7 +3478,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4861f625", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-4(4-2\\beta_0)+\\lambda=0,\n", @@ -2795,14 +3490,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9928eadb", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c94a1223", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2(2-\\beta_1)+\\lambda=0.\n", @@ -2811,14 +3512,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9bcaff12", + "metadata": { + "editable": true + }, "source": [ "which yields" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1b7020d6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{16+\\lambda}{8},\n", @@ -2827,14 +3534,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51fce0e9", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1fe81b2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{4+\\lambda}{2}.\n", @@ -2843,11 +3556,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "414a2e5b", + "metadata": { + "editable": true + }, "source": [ "Using the constraint on $\\beta_0$ and $\\beta_1$ we can then find the optimal value of $\\lambda$ for the different cases. We leave this as an exercise to you.\n", "\n", - "\n", "Here we set up the OLS, Ridge and Lasso functionality in order to study the above example. Note that here we have opted for a set of values of $\\lambda$, meaning that we need to perform a search in order to find the optimal values.\n", "\n", "First we study and compare the OLS and Ridge results. The next code compares all three methods.\n", @@ -2857,6 +3572,7 @@ { "cell_type": "code", "execution_count": 9, + "id": "57451fca", "metadata": { "collapsed": false, "editable": true @@ -2880,7 +3596,7 @@ }, "metadata": { "filenames": { - "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_245_1.png" + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_254_1.png" }, "needs_background": "light" }, @@ -2943,7 +3659,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6d10b060", + "metadata": { + "editable": true + }, "source": [ "We see here that we reach a plateau for the Ridge results. Writing out the coefficients $\\boldsymbol{\\beta}$, we that they are getting smaller and smaller and our error stabilizes since the predicted values of $\\tilde{\\boldsymbol{y}}$ approach zero.\n", "\n", @@ -2957,6 +3676,7 @@ { "cell_type": "code", "execution_count": 10, + "id": "100f7dbb", "metadata": { "collapsed": false, "editable": true @@ -3180,7 +3900,7 @@ }, "metadata": { "filenames": { - "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_247_1.png" + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_256_1.png" }, "needs_background": "light" }, @@ -3248,7 +3968,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d50bfd5", + "metadata": { + "editable": true + }, "source": [ "We bring then back our exponential function example and study all\n", "three regression methods. Depending on the level of noise, we note\n", @@ -3264,6 +3987,7 @@ { "cell_type": "code", "execution_count": 11, + "id": "409f405d", "metadata": { "collapsed": false, "editable": true @@ -3289,7 +4013,7 @@ }, "metadata": { "filenames": { - "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_249_1.png" + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_258_1.png" }, "needs_background": "light" }, @@ -3379,327 +4103,26 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "50e9be28", + "metadata": { + "editable": true + }, "source": [ "Both these example send a clear message. The addition of a\n", "shrinkage/regularization term implies that we need to perform a search\n", "for the optimal values of $\\lambda$. We will see this throughout these\n", "series of lectures.\n", "\n", - "\n", - "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*.\n", - "The following code example solves the simpler problem we discussed above, where we have added the latter python file." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'cvxopt'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mcvxopt\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatrix\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspdiag\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmul\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdiv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msqrt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msetseed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mcvxopt\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mblas\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlapack\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msolvers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msparse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspmatrix\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'cvxopt'" - ] - } - ], - "source": [ - "from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed\n", - "from cvxopt import blas, lapack, solvers, sparse, spmatrix\n", - "import math\n", - "\n", - "try:\n", - " import mosek\n", - " import sys\n", - " __MOSEK = True\n", - "except: __MOSEK = False\n", - "\n", - "if __MOSEK:\n", - "\n", - " def l1regls_mosek(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize || A*x - b ||_2^2 + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars( 2*n) # number of variables\n", - " task.appendcons( 2*n) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " Q = matrix(0.0, (n,n)) \n", - " blas.syrk(A, Q, alpha = 2.0, trans='T')\n", - "\n", - " I = []\n", - " for i in range(n):\n", - " I.extend(range(i,n))\n", - "\n", - " J = []\n", - " for i in range(n):\n", - " J.extend((n-i)*[i])\n", - "\n", - " task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n]))\n", - " task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var,\n", - " 0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - " def l1regls_mosek2(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize w'*w + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " A*x - w = b\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars(2*n + m) # number of variables\n", - " task.appendcons(2*n + m) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0])\n", - "\n", - " task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " for i in range(m):\n", - " task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " 2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b))\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], \n", - " (2*n+m)*[0.0], (2*n+m)*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - "def l1regls(A, b):\n", - " \"\"\"\n", - " \n", - " Returns the solution of l1-norm regularized least-squares problem\n", - " \n", - " minimize || A*x - b ||_2^2 + || x ||_1.\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - " q = matrix(1.0, (2*n,1))\n", - " q[:n] = -2.0 * A.T * b\n", - "\n", - " def P(u, v, alpha = 1.0, beta = 0.0 ):\n", - " \"\"\"\n", - " v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v \n", - " \"\"\"\n", - " v *= beta\n", - " v[:n] += alpha * 2.0 * A.T * (A * u[:n])\n", - "\n", - "\n", - " def G(u, v, alpha=1.0, beta=0.0, trans='N'):\n", - " \"\"\"\n", - " v := alpha*[I, -I; -I, -I] * u + beta * v (trans = 'N' or 'T')\n", - " \"\"\"\n", - "\n", - " v *= beta\n", - " v[:n] += alpha*(u[:n] - u[n:])\n", - " v[n:] += alpha*(-u[:n] - u[n:])\n", - "\n", - " h = matrix(0.0, (2*n,1))\n", - "\n", - "\n", - " # Customized solver for the KKT system \n", - " #\n", - " # [ 2.0*A'*A 0 I -I ] [x[:n] ] [bx[:n] ]\n", - " # [ 0 0 -I -I ] [x[n:] ] = [bx[n:] ].\n", - " # [ I -I -D1^-1 0 ] [zl[:n]] [bzl[:n]]\n", - " # [ -I -I 0 -D2^-1 ] [zl[n:]] [bzl[n:]]\n", - " #\n", - " # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2.\n", - " # \n", - " # We first eliminate zl and x[n:]:\n", - " #\n", - " # ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = \n", - " # bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] \n", - " #\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " #\n", - " # zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ).\n", - " #\n", - " # The first equation has the form\n", - " #\n", - " # (A'*A + D)*x[:n] = rhs\n", - " #\n", - " # and is equivalent to\n", - " #\n", - " # [ D A' ] [ x:n] ] = [ rhs ]\n", - " # [ A -I ] [ v ] [ 0 ].\n", - " #\n", - " # It can be solved as \n", - " #\n", - " # ( A*D^-1*A' + I ) * v = A * D^-1 * rhs\n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - "\n", - " S = matrix(0.0, (m,m))\n", - " Asc = matrix(0.0, (m,n))\n", - " v = matrix(0.0, (m,1))\n", - "\n", - " def Fkkt(W):\n", - "\n", - " # Factor \n", - " #\n", - " # S = A*D^-1*A' + I \n", - " #\n", - " # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2.\n", - "\n", - " d1, d2 = W['di'][:n]**2, W['di'][n:]**2\n", - "\n", - " # ds is square root of diagonal of D\n", - " ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), \n", - " sqrt(d1+d2) )\n", - " d3 = div(d2 - d1, d1 + d2)\n", - " \n", - " # Asc = A*diag(d)^-1/2\n", - " Asc = A * spdiag(ds**-1)\n", - "\n", - " # S = I + A * D^-1 * A'\n", - " blas.syrk(Asc, S)\n", - " S[::m+1] += 1.0 \n", - " lapack.potrf(S)\n", - "\n", - " def g(x, y, z):\n", - "\n", - " x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + \n", - " mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - \n", - " mul(d3, z[n:])) )\n", - " x[:n] = div( x[:n], ds) \n", - "\n", - " # Solve\n", - " #\n", - " # S * v = 0.5 * A * D^-1 * ( bx[:n] - \n", - " # (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] )\n", - " \n", - " blas.gemv(Asc, x, v)\n", - " lapack.potrs(S, v)\n", - " \n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - " blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T')\n", - " x[:n] = div(x[:n], ds)\n", - "\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 )\\\n", - " - mul( d3, x[:n] )\n", - " \n", - " # zl[:n] = D1^1/2 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ).\n", - " z[:n] = mul( W['di'][:n], x[:n] - x[n:] - z[:n] ) \n", - " z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) \n", - "\n", - " return g\n", - "\n", - " return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n]" + "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*." ] }, { "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we call the above functions and solve the problem, as done here" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "id": "4c5c2565", "metadata": { - "collapsed": false, "editable": true }, - "outputs": [], "source": [ - "from cvxopt import matrix, normal\n", - "\n", - "X = matrix( [ [ 2, 0, 1], [0, 1, 3]])\n", - "y = matrix( [4, 2, 3])\n", - "x = l1regls(X,y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**More text will be added to this example.**\n", - "\n", "## Linking the regression analysis with a statistical interpretation\n", "\n", "We will now couple the discussions of ordinary least squares, Ridge\n", @@ -3710,7 +4133,6 @@ "parameter can reduce considerably the variance of the parameters\n", "$\\beta$.\n", "\n", - "\n", "The\n", "advantage of doing linear regression is that we actually end up with\n", "analytical expressions for several statistical quantities. \n", @@ -3718,7 +4140,6 @@ "derive quantities like the variance and other expectation values in a\n", "rather straightforward way.\n", "\n", - "\n", "It is assumed that $\\varepsilon_i\n", "\\sim \\mathcal{N}(0, \\sigma^2)$ and the $\\varepsilon_{i}$ are\n", "independent, i.e.:" @@ -3726,7 +4147,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f264b531", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3739,7 +4163,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "800b179f", + "metadata": { + "editable": true + }, "source": [ "The randomness of $\\varepsilon_i$ implies that\n", "$\\mathbf{y}_i$ is also a random variable. In particular,\n", @@ -3752,8 +4179,6 @@ "notation above $\\mathbf{X}_{i,\\ast}$ means that we are looking at the\n", "row number $i$ and perform a sum over all values $p$.\n", "\n", - "\n", - "\n", "The assumption we have made here can be summarized as (and this is going to be useful when we discuss the bias-variance trade off)\n", "that there exists a function $f(\\boldsymbol{x})$ and a normal distributed error $\\boldsymbol{\\varepsilon}\\sim \\mathcal{N}(0, \\sigma^2)$\n", "which describe our data" @@ -3761,7 +4186,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b4815186", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y} = f(\\boldsymbol{x})+\\boldsymbol{\\varepsilon}\n", @@ -3770,7 +4198,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2a343970", + "metadata": { + "editable": true + }, "source": [ "We approximate this function with our model from the solution of the linear regression equations, that is our\n", "function $f$ is approximated by $\\boldsymbol{\\tilde{y}}$ where we want to minimize $(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2$, our MSE, with" @@ -3778,7 +4209,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "358077b0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{y}} = \\boldsymbol{X}\\boldsymbol{\\beta}.\n", @@ -3787,14 +4221,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "73f23e81", + "metadata": { + "editable": true + }, "source": [ "We can calculate the expectation value of $\\boldsymbol{y}$ for a given element $i$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bebdffa9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3807,7 +4247,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8c38cb47", + "metadata": { + "editable": true + }, "source": [ "while\n", "its variance is" @@ -3815,7 +4258,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "193c47ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \\mbox{Var}(y_i) & = \\mathbb{E} \\{ [y_i\n", @@ -3835,18 +4281,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "92832b0a", + "metadata": { + "editable": true + }, "source": [ "Hence, $y_i \\sim \\mathcal{N}( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}, \\sigma^2)$, that is $\\boldsymbol{y}$ follows a normal distribution with \n", "mean value $\\boldsymbol{X}\\boldsymbol{\\beta}$ and variance $\\sigma^2$ (not be confused with the singular values of the SVD). \n", "\n", - "\n", "With the OLS expressions for the parameters $\\boldsymbol{\\beta}$ we can evaluate the expectation value" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f517886", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}(\\boldsymbol{\\beta}) = \\mathbb{E}[ (\\mathbf{X}^{\\top} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbb{E}[ \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\mathbf{X}^{T}\\mathbf{X}\\boldsymbol{\\beta}=\\boldsymbol{\\beta}.\n", @@ -3855,7 +4306,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9dea445", + "metadata": { + "editable": true + }, "source": [ "This means that the estimator of the regression parameters is unbiased.\n", "\n", @@ -3866,7 +4320,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3aececb1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{eqnarray*}\n", @@ -3894,7 +4351,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38f2849", + "metadata": { + "editable": true + }, "source": [ "where we have used that $\\mathbb{E} (\\mathbf{Y} \\mathbf{Y}^{T}) =\n", "\\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} \\, \\mathbf{X}^{T} +\n", @@ -3904,7 +4364,6 @@ "$\\boldsymbol{\\sigma}^2 (\\boldsymbol{\\beta}_j ) = \\boldsymbol{\\sigma}^2 [(\\mathbf{X}^{T} \\mathbf{X})^{-1}]_{jj} $. This may be used to\n", "construct a confidence interval for the estimates.\n", "\n", - "\n", "In a similar way, we can obtain analytical expressions for say the\n", "expectation values of the parameters $\\boldsymbol{\\beta}$ and their variance\n", "when we employ Ridge regression, allowing us again to define a confidence interval. \n", @@ -3914,7 +4373,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "47dbc181", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big]=(\\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I}_{pp})^{-1} (\\mathbf{X}^{\\top} \\mathbf{X})\\boldsymbol{\\beta}^{\\mathrm{OLS}}.\n", @@ -3923,7 +4385,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a409614d", + "metadata": { + "editable": true + }, "source": [ "We see clearly that \n", "$\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big] \\not= \\boldsymbol{\\beta}^{\\mathrm{OLS}}$ for any $\\lambda > 0$. We say then that the ridge estimator is biased.\n", @@ -3933,7 +4398,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "32e59beb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{Ridge}}]=\\sigma^2[ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1} \\mathbf{X}^{T} \\mathbf{X} \\{ [ \\mathbf{X}^{\\top} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T},\n", @@ -3942,7 +4410,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5d38011", + "metadata": { + "editable": true + }, "source": [ "and it is easy to see that if the parameter $\\lambda$ goes to infinity then the variance of Ridge parameters $\\boldsymbol{\\beta}$ goes to zero. \n", "\n", @@ -3951,7 +4422,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "999a6bc6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{OLS}}]-\\mbox{Var}(\\boldsymbol{\\beta}^{\\mathrm{Ridge}})=\\sigma^2 [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}[ 2\\lambda\\mathbf{I} + \\lambda^2 (\\mathbf{X}^{T} \\mathbf{X})^{-1} ] \\{ [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T}.\n", @@ -3960,14 +4434,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "888f1db7", + "metadata": { + "editable": true + }, "source": [ "The difference is non-negative definite since each component of the\n", "matrix product is non-negative definite. \n", - "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. \n", - "\n", - "\n", - "\n", + "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below." + ] + }, + { + "cell_type": "markdown", + "id": "76360bbe", + "metadata": { + "editable": true + }, + "source": [ "## Deriving OLS from a probability distribution\n", "\n", "Our basic assumption when we derived the OLS equations was to assume\n", @@ -3986,7 +4469,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b1976cd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "y_i\\sim \\mathcal{N}(\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta}, \\sigma^2)=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -3995,7 +4481,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff419a1", + "metadata": { + "editable": true + }, "source": [ "We assume now that the various $y_i$ values are stochastically distributed according to the above Gaussian distribution. \n", "We define this distribution as" @@ -4003,7 +4492,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "82730c14", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(y_i, \\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]},\n", @@ -4012,7 +4504,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4982965d", + "metadata": { + "editable": true + }, "source": [ "which reads as finding the likelihood of an event $y_i$ with the input variables $\\boldsymbol{X}$ given the parameters (to be determined) $\\boldsymbol{\\beta}$.\n", "\n", @@ -4021,7 +4516,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab4c31a7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{y},\\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}=\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta}).\n", @@ -4030,7 +4528,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "768cb1fc", + "metadata": { + "editable": true + }, "source": [ "We will write this in a more compact form reserving $\\boldsymbol{D}$ for the domain of events, including the ouputs (targets) and the inputs. That is\n", "in case we have a simple one-dimensional input and output case" @@ -4038,7 +4539,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9f0c7f3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})].\n", @@ -4047,7 +4551,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c617cdd7", + "metadata": { + "editable": true + }, "source": [ "In the more general case the various inputs should be replaced by the possible features represented by the input data set $\\boldsymbol{X}$. \n", "We can now rewrite the above probability as" @@ -4055,7 +4562,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "760dd73f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -4064,27 +4574,27 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd8cbb0", + "metadata": { + "editable": true + }, "source": [ "It is a conditional probability (see below) and reads as the\n", "likelihood of a domain of events $\\boldsymbol{D}$ given a set of parameters\n", "$\\boldsymbol{\\beta}$.\n", "\n", - "\n", "In statistics, maximum likelihood estimation (MLE) is a method of\n", "estimating the parameters of an assumed probability distribution,\n", "given some observed data. This is achieved by maximizing a likelihood\n", "function so that, under the assumed statistical model, the observed\n", "data is the most probable. \n", "\n", - "\n", "We will assume here that our events are given by the above Gaussian\n", "distribution and we will determine the optimal parameters $\\beta$ by\n", "maximizing the above PDF. However, computing the derivatives of a\n", "product function is cumbersome and can easily lead to overflow and/or\n", "underflowproblems, with potentials for loss of numerical precision.\n", "\n", - "\n", "In practice, it is more convenient to maximize the logarithm of the\n", "PDF because it is a monotonically increasing function of the argument.\n", "Alternatively, and this will be our option, we will minimize the\n", @@ -4094,15 +4604,15 @@ "Note also that maximization/minimization of the logarithm of the PDF\n", "is equivalent to the maximization/minimization of the function itself.\n", "\n", - "\n", - "\n", - "\n", "We could now define a new cost function to minimize, namely the negative logarithm of the above PDF" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbfab5d3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=-\\log{\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})}=-\\sum_{i=0}^{n-1}\\log{p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})},\n", @@ -4111,14 +4621,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f4ee97d7", + "metadata": { + "editable": true + }, "source": [ "which becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1e74d52d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{n}{2}\\log{2\\pi\\sigma^2}+\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}.\n", @@ -4127,14 +4643,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b983cb4c", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative of the *new* cost function with respect to the parameters $\\beta$ we recognize our familiar OLS equation, namely" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c90a8ed0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right) =0,\n", @@ -4143,14 +4665,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38fcc19", + "metadata": { + "editable": true + }, "source": [ "which leads to the well-known OLS equation for the optimal paramters $\\beta$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "348010f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}!\n", @@ -4159,11 +4687,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd33a62d", + "metadata": { + "editable": true + }, "source": [ "Before we make a similar analysis for Ridge and Lasso regression, we need a short reminder on statistics. \n", "\n", - "\n", "A central theorem in statistics is Bayes' theorem. This theorem plays a similar role as the good old Pythagoras' theorem in geometry.\n", "Bayes' theorem is extremely simple to derive. But to do so we need some basic axioms from statistics.\n", "\n", @@ -4177,7 +4707,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2bb675c1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X)+p(Y)-p(X \\cap Y).\n", @@ -4186,14 +4719,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d1ff7ab5", + "metadata": { + "editable": true + }, "source": [ "The product rule (aka joint probability) is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "80d51bf1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X,Y)= p(X\\vert Y)p(Y)=p(Y\\vert X)p(X),\n", @@ -4202,20 +4741,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3eb856c7", + "metadata": { + "editable": true + }, "source": [ "where we read $p(X\\vert Y)$ as the likelihood of obtaining $X$ given $Y$.\n", "\n", "If we have independent events then $p(X,Y)=p(X)p(Y)$.\n", "\n", - "\n", - "\n", "The marginal probability is defined in terms of only one of the set of variables $X,Y$. For a discrete probability we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "84c98a40", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X)=\\sum_{i=0}^{n-1}p(X,Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert Y=y_i)p(Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert y_i)p(y_i).\n", @@ -4224,14 +4767,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "094f6489", + "metadata": { + "editable": true + }, "source": [ "The conditional probability, if $p(Y) > 0$, is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "40b87dab", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)}=\\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}.\n", @@ -4240,14 +4789,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "02ee6009", + "metadata": { + "editable": true + }, "source": [ "If we combine the conditional probability with the marginal probability and the standard product rule, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9b83f7e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)},\n", @@ -4256,14 +4811,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "28693db1", + "metadata": { + "editable": true + }, "source": [ "which we can rewrite as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd0819c2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}=\\frac{p(Y\\vert X)p(X)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)},\n", @@ -4272,11 +4833,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c73d36a3", + "metadata": { + "editable": true + }, "source": [ "which is Bayes' theorem. It allows us to evaluate the uncertainty in in $X$ after we have observed $Y$. We can easily interchange $X$ with $Y$. \n", "\n", - "\n", "The quantity $p(Y\\vert X)$ on the right-hand side of the theorem is\n", "evaluated for the observed data $Y$ and can be viewed as a function of\n", "the parameter space represented by $X$. This function is not\n", @@ -4289,7 +4852,6 @@ "\n", "Let us try to illustrate Bayes' theorem through an example.\n", "\n", - "\n", "Let us suppose that you are undergoing a series of mammography scans\n", "in order to rule out possible breast cancer cases. We define the\n", "sensitivity for a positive event by the variable $X$. It takes binary\n", @@ -4307,7 +4869,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "779d9389", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=1) =0.8.\n", @@ -4316,7 +4881,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "63db00a0", + "metadata": { + "editable": true + }, "source": [ "This obviously sounds scary since many would conclude that if the test\n", "is positive, there is a likelihood of $80\\%$ for having cancer. It is\n", @@ -4326,7 +4894,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab01099c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1\\vert X=1),\n", @@ -4335,12 +4906,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ec0ebb28", + "metadata": { + "editable": true + }, "source": [ "instead of $p(X=1\\vert Y=1)$.\n", "\n", - "\n", - "\n", "If we look at various national surveys on breast cancer, the general\n", "likelihood of developing breast cancer is a very small number. Let us\n", "assume that the prior probability in the population as a whole is" @@ -4348,7 +4920,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c432161", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1) =0.004.\n", @@ -4357,7 +4932,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03d0cdb8", + "metadata": { + "editable": true + }, "source": [ "We need also to account for the fact that the test may produce a false\n", "positive result (false alarm). Let us here assume that we have" @@ -4365,7 +4943,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d7a0ad2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=0) =0.1.\n", @@ -4374,7 +4955,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fcdc27a1", + "metadata": { + "editable": true + }, "source": [ "Using Bayes' theorem we can then find the posterior probability that\n", "the person has breast cancer in case of a positive test, that is we\n", @@ -4383,7 +4967,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e773eb9e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -4398,7 +4985,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3892720e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -4413,12 +5003,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c68513be", + "metadata": { + "editable": true + }, + "source": [ + "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!" + ] + }, + { + "cell_type": "markdown", + "id": "db1bcf38", + "metadata": { + "editable": true + }, "source": [ - "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!\n", - "\n", - "\n", - "\n", "## Bayes' Theorem and Ridge and Lasso Regression\n", "\n", "Hitherto we have discussed Ridge and Lasso regression in terms of a\n", @@ -4428,7 +5027,6 @@ "\n", "Before we proceed let us perform a Ridge, Lasso and OLS analysis of a polynomial fit. \n", "\n", - "\n", "We will play around with a study of the values for the optimal\n", "parameters $\\boldsymbol{\\beta}$ using OLS, Ridge and Lasso regression. For\n", "OLS, you will notice as function of the noise and polynomial degree,\n", @@ -4443,12 +5041,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, + "id": "aa27ede9", "metadata": { "collapsed": false, "editable": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1.0169643 0.27924636 -1.4087793 1.03308408 0. ]\n", + "Test MSE OLS\n", + "0.958228616652075\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAnVklEQVR4nO3deXgUVd728e+PCAMDiCwBFcS4IC4sIYIj+LL4iOKCqA/Oi8CAgIgLOCLKgOKAyigoOoqAKCLiNjDKMqIIio4I7yAOqxiGARXwkeWRRcMga0jO+8dpYoxJurN0Kt19f64rF91dlaq7C+hf16lT55hzDhERSVwVgg4gIiLBUiEQEUlwKgQiIglOhUBEJMGpEIiIJLgTgg5QVHXq1HEpKSlBxxARiSmrVq3a45xLzm9ZzBWClJQUVq5cGXQMEZGYYmbfFLRMTUMiIglOhUBEJMGpEIiIJLiYu0aQn8zMTLZt28bhw4eDjiJFVLlyZRo0aEDFihWDjiKSsOKiEGzbto3q1auTkpKCmQUdRyLknGPv3r1s27aNM844I+g4IgkrLpqGDh8+TO3atVUEYoyZUbt2bZ3JiQQsLgoBoCIQo/T3JhK8uCkEIiJx7ZFHYPXqqGxahaCUmBm9evXKeX7s2DGSk5Pp3LkzAN999x2dO3emefPmnH/++Vx99dUAbN26lSpVqpCamprz8+qrr/5i+x06dKBx48Y0b96cVq1asXbt2pxlV199NRkZGb/4nYceeognn3yyRO9r7969OblOPvlk6tevn/P86NGjEW1j8eLFLFu2rEQ5RBLavHkwahTMnRuVzcfFxeLyoGrVqqSnp3Po0CGqVKnCokWLqF+/fs7ykSNHcvnll3P33XcDsG7dupxlZ5111s8+2Avyxhtv0LJlS15++WWGDh3KokWLAHjvvfdK983kUrt27ZxsDz30ENWqVeO+++4r0jYWL15MtWrVaNOmTRQSisS5PXtgwABo3hz++Meo7EJnBKXoqquuYv78+QDMmDGD7t275yzbuXMnDRo0yHnerFmzYu+ndevWbN++Ped5SkoKe/bsAeDRRx+lcePGdOzYkY0bN+ass2LFCpo1a0br1q0ZOnQoTZo0ASArK4uhQ4fSqlUrmjVrxgsvvBBRhlWrVtG+fXsuvPBCOnXqxM6dOwF49tlnOf/882nWrBk33XQTW7du5fnnn+fpp58mNTWVpUuXFvt9iyQc5+COO+D77+HVV6FSpajsJu7OCAYPhgi+XBdJaio880z49W666SYeeeQROnfuzLp16+jXr1/OB9/AgQPp1q0bEydOpGPHjvTt25dTTz0VgK+//prU1NSc7UyYMIG2bdsWuJ+FCxdy/fXX/+L1VatWMXPmTNasWcOxY8dIS0vjwgsvBKBv375MmTKFNm3aMHz48Jzfeemll6hRowYrVqzgyJEjXHLJJVxxxRWFdufMzMzkrrvu4u233yY5OZm//vWvjBgxgmnTpjF27Fi2bNnCr371KzIyMjjppJO4/fbbi3UmIZLwZs6EWbNgzBgowZfHcOKuEASpWbNmbN26lRkzZuRcAziuU6dObN68mYULF7JgwQJatGhBeno6EHnTUM+ePTlw4ABZWVmszuei0dKlS7nhhhv49a9/DUCXLl0AyMjIYP/+/TlNMz169ODdd98F4IMPPmDdunXMmjULgH379vHll18WWgg2btxIeno6l19+OeDPKk455ZScY9CzZ0+uv/76fIuViERoxw4YOBAuvhiGDo3qruKuEETyzT2aunTpwn333cfixYvZu3fvz5bVqlWLHj160KNHDzp37sySJUtyvrFH4o033qB58+YMHz6cgQMHMmfOnF+sk193TOdcgdt0zjFhwgQ6deoUcQ7nHBdccAGffvrpL5bNnz+fJUuWMG/ePEaPHs369esj3q6IhDgH/fvD4cO+SSgpKaq70zWCUtavXz9GjhxJ06ZNf/b63//+dw4ePAjA/v37+frrr2nYsGGRt1+xYkX+9Kc/sXz5cjZs2PCzZe3atWPu3LkcOnSI/fv388477wBQs2ZNqlevzvLlywGYOXNmzu906tSJyZMnk5mZCcCmTZs4cOBAoRkaN27M7t27cwpBZmYm69evJzs7m2+//ZZLL72UJ554goyMDH788UeqV6/O/v37i/xeRRLW1KmwYAE88QQ0ahT13akQlLIGDRrk9AzKbdWqVbRs2TLngm3//v1p1aoV8NM1guM/zz77bKH7qFKlCvfee+8vuoampaXRrVs3UlNT6dq168+uM7z00ksMGDCA1q1b45yjRo0aAPTv35/zzz+ftLQ0mjRpwm233caxY8cK3X+lSpWYNWsWw4YNo3nz5qSmprJs2TKysrL43e9+R9OmTWnRogX33HMPJ510Etde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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapter2_324_1.png" + }, + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -4517,7 +5141,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "66975598", + "metadata": { + "editable": true + }, "source": [ "How can we understand this?\n", "\n", @@ -4543,12 +5170,319 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, + "id": "f90a238f", "metadata": { "collapsed": false, "editable": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
beta
00.986699
1-0.606760
21.280573
3-0.850164
40.000000
\n", + "
" + ], + "text/plain": [ + " beta\n", + "0 0.986699\n", + "1 -0.606760\n", + "2 1.280573\n", + "3 -0.850164\n", + "4 0.000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
beta
00.978553
1-0.511888
21.051418
3-0.701370
40.000000
\n", + "
" + ], + "text/plain": [ + " beta\n", + "0 0.978553\n", + "1 -0.511888\n", + "2 1.051418\n", + "3 -0.701370\n", + "4 0.000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
beta
00.946957
1-0.162246
20.221921
3-0.167787
40.000000
\n", + "
" + ], + "text/plain": [ + " beta\n", + "0 0.946957\n", + "1 -0.162246\n", + "2 0.221921\n", + "3 -0.167787\n", + "4 0.000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
beta
00.906747
10.017665
2-0.029483
3-0.053849
40.000000
\n", + "
" + ], + "text/plain": [ + " beta\n", + "0 0.906747\n", + "1 0.017665\n", + "2 -0.029483\n", + "3 -0.053849\n", + "4 0.000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
beta
00.718165
10.156956
20.040102
3-0.001880
40.000000
\n", + "
" + ], + "text/plain": [ + " beta\n", + "0 0.718165\n", + "1 0.156956\n", + "2 0.040102\n", + "3 -0.001880\n", + "4 0.000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import numpy as np\n", "import pandas as pd\n", @@ -4592,7 +5526,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d32f4700", + "metadata": { + "editable": true + }, "source": [ "As an exercise, repeat these calculations with ordinary least squares\n", "only with and without noise. Calculate thereafter the variance of the\n", @@ -4600,11 +5537,16 @@ "noise. Here we recommend to use $\\sigma^2=1$ as variance for the\n", "added noise (which follows a normal distribution with mean value zero).\n", "Comment your results. If you have a large noise term, do the parameters $\\beta_j$ vary more as function\n", - "model complexity? And what about their variance? \n", - "\n", - "\n", - "\n", - "\n", + "model complexity? And what about their variance?" + ] + }, + { + "cell_type": "markdown", + "id": "5292b482", + "metadata": { + "editable": true + }, + "source": [ "## Linking Bayes' Theorem with Ridge and Lasso Regression\n", "\n", "We have seen that Ridge regression suppresses those features which\n", @@ -4618,7 +5560,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b827637", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})],\n", @@ -4627,14 +5572,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6e73b7d4", + "metadata": { + "editable": true + }, "source": [ "is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ead2878e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -4643,14 +5594,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1302f31e", + "metadata": { + "editable": true + }, "source": [ "In Bayes' theorem this function plays the role of the so-called likelihood. We could now ask the question what is the posterior probability of a parameter set $\\boldsymbol{\\beta}$ given a domain of events $\\boldsymbol{D}$? That is, how can we define the posterior probability" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "dd411d77", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D}).\n", @@ -4659,14 +5616,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "01dcd800", + "metadata": { + "editable": true + }, "source": [ "Bayes' theorem comes to our rescue here since (omitting the normalization constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0a3fa1e5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})\\propto p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})p(\\boldsymbol{\\beta}).\n", @@ -4675,25 +5638,28 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5ce5ac4", + "metadata": { + "editable": true + }, "source": [ "We have a model for $p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})$ but need one for the **prior** $p(\\boldsymbol{\\beta}$! \n", "\n", - "\n", - "\n", "With the posterior probability defined by a likelihood which we have\n", "already modeled and an unknown prior, we are now ready to make\n", "additional models for the prior.\n", "\n", "We can, based on our discussions of the variance of $\\boldsymbol{\\beta}$ and\n", "the mean value, assume that the prior for the values $\\boldsymbol{\\beta}$ is\n", - "given by a Gaussian with mean value zero and variance $\\tau^2$, that\n", - "is" + "given by a Gaussian with mean value zero and variance $\\tau^2$, that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "9221bb65", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4702,14 +5668,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0e7f22c4", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3565934d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta\\vert\\boldsymbol{D})}=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4718,7 +5690,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5c4b9c3a", + "metadata": { + "editable": true + }, "source": [ "We can now optimize this quantity with respect to $\\boldsymbol{\\beta}$. As we\n", "did for OLS, this is most conveniently done by taking the negative\n", @@ -4728,7 +5703,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f91f265b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{2\\tau^2}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4737,14 +5715,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a0427716", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/2\\tau^2$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "117eb03b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4753,17 +5737,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9015a44a", + "metadata": { + "editable": true + }, "source": [ "which is our Ridge cost function! Nice, isn't it?\n", "\n", - "\n", "To derive the Lasso cost function, we simply replace the Gaussian prior with an exponential distribution ([Laplace in this case](https://en.wikipedia.org/wiki/Laplace_distribution)) with zero mean value, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a184ac5a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4772,14 +5761,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae799fbe", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "055d1b54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4788,7 +5783,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "104615f6", + "metadata": { + "editable": true + }, "source": [ "Taking the negative\n", "logarithm of the posterior probability and leaving out the\n", @@ -4797,7 +5795,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d868c3b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{\\tau}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4806,14 +5807,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c88440ff", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/\\tau$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "07c1232a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4822,11 +5829,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8416dffb", + "metadata": { + "editable": true + }, "source": [ "which is our Lasso cost function! \n", "\n", - "\n", "Plotting these prior functions shows us that we can use the parameter\n", "$\\lambda$ to shrink or increase the role of a given parameter\n", "$\\beta_j$. The variance for the Laplace distribution is\n", @@ -4852,5 +5861,5 @@ } }, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 5 } \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/chapter2.py b/doc/LectureNotes/_build/jupyter_execute/chapter2.py index 6c5959b71..1bfb3775a 100644 --- a/doc/LectureNotes/_build/jupyter_execute/chapter2.py +++ b/doc/LectureNotes/_build/jupyter_execute/chapter2.py @@ -1,15 +1,15 @@ #!/usr/bin/env python # coding: utf-8 +# + # # Ridge and Lasso Regression -# -# -# + # ## Mathematical Interpretation of Ordinary Least Squares # # What is presented here is a mathematical analysis of various regression algorithms (ordinary least squares, Ridge and Lasso Regression). The analysis is based on an important algorithm in linear algebra, the so-called Singular Value Decomposition (SVD). # -# # We have shown that in ordinary least squares (OLS) the optimal parameters $\beta$ are given by # $$ @@ -39,9 +39,6 @@ # The matrix $\boldsymbol{A}$ has the important property that $\boldsymbol{A}^2=\boldsymbol{A}$. This is the definition of a [projection matrix](https://en.wikipedia.org/wiki/Projection_matrix). # We can then interpret our optimal model $\tilde{\boldsymbol{y}}$ as being represented by an orthogonal projection of $\boldsymbol{y}$ onto a space defined by the column vectors of $\boldsymbol{X}$. In our case here the matrix $\boldsymbol{A}$ is a square matrix. If it is a general rectangular matrix we have an oblique projection matrix. # -# -# -# # We have defined the residual error as # $$ @@ -50,7 +47,6 @@ # The residual errors are then the projections of $\boldsymbol{y}$ onto the orthogonal component of the space defined by the column vectors of $\boldsymbol{X}$. # -# # If the matrix $\boldsymbol{X}$ is an orthogonal (or unitary in case of complex values) matrix, we have # $$ @@ -69,14 +65,10 @@ # \boldsymbol{\epsilon}=\boldsymbol{y}-\tilde{\boldsymbol{y}}=0. # $$ -# This serves also as a useful test of our codes. -# -# -# -# +# This serves also as a useful test of our codes. + # ## The singular value decomposition # -# # The examples we have looked at so far are cases where we normally can # invert the matrix $\boldsymbol{X}^T\boldsymbol{X}$. Using a polynomial expansion where we fit of various functions leads to # row vectors of the design matrix which are essentially orthogonal due @@ -84,7 +76,6 @@ # design matrix is then often done via a so-called LU, QR or Cholesky # decomposition. # -# # As we will also see in the first project, # this may # however not the be case in general and a standard matrix inversion @@ -108,9 +99,6 @@ # in the principal component analysis where high-dimensional data can be # reduced to the statistically relevant features. # -# -# -# # One of the typical problems we encounter with linear regression, in particular # when the matrix $\boldsymbol{X}$ (our so-called design matrix) is high-dimensional, # are problems with near singular or singular matrices. The column vectors of $\boldsymbol{X}$ @@ -156,8 +144,6 @@ # We see easily that $\mbox{det}(\boldsymbol{X}) = x_{11} x_{22} - x_{12} x_{21} = 1 \times (-1) - 1 \times (-1) = 0$. Hence, $\mathbf{X}$ is singular and its inverse is undefined. # This is equivalent to saying that the matrix $\boldsymbol{X}$ has at least an eigenvalue which is zero. # -# -# # If our design matrix $\boldsymbol{X}$ which enters the linear regression problem # @@ -182,14 +168,10 @@ # \boldsymbol{X}^{T} \boldsymbol{X} \rightarrow \boldsymbol{X}^{T} \boldsymbol{X}+\lambda \boldsymbol{I}, # $$ -# where $\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\lambda$ is called a hyperparameter. More about this later. -# -# -# -# +# where $\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\lambda$ is called a hyperparameter. More about this later. + # ## Basic math of the SVD # -# # From standard linear algebra we know that a square matrix $\boldsymbol{X}$ can be diagonalized if and only it is # a so-called [normal matrix](https://en.wikipedia.org/wiki/Normal_matrix), that is if $\boldsymbol{X}\in {\mathbb{R}}^{n\times n}$ # we have $\boldsymbol{X}\boldsymbol{X}^T=\boldsymbol{X}^T\boldsymbol{X}$ or if $\boldsymbol{X}\in {\mathbb{C}}^{n\times n}$ we have $\boldsymbol{X}\boldsymbol{X}^{\dagger}=\boldsymbol{X}^{\dagger}\boldsymbol{X}$. @@ -225,10 +207,6 @@ # is not diagonalizable, it is a so-called [defective matrix](https://en.wikipedia.org/wiki/Defective_matrix). It is easy to see that the condition # $\boldsymbol{X}\boldsymbol{X}^T=\boldsymbol{X}^T\boldsymbol{X}$ is not fulfilled. # -# -# -# -# # However, and this is the strength of the SVD algorithm, any general # matrix $\boldsymbol{X}$ can be decomposed in terms of a diagonal matrix and # two orthogonal/unitary matrices. The [Singular Value Decompostion @@ -270,7 +248,6 @@ # # The columns of $\boldsymbol{U}$ are called the left singular vectors while the columns of $\boldsymbol{V}$ are the right singular vectors. # -# # If we assume that $n > p$, then our matrix $\boldsymbol{U}$ has dimension $n # \times n$. The last $n-p$ columns of $\boldsymbol{U}$ become however # irrelevant in our calculations since they are multiplied with the @@ -287,7 +264,7 @@ # If $p > n$, then only the first $n$ columns of $\boldsymbol{V}$ are computed and $\boldsymbol{\Sigma}$ has dimension $n\times n$. # The $n=p$ case is obvious, we retain the full SVD. # In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy. -# + # ## Codes for the SVD # In[1]: @@ -333,8 +310,6 @@ print(C-X) # inversion algorithm for matrix inversion with $\boldsymbol{X}^T\boldsymbol{X}$ results # in the program terminating due to a singular matrix. # -# -# # The $U$, $S$, and $V$ matrices returned from the **svd()** function # cannot be multiplied directly. # @@ -347,8 +322,7 @@ print(C-X) # If you wish to include the zero singular values, you will need to # resize the matrices and set up a diagonal matrix as done in the above # example -# -# + # ## Code for SVD and Inversion of Matrices # # How do we use the SVD to invert a matrix $\boldsymbol{X}^T\boldsymbol{X}$ which is singular or near singular? @@ -410,7 +384,7 @@ print(np.abs(B-C)) # \boldsymbol{A}_{\mathrm{PI}}= \boldsymbol{V}\boldsymbol{D}_{\mathrm{PI}}\boldsymbol{U}^T, # $$ -# where $\boldsymbol{D}_{\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\boldsymbol{Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD. +# where $\boldsymbol{D}_{\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\boldsymbol{\Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD. # In[4]: @@ -441,11 +415,7 @@ print(np.abs(C-B)) # As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**. -# -# -# -# -# + # ## Mathematics of the SVD and implications # # Let us take a closer look at the mathematics of the SVD and the various implications for machine learning studies. @@ -481,7 +451,6 @@ print(np.abs(C-B)) # All values beyond $p-1$ are all zero. # -# # As an example, consider the following $3\times 2$ example for the matrix $\boldsymbol{\Sigma}$ # $$ @@ -538,8 +507,6 @@ print(np.abs(C-B)) # contain only zeros. This will have important consequences for our SVD # decomposition of the design matrix. # -# -# # The matrix that may cause problems for us is $\boldsymbol{X}^T\boldsymbol{X}$. Using the SVD we can rewrite this matrix as # $$ @@ -554,12 +521,6 @@ print(np.abs(C-B)) # We define $\boldsymbol{\Sigma}^T\boldsymbol{\Sigma}=\tilde{\boldsymbol{\Sigma}}^2$ which is a diagonal matrix containing only the singular values squared. It has dimensionality $p \times p$. # -# This means, using the orthogonality of $\boldsymbol{V}$, that we get - -# $$ -# \boldsymbol{X}^T\boldsymbol{X}=\tilde{\boldsymbol{\Sigma}}^2. -# $$ - # We can now insert the result for the matrix $\boldsymbol{X}^T\boldsymbol{X}$ into our equation for ordinary least squares where # $$ @@ -569,10 +530,10 @@ print(np.abs(C-B)) # and using our SVD decomposition of $\boldsymbol{X}$ we have # $$ -# \tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^T\tilde{\boldsymbol{\Sigma}}^{-2}\boldsymbol{V}\boldsymbol{\Sigma}^T\boldsymbol{U}^T\boldsymbol{y}, +# \tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{\Sigma}\boldsymbol{V}^T\left(\boldsymbol{V}\tilde{\boldsymbol{\Sigma}}^{2}(\boldsymbol{V}^T\right)^{-1}\boldsymbol{V}\boldsymbol{\Sigma}^T\boldsymbol{U}^T\boldsymbol{y}, # $$ -# which gives us, using the orthogonality of the matrices $\boldsymbol{U}$ and $\boldsymbol{V}$, +# which gives us, using the orthogonality of the matrices $\boldsymbol{U}$ and $\boldsymbol{V}$,, # $$ # \tilde{y}_{\mathrm{OLS}}=\boldsymbol{U}\boldsymbol{U}^T\boldsymbol{y}=\sum_{i=0}^{p-1}\boldsymbol{u}_i\boldsymbol{u}^T_j\boldsymbol{y}, @@ -587,8 +548,7 @@ print(np.abs(C-B)) # that belong to $i>p-1$, result in only zeros when we perform the multiplications. This means that the sum above has non-zero elements only up to $i=p-1$. This corresponds also to the number of singular values (these are all non-zero). # # It means that the ordinary least square model (with the optimal parameters) $\boldsymbol{\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\boldsymbol{y}$ by the vectors of the matrix $\boldsymbol{U}$. -# -# + # ## Further properties (important for our analyses later) # # Let us study again $\boldsymbol{X}^T\boldsymbol{X}$ in terms of our SVD, @@ -638,11 +598,9 @@ print(np.abs(C-B)) # number of rows represents the number of data inputs. Note that in # other texts you may find the opposite notation. This has consequences # for the definition of for example the covariance matrix and its relation to the SVD. -# -# + # ## Meet the Covariance Matrix # -# # Before we move on to a discussion of Ridge and Lasso regression, we want to show an important example of the above. # # We have already noted that the matrix $\boldsymbol{X}^T\boldsymbol{X}$ in ordinary @@ -666,8 +624,6 @@ print(np.abs(C-B)) # the eigenvalues of the covariance matrix and the Hessian matrix in # terms of the singular values. Let us develop these arguments, as they will play an important role in our machine learning studies. # -# -# # Before we discuss the link between for example Ridge regression and the singular value decomposition, we need to remind ourselves about # the definition of the covariance and the correlation function. These are quantities that play a central role in machine learning methods. # @@ -709,7 +665,6 @@ print(np.abs(C-B)) # **Scikit-Learn** or **nunmpy's** function calculate the covariance, this # quantity will be computed with a factor $1/(n-1)$. # -# # The covariance takes values between zero and infinity and may thus # lead to problems with loss of numerical precision for particularly # large values. It is common to scale the covariance matrix by @@ -733,8 +688,6 @@ print(np.abs(C-B)) # In the above example this is the function we constructed using **pandas**. # -# -# # In our derivation of the various regression algorithms like **Ordinary Least Squares** or **Ridge regression** # we defined the design/feature matrix $\boldsymbol{X}$ as @@ -865,8 +818,6 @@ print(C) # # The above procedure with **numpy** can be made more compact if we use **pandas**. # -# -# # We whow here how we can set up the correlation matrix using **pandas**, as done in this simple code # In[7]: @@ -947,8 +898,6 @@ print(covariance_matrix) # drop these elements and construct a correlation # matrix without these elements. # -# -# # We can rewrite the covariance matrix in a more compact form in terms of the design/feature matrix $\boldsymbol{X}$ as # $$ @@ -983,12 +932,12 @@ print(covariance_matrix) # \end{bmatrix}, # $$ -# where we wrote $$\boldsymbol{C}[\boldsymbol{x}_0,\boldsymbol{x}_1] = \boldsymbol{C}[\boldsymbol{x}]$$ to indicate that this is the covariance of the vectors $\boldsymbol{x}$ of the design/feature matrix $\boldsymbol{X}$. +# where we wrote $\boldsymbol{C}[\boldsymbol{x}_0,\boldsymbol{x}_1]=\boldsymbol{C}[\boldsymbol{x}]$ to indicate +# that this is the covariance of the vectors $\boldsymbol{x}$ of the +# design/feature matrix $\boldsymbol{X}$. # # It is easy to generalize this to a matrix $\boldsymbol{X}\in {\mathbb{R}}^{n\times p}$. -# -# -# + # ## Linking with the SVD # # We saw earlier that @@ -1042,7 +991,6 @@ print(covariance_matrix) # $\boldsymbol{v}_i$ are hierarchically ordered by how much correlation they # encode from the columns of $\boldsymbol{X}$. # -# # Note that these are also the eigenvectors and eigenvalues of the # Hessian matrix. # @@ -1060,7 +1008,6 @@ print(covariance_matrix) # self-adjoint, the singular values of $\boldsymbol{X}$ are equal to the # absolute value of the eigenvalues of $\boldsymbol{X}$. # -# # For $\boldsymbol{X}\boldsymbol{X}^T$ we found # $$ @@ -1093,10 +1040,7 @@ print(covariance_matrix) # Since we will mainly be interested in the correlations among the features # of our data (the columns of $\boldsymbol{X}$, the quantity of interest for us are the non-zero singular # values and the column vectors of $\boldsymbol{V}$. -# -# -# -# + # ## Ridge and Lasso Regression # # Let us remind ourselves about the expression for the standard Mean Squared Error (MSE) which we used to define our cost function and the equations for the ordinary least squares (OLS) method, that is @@ -1184,15 +1128,12 @@ print(covariance_matrix) # which can lead to singular matrices. However, with the SVD, we can always compute the inverse of the matrix $\boldsymbol{X}^T\boldsymbol{X}$. # -# # We see that Ridge regression is nothing but the standard OLS with a # modified diagonal term added to $\boldsymbol{X}^T\boldsymbol{X}$. The consequences, in # particular for our discussion of the bias-variance tradeoff are rather # interesting. We will see that for specific values of $\lambda$, we may # even reduce the variance of the optimal parameters $\boldsymbol{\beta}$. These topics and other related ones, will be discussed after the more linear algebra oriented analysis here. # -# -# # Using our insights about the SVD of the design matrix $\boldsymbol{X}$ # We have already analyzed the OLS solutions in terms of the eigenvectors (the columns) of the right singular value matrix $\boldsymbol{U}$ as @@ -1208,8 +1149,6 @@ print(covariance_matrix) # with the vectors $\boldsymbol{u}_j$ being the columns of $\boldsymbol{U}$ from the SVD of the matrix $\boldsymbol{X}$. # -# -# # Since $\lambda \geq 0$, it means that compared to OLS, we have # $$ @@ -1224,8 +1163,6 @@ print(covariance_matrix) # # For small eigenvalues $\sigma_i$ it means that their contributions become less important, a fact which can be used to reduce the number of degrees of freedom. More about this when we have covered the material on a statistical interpretation of various linear regression methods. # -# -# # For the sake of simplicity, let us assume that the design matrix is orthonormal, that is # $$ @@ -1250,8 +1187,6 @@ print(covariance_matrix) # # We will come back to more interpreations after we have gone through some of the statistical analysis part. # -# -# # Using the matrix-vector expression for Lasso regression and dropping the parameter $1/n$ in front of the standard mean squared error equation, we have the following **cost** function # $$ @@ -1278,10 +1213,6 @@ print(covariance_matrix) # This equation does not lead to a nice analytical equation as in Ridge regression or ordinary least squares. This equation can however be solved by using standard convex optimization algorithms using for example the Python package [CVXOPT](https://cvxopt.org/). We will discuss this later. # -# -# -# -# # Let us assume that our design matrix is given by unit (identity) matrix, that is a square diagonal matrix with ones only along the # diagonal. In this case we have an equal number of rows and columns $n=p$. # @@ -1331,7 +1262,6 @@ print(covariance_matrix) # Plotting these results ([figure in handwritten notes for week 36](https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2021/NotesSeptember9.pdf)) shows clearly that Lasso regression suppresses (sets to zero) values of $\beta_i$ for specific values of $\lambda$. Ridge regression reduces on the other hand the values of $\beta_i$ as function of $\lambda$. # -# # As another examples, # let us assume we have a data set with outputs/targets given by the vector @@ -1347,7 +1277,6 @@ print(covariance_matrix) # meaning that we have two features and two unknown parameters $\beta_0$ and $\beta_1$ to be determined either by ordinary least squares, Ridge or Lasso regression. # -# # For ordinary least squares (OLS) we know that the optimal solution is # $$ @@ -1362,7 +1291,6 @@ print(covariance_matrix) # The code which implements this simpler case is presented after the discussion of Ridge and Lasso. # -# # For Ridge regression we have # $$ @@ -1380,8 +1308,6 @@ print(covariance_matrix) # # To see this, let us write the cost function for Ridge regression. # -# -# # We define the MSE without the $1/n$ factor and have then, using that # $$ @@ -1412,7 +1338,6 @@ print(covariance_matrix) # which gives $\lambda=4.571$ and $\beta_0=0.933$ and $\beta_1=0.359$. # -# # For Lasso we need now, keeping a constraint on $\vert\beta_0\vert+\vert\beta_1\vert=1$, to take the derivative of the absolute values of $\beta_0$ # and $\beta_1$. This gives us the following derivatives of the cost function @@ -1465,7 +1390,6 @@ print(covariance_matrix) # Using the constraint on $\beta_0$ and $\beta_1$ we can then find the optimal value of $\lambda$ for the different cases. We leave this as an exercise to you. # -# # Here we set up the OLS, Ridge and Lasso functionality in order to study the above example. Note that here we have opted for a set of values of $\lambda$, meaning that we need to perform a search in order to find the optimal values. # # First we study and compare the OLS and Ridge results. The next code compares all three methods. @@ -1694,285 +1618,8 @@ plt.show() # for the optimal values of $\lambda$. We will see this throughout these # series of lectures. # -# # As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*. -# The following code example solves the simpler problem we discussed above, where we have added the latter python file. -# In[12]: - - -from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed -from cvxopt import blas, lapack, solvers, sparse, spmatrix -import math - -try: - import mosek - import sys - __MOSEK = True -except: __MOSEK = False - -if __MOSEK: - - def l1regls_mosek(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize || A*x - b ||_2^2 + e'*u - - subject to -u <= x <= u - - """ - - m, n = A.size - - env = mosek.Env() - task = env.Task(0,0) - task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x)) - - task.appendvars( 2*n) # number of variables - task.appendcons( 2*n) # number of constraints - - # input quadratic objective - Q = matrix(0.0, (n,n)) - blas.syrk(A, Q, alpha = 2.0, trans='T') - - I = [] - for i in range(n): - I.extend(range(i,n)) - - J = [] - for i in range(n): - J.extend((n-i)*[i]) - - task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n])) - task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0]) # setup linear objective - - # input constraint matrix row by row - for i in range(n): - task.putarow( i, [i, n+i], [1.0, -1.0]) - task.putarow( n+i, [i, n+i], [1.0, 1.0]) - - # setup bounds on constraints - task.putboundslice(mosek.accmode.con, - 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0]) - - # setup variable bounds - task.putboundslice(mosek.accmode.var, - 0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0]) - - # optimize the task - task.putobjsense(mosek.objsense.minimize) - task.optimize() - task.solutionsummary(mosek.streamtype.log) - x = n*[0.0] - task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x) - - return matrix(x) - - def l1regls_mosek2(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize w'*w + e'*u - - subject to -u <= x <= u - - A*x - w = b - - """ - - m, n = A.size - - env = mosek.Env() - task = env.Task(0,0) - task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x)) - - task.appendvars(2*n + m) # number of variables - task.appendcons(2*n + m) # number of constraints - - # input quadratic objective - task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0]) - - task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0]) # setup linear objective - - # input constraint matrix row by row - for i in range(n): - task.putarow( i, [i, n+i], [1.0, -1.0]) - task.putarow( n+i, [i, n+i], [1.0, 1.0]) - - for i in range(m): - task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0]) - - # setup bounds on constraints - task.putboundslice(mosek.accmode.con, - 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0]) - task.putboundslice(mosek.accmode.con, - 2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b)) - - # setup variable bounds - task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], - (2*n+m)*[0.0], (2*n+m)*[0.0]) - - # optimize the task - task.putobjsense(mosek.objsense.minimize) - task.optimize() - task.solutionsummary(mosek.streamtype.log) - x = n*[0.0] - task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x) - - return matrix(x) - -def l1regls(A, b): - """ - - Returns the solution of l1-norm regularized least-squares problem - - minimize || A*x - b ||_2^2 + || x ||_1. - - """ - - m, n = A.size - q = matrix(1.0, (2*n,1)) - q[:n] = -2.0 * A.T * b - - def P(u, v, alpha = 1.0, beta = 0.0 ): - """ - v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v - """ - v *= beta - v[:n] += alpha * 2.0 * A.T * (A * u[:n]) - - - def G(u, v, alpha=1.0, beta=0.0, trans='N'): - """ - v := alpha*[I, -I; -I, -I] * u + beta * v (trans = 'N' or 'T') - """ - - v *= beta - v[:n] += alpha*(u[:n] - u[n:]) - v[n:] += alpha*(-u[:n] - u[n:]) - - h = matrix(0.0, (2*n,1)) - - - # Customized solver for the KKT system - # - # [ 2.0*A'*A 0 I -I ] [x[:n] ] [bx[:n] ] - # [ 0 0 -I -I ] [x[n:] ] = [bx[n:] ]. - # [ I -I -D1^-1 0 ] [zl[:n]] [bzl[:n]] - # [ -I -I 0 -D2^-1 ] [zl[n:]] [bzl[n:]] - # - # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2. - # - # We first eliminate zl and x[n:]: - # - # ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = - # bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + - # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - - # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] - # - # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) - # - (D2-D1)*(D1+D2)^-1 * x[:n] - # - # zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] ) - # zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ). - # - # The first equation has the form - # - # (A'*A + D)*x[:n] = rhs - # - # and is equivalent to - # - # [ D A' ] [ x:n] ] = [ rhs ] - # [ A -I ] [ v ] [ 0 ]. - # - # It can be solved as - # - # ( A*D^-1*A' + I ) * v = A * D^-1 * rhs - # x[:n] = D^-1 * ( rhs - A'*v ). - - S = matrix(0.0, (m,m)) - Asc = matrix(0.0, (m,n)) - v = matrix(0.0, (m,1)) - - def Fkkt(W): - - # Factor - # - # S = A*D^-1*A' + I - # - # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2. - - d1, d2 = W['di'][:n]**2, W['di'][n:]**2 - - # ds is square root of diagonal of D - ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), - sqrt(d1+d2) ) - d3 = div(d2 - d1, d1 + d2) - - # Asc = A*diag(d)^-1/2 - Asc = A * spdiag(ds**-1) - - # S = I + A * D^-1 * A' - blas.syrk(Asc, S) - S[::m+1] += 1.0 - lapack.potrf(S) - - def g(x, y, z): - - x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + - mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - - mul(d3, z[n:])) ) - x[:n] = div( x[:n], ds) - - # Solve - # - # S * v = 0.5 * A * D^-1 * ( bx[:n] - - # (D2-D1)*(D1+D2)^-1 * bx[n:] + - # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - - # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] ) - - blas.gemv(Asc, x, v) - lapack.potrs(S, v) - - # x[:n] = D^-1 * ( rhs - A'*v ). - blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T') - x[:n] = div(x[:n], ds) - - # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) - # - (D2-D1)*(D1+D2)^-1 * x[:n] - x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 ) - mul( d3, x[:n] ) - - # zl[:n] = D1^1/2 * ( x[:n] - x[n:] - bzl[:n] ) - # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ). - z[:n] = mul( W['di'][:n], x[:n] - x[n:] - z[:n] ) - z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) - - return g - - return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n] - - -# Then we call the above functions and solve the problem, as done here - -# In[ ]: - - -from cvxopt import matrix, normal - -X = matrix( [ [ 2, 0, 1], [0, 1, 3]]) -y = matrix( [4, 2, 3]) -x = l1regls(X,y) - - -# **More text will be added to this example.** -# # ## Linking the regression analysis with a statistical interpretation # # We will now couple the discussions of ordinary least squares, Ridge @@ -1983,7 +1630,6 @@ x = l1regls(X,y) # parameter can reduce considerably the variance of the parameters # $\beta$. # -# # The # advantage of doing linear regression is that we actually end up with # analytical expressions for several statistical quantities. @@ -1991,7 +1637,6 @@ x = l1regls(X,y) # derive quantities like the variance and other expectation values in a # rather straightforward way. # -# # It is assumed that $\varepsilon_i # \sim \mathcal{N}(0, \sigma^2)$ and the $\varepsilon_{i}$ are # independent, i.e.: @@ -2015,8 +1660,6 @@ x = l1regls(X,y) # notation above $\mathbf{X}_{i,\ast}$ means that we are looking at the # row number $i$ and perform a sum over all values $p$. # -# -# # The assumption we have made here can be summarized as (and this is going to be useful when we discuss the bias-variance trade off) # that there exists a function $f(\boldsymbol{x})$ and a normal distributed error $\boldsymbol{\varepsilon}\sim \mathcal{N}(0, \sigma^2)$ # which describe our data @@ -2063,7 +1706,6 @@ x = l1regls(X,y) # Hence, $y_i \sim \mathcal{N}( \mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, \sigma^2)$, that is $\boldsymbol{y}$ follows a normal distribution with # mean value $\boldsymbol{X}\boldsymbol{\beta}$ and variance $\sigma^2$ (not be confused with the singular values of the SVD). # -# # With the OLS expressions for the parameters $\boldsymbol{\beta}$ we can evaluate the expectation value # $$ @@ -2107,7 +1749,6 @@ x = l1regls(X,y) # $\boldsymbol{\sigma}^2 (\boldsymbol{\beta}_j ) = \boldsymbol{\sigma}^2 [(\mathbf{X}^{T} \mathbf{X})^{-1}]_{jj} $. This may be used to # construct a confidence interval for the estimates. # -# # In a similar way, we can obtain analytical expressions for say the # expectation values of the parameters $\boldsymbol{\beta}$ and their variance # when we employ Ridge regression, allowing us again to define a confidence interval. @@ -2137,10 +1778,8 @@ x = l1regls(X,y) # The difference is non-negative definite since each component of the # matrix product is non-negative definite. -# This means the variance we obtain with the standard OLS will always for $\lambda > 0$ be larger than the variance of $\boldsymbol{\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. -# -# -# +# This means the variance we obtain with the standard OLS will always for $\lambda > 0$ be larger than the variance of $\boldsymbol{\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. + # ## Deriving OLS from a probability distribution # # Our basic assumption when we derived the OLS equations was to assume @@ -2193,21 +1832,18 @@ x = l1regls(X,y) # likelihood of a domain of events $\boldsymbol{D}$ given a set of parameters # $\boldsymbol{\beta}$. # -# # In statistics, maximum likelihood estimation (MLE) is a method of # estimating the parameters of an assumed probability distribution, # given some observed data. This is achieved by maximizing a likelihood # function so that, under the assumed statistical model, the observed # data is the most probable. # -# # We will assume here that our events are given by the above Gaussian # distribution and we will determine the optimal parameters $\beta$ by # maximizing the above PDF. However, computing the derivatives of a # product function is cumbersome and can easily lead to overflow and/or # underflowproblems, with potentials for loss of numerical precision. # -# # In practice, it is more convenient to maximize the logarithm of the # PDF because it is a monotonically increasing function of the argument. # Alternatively, and this will be our option, we will minimize the @@ -2217,9 +1853,6 @@ x = l1regls(X,y) # Note also that maximization/minimization of the logarithm of the PDF # is equivalent to the maximization/minimization of the function itself. # -# -# -# # We could now define a new cost function to minimize, namely the negative logarithm of the above PDF # $$ @@ -2246,7 +1879,6 @@ x = l1regls(X,y) # Before we make a similar analysis for Ridge and Lasso regression, we need a short reminder on statistics. # -# # A central theorem in statistics is Bayes' theorem. This theorem plays a similar role as the good old Pythagoras' theorem in geometry. # Bayes' theorem is extremely simple to derive. But to do so we need some basic axioms from statistics. # @@ -2271,8 +1903,6 @@ x = l1regls(X,y) # # If we have independent events then $p(X,Y)=p(X)p(Y)$. # -# -# # The marginal probability is defined in terms of only one of the set of variables $X,Y$. For a discrete probability we have # $$ @@ -2299,7 +1929,6 @@ x = l1regls(X,y) # which is Bayes' theorem. It allows us to evaluate the uncertainty in in $X$ after we have observed $Y$. We can easily interchange $X$ with $Y$. # -# # The quantity $p(Y\vert X)$ on the right-hand side of the theorem is # evaluated for the observed data $Y$ and can be viewed as a function of # the parameter space represented by $X$. This function is not @@ -2312,7 +1941,6 @@ x = l1regls(X,y) # # Let us try to illustrate Bayes' theorem through an example. # -# # Let us suppose that you are undergoing a series of mammography scans # in order to rule out possible breast cancer cases. We define the # sensitivity for a positive event by the variable $X$. It takes binary @@ -2342,8 +1970,6 @@ x = l1regls(X,y) # instead of $p(X=1\vert Y=1)$. # -# -# # If we look at various national surveys on breast cancer, the general # likelihood of developing breast cancer is a very small number. Let us # assume that the prior probability in the population as a whole is @@ -2384,9 +2010,7 @@ x = l1regls(X,y) # $$ # That is, in case of a positive test, there is only a $3\%$ chance of having breast cancer! -# -# -# + # ## Bayes' Theorem and Ridge and Lasso Regression # # Hitherto we have discussed Ridge and Lasso regression in terms of a @@ -2396,7 +2020,6 @@ x = l1regls(X,y) # # Before we proceed let us perform a Ridge, Lasso and OLS analysis of a polynomial fit. # -# # We will play around with a study of the values for the optimal # parameters $\boldsymbol{\beta}$ using OLS, Ridge and Lasso regression. For # OLS, you will notice as function of the noise and polynomial degree, @@ -2408,7 +2031,7 @@ x = l1regls(X,y) # typically be reduced, providing thereby less fluctuations from one # order to another one. -# In[ ]: +# In[12]: import numpy as np @@ -2497,7 +2120,7 @@ plt.show() # quench the fluctuations in the parameters of $\beta_i$ which have a # large variance (normally for higher orders in the polynomial). -# In[ ]: +# In[13]: import numpy as np @@ -2546,11 +2169,8 @@ for i in range(nlambdas): # noise. Here we recommend to use $\sigma^2=1$ as variance for the # added noise (which follows a normal distribution with mean value zero). # Comment your results. If you have a large noise term, do the parameters $\beta_j$ vary more as function -# model complexity? And what about their variance? -# -# -# -# +# model complexity? And what about their variance? + # ## Linking Bayes' Theorem with Ridge and Lasso Regression # # We have seen that Ridge regression suppresses those features which @@ -2585,8 +2205,6 @@ for i in range(nlambdas): # We have a model for $p(\boldsymbol{D}\vert\boldsymbol{\beta})$ but need one for the **prior** $p(\boldsymbol{\beta}$! # -# -# # With the posterior probability defined by a likelihood which we have # already modeled and an unknown prior, we are now ready to make # additional models for the prior. @@ -2594,7 +2212,6 @@ for i in range(nlambdas): # We can, based on our discussions of the variance of $\boldsymbol{\beta}$ and # the mean value, assume that the prior for the values $\boldsymbol{\beta}$ is # given by a Gaussian with mean value zero and variance $\tau^2$, that -# is # $$ # p(\boldsymbol{\beta})=\prod_{j=0}^{p-1}\exp{\left(-\frac{\beta_j^2}{2\tau^2}\right)}. @@ -2623,7 +2240,6 @@ for i in range(nlambdas): # which is our Ridge cost function! Nice, isn't it? # -# # To derive the Lasso cost function, we simply replace the Gaussian prior with an exponential distribution ([Laplace in this case](https://en.wikipedia.org/wiki/Laplace_distribution)) with zero mean value, that is # $$ @@ -2652,7 +2268,6 @@ for i in range(nlambdas): # which is our Lasso cost function! # -# # Plotting these prior functions shows us that we can use the parameter # $\lambda$ to shrink or increase the role of a given parameter # $\beta_j$. The variance for the Laplace distribution is diff --git a/doc/LectureNotes/_build/jupyter_execute/chapter2_254_1.png b/doc/LectureNotes/_build/jupyter_execute/chapter2_254_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ec67fae4fa6daa8ef3a2b9018b568af7b2f4bb GIT binary patch literal 9297 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 DMI<22 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/chapter2_256_1.png b/doc/LectureNotes/_build/jupyter_execute/chapter2_256_1.png new file mode 100644 index 0000000000000000000000000000000000000000..866b6addfdb31f7636bc251a12977550ffb94dc2 GIT binary patch literal 11129 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 gJk-+?F> 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 BXvF{k literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/chapter2_258_1.png b/doc/LectureNotes/_build/jupyter_execute/chapter2_258_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8636c6a831232279300e0997f3ffbe2b13454b GIT binary patch literal 14655 zcmZ|0byQSu^fx+ygft>BNQw&54BZ$g4bsg3LrM(NT}nwwgS1F@Hw@At-Q7Jj14zAx z@9*CCUH7hg|6sA!S!bTJpJ(sS-k<&1=Y)Jxlp?@=h6@6L2xO!sRX`v#Z{QCX2Mf4D zW+~1J{1bBgpyj9vH*<6`vNr`O7&+Qm!yTSK$AQxO*)l5-{<3pJj z1kpdfJ)`IKBYsE!SiOLr9;~cJOqEeq;y?XK!#iG|suAU1l;>L){0m)9-Hz`Ux~!Bi zI-0*UQ`K2htAtswC9$m8!N9s_nt9s5{Ka6iIb&~<%i{H-LnrvFifsP(_WoT^tct8q z0;6|!Y=I%~F>AIOW>yH4IhzHna3jmC-e$3?DVvYmWfTIHWDMGcbDaJ){tjew^b^K*GM9vSE&D%^UO1PZ_lVvtVqccB{ zmyGti?Mggnupb!;4G!iS85toAm1E8p9od~Ij0D3NLOES@Rw<(17*g9IKa@zIgV8?K z+Ujc*>ueylV^#W2gL~3O<3$`al-_5Eml;T^_`Nm^4<3JQV+tF136uW?VT5p3bYRB= zo9kb%qHTq2YG%yVcca$REy9FWi@*H#LQ&Ol$M@M@G2AZP(z7D;*z9uCj3n(ouoydHxZY1cWq2wkjCzoZv(I+V-<-pAI zEq0Hq%kFGj8Te5iw6$eo1-PxwrZ;e4K>kmAJKs(tgygxXs9tL|^M;9S@+F$WKiW4w zL9#;Wx=g^apGZ?u9{m+4Gy3|Tzcl0?HyFod(apSVZGK*l;l+!csZu%+HWBS_XsdUX z^-OePBDkdSKp3Q=s`?lQhhAK~Wtrb*w(7~;;cPXl!cX2z)BgCEuU?hgE;RVp?3FY| zkTNO8x(-$jiTAUXHraQUB0EAzo30NU6VB&PJ9A7l2m_kAT7|EbX#>5s}y_x_nC=E3cLW&z@V`tQtky38m_(p!8iSBVJ% ziDFjG;W8Tl$FpgpBmM;7^KK&^0~i#HG6V$a)d&OA3D&`B&*QEhG;J@VVB2J zT2(lb^!((z6JHM&GF6#^_BA|iH1m|w#o4sVK)#ebW_EKnK7+<$cFQ1TWo69BwbfM) z4+-R4t@-`kEoNj^R+f-`hx5T49%s{=7)FKdku2=F8XHzE^Nqf^j?T`J7B7#kFv|DV z)@+7y^RTY4=giC@b#;P^9*50OuBk+v*+g6pUW$vSL10}!qNCr{+Ae@aUAfqGsz4b& z_jfN}z8r3Hb6`~Xsm4$EhHqr;MxurStEPf@$xUwrq?~51IO%k|EUvM+4`7`}N?% z8E=7wuP)+ z${E8HUugZe%lhx)5Ndn{K|a;NYTE77v_oHa9v@3mL<6aSIN~{6+J!b{QUfZ zL`aq){(Xu;vwOMK6h{lNHF9ADeT{hy&UyY;uIIU$Eld^b0@BJIi?$!j8s z8$`IkqO_qQJ*c<0*ViU*b39+waeElex9ux7kI$Vah@8`4AdrCSay66_B(0=m-W@?> zI+zU~%Tb7OT6EuIHycVLK(u&WPnW}_LOK8+-1-yM0cQt*tKajltXpgt{+yOq91EB6 zqj@`wfn;p2f4;Q>K}x3O7H%wZ{B$N)gIVjFRQ{}2!!_ROws749tf;pew9!&8??QKy zL{#kUxg*6;U}k1!YBBdJY2AqebxI(>zG4&Q01so+Z>Y+U@`mInr7QNwvr_``NF;g$ zsx_hJRBTv#~@U%#vw-g|>Zr{gcZyn1&Rg5dl#tNnbIo~^fBZdZYTne$`$ z;$q3_Of8D9#TO%}LZ%>h_FUG}Txs6_cKpi^9a?Ttx`SzAc!+$}-06A;Ca1m0=5^%t zzkeq;r$d#-owzmDGb+D}9kvDs(!`R(!tfPSg*%(vPC+<$cn`U;NUI#(S4rZwYFVh+ z{oHu9BV>Jj9aQFZ?L3$wq-xR_$Ex|@udQ%qF|pLLGA?usjF|=}t2Xag6$A=d1G#zr zo}L9)MaA%+V?^5EYVkdCdDq9g8za5Q2mle~Vm?|Z-N8U@r1J*c>t_^LeJNOfT<@`RC4L!UfXlE@F>(`v&ZS7&wVnGbAIw#z5}u-#|FD< zU*+wcND-7MhOtfT!fsohpY*OVijwsrDm7Utp^$;n-GMjtnbazB<0b~Y@$Nl(2?GQ& z^0bv0h!I_j$)cnWB=tc+&LyR$#-Apfq!qOD6qRKMkb~QgQ{Cy>LZ!Ay8H22#}hQe@2NN0jo z2Aon%D8oE-_E!M#LKyz`0u?Dq+k7gMo9!KLL|QLny(v5G!56X-k`12>l)c63g&_tu zp~*7BPa`NZ*4*RX>v9j8X{nkh6eDKf7j}I_;eCU|Vc+}4?PNh^Y!#$MV@mS#GEQaJ zUhMp-=)LIK0RfLW_f~C8n8zu0lceiG;3mGU?oc%3rs6;H(XZYt90qQinOa&;!koMG zbb2N;V$>v*M^^m~qbTB_>4CJ2XZQ4fwV9)5#QGSqez9gw$-hHULnGRmcMuNtQh)_1 zbvLQ}_e|rBt#;@gI*%D5N5T4x05&}yXJWE-JTlDh*upZpi^KWd%7?99P>H?Y^K5&> zzwYyR-dg}-c(mr`=Fo9|0DM|N+>>=?#>zpkK8E`fNqm!{U1=iX7tNc@_ut*uQIH4RIs3XhF_>i_jC-e*ka4b-A5#-bMmtw-4X z0t$4YpxdcF!OCMQ{bZuxQkQ1o)fcVE|INBAX8IW_)Ft_Yd#p(wJB{C^cB=MsCzze@ zPB`w21^_wB{d~964+9&dTV4Zjgw@qmFs}tMkXmo9m+m*ur=Uy#RmjlESFyF4;db4J z0O>r|DDq@#$I4Qp5|`&=l|$oiq6p-%66PWrZln<#+MQWgFIkiix(`O$>x5<}q>lYe zaqXYmi}snyPet~OhJ{%W6C7$Gbb%$kD)v_!znu5-O_M_VdwY$>^OSEcTJK+Rb4LSP z5Bsv#1p!J)S0vrg!9rucTK*Fz#T0s8-dKQy99Fb2zut(Rt@1lwyV{x61w*{p!wa!b zkIQP*jxVZ(EBaTIQ4np^^h>A`%x=*7H) z^=#G7uiC=cer~LTMxuE3wP8-H`irdUZ&?4hZM3NV_}>6=`CW^rTiY;*3>zF*$^*Toe>nRKV0AX?{Y~xP7_JyVLGG@)61A?^ z77o zqI{!C|4wq$*SzfSYW^d(@<_Q-uCDp5JTQwedw{@2-05h+4Pl(ep8U%`Mozw_3 zAKInC6hGyxo=BUvX7y6WKG$Q(^c)ST4KCsFtXP%OW-Lp~frbm28oK_~`n&Q+|J-a_ zwMg&D>^^F5u8wJ?ngSKkda>y$I$gl!Ko0=Qp>J@k{g3xS%h3B(`K3L#6FVHQwa=r) zGJJ(u_OFL-r5(`CV@+%NfWos4^al_Kwt+&a@rP6ZqnoMdUrMP$Ao?5Re!gcgI5}i*?659 zecb7)#X5XIx8dK~Dk0*$zg#nC3j+w2=SeRUK$k*+v=fz(&^=RWu3c+ObA55hnTO+k z@Lk_!!HELiddsg51nEw0`X*4HMc_@xAKSzqtN<9>?Z5N2&379GN&o;amVAg1$7|i% z<;Iu{f3WF15f9Kb@H(G(a{N$u>3nXY0PIAkr0AJ=$Z8+#a=rwmzo7r_A_UQvJm&psi^)H=Z}QHc&aBCmH~Jrw!yhpb=#P+NKqt<1_}2#S=ifd?J@$5|24K{)Jvd zMn;DJb=Jr5)hH?2=R!hBKxs?!Ld~e8tLCd@`(M+l#3;Far!YW#`^Hsa<`Vtu&-Tbb zCDAsy21I<3dSJvf2~SQ*Dc9`pPggg$V_K2N7+hc^nx1{mDly zWd98?4htWQa2OKn2HG&3$B&=0u@xB#?yf~jaBSaFXlQ6}oSmKdW6aQbosEz+GiImQ z_LC>_g~oYdS29fnwdzk5jqmBWvJ7n>>+ZiZO_GYB4vCB;y1Kf;G)+=fRh0`nCZggG z13X;T!T%413@t51%06_OTb&e86NE3C=iSwoBf$7FDAJ;%|MYXVhLx6b0##i;nLqsY z`hv%C`_swkDVpm}b^=KESIc3`wV(%zjo=xtVP7osE0l=EFnu5q-JmYKS$+5IjCs0O zysmA1z-+bESc$%f^Wmb`4m?FggHnQ)lo;`zuW^{E2CH~4P@5)7Rj7*1!EK~sAWgw1 zp>Jo=Dsp9s`tsc&w)srO0%1@7tz3dK=(|4@g{_zgUdKVW~%8-FGI1wAIY|Ey!r zQibOmilDtXqDO^r?>Mx_B!kYb2TW=O)gZgX55`jQ(+!7o57iQAZUF?NJDjS!?#mho zhmf$PNDvAvmIeUcK0-df|LL>7z9EX!lUASAPQnqgUABc$!HRAPvTc3q8LefXuEZ|H z{eI-aPbMJl6@W_i|I`Cc4_x-A%S}v7i0SBtfEL@kvs62uH9C!uNs-IRjYZx6w*GmG z^UTn(V;4ARq3nELfZV-_AkVTDN;>TfnUj&0=IXRrY^vY(=g^m3WRx$fP8Cvhzm8?D zLA3|T)#!iA$e^$EzIEp@M1W$VqKtHEtSwuv4@Aal;ZRr@1nPAj_xSN+h<>9p-;l(8 z(@d*RE2JxNq0xoP$H!-^!nEIi4gjT`bt}L_%m8`gLwu@`LlfNHPy?mwgIx~dyBE<8(ill)bzm2j#oPYEh96-R>|F67|6`8omyq<@nME1Ca5WR zU%4;K{7gyO1WEm)gw%-_3@?015S{8(@-jj`x`xXEb1xV;<_!YBe~O<0x6i>_6-o`7 zWvk+9pxJtVlqA|v$fl)xW%n*MCKk5g-C#ZcO7nB-r%^vasPv%0+FuZ}Xb9s7I0j5f zxl;w=40`Z&iDs#Re2QQcpz48Y;7fx*_L5!T^erugw>8LWo1K{0qkp~pKy2g0 z%h5g~c2|#BK)7BH-3zNfz6vg@2yUB}hXlSb`Gy30f}w zZ?*pv%QzK9bZykxtX^DPYyo1~Pr>;_NMM#!B)PnddVwAogU75aTl-1QN2dk>r|YqR zzSRD~HBLD-wWpSrmek^&)4QL>$&M~AI8`R!<+GwrhsrzzRIgE6Ig`ql?u|D0lScFW z$AChh((3J1*#1ej{-=`o^Qoc858-n>B5y^=vPUA{WyhN5>nDFemgahY{mENmFtcl+ z7d?jpvP%JPW1tu!Z*A$+=eW9vu+!8Mke=Nl6p|AY7=z!m3M$-eWxW@ZWghyG6tXky z=Y9{CYW%k{jx#c2y!9YiZ%~qRNGhhSp9+V}XS9n_{QmEn+2FdPg<#=s_Xtx>&csL^ z?}My;kr3slUFO>vJ~vXYt?&-r>*3HI9#`KAZ+WYjZl-bTd^TmZ8!uyi{yKXenlA2n zbU`%zLp_z~r)5ase|>3vvnVH=QC44AfT(+EYHrs~FOBfwW&ozt)OR2usmL$-cw%`T zkca+sey++=EfqpQO8jPuvBb;ER`VgxZnW4tKpZxIjMlN!z&?|1=Vnb&yeDl{>GNXO z|4uE|w~vL~9{UvtSWWPs)qGauLf&_5@RU3Xz4}KF8QHd9t)OFyyPeZjs*Z^~o4%#}EzqS2*Dc>At|KC*XApWrf7JNl3$Qiyi-VUWU0v7E@mbM? z9$*#NfcG+)A*UTkTA+)~*_m3FS)j&+vq-;x==u3JWmfa8oN4DLC9oaFC%Qb$Mh;{lXh&(RJslqTk1b^TETc?SK6GN&Vm|(1$TG)ux>cED%l4Q(>-co! z%&Gn?RaLe=NX+9$IMo%4u%FeL|E{Lw!>VFM1_~_+0?gsj+xBsccdTF9I-qs2{=trH zll-H~Z<({z9t$jV*l_-3;uViCc2d929~|8Y3^P(5cG*ZeD3g(%O5v0`z5YymV-u-^+5ofcdUvQ6p%Lq))g`cL`iM z;_dUgtOM*IHcXy6m>+BJpQ?X-WLVoeTAV+)$;@f`>MrHoMJXCNIvA#ib`^mu%bX3G zu8lNp-3JYKKqLBOZ>}XxVuR;{ZLIHEK_rhso-{NmDh2)?|1536^IvnK-n!c?*sE!* zwqjcl;-g_bgDFlY)MDfaa^-TnH&7XJCIW^psLghMcO4D5hYR~oyqgtjEa z@;W=#7^%}lNV`7QF-JN6a&*^1v=5WCHF%);QzL}2-m_g;d)8#%*%GFv6)4WpL6l0OZ3IgTU8xAvNopNJS#9&h8#V@YDb z(JDDyf*4dVx5I35h`SQ4>96f;b7N25kTTl2w==Km=qX6ry(-K)7Br=qzr~s38e&*J z3>aK(enQ~ej(AF9`M3z{BNc4$>D&d5;iES|1JrL+E6ZH_BU$cFRcSb8!R@ZpKQ^CZC)LQRc+t3V8MT=U3)i&KCZxkV6_XmojE3$ z`tiYDVW`)KKp*03o$6fWYCurT=W^7DRO#b3H~2?UYr>bST9j72CqKKUDXYDCt=~OE zP5z;DQ@G{ue=e;}Xdd4hks1|aM?Ix610MhVfkh0O=gJIqsf*cIlpybyD0haLw;_VsqCd#=}sinE1sHk67GM}8tfX{qeGGeSI3uSwn`Lo zmv@MJv$TPkNKwf93urme0M#2**X-k0h%71rrGAO@+E@QBw zfHVA2%6YhO%9j4>eC(GsdHLtOErR7Q^h>{PS+m)UYv5aZ3O>UvMvv5Qyow2P-`PJ% zc;1NTuz_9fNvh`zg_0%{EA2t4Pg7O;GHc*cz)bhAi^Dc4V7Ny4ukIxhY4RwwWz~$v z;G5h_*{(#Hu0%xEK*Evxk{1f-@D4@Lp&B9qF zH&%9R%s@&A$x3pfqTXCn!^DW1h0bpU=8dOrL}CN&`EkKA7QZUp*m52iTCSEGTS7hG zYF$e<;i;B_2jKs14+O@> z)k4i#`^W!uf$a^BWKmnp1SUZi>R&8>#))m(=sZyA-$PwO7ug~&f~S;sN!!r$z4%#_o! zDel-Yez2==37d{yTU-9~NRTcmVA#aNuj5MR^%4c62sB^)n5v>orP>RK)e8r}p?0NH zjT;l+^=-4cuFy-Ysi|W(SPdeas>-b1GF!cNRl8Y!l7%Lo3>k8jjO^oE7K7=$2-CQk9{5F=%thb*FLJH;{JbJxDlf19_M$DyCR{ZvtN^XzLQ zg9>&c);Q?I4+t%RhrD=mCt_ksroXv?dA>VyKqrc0K16PFaqK6IB8?`b_8l1bh4l9R z)QGyOh2}pQuSnpOmiwBL@(YQE_9-h6dAHd7BSEuDjElHHvvy&r68q#dv<4gd{co|I zgGK!lKFxgem6e(;YM~MQRMD)%hl5+ue27gHZ(XX~j-pK!!U!Uavo6&py}4Z(XBM>o zZQ_BPtyxlb7p4}`sAyKCnLE7fcr57MWa6>Vu#B|vuyuFuMQvLUmm{yo^MBbe)HwUL z2d$j#{6c2mB2%xuVg+Dfs_-`o8P&JmriLQK4w+lP>jB{GJ^-p+XS=5OPn$nT-qb7J z-@TgKo4T)TmWqrUeS4(c-%!w z#4n0l#TR>x{2HC3;H;@0O3`+|KG~>25lOH$d#!!cy{3Z4F1DCQ7T;cN$-yO@2PW@2 zNV99r&F5whTU$+Zvt@nmY!8}FSMN}1u7C6%8^$re$`x+zhKC7(sLPflUNPwU&LYgr zyMM8i1>;;UV_YuXf9EJw+Znnh634l{rm!L6a75S-fa}&GegVGnS@hY>k8U39dH0^4 zv*}aClvd#f%lDitxn%!~c+bbH8S#N$@&lO~?g|fTH>1Iv3 zj7)Z|fVIW-Oup(4a;qi$d>=T3`o;6}srPEkTl9~xX1y2f`_m6ijTRSc(p?rG+sr<- zIc4Fk5cd?+b5IyTjozV*VR8pq)WOVmK`W9BPYBpBjl&^Kq1EA_kD&2lT>&E{OQ>92 z19f-gT+7FFIrQC=Vl6*FG<)tvw-x!>Nt?GJCM|#Oouo-Mgt7e6zMt^myENC)tD{fH zzljY0&(LSrk3l_R(PxQYqtT~zBC4+T#uF^|a{vQdJ85Gm&+3`ws0%5;BuI`sP|Z=VX;IgHu#d;=~I?5P}>wU^Ted zTCl893P?_Al!rV{v5TujeHGmBp<%y8jw@{(HUPc%}>ZLan?k-=E- z=bvW_5scpIkoB!O!u`pj$CeJ(??s*FbZO$Q-L{{ftm>RxD0$~thWFv`e0o^e6i9(A zfkfiIwhM+1xHsi!(Ff(J?@Boq6QF-$nb~BwJD+>HIecQh@#GDtdvROLJd_ZJIV1tU zu6M$^R1d840|qt*lchn8hnv#!aw3Aj+wj!d zLI{V&aYm)r%moQmq<%NxnMyOa&KilnV4)^whRtoPT8g=MR6gQ*@($TF8?%l7s9RhswW z;%*KaM3&ngKF(Q+lMW|N?OZzm3d4}|kXX&XWAn|g37luHle@w5@16Pase@-))4yaf z9rYi;njl(p89Z9?^uBwU31?hxF6?2h31~fdN%);WrcS5$N^44pT^z=%tZL#~~(m0$>*V?)?nc9nHc0Euhotz#I}EnX(ZdTOk>QrLt#P*=j=_Y*Ko6B82R`oh2qkGMkVYN!4rbfx{TjmeP(ut`0h<$6_od98{ z3}>4PmY}1VX#uw`Uix3r5^$p6OsJj$%}^;l;NpuKC)Srt??1C#TKkp}4DTp!-^E7k zVeHRfjODbo-V={~Um& zMV(gxu=$O&MejL&&DOV0(u2Oww1-`UdH2knOa=kquxkFPUHSvP$Bl|wx1LiROyl*Y zJ_Ergt@{~U3&!z}%^g)}uwG3}xQmdb01MHE`K5cK!{HX>nANCv_TUcFH*+2t-8{>5 z#!j(=l|HS=_QM3I;gx;QKu2)dbS)Oo=Z?xvyZ4HV|FGKbS{&gz;ZmzsBh@l|P1OZC ze|~jvGBo=Mpuv|hU<0nKtDiVHB8;tag~!DWK8h&aB{FeT?^GBLNQlPiF zjADV*Mb5knQvDyYIBN-B!>MEqS~3SkN{N3okoFFAu<~G( z4#-DH37B2A4@JkA*WI-w=QVg>dncLW{ki4K#5)Z04yc@QYr5)rp(f@Q%SIFzPrfSOj|O!NH*V1%A1C}R^@_OxvGDBI>)mMW zs7ou1Yg{o!j9Fo0seUF2#bk=bjy*}+sEzt+)-TJO7P?$?`-nYx?8>JA`Sn40a5#eZA?4c)DmO3G*n1yzs8HN;JuiVG?Cl^nU zJ6;SzV=upDq%u9eI?Q~>UNiNj!iSIhnHr<(*cX3t+Uv?*ZxII%!FuJpM@5R=@D=8l ztwTFSq@lq?9`Z#OVNcc(k9C5x3U($`(P1of<0LZCyRTe0xS{TFj{3HVF0 zCjTzWLr8C6X~jei+@kS)Z3I1ML@!zCe+>8<5>Djxr)8NxK04h@%FShXo_VQ3$oO(N z@&^d|`O&`<=O1({Z@s@^yX1T%^C@_AxqaiVUQ#4|lYNVs{Dd_m>_2km;RfCDdS?}* zErbJA<-IadD;ZeHCyZXVbDSKxiFs4 z)InUTTyG%a*z#>OOqB2_3ZGcPs_yoc8i5aThIFChC zD#Y>_gZ!yJz1pUaYmZE@kRX5BIkMdF4f9^{O|>d&3bj?bVQ7aDp;@Bfx^3|5v-zCC zMZGhLb3jK7txnADgo{e!l}4EF@e_OlFsG51Bxi)wm4KieI{iGTLm|cO*U$nkpB0YDpw&6}DsQb0YwP4ajYIC>k68 z(ysm-7sH?iOm67^ueT0$m4Dm38rG8B4GpH_!b!AxQ0>*93wh;rgJW13Uig)kD{Q4$ zhs~_-3&yGx{HibkUgS4>UN-z7vZ;N@JqMcC0{;=9<5eLGd(fQzUtccdrX!q$B-gn< zRXDeGhJa+#7C(!H?~PjMC45|K;4OJZp{H$q9tMf(q-glC+WLf{qM(Xrswn4+{01TDCSouNWT z^5jFu2_=|eR9CVlqzBHxJ-O=&k~FCZrhXC?uFh5fvsz~9wD30w8MLX44jI}ARd zp9GU)TVvmueG%QVeq@UtuR{|Y?219^EB*%GE;+bEi;4`S>bIzYt^8eYSs5nJlR8VUQU_E`or(`y0fJ*=}H0@HLIA6g$u7XnvLW* zI#zKQP6$3_#pZlL#2~5%!+SR0eW8TiS%pzzhgCv7TwflAv38h3&8cfjx5rXR#yYz; z7-Sp$8|2QO>L&$1!hoU^kzIFLQNrYDiQy9Qe7cfA&lpepg5-Zxyw4;%I*W4`iGX&t zqdaR*Vu?16JsFBK9mqZzEKLO)pwsA7|E}bVDad@BK$Z|ZPjH4&0#Qsk^>}=kFfr;Y z96&3D)~fq7RF{|pYAxf_05OZ7IDTp#CiI+vc{(CW%ge6m#Sb=yDYUycWF%LSkj;pb z>AG&Bb1=-CuS<=mOOguqtNgaT#`)tYXJ{}l#~Byp^k;RpfDmc;@?-iLumccYdgHPg z<-y|*sx~p#)M}z${It719lCB9q*R+`NQmKyo9*P!;71@aJHPw)umQk#%BU1RoXeV~ zXmK^)j>FZi(4LPZGrl&j`(EYLp&f$a{9d8*bM9+|=|Lp*%D{ViC<<``Lj01GuZY|NoHwAT9p~QClfV#f0Wbw{($F1BFWIIE`|*{>7TNk~$Qh@ra`i zk+~?T1kDXOk|Y)e0ceLiv#I(EvM8m{REl5YZouG|?61U3wHsYV`7J+sqE?;_ zn5*CWb8F$x;Np@{6;oiOHy_`ea945rvJU#eB*UvdA-Kt^v{W1_NuIW+4aDX%n2OxY zJOP5&qq>XiO?Y7Tj>J?PbbIezzdjfXyCSe)s5Pl3wk?t8<>=A1 zm>J~CQ(rwJr~(xjiBvk2 z@`L1rPjkHC#&zv!G2k7>v1xZ3MCZEo33Bm>-<@!X+J`7LH!)6S_ zdMToo_OJEzyR6j79yD8##%GB}VZ8usAGKgd@Apdxbgj=>aeKLt%n3uQ|KconxTUS( zHE}YuqNl?e>HCFPk$l^gzNrY~>l0}Ct7`|d*|m8;B*ri1VaiJ)Ux*n-S?2J++V4Hj z4B3a9rp1ZSIKGexY|H{KpVzkR{r9e)bKP@-pQl`1itTSZ;;nVFHRpB1mI+xyI&}Ms z_=o$$?^E)SE$xWlaco+Q=rBn42b0g`(>H!$ryT`qXn?}&Qu7pSk#0j8Qk;8(cl3e_ zAwCJE*>)$H`-wMiDq%ZJC|!Fo9f`5XprUg^ghmL4os^T&pSFZe*@cP?2EM^COultm zAf#s~f0N?1z=EKpU$|@d_jGPj-FG8kHFgistLJB|t=sAM{NR4w$oC>p|946{|_6i@Ze6W3q)5w`)TO7Pr~@|Qz&m(U(uYnh7y)22Y1>A*a4 zv$AZ8jMKrAiyHA#1u6StFP4i$|l8d!euuKKFypce?9e}0jU11g&MXKxgN-JG{M5O zSs9jq%7HhuA%W&;?L^!sW&z9qfY1JDfI60s`!Ju8Rp)w;iT^(@EaC z5e|N7>1n|er?He9;2%}*>t^1@?g(#RJ1+;wZ98udS9fn$XZ!O$4qixScQ>evl8n66 zc_(jg52Tu`?34dBK*rt6QTB)3-)67~g9qFk34t(ikbfy4Sr}djM9f4FrhU&3voh}Q z$9aEZXJajio{B0~ih}EN{dpOw3*o|h@AqP7!pm6k30M>=mPtjZ2Q`E05f@jBM~Mr~ zT$bxmctszdNWXTTrJOgKf@?kbck=a)^Dc1wVVAT0GrdnW-j~LMLn|eD#vi1=X=GZk z8F_6?%tW%VvFTZHg|nO&5^B49;WV3`$0ceZAqImeEtp8#>(jBZBJ~{MEJpX9{u%U? zkdV;sI?Wa*QEu|~=Pc$X-rXF>6`q#HX;Nv$=Y5JTIny37$@$^d?Q8$X3Ym?%FY<7> zTeVNdzD#$-L?jAbzt`a9z^~|})fvwP{!FQ!d3D-#toHezq4Ly}lyEeSzzv}}%)_;b zX7W=gUPX98MTkLCCM%jn@anCVpC9j2+do6!Y4mxL^EHlIN`{dlU+8q<)~+afQ@sRm zz;h+}hVAyBGFOYJ{IpEI=78-U|B&S$@+qmQi@zG6kjda(fgE+;693J4OeksJDtLPc z;yV5*{nGt6FS4?-HaGv2SCQ-w1=PIrJ!iitx=&zC-deo#S^0@^FtrI*;^X6M-OGtN z7Z59!7xW&s<^l{=Z7{gH|LD(1Ro>>&!nZ=UCl5DfI;AXYD`2WH_Mc7ua*sK2IcL)Q zx;i^&{^ma(dQ((did-OEcysS{`>X2-Wj3uL_`k`*H@xF<{_?u7RaH?2eV9imwTdcYKj-&*so{%+sg-A11kj4P|g*6E=)_h(xUS0%q+ z=9aa-_3`nL(?H2>PWJfE4H|*AScucaS<+rt*|Lr!b@9TR@=ANs(LMy1DIc*q-bj=h zYe0%I^DB1yPgI!K*sqm7T^e?sY|$Y4>+3TH?krPGeY+u8435Kl`A72eGs^Q7HTIp1 zSxPRtOT%yZ)V#%SXDL#gmy}E>xEAyM&3#Gm<_nW-)9E|W_sdPbwFC#sG_C8XJ^k|; zpQBFUw=?RfdUCYsJY2!2Jnqe5S?Bh9pO{BnEX@;DQc5qr`I7rEI6>qraVk-L>Tqp( z$h6>YaoMuyDxRK}HJZM~ibwD9r7N4a_O{(VEsCD=pJP+=UB!KRy0kD-WrL@i#D-BV z4!=FaA!bnYuq$zEW$dM~p#~SKs+E*AI5>z|xs@pw2H?nDpBKf%<8{0}ax$|G%#=sY z-x{tk?|ApH3x4zFY&(-Ib-w##%Pq7*)a55X<%0IsF_Zp_#V^b56w*qXR7`az3tM@8 zy=djx$ra^8#Nlvrm5r-2D|M5is;cN#(stD|Uion6ff9M2WwTn>(e|p4ZAk?M1(n63 z)cWI{v4p3h7gE*{_(<~_TO6-=+siJGnab1Dugz-^WHj#OAm--g6?o#SZ{Le=HcUsK+1suPW!8Er^8nJ_-EDh9 zI##_6)d<*{8uy)~nTlY&YCHbvDK1Ni2^D;}v+?_-4YvjTWw&2&u;xpf5Y?&vO9raH z(=ZPSHI9art)zpXg!EXLQx^-b%4wMv-e{KRe=32Iu)lp8S)aTY+kwncd)%AJW&}NsX}*r*fHJF zq9-mP@uqP=Dg5qmm5ruu;#oa_^w6Dy$rF+<%egD`Skm#~{=rg}^N(t~U zrJC=8_Ps8<{#dVZ037mg^;g4LHSgHt!`)51`WnQj266k1X%+tO?_P>bRU`tx=KW_d z?rW-8DjLmzExDbo;xVOFz{jubh6DM6WYk6=M3+XY#MITZ-CK_{Zpt>NiRJo*KYMm6 zr~GZa9|%?M-_!6l795t{EoR)E2wao>6kSqW{Ozr!@?B%&#h)LS`YWMLTicxbVHdZv;KcSkgHAqYZINy&S# zh8C>hWhg&e@R&+4zQdmFP<2EP~A3`IoL$9Paf zir+qHcZll912_V#UI5&u(Et zAmngNONe?j*jvcsTs74mW&N1y%bdx0#APhbBx|&1ywUfigDzY0f~psFz;^iDqf8a~ zYF=&ba09Hx)V=dunNA3?`MOs~w|Hb_F|yLZ%gbx@qEz^M-e@)Vy3zOR3x!GZbNc%F z@q5-Wzs?0NzY`bbjI%4$-FJIsT&nZdBCM1C{fLo`ZN;XtLXZQ(5`_#4rOkZ(qsN~2 z&v`QAunFrzjNV#&wErEn{I1JyDvVBF6%Bu8S$pcs^UZ5|b9~tq6*T_3>zY^x2*QNb z>69yroMBx0klbL`6Tmxw7*jGbbS*3_@N=^2zNko7HpsLVIU3Zh?qYBTYHAZA*KSUhU9CWV8!!=P{>t(TSd8XTnpqB?>uJA zct(Iuh2^O^^R-|r00;9APHgFtrt`hBtwn*ms})uaDXmApWy!e;{C<(1-q{vGXWr-| zJyz%5&$qF)_YBb-xQl3yWcc7dnF}iH-}MgG&0Cqf76if&avrze88TM;r1x_iNAC(> z68wBLYfM#3c#>xHpP>i?j%J-H%+fi;KFd_R(~2hjw{y{IRY1ys{Qdm%ql=!tzCFkw z$cM*6@gc_t$!PS~?GYP8;HzV~a6 zy<}Q>YVQvGrIdO5(f;P*P&p5nQtZ1n5k%T2Hl2_TZ)GXQDNhDLOa05r7|(oCYdwyK zceex+>SPt&PW>+9h|(35b|Cvv2l(H!N21iIK!?UUa777F0%UJK+r7-PPNr@mK(g+a z7gM=u6#`V5M~;pIA6-nzL<}U_Yf$}^T!wMZEdeVZN4)SXjK<(7_g8q12%}viTzXCs zbcYO%*1=qF?lGv{PTW%$rZ=^BjxBrVgtb@z?QTgJVwGhNTm+yH{{waHuls+NOGAikxb zI6rbcv{d@?jE@Q{S=H1IYA+tdUv(1)^#@9-qooUwaLv;tlkeZZd*G8X7~CXjr!Huh zNe<{CvUstu;CFA@(EY|z25-t#W-T#{p%aWukYQBo>v!UP%zz=0L{?WuscvUsB}%c5 zdDow?AGCuPY{~g5biThRCPP^hxM}W^$qGp05;W9qSc(@)``1ccN_J-6-m^lbVq=jo319?2JJ zoZhd%zyYHOTIL_MPtNe86?g7cTJ1YtbC3P}{I#)N8)c>(1-}xb+U)|MpYK(eCI6$8 zd4+@~GNk1m(OdcO0qQ0=x5p=xTwqJ~5>_9Z)UYZD&x>r)*+0pAo&co;Pahun?aguc z?K^0Gaylh`QmhXXF>(C?*_~t^v0jQnC$f<{g5v2P@+Z?aZ~1SbDG}OY@tIlCFqnSF zk9XDfG)>#wm>@5Lb3DuujJ)^}!F=UN&U=kTd4ktFOUM|Ui$t98jeK8sxWNtw{_}Yy z=D66j&t-RBv%QAFr2=ReTQkdC-?pZv^Q_q-7MYyVB#18>b-!gU^+oRUHEzA*d# zbCb6fmAHUh&L2p-MBX=Y_UtcDx<`-pm^#xh(d3lfBezG9P^2g>>o;A7%TL7x#bN_; z?-Mopj*6Bga`^3Z%VD?y2N(JLXgpcm8ai2}cK;pMGNXYPv2g7YgQzH`dGg?!u`4u_gPOK4^2h!V5Jsd4nmJ_U&A+CL}c9UzNCRt#W$QVyls`VFo(f} z6cDE>%qZNOX~go*dS@wc%yGRyqOuURKX4{!^EF6KEc}&a4edF9>QBBgXWUPz-9|J1 zwclXCMqwSaxTcJumaCYtG~escGmujdr%VWs8?5M=fGTBk;5D!Jt&Zp0sQq=Tnavh3 z>Qk68Dk+LA;(ymkbTnr&HE5-ZN;_`KYX5^BBq*$PVYLXKaP%?%9&_~t>=mJuSP){* z*`w0~rVqHhv$SAuox5=ehyY3rQOnFrbC22sud#+1vqdn4J=MA_H>7H6Yii7veAjmh zwRUl^`ofj%djw}njy~&aXY~EefN;m(Q2WTsX&7ZH@LS-2JK95 zrhK*6MZgw=<-oYid~gDBf-b{Y;Uul3a~`wLwM*mpK(4S0CZ656t@HJ(oShEA**>0p z09T)#WmsHXp9nN6Hz7a6)5An|q%CP@zwBQqsrm#CPoC_n{TQGNJ@Jb)xj_oxksjI8 zv1sOqzU=AQq=JC${DIFRfN9{%2jrMBfKC!{gaJp*J+R#6l`*>D!}bPZdtnl7j%W$l zWcz_}-wu4v`oDu_pY_kaO~4YV58Yl#TVNwt!CV<~EbL>D zA>rs}r}h?v%kD`mz&r~GP)g|GgUYU#bLN-DEec?;ze*2jak#F6GMtIK*HLN)pdZHQNsKy(4F8sqhGIMOLGOk)({K#{-+K4R!9=^ynB}r2VS{Q zSE9Q1HF((K5_xPQqnPYwU@C{pz`h)hs3|L`Wz5M=sL6tS0nt%c2^~wnH!U1}DlAdp zILcn)=`>@Tze9=+Ohj{Zl(afsB$9cV`BGU|pdzOQJq9^B7vhHa80LdLQ6ZXKhi1mo z&vtdBT$Bq|!}wSLvrOt&3)iyDQwg)iDDNQmf)SjnN9JS>0?~+*(!d40#Yy$z6ss_? zM~^ya>rX=JSJgCeA7HoZH!GkRWS3_5A!PyvIYQZbA!zp-pr@#}wg^4!EcS4^Fdp9C zjoT6=4V8B=$)aAT+ABs$QllHr+0Zu80eWD4#IutCXbQV)R~yPBcjgBdLW50Dq?t69o; zJlwx7KTVson<>nGs5`kj zM5Af<++YQtcUI&brwej5{!!At_@@%9i8)Bexu5;sQxCW(lBsK5`JSC2#$>kqd6PdN zlIAf&Z$ULl2}Sjbx9{m7E>kT)2LBPyIwM>dWIvBsMeOI-RCGb9M*56b_8$?P*$wJ- zJQO@s2?7fgI68z1aX4nI8d(`wbOD157J6U`n;}%&g^0&>CIr8{BVin6E#-rEP$hD! z5#7GnoF_4wo&BQ+s;8G=2z{z(o5rqIqmOo}9^B4R99m;TF*4Q9co*duruyyqMInX@ z!W~H$y(j$FOEp1Jvx{mpJ7OeIn?bH%mSi5XC8wOZ!t1jdsfx_kPY1qKcsNowqo}Z| z*tM0?u_k5@d;>>e=55%_=$QMV9)h%Y!|DElMlrj?^r|o+vr6dhfzR5`ILz_`icSzz zmv*MW=b+Z#Q~ie^QAtUSsd2jH=Qa?_ZJ`JtgI0fROo2KtO@$&uvr?fH@*+uj~UntxZ*&!YBx?iHD>TKcl> zx=%0sU~@a^M15hGBd31lvg^V?mom-mY+A0Zcg7Rs$*-2sj<$<;|HG0gtmz20xLm-J zVRTcUmX72G?#ht))%y|Rfc50h&@?E!Lb-TY4_Q@-r~yh(mjp7h%v5$k@h&}?uof+w z`9Vz$*omxs5Mdx}2Q&(NQ7!0)GQ-eYCJs^R99^M&An_y~6zaAeY=gT7GNSn7P=K$B zwvJ{6<=ilW_6I$ZU@jZD=1u8-m)!`r2YC z>_))4SBJeew)nGtGYn4OMZj`8kNMe?UyZg1&@zYLl-U?C)W-o;ncS^Pz6<(R81m&^ zQBgjJo&;G_!B#tY?51@9yW_8_gSq--QI$N}G^$MVAVl?-=M7*AC;9OG%*_d_25F2zO6MS@Q&UrWWiaqpYC*gKyE~2) z|DfZQ6v6r$V)#@hqt$QB*qKM%Y+oG)#m!pJaZ91HlmII3aGL@0iN>DIe~EN6Hd2L& zyzGcM9`Bg_()OgTEj?;`_k|zZM;%)P6vd(?03D-!MtO-+g_ujHOZhR3h}(s!%wq;{ z+(O!W{h{C@#qYp*Z&lrCY?y~ikN(@T(x3+JFG=gfX~hO6RPDlZW%F5{U&!QD(CQrT zg7)>#r7SIP$9Hg{pP#sLgTAx!c+Sy#uP}DRbVTvc=G>yp*Eyd8AFhh&65QqJy;nB1 z#!2cB1UK{fsd^{?EB3a(zvX-?@?1$Htmp9c3>B+=^Ow-E-S@<23!rt9ZiOt9Z? zu5Ntv>bTtxIWqVkvCo2eJ&j5(K|BQWn*6&L>$gqn*RHC}J_F8UK(0j&JFbEghdf;KtI%WlP!6o z;iDg!z@;!q8+^`jS-y}1V2C0qa3yTW(RM`CB)m>-rOSVyK29wf2Kr+OCd;~m`8?-= zBbc1>#DZA3-c2SoG@xMkz2eeCCM*=OCz?0Wd<>H#VmQ1NlFx#J{szQX%NS98O>5|l z$L_dCzeX0lZqG$7%H;1eXM@(mWFdJ$lpi0rU1M#_*CxMG0@#5t6t*`6jrvOL*YX(9Go zy0a>Ee>RR7QbX;+^XN;i(M<|${q23qiu$YwcJruxvN@n-fTpBl)p;oc zVwxb!qK1aQCI_dxSNy* zpNm5GQ+O2=j+9A`xnbjtpde%h8J4drfXjs-_b9@hKPsDQ9X>7M2n^kMogvHIV z^&w}-x=yN<(TVeb4{|Hfo?DO8CTN;2*kzF3I^e4zb&aR+(RLN#)pf!mtf#n4iCLAH zk!h}fq1=kD=??~p^@6H@#Tj_wSDu-O#y#xK*q6y)YgrNt=ezR5klMI4gzy#C(|o>) zZIG^|Z#&3x0bn5R8FHO;*aDFvla_gEu@r#femQN9fyg}dsJq)44~t47GfH6p?E)ry2IH~_Zm=;JE79qq zvua+{)iON39=x)mMS-u!;a^b zwZ%B%ZhopU>q&Zk=J>ovRqN^vnw3!w&<<_(vjTitfiO?KwfNnL!lP%!!W&jDYqH@M zOX+fMiCicnLWlKUdJkfW~UU-v_@ow|^{j)fYTmWpq2nfeBOyoJuWiht)pq>PT+@K`Xx|A|Jmr~2OYVK3lJLd zs)qa{gmLAoJC(2W%B&ck0=Wwdk@yCb9ZZB32+(9|o{=alPB(j04QlCv5X>BXO;h1p zjDDg>&P+ePIetgP35!Fv3qp*mdcp*HD3liJpxSePxNE5nQ9FTq-&cXHL^=dF#b>^) zNHUj(T0TP9M3XAau>p595z`Zm{{7JzRnVFbPIKbAl`M!_S#Q_jtkG_T9;N@#z|9js zRpQJJor?U(>?Bn`vBrRXUCBe#h+*%nie^tkCB%SUBjl`K6KcDb@@dbyUsN9#VM7gk zc95dA;C^q7K34^=q4CD$LZV~Nv9kV|G!t19sOL9>@OsFvoAVttUr#BgT6Z%i1v0MG z3A~^!;;C*LOft2~V^blLQkR_Xcl-JrB%rD=$m|^CjW9I!=^gxb7;@EYfvm3-cX?jZ zBWXOFE~^kP>mmg^x$J5cG!X?Wt?U6uj2^*hyQVMT6NgW+<#KQ ze$_gP;jbT;XzW9ie$_gT^IMMNl*0)-@(FXzbe=&%&AornrG*5r|3js06+trvMT0fW}q$QkT?A_(b5nL_A8jr`v?4@&O9z`Sm0W=KK4@-)oZuZla%l-e)jM#PD3mESUtyN?ZFvcus=n2z zr*E>%w`Y?!c)T`Ot{Y`E&`0St`Vao5NaoKzr6O4p*rwE{j{kZz3H5Okhzd8-9=|w1T2?v=9rE!_wcb zTJzh3OO>|Hr=Ty1jr@Od3HtzUxr_a1HJ?DAh{yez3uwlE6X>gmM+e&@^uQe~fj+sj zTVWjM_RO}q)1+IxwBRXXz9B}p$mkMvN;iqZo4V!e=E42F0&0E=D%978jBToU72^9I z5xb3Bw4~GC^l<{0sM&dRCTF_P=AZUAwi~0Yt4{Ot+cu+{T@Y&mC-W;9@DX_|tAC#H z%=kO8{mJ5Nd&JE?*QX1mw->fq3ZSvdeXgnK=SnrXh@E~Te2v$Wl7~)bvT+s2h28SV zmT5o_t(5n@R*>(}Z%;MX#UP(JIy+g)YeqgxV?Mr??6)zgb%}7cjH*Je<|6i@79)XE zlafelYmxcnxB90-^a>4LD&KFJQpOiAz@pTPgCr_XD|Yo;u4`2DW&Xi5cH>rQS1D;@ zhHp~*q;jMX%pM)Z3ShN~R#2!*v>^RTJxHCkJ}HL1Zd{fsaafi3zHhml5MmnTUnQg_ z{Gxs%6vc;ckRtx_#foW_6PDb;h#cezQ_$JAT1NiycPuaNVAt+ZTPxPcqUunaNNLMy z%-AAEJzS7`DuS?NGo^Wy6bMb*ycyJ{!lSA8bqUnyr+d?P6AxPvwftsORxcd$8rM7Y zVk3*8lyN-!!G1hD0d`>J4LPF*)MNvl=CBd+h^L~XAw%Hnwu<`5rfUc(RBp{rwh}cW zUjs!QqD=4&f;iWJT-WrlYc!9z_W5$y;7w+f-b~x`dS60QNn-0KsLBEtn(g%g*67r= zg+wqOB?9fO;vIzes1e_XS?|3*o$#lw0OL4K7dgfoV532St6(5VeOQgdQrOxo1V2c3 zv?NZ^-Qr-l8KpJTX%$rSm57}T(~QgtN6fZPmr?;GO>qdQZWmmUpF9uELEmP6vZN6- zfHTD=U~?LFHYr*fB&vw0>^@gj(zQJ;`H2qQpwwZ?BY0}eh6d^ldQ>gQFh3M@g;%?j z8Qyl;Z0>b!Jdb4TxWIEeMUdtNQ)4FKu?U?}ClPN{)yhC41pABSCK#hd6TzGel{IQ9_ gVC4T(n~y`e8f|TaJJ+v+|8@t_yKVrh)Ugf!AN%IcRsaA1 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/chapter2.ipynb b/doc/LectureNotes/chapter2.ipynb index fc1dc3fa0..8bb203708 100644 --- a/doc/LectureNotes/chapter2.ipynb +++ b/doc/LectureNotes/chapter2.ipynb @@ -2,23 +2,45 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "id": "7146aabe", + "metadata": { + "editable": true + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "383d5dba", + "metadata": { + "editable": true + }, + "source": [ + "# Ridge and Lasso Regression" + ] + }, + { + "cell_type": "markdown", + "id": "08812109", + "metadata": { + "editable": true + }, "source": [ - "# Ridge and Lasso Regression\n", - "\n", - "\n", - "\n", "## Mathematical Interpretation of Ordinary Least Squares\n", "\n", "What is presented here is a mathematical analysis of various regression algorithms (ordinary least squares, Ridge and Lasso Regression). The analysis is based on an important algorithm in linear algebra, the so-called Singular Value Decomposition (SVD). \n", "\n", - "\n", "We have shown that in ordinary least squares (OLS) the optimal parameters $\\beta$ are given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "04ce00fc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -27,7 +49,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "88d4cd43", + "metadata": { + "editable": true + }, "source": [ "The **hat** over $\\boldsymbol{\\beta}$ means we have the optimal parameters after minimization of the cost function.\n", "\n", @@ -36,7 +61,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b95f6106", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -45,14 +73,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2ee3b8e9", + "metadata": { + "editable": true + }, "source": [ "We now define a matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "72f7dde8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T.\n", @@ -61,14 +95,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b092bc7", + "metadata": { + "editable": true + }, "source": [ "We can rewrite" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "44b3e758", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}=\\boldsymbol{X}\\hat{\\boldsymbol{\\beta}} = \\boldsymbol{A}\\boldsymbol{y}.\n", @@ -77,20 +117,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6cec4c92", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{A}$ has the important property that $\\boldsymbol{A}^2=\\boldsymbol{A}$. This is the definition of a [projection matrix](https://en.wikipedia.org/wiki/Projection_matrix).\n", "We can then interpret our optimal model $\\tilde{\\boldsymbol{y}}$ as being represented by an orthogonal projection of $\\boldsymbol{y}$ onto a space defined by the column vectors of $\\boldsymbol{X}$. In our case here the matrix $\\boldsymbol{A}$ is a square matrix. If it is a general rectangular matrix we have an oblique projection matrix.\n", "\n", - "\n", - "\n", - "\n", "We have defined the residual error as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef64424c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=\\left[\\boldsymbol{I}-\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\right]\\boldsymbol{y}.\n", @@ -99,17 +142,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cad57da0", + "metadata": { + "editable": true + }, "source": [ "The residual errors are then the projections of $\\boldsymbol{y}$ onto the orthogonal component of the space defined by the column vectors of $\\boldsymbol{X}$.\n", "\n", - "\n", "If the matrix $\\boldsymbol{X}$ is an orthogonal (or unitary in case of complex values) matrix, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "94355d54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{X}\\boldsymbol{X}^T = \\boldsymbol{I}.\n", @@ -118,14 +166,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c1ccdf5", + "metadata": { + "editable": true + }, "source": [ "In this case the matrix $\\boldsymbol{A}$ becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0d943ee1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T)=\\boldsymbol{I},\n", @@ -134,14 +188,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f951392", + "metadata": { + "editable": true + }, "source": [ "and we have the obvious case" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce1a6d6f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\epsilon}=\\boldsymbol{y}-\\tilde{\\boldsymbol{y}}=0.\n", @@ -150,16 +210,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2861bd8e", + "metadata": { + "editable": true + }, + "source": [ + "This serves also as a useful test of our codes." + ] + }, + { + "cell_type": "markdown", + "id": "1dfaffdb", + "metadata": { + "editable": true + }, "source": [ - "This serves also as a useful test of our codes. \n", - "\n", - "\n", - "\n", - "\n", "## The singular value decomposition\n", "\n", - "\n", "The examples we have looked at so far are cases where we normally can\n", "invert the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$. Using a polynomial expansion where we fit of various functions leads to\n", "row vectors of the design matrix which are essentially orthogonal due\n", @@ -167,7 +234,6 @@ "design matrix is then often done via a so-called LU, QR or Cholesky\n", "decomposition.\n", "\n", - "\n", "As we will also see in the first project, \n", "this may\n", "however not the be case in general and a standard matrix inversion\n", @@ -191,9 +257,6 @@ "in the principal component analysis where high-dimensional data can be\n", "reduced to the statistically relevant features.\n", "\n", - "\n", - "\n", - "\n", "One of the typical problems we encounter with linear regression, in particular \n", "when the matrix $\\boldsymbol{X}$ (our so-called design matrix) is high-dimensional, \n", "are problems with near singular or singular matrices. The column vectors of $\\boldsymbol{X}$ \n", @@ -204,7 +267,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3e091b51", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -224,7 +290,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fcbdb36", + "metadata": { + "editable": true + }, "source": [ "The columns of $\\boldsymbol{X}$ are linearly dependent. We see this easily since the \n", "the first column is the row-wise sum of the other two columns. The rank (more correct,\n", @@ -238,7 +307,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f35594a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -254,19 +326,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "093183cd", + "metadata": { + "editable": true + }, "source": [ "We see easily that $\\mbox{det}(\\boldsymbol{X}) = x_{11} x_{22} - x_{12} x_{21} = 1 \\times (-1) - 1 \\times (-1) = 0$. Hence, $\\mathbf{X}$ is singular and its inverse is undefined.\n", "This is equivalent to saying that the matrix $\\boldsymbol{X}$ has at least an eigenvalue which is zero.\n", "\n", - "\n", - "\n", "If our design matrix $\\boldsymbol{X}$ which enters the linear regression problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7a22cf10", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -281,7 +357,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a66feb94", + "metadata": { + "editable": true + }, "source": [ "has linearly dependent column vectors, we will not be able to compute the inverse\n", "of $\\boldsymbol{X}^T\\boldsymbol{X}$ and we cannot find the parameters (estimators) $\\beta_i$. \n", @@ -294,7 +373,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5b5978a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^{T} \\boldsymbol{X} \\rightarrow \\boldsymbol{X}^{T} \\boldsymbol{X}+\\lambda \\boldsymbol{I},\n", @@ -303,16 +385,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bed64679", + "metadata": { + "editable": true + }, + "source": [ + "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later." + ] + }, + { + "cell_type": "markdown", + "id": "860c9b6d", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{I}$ is the identity matrix. When we discuss **Ridge** regression this is actually what we end up evaluating. The parameter $\\lambda$ is called a hyperparameter. More about this later. \n", - "\n", - "\n", - "\n", - "\n", "## Basic math of the SVD\n", "\n", - "\n", "From standard linear algebra we know that a square matrix $\\boldsymbol{X}$ can be diagonalized if and only it is \n", "a so-called [normal matrix](https://en.wikipedia.org/wiki/Normal_matrix), that is if $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times n}$\n", "we have $\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ or if $\\boldsymbol{X}\\in {\\mathbb{C}}^{n\\times n}$ we have $\\boldsymbol{X}\\boldsymbol{X}^{\\dagger}=\\boldsymbol{X}^{\\dagger}\\boldsymbol{X}$.\n", @@ -321,7 +410,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "724355a3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\lambda_1,\\boldsymbol{u}_1),\\dots, (\\lambda_n,\\boldsymbol{u}_n),\n", @@ -330,14 +422,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "80fea225", + "metadata": { + "editable": true + }, "source": [ "and the eigenvalues are given by the diagonal matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a7bc845", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\\mathrm{Diag}(\\lambda_1, \\dots,\\lambda_n).\n", @@ -346,14 +444,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "789f1977", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ can be written in terms of an orthogonal/unitary transformation $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "56e422f4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -362,7 +466,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f015c981", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{I}$ or $\\boldsymbol{U}\\boldsymbol{U}^{\\dagger}=\\boldsymbol{I}$.\n", "\n", @@ -371,7 +478,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "dfd219d0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\begin{bmatrix} \n", @@ -383,15 +493,14 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9992b4d2", + "metadata": { + "editable": true + }, "source": [ "is not diagonalizable, it is a so-called [defective matrix](https://en.wikipedia.org/wiki/Defective_matrix). It is easy to see that the condition\n", "$\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{X}^T\\boldsymbol{X}$ is not fulfilled. \n", "\n", - "\n", - "\n", - "\n", - "\n", "However, and this is the strength of the SVD algorithm, any general\n", "matrix $\\boldsymbol{X}$ can be decomposed in terms of a diagonal matrix and\n", "two orthogonal/unitary matrices. The [Singular Value Decompostion\n", @@ -405,7 +514,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e41ce3a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\n", @@ -414,14 +526,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "916148d2", + "metadata": { + "editable": true + }, "source": [ "As an example, the above defective matrix can be decomposed as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8488b628", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X} = \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& 1 \\\\ 1& -1\\\\ \\end{bmatrix} \\begin{bmatrix} 2& 0 \\\\ 0& 0\\\\ \\end{bmatrix} \\frac{1}{\\sqrt{2}}\\begin{bmatrix} 1& -1 \\\\ 1& 1\\\\ \\end{bmatrix}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -430,7 +548,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb7bb105", + "metadata": { + "editable": true + }, "source": [ "with eigenvalues $\\sigma_1=2$ and $\\sigma_2=0$. \n", "The SVD exits always! \n", @@ -453,7 +574,6 @@ "\n", "The columns of $\\boldsymbol{U}$ are called the left singular vectors while the columns of $\\boldsymbol{V}$ are the right singular vectors.\n", "\n", - "\n", "If we assume that $n > p$, then our matrix $\\boldsymbol{U}$ has dimension $n\n", "\\times n$. The last $n-p$ columns of $\\boldsymbol{U}$ become however\n", "irrelevant in our calculations since they are multiplied with the\n", @@ -469,14 +589,23 @@ "If $n > p$, we keep only the first $p$ columns of $\\boldsymbol{U}$ and $\\boldsymbol{\\Sigma}$ has dimension $p\\times p$. \n", "If $p > n$, then only the first $n$ columns of $\\boldsymbol{V}$ are computed and $\\boldsymbol{\\Sigma}$ has dimension $n\\times n$.\n", "The $n=p$ case is obvious, we retain the full SVD. \n", - "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy.\n", - "\n", + "In general the economy-size SVD leads to less FLOPS and still conserving the desired accuracy." + ] + }, + { + "cell_type": "markdown", + "id": "86e39aa0", + "metadata": { + "editable": true + }, + "source": [ "## Codes for the SVD" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, + "id": "9c3ae0cf", "metadata": { "collapsed": false, "editable": true @@ -516,7 +645,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5e02d16", + "metadata": { + "editable": true + }, "source": [ "The matrix $\\boldsymbol{X}$ has columns that are linearly dependent. The first\n", "column is the row-wise sum of the other two columns. The rank of a\n", @@ -527,8 +659,6 @@ "inversion algorithm for matrix inversion with $\\boldsymbol{X}^T\\boldsymbol{X}$ results\n", "in the program terminating due to a singular matrix.\n", "\n", - "\n", - "\n", "The $U$, $S$, and $V$ matrices returned from the **svd()** function\n", "cannot be multiplied directly.\n", "\n", @@ -540,9 +670,16 @@ "\n", "If you wish to include the zero singular values, you will need to\n", "resize the matrices and set up a diagonal matrix as done in the above\n", - "example\n", - "\n", - "\n", + "example" + ] + }, + { + "cell_type": "markdown", + "id": "ceac1ca3", + "metadata": { + "editable": true + }, + "source": [ "## Code for SVD and Inversion of Matrices\n", "\n", "How do we use the SVD to invert a matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ which is singular or near singular?\n", @@ -551,7 +688,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, + "id": "15a9c8e8", "metadata": { "collapsed": false, "editable": true @@ -563,14 +701,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4a6e5469", + "metadata": { + "editable": true + }, "source": [ "Let us first look at a matrix which does not causes problems and write our own function where we just use the SVD." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, + "id": "ef3b6935", "metadata": { "collapsed": false, "editable": true @@ -610,7 +752,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "155ca008", + "metadata": { + "editable": true + }, "source": [ "Although our matrix to invert $\\boldsymbol{X}^T\\boldsymbol{X}$ is a square matrix, our matrix may be singular. \n", "\n", @@ -625,7 +770,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "da493b94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}_{\\mathrm{PI}}= \\boldsymbol{V}\\boldsymbol{D}_{\\mathrm{PI}}\\boldsymbol{U}^T,\n", @@ -634,14 +782,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8bf214ea", + "metadata": { + "editable": true + }, "source": [ - "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." + "where $\\boldsymbol{D}_{\\mathrm{PI}}$ can be calculated by creating a diagonal matrix from $\\boldsymbol{\\Sigma}$ where we only keep the singular values (the non-zero values). The following code computes the pseudoinvers of the matrix based on the SVD." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, + "id": "e437b5d9", "metadata": { "collapsed": false, "editable": true @@ -675,14 +827,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e711d30f", + "metadata": { + "editable": true + }, + "source": [ + "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**." + ] + }, + { + "cell_type": "markdown", + "id": "a0ba9d2f", + "metadata": { + "editable": true + }, "source": [ - "As you can see from these examples, our own decomposition based on the SVD agrees the pseudoinverse algorithm provided by **Numpy**.\n", - "\n", - "\n", - "\n", - "\n", - "\n", "## Mathematics of the SVD and implications\n", "\n", "Let us take a closer look at the mathematics of the SVD and the various implications for machine learning studies.\n", @@ -692,7 +851,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "90951d11", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -708,14 +870,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91ff188a", + "metadata": { + "editable": true + }, "source": [ "We can SVD decompose our matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "61b2e6d7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -724,7 +892,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a5bf286", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{U}$ is an orthogonal matrix of dimension $n\\times n$, meaning that $\\boldsymbol{U}\\boldsymbol{U}^T=\\boldsymbol{U}^T\\boldsymbol{U}=\\boldsymbol{I}_n$. Here $\\boldsymbol{I}_n$ is the unit matrix of dimension $n \\times n$.\n", "\n", @@ -735,7 +906,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1bd0e480", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sigma_0 > \\sigma_1 > \\sigma_2 > \\dots > \\sigma_{p-1} > 0.\n", @@ -744,17 +918,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6133bbea", + "metadata": { + "editable": true + }, "source": [ "All values beyond $p-1$ are all zero.\n", "\n", - "\n", "As an example, consider the following $3\\times 2$ example for the matrix $\\boldsymbol{\\Sigma}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2f4ec9c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -768,14 +947,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d8e91a1a", + "metadata": { + "editable": true + }, "source": [ "The singular values are $\\sigma_0=2$ and $\\sigma_1=1$. It is common to rewrite the matrix $\\boldsymbol{\\Sigma}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66510064", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}=\n", @@ -788,14 +973,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0de239cf", + "metadata": { + "editable": true + }, "source": [ "where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae4894a1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{\\Sigma}}=\n", @@ -808,14 +999,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "928421c0", + "metadata": { + "editable": true + }, "source": [ "contains only the singular values. Note also (and we will use this below) that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f707ba94", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\n", @@ -828,14 +1025,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c2169a96", + "metadata": { + "editable": true + }, "source": [ "which is a $2\\times 2 $ matrix while" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd7213a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T=\n", @@ -849,20 +1052,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "014bf918", + "metadata": { + "editable": true + }, "source": [ "is a $3\\times 3 $ matrix. The last row and column of this last matrix\n", "contain only zeros. This will have important consequences for our SVD\n", "decomposition of the design matrix.\n", "\n", - "\n", - "\n", "The matrix that may cause problems for us is $\\boldsymbol{X}^T\\boldsymbol{X}$. Using the SVD we can rewrite this matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5b371d72", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T,\n", @@ -871,14 +1078,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5fdd06fb", + "metadata": { + "editable": true + }, "source": [ "and using the orthogonality of the matrix $\\boldsymbol{U}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "416109ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -887,32 +1100,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "38a7766d", + "metadata": { + "editable": true + }, "source": [ "We define $\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}=\\tilde{\\boldsymbol{\\Sigma}}^2$ which is a diagonal matrix containing only the singular values squared. It has dimensionality $p \\times p$.\n", "\n", - "This means, using the orthogonality of $\\boldsymbol{V}$, that we get" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\boldsymbol{X}^T\\boldsymbol{X}=\\tilde{\\boldsymbol{\\Sigma}}^2.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ "We can now insert the result for the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ into our equation for ordinary least squares where" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "18839f7b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{X}\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -921,30 +1124,42 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b743da67", + "metadata": { + "editable": true + }, "source": [ "and using our SVD decomposition of $\\boldsymbol{X}$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b91982c5", + "metadata": { + "editable": true + }, "source": [ "$$\n", - "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\tilde{\\boldsymbol{\\Sigma}}^{-2}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", + "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\left(\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^{2}(\\boldsymbol{V}^T\\right)^{-1}\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{y},\n", "$$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "310034bb", + "metadata": { + "editable": true + }, "source": [ - "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$," + "which gives us, using the orthogonality of the matrices $\\boldsymbol{U}$ and $\\boldsymbol{V}$,," ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "efadf88e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{y}_{\\mathrm{OLS}}=\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_i\\boldsymbol{u}^T_j\\boldsymbol{y},\n", @@ -953,14 +1168,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "293eece5", + "metadata": { + "editable": true + }, "source": [ "Note here that when we perform the multiplication of the various matrices, the orthogonal vectors of the matrix $\\boldsymbol{U}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "66ead26c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{U}=[\\boldsymbol{u}_0,\\boldsymbol{u}_1,\\dots,\\boldsymbol{u}_{n-1}],\n", @@ -969,13 +1190,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "67b71310", + "metadata": { + "editable": true + }, "source": [ "that belong to $i>p-1$, result in only zeros when we perform the multiplications. This means that the sum above has non-zero elements only up to $i=p-1$. This corresponds also to the number of singular values (these are all non-zero).\n", "\n", - "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$.\n", - "\n", - "\n", + "It means that the ordinary least square model (with the optimal parameters) $\\boldsymbol{\\tilde{y}}$, corresponds to an orthogonal transformation of the output (or target) vector $\\boldsymbol{y}$ by the vectors of the matrix $\\boldsymbol{U}$." + ] + }, + { + "cell_type": "markdown", + "id": "fa804884", + "metadata": { + "editable": true + }, + "source": [ "## Further properties (important for our analyses later)\n", "\n", "Let us study again $\\boldsymbol{X}^T\\boldsymbol{X}$ in terms of our SVD," @@ -983,7 +1214,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ac661f44", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -992,14 +1226,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1d195b3c", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "38865678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}.\n", @@ -1008,7 +1248,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "07a7126d", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$ are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$\n", "with eigenvalues given by the singular values squared, that is" @@ -1016,7 +1259,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1375bb2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1025,14 +1271,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b32590d", + "metadata": { + "editable": true + }, "source": [ "Similarly, if we use the SVD decomposition for the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bfefb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T.\n", @@ -1041,14 +1293,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9a62b75", + "metadata": { + "editable": true + }, "source": [ "If we now multiply from the right with $\\boldsymbol{U}$ (using the orthogonality of $\\boldsymbol{U}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c591bfc0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{U}=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T.\n", @@ -1057,7 +1315,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d7fa31d3", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{u}_i$ of the orthogonal matrix $\\boldsymbol{U}$ are the eigenvectors of the matrix $\\boldsymbol{X}\\boldsymbol{X}^T$\n", "with eigenvalues given by the singular values squared, that is" @@ -1065,7 +1326,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d132cee3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}\\boldsymbol{X}^T\\right)\\boldsymbol{u}_i=\\boldsymbol{u}_i\\sigma_i^2.\n", @@ -1074,7 +1338,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7aa7f89c", + "metadata": { + "editable": true + }, "source": [ "**Important note**: we have defined our design matrix $\\boldsymbol{X}$ to be an\n", "$n\\times p$ matrix. In most supervised learning cases we have that $n\n", @@ -1084,12 +1351,18 @@ "always refer to the number of features in our data set, while the\n", "number of rows represents the number of data inputs. Note that in\n", "other texts you may find the opposite notation. This has consequences\n", - "for the definition of for example the covariance matrix and its relation to the SVD.\n", - "\n", - "\n", + "for the definition of for example the covariance matrix and its relation to the SVD." + ] + }, + { + "cell_type": "markdown", + "id": "8e546bb5", + "metadata": { + "editable": true + }, + "source": [ "## Meet the Covariance Matrix\n", "\n", - "\n", "Before we move on to a discussion of Ridge and Lasso regression, we want to show an important example of the above.\n", "\n", "We have already noted that the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ in ordinary\n", @@ -1099,7 +1372,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "96d8b53c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial^2 C(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}^T\\partial \\boldsymbol{\\beta}} =\\frac{2}{n}\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1108,7 +1384,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7e05a9b", + "metadata": { + "editable": true + }, "source": [ "This quantity defines was what is called the Hessian matrix (the second derivative of a function we want to optimize).\n", "\n", @@ -1117,7 +1396,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "55fd14e4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H}=\\boldsymbol{X}^T\\boldsymbol{X}.\n", @@ -1126,15 +1408,16 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "09320523", + "metadata": { + "editable": true + }, "source": [ "The Hessian matrix for ordinary least squares is also proportional to\n", "the covariance matrix. This means also that we can use the SVD to find\n", "the eigenvalues of the covariance matrix and the Hessian matrix in\n", "terms of the singular values. Let us develop these arguments, as they will play an important role in our machine learning studies.\n", "\n", - "\n", - "\n", "Before we discuss the link between for example Ridge regression and the singular value decomposition, we need to remind ourselves about\n", "the definition of the covariance and the correlation function. These are quantities that play a central role in machine learning methods.\n", "\n", @@ -1144,7 +1427,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "23b5cf2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1155,14 +1441,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "136c43bc", + "metadata": { + "editable": true + }, "source": [ "where for example" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b52fc8e3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] =\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})(y_i- \\overline{y}).\n", @@ -1171,14 +1463,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fe153c88", + "metadata": { + "editable": true + }, "source": [ "With this definition and recalling that the variance is defined as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea57dd81", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{var}[\\boldsymbol{x}]=\\frac{1}{n} \\sum_{i=0}^{n-1}(x_i- \\overline{x})^2,\n", @@ -1187,14 +1485,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8154bc8", + "metadata": { + "editable": true + }, "source": [ "we can rewrite the covariance matrix as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "081adf91", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}] & \\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1205,7 +1509,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d61424f0", + "metadata": { + "editable": true + }, "source": [ "**Note:** we have used $1/n$ in the above definitions of the *sample* variance and covariance. We assume then that we can calculate the exact mean value. \n", "What you will find in essentially all statistics texts are equations\n", @@ -1216,7 +1523,6 @@ "**Scikit-Learn** or **nunmpy's** function calculate the covariance, this\n", "quantity will be computed with a factor $1/(n-1)$.\n", "\n", - "\n", "The covariance takes values between zero and infinity and may thus\n", "lead to problems with loss of numerical precision for particularly\n", "large values. It is common to scale the covariance matrix by\n", @@ -1226,7 +1532,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1f517794", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]=\\frac{\\mathrm{cov}[\\boldsymbol{x},\\boldsymbol{y}]}{\\sqrt{\\mathrm{var}[\\boldsymbol{x}] \\mathrm{var}[\\boldsymbol{y}]}}.\n", @@ -1235,7 +1544,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "27c43f34", + "metadata": { + "editable": true + }, "source": [ "The correlation function is then given by values $\\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}]\n", "\\in [-1,1]$. This avoids eventual problems with too large values. We\n", @@ -1245,7 +1557,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "35ac64e2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x},\\boldsymbol{y}] = \\begin{bmatrix} 1 & \\mathrm{corr}[\\boldsymbol{x},\\boldsymbol{y}] \\\\\n", @@ -1256,19 +1571,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ec11e59", + "metadata": { + "editable": true + }, "source": [ "In the above example this is the function we constructed using **pandas**.\n", "\n", - "\n", - "\n", "In our derivation of the various regression algorithms like **Ordinary Least Squares** or **Ridge regression**\n", "we defined the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d1a1a24", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1284,7 +1603,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b12f1560", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$, with the predictors/features $p$ refering to the column numbers and the\n", "entries $n$ being the row elements.\n", @@ -1293,7 +1615,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7975e5ec", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix} \\boldsymbol{x}_0 & \\boldsymbol{x}_1 & \\boldsymbol{x}_2 & \\dots & \\dots & \\boldsymbol{x}_{p-1}\\end{bmatrix},\n", @@ -1302,14 +1627,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4628dae3", + "metadata": { + "editable": true + }, "source": [ "with a given vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "6acd55ed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_i^T = \\begin{bmatrix}x_{0,i} & x_{1,i} & x_{2,i}& \\dots & \\dots x_{n-1,i}\\end{bmatrix}.\n", @@ -1318,7 +1649,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "15268d5e", + "metadata": { + "editable": true + }, "source": [ "With these definitions, we can now rewrite our $2\\times 2$\n", "correlation/covariance matrix in terms of a moe general design/feature\n", @@ -1328,7 +1662,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f7cc7e46", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1344,14 +1681,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "91f506bb", + "metadata": { + "editable": true + }, "source": [ "and the correlation matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3f65d15d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{K}[\\boldsymbol{x}] = \\begin{bmatrix}\n", @@ -1367,7 +1710,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4dda44f3", + "metadata": { + "editable": true + }, "source": [ "The Numpy function **np.cov** calculates the covariance elements using\n", "the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have\n", @@ -1380,7 +1726,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3a6e7b9b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{W} = \\begin{bmatrix} x_0 & x_1 & x_2 & \\dots & x_{n-2} & x_{n-1} \\\\\n", @@ -1391,7 +1740,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d907b263", + "metadata": { + "editable": true + }, "source": [ "which in turn is converted into into the $2\\times 2$ covariance matrix\n", "$\\boldsymbol{C}$ via the Numpy function **np.cov()**. We note that we can also calculate\n", @@ -1402,7 +1754,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, + "id": "8dbb102f", "metadata": { "collapsed": false, "editable": true @@ -1423,7 +1776,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "25852e86", + "metadata": { + "editable": true + }, "source": [ "The previous example can be converted into the correlation matrix by\n", "simply scaling the matrix elements with the variances. We should also\n", @@ -1434,7 +1790,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, + "id": "cb3ee7b6", "metadata": { "collapsed": false, "editable": true @@ -1466,7 +1823,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6f2860ea", + "metadata": { + "editable": true + }, "source": [ "We see that the matrix elements along the diagonal are one as they\n", "should be and that the matrix is symmetric. Furthermore, diagonalizing\n", @@ -1474,14 +1834,13 @@ "\n", "The above procedure with **numpy** can be made more compact if we use **pandas**.\n", "\n", - "\n", - "\n", "We whow here how we can set up the correlation matrix using **pandas**, as done in this simple code" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, + "id": "48781620", "metadata": { "collapsed": false, "editable": true @@ -1506,14 +1865,18 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4ccdedad", + "metadata": { + "editable": true + }, "source": [ "We expand this model to the Franke function discussed earlier." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, + "id": "e4090257", "metadata": { "collapsed": false, "editable": true @@ -1567,7 +1930,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6547bf2f", + "metadata": { + "editable": true + }, "source": [ "We note here that the covariance is zero for the first rows and\n", "columns since all matrix elements in the design matrix were set to one\n", @@ -1578,14 +1944,15 @@ "drop these elements and construct a correlation\n", "matrix without these elements. \n", "\n", - "\n", - "\n", "We can rewrite the covariance matrix in a more compact form in terms of the design/feature matrix $\\boldsymbol{X}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4e26eab7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}= \\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}].\n", @@ -1594,14 +1961,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7f6a0df9", + "metadata": { + "editable": true + }, "source": [ "To see this let us simply look at a design matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{2\\times 2}$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff73ba2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}\n", @@ -1615,14 +1988,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae6e2e42", + "metadata": { + "editable": true + }, "source": [ "If we then compute the expectation value (note the $1/n$ factor instead of $1/(n-1)$)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "87a8dccc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}[\\boldsymbol{X}^T\\boldsymbol{X}] = \\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X}=\\frac{1}{n}\\begin{bmatrix}\n", @@ -1634,14 +2013,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1db8e000", + "metadata": { + "editable": true + }, "source": [ "which is just" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "59e0c46d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]=\\begin{bmatrix} \\mathrm{var}[\\boldsymbol{x}_0] & \\mathrm{cov}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] \\\\\n", @@ -1652,14 +2037,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ce39f8d0", + "metadata": { + "editable": true + }, "source": [ - "where we wrote $$\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1] = \\boldsymbol{C}[\\boldsymbol{x}]$$ to indicate that this is the covariance of the vectors $\\boldsymbol{x}$ of the design/feature matrix $\\boldsymbol{X}$.\n", - "\n", - "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$.\n", - "\n", - "\n", + "where we wrote $\\boldsymbol{C}[\\boldsymbol{x}_0,\\boldsymbol{x}_1]=\\boldsymbol{C}[\\boldsymbol{x}]$ to indicate\n", + "that this is the covariance of the vectors $\\boldsymbol{x}$ of the\n", + "design/feature matrix $\\boldsymbol{X}$.\n", "\n", + "It is easy to generalize this to a matrix $\\boldsymbol{X}\\in {\\mathbb{R}}^{n\\times p}$." + ] + }, + { + "cell_type": "markdown", + "id": "526f22b3", + "metadata": { + "editable": true + }, + "source": [ "## Linking with the SVD\n", "\n", "We saw earlier that" @@ -1667,7 +2063,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5d16d7c8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T=\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{V}^T.\n", @@ -1676,14 +2075,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11a74368", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $p\\times p$, with $p$ corresponding to the singular values, we defined earlier the matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0ca3614f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma} = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1692,14 +2097,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b98abb6c", + "metadata": { + "editable": true + }, "source": [ "where the tilde-matrix $\\tilde{\\boldsymbol{\\Sigma}}$ is a matrix of dimension $p\\times p$ containing only the singular values $\\sigma_i$, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "813567cc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{\\Sigma}}=\\begin{bmatrix} \\sigma_0 & 0 & 0 & \\dots & 0 & 0 \\\\\n", @@ -1713,14 +2124,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ed905c7b", + "metadata": { + "editable": true + }, "source": [ "meaning we can write" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0136bdac", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2\\boldsymbol{V}^T.\n", @@ -1729,14 +2146,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d43e6609", + "metadata": { + "editable": true + }, "source": [ "Multiplying from the right with $\\boldsymbol{V}$ (using the orthogonality of $\\boldsymbol{V}$) we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "15d2bb49", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{V}=\\boldsymbol{V}\\tilde{\\boldsymbol{\\Sigma}}^2.\n", @@ -1745,7 +2168,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "374104f4", + "metadata": { + "editable": true + }, "source": [ "This means the vectors $\\boldsymbol{v}_i$ of the orthogonal matrix $\\boldsymbol{V}$\n", "are the eigenvectors of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$ with eigenvalues\n", @@ -1754,7 +2180,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "86f4db59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)\\boldsymbol{v}_i=\\boldsymbol{v}_i\\sigma_i^2.\n", @@ -1763,7 +2192,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9d007f11", + "metadata": { + "editable": true + }, "source": [ "In other words, each non-zero singular value of $\\boldsymbol{X}$ is a positive\n", "square root of an eigenvalue of $\\boldsymbol{X}^T\\boldsymbol{X}$. It means also that\n", @@ -1773,7 +2205,6 @@ "$\\boldsymbol{v}_i$ are hierarchically ordered by how much correlation they\n", "encode from the columns of $\\boldsymbol{X}$. \n", "\n", - "\n", "Note that these are also the eigenvectors and eigenvalues of the\n", "Hessian matrix.\n", "\n", @@ -1783,7 +2214,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03c93eed", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{C}[\\boldsymbol{X}]=\\frac{1}{n}\\boldsymbol{X}^T\\boldsymbol{X},\n", @@ -1792,7 +2226,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3ee37fac", + "metadata": { + "editable": true + }, "source": [ "meaning that every squared non-singular value of $\\boldsymbol{X}$ divided by $n$ (\n", "the number of samples) are the eigenvalues of the covariance\n", @@ -1801,13 +2238,15 @@ "self-adjoint, the singular values of $\\boldsymbol{X}$ are equal to the\n", "absolute value of the eigenvalues of $\\boldsymbol{X}$.\n", "\n", - "\n", "For $\\boldsymbol{X}\\boldsymbol{X}^T$ we found" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "13290881", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}\\boldsymbol{V}^T\\boldsymbol{V}\\boldsymbol{\\Sigma}^T\\boldsymbol{U}^T=\\boldsymbol{U}\\boldsymbol{\\Sigma}^T\\boldsymbol{\\Sigma}\\boldsymbol{U}^T.\n", @@ -1816,14 +2255,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3896b3e6", + "metadata": { + "editable": true + }, "source": [ "Since the matrices here have dimension $n\\times n$, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ca47bd66", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Sigma}\\boldsymbol{\\Sigma}^T = \\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\\\ \\boldsymbol{0}\\\\ \\end{bmatrix}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} \\boldsymbol{0}\\\\ \\end{bmatrix}=\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix},\n", @@ -1832,14 +2277,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1513e1d0", + "metadata": { + "editable": true + }, "source": [ "leading to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4b9bf25a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{X}^T=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}\\boldsymbol{U}^T.\n", @@ -1848,14 +2299,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2eeb03c8", + "metadata": { + "editable": true + }, "source": [ "Multiplying with $\\boldsymbol{U}$ from the right gives us the eigenvalue problem" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "da278d8e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{X}\\boldsymbol{X}^T)\\boldsymbol{U}=\\boldsymbol{U}\\begin{bmatrix} \\tilde{\\boldsymbol{\\Sigma}} & \\boldsymbol{0} \\\\ \\boldsymbol{0} & \\boldsymbol{0}\\\\ \\end{bmatrix}.\n", @@ -1864,7 +2321,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2b341903", + "metadata": { + "editable": true + }, "source": [ "It means that the eigenvalues of $\\boldsymbol{X}\\boldsymbol{X}^T$ are again given by\n", "the non-zero singular values plus now a series of zeros. The column\n", @@ -1873,11 +2333,16 @@ "\n", "Since we will mainly be interested in the correlations among the features\n", "of our data (the columns of $\\boldsymbol{X}$, the quantity of interest for us are the non-zero singular\n", - "values and the column vectors of $\\boldsymbol{V}$.\n", - "\n", - "\n", - "\n", - "\n", + "values and the column vectors of $\\boldsymbol{V}$." + ] + }, + { + "cell_type": "markdown", + "id": "e66723d1", + "metadata": { + "editable": true + }, + "source": [ "## Ridge and Lasso Regression\n", "\n", "Let us remind ourselves about the expression for the standard Mean Squared Error (MSE) which we used to define our cost function and the equations for the ordinary least squares (OLS) method, that is \n", @@ -1886,7 +2351,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "85cff01a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in {\\mathbb{R}}^{p}}}\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right)\\right\\}.\n", @@ -1895,14 +2363,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c3bdf4f5", + "metadata": { + "editable": true + }, "source": [ "or we can state it as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1306ed38", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1912,14 +2386,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "00474af5", + "metadata": { + "editable": true + }, "source": [ "where we have used the definition of a norm-2 vector, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "346ae1ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_2 = \\sqrt{\\sum_i x_i^2}.\n", @@ -1928,7 +2408,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "36f83c2a", + "metadata": { + "editable": true + }, "source": [ "By minimizing the above equation with respect to the parameters\n", "$\\boldsymbol{\\beta}$ we could then obtain an analytical expression for the\n", @@ -1938,7 +2421,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "eb246827", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1948,7 +2434,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d38c34b0", + "metadata": { + "editable": true + }, "source": [ "which leads to the Ridge regression minimization problem where we\n", "require that $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2^2\\le t$, where $t$ is\n", @@ -1957,7 +2446,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e3f2141f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\frac{1}{n}\\vert\\vert \\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\vert\\vert_2^2+\\lambda\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -1966,14 +2458,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "74f56599", + "metadata": { + "editable": true + }, "source": [ "we have a new optimization equation" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea246d4b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\displaystyle \\min_{\\boldsymbol{\\beta}\\in\n", @@ -1983,7 +2481,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c6b1faa8", + "metadata": { + "editable": true + }, "source": [ "which leads to Lasso regression. Lasso stands for least absolute shrinkage and selection operator. \n", "\n", @@ -1992,7 +2493,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2fc09f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert\\vert \\boldsymbol{x}\\vert\\vert_1 = \\sum_i \\vert x_i\\vert.\n", @@ -2001,14 +2505,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a9f2c69a", + "metadata": { + "editable": true + }, "source": [ "Using the matrix-vector expression for Ridge regression and dropping the parameter $1/n$ in front of the standard means squared error equation, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2fb35c59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\boldsymbol{\\beta}^T\\boldsymbol{\\beta},\n", @@ -2017,7 +2527,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2e7636c6", + "metadata": { + "editable": true + }, "source": [ "and \n", "taking the derivatives with respect to $\\boldsymbol{\\beta}$ we obtain then\n", @@ -2028,7 +2541,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51bd5332", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{Ridge}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2037,14 +2553,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbd07896", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{I}$ being a $p\\times p$ identity matrix with the constraint that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "39cd7db8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sum_{i=0}^{p-1} \\beta_i^2 \\leq t,\n", @@ -2053,7 +2575,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "245333af", + "metadata": { + "editable": true + }, "source": [ "with $t$ a finite positive number. \n", "\n", @@ -2062,7 +2587,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ea29678", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_{\\mathrm{OLS}} = \\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y},\n", @@ -2071,26 +2599,29 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ad883534", + "metadata": { + "editable": true + }, "source": [ "which can lead to singular matrices. However, with the SVD, we can always compute the inverse of the matrix $\\boldsymbol{X}^T\\boldsymbol{X}$.\n", "\n", - "\n", "We see that Ridge regression is nothing but the standard OLS with a\n", "modified diagonal term added to $\\boldsymbol{X}^T\\boldsymbol{X}$. The consequences, in\n", "particular for our discussion of the bias-variance tradeoff are rather\n", "interesting. We will see that for specific values of $\\lambda$, we may\n", "even reduce the variance of the optimal parameters $\\boldsymbol{\\beta}$. These topics and other related ones, will be discussed after the more linear algebra oriented analysis here.\n", "\n", - "\n", - "\n", "Using our insights about the SVD of the design matrix $\\boldsymbol{X}$ \n", "We have already analyzed the OLS solutions in terms of the eigenvectors (the columns) of the right singular value matrix $\\boldsymbol{U}$ as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "54e5791f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{OLS}}=\\boldsymbol{X}\\boldsymbol{\\beta} =\\boldsymbol{U}\\boldsymbol{U}^T\\boldsymbol{y}.\n", @@ -2099,14 +2630,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c406bcb3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression this becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1a6f9659", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\tilde{\\boldsymbol{y}}_{\\mathrm{Ridge}}=\\boldsymbol{X}\\boldsymbol{\\beta}_{\\mathrm{Ridge}} = \\boldsymbol{U\\Sigma V^T}\\left(\\boldsymbol{V}\\boldsymbol{\\Sigma}^2\\boldsymbol{V}^T+\\lambda\\boldsymbol{I} \\right)^{-1}(\\boldsymbol{U\\Sigma V^T})^T\\boldsymbol{y}=\\sum_{j=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda}\\boldsymbol{y},\n", @@ -2115,18 +2652,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e2edbb3a", + "metadata": { + "editable": true + }, "source": [ "with the vectors $\\boldsymbol{u}_j$ being the columns of $\\boldsymbol{U}$ from the SVD of the matrix $\\boldsymbol{X}$. \n", "\n", - "\n", - "\n", "Since $\\lambda \\geq 0$, it means that compared to OLS, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "402353ad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\sigma_j^2}{\\sigma_j^2+\\lambda} \\leq 1.\n", @@ -2135,7 +2676,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "423b6396", + "metadata": { + "editable": true + }, "source": [ "Ridge regression finds the coordinates of $\\boldsymbol{y}$ with respect to the\n", "orthonormal basis $\\boldsymbol{U}$, it then shrinks the coordinates by\n", @@ -2145,14 +2689,15 @@ "\n", "For small eigenvalues $\\sigma_i$ it means that their contributions become less important, a fact which can be used to reduce the number of degrees of freedom. More about this when we have covered the material on a statistical interpretation of various linear regression methods.\n", "\n", - "\n", - "\n", "For the sake of simplicity, let us assume that the design matrix is orthonormal, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "f1d49878", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}=(\\boldsymbol{X}^T\\boldsymbol{X})^{-1} =\\boldsymbol{I}.\n", @@ -2161,14 +2706,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "29e021c6", + "metadata": { + "editable": true + }, "source": [ "In this case the standard OLS results in" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "7ea41670", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{OLS}} = \\boldsymbol{X}^T\\boldsymbol{y}=\\sum_{i=0}^{p-1}\\boldsymbol{u}_j\\boldsymbol{u}_j^T\\boldsymbol{y},\n", @@ -2177,14 +2728,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5c24d1b", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5cde9430", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{Ridge}} = \\left(\\boldsymbol{I}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}=\\left(1+\\lambda\\right)^{-1}\\boldsymbol{\\beta}^{\\mathrm{OLS}},\n", @@ -2193,7 +2750,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f8725e06", + "metadata": { + "editable": true + }, "source": [ "that is the Ridge estimator scales the OLS estimator by the inverse of a factor $1+\\lambda$, and\n", "the Ridge estimator converges to zero when the hyperparameter goes to\n", @@ -2201,14 +2761,15 @@ "\n", "We will come back to more interpreations after we have gone through some of the statistical analysis part. \n", "\n", - "\n", - "\n", "Using the matrix-vector expression for Lasso regression and dropping the parameter $1/n$ in front of the standard mean squared error equation, we have the following **cost** function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "77595d78", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{X},\\boldsymbol{\\beta})=\\left\\{(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\right\\}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -2217,14 +2778,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "30d6a0a4", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative with respect to $\\boldsymbol{\\beta}$ and recalling that the derivative of the absolute value is (we drop the boldfaced vector symbol for simplicty)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e6aaeb07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{d \\vert \\beta\\vert}{d \\boldsymbol{\\beta}}=\\mathrm{sgn}(\\boldsymbol{\\beta})=\\left\\{\\begin{array}{cc} 1 & \\beta > 0 \\\\ 0 & \\beta =0\\\\-1 & \\beta < 0, \\end{array}\\right.\n", @@ -2233,14 +2800,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "61f8860b", + "metadata": { + "editable": true + }, "source": [ "we have that the derivative of the cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "848fab1b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{X},\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}=-2\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})+\\lambda sgn(\\boldsymbol{\\beta})=0,\n", @@ -2249,14 +2822,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b3f9c65", + "metadata": { + "editable": true + }, "source": [ "and reordering we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a4535489", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\boldsymbol{X}\\boldsymbol{\\beta}+\\lambda sgn(\\boldsymbol{\\beta})=2\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2265,14 +2844,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "08d1dcfc", + "metadata": { + "editable": true + }, "source": [ "This equation does not lead to a nice analytical equation as in Ridge regression or ordinary least squares. This equation can however be solved by using standard convex optimization algorithms using for example the Python package [CVXOPT](https://cvxopt.org/). We will discuss this later. \n", "\n", - "\n", - "\n", - "\n", - "\n", "Let us assume that our design matrix is given by unit (identity) matrix, that is a square diagonal matrix with ones only along the\n", "diagonal. In this case we have an equal number of rows and columns $n=p$.\n", "\n", @@ -2281,7 +2859,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "bfad6360", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2,\n", @@ -2290,14 +2871,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ececd781", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "834ae242", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{OLS}} = y_i.\n", @@ -2306,14 +2893,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ef16a3d3", + "metadata": { + "editable": true + }, "source": [ "For Ridge regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a40a2bf7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\beta_i^2,\n", @@ -2322,14 +2915,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c6b14af", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "d9fb8933", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\beta}_i^{\\mathrm{Ridge}} = \\frac{y_i}{1+\\lambda}.\n", @@ -2338,14 +2937,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "272cb2f8", + "metadata": { + "editable": true + }, "source": [ "For Lasso regression our cost function is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "fadce691", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\vert\\beta_i\\vert=\\sum_{i=0}^{p-1}(y_i-\\beta_i)^2+\\lambda\\sum_{i=0}^{p-1}\\sqrt{\\beta_i^2},\n", @@ -2354,14 +2959,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7cd5640", + "metadata": { + "editable": true + }, "source": [ "and minimizing we have that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "463185a0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2\\sum_{i=0}^{p-1}(y_i-\\beta_i)+\\lambda \\sum_{i=0}^{p-1}\\frac{(\\beta_i)}{\\vert\\beta_i\\vert}=0,\n", @@ -2370,14 +2981,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7b2748c6", + "metadata": { + "editable": true + }, "source": [ "which leads to" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "14027ed3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}_i^{\\mathrm{Lasso}} = \\left\\{\\begin{array}{ccc}y_i-\\frac{\\lambda}{2} &\\mathrm{if} & y_i> \\frac{\\lambda}{2}\\\\\n", @@ -2388,18 +3005,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6ee85f1d", + "metadata": { + "editable": true + }, "source": [ "Plotting these results ([figure in handwritten notes for week 36](https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2021/NotesSeptember9.pdf)) shows clearly that Lasso regression suppresses (sets to zero) values of $\\beta_i$ for specific values of $\\lambda$. Ridge regression reduces on the other hand the values of $\\beta_i$ as function of $\\lambda$.\n", "\n", - "\n", "As another examples, \n", "let us assume we have a data set with outputs/targets given by the vector" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "b5208771", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y}=\\begin{bmatrix}4 \\\\ 2 \\\\3\\end{bmatrix},\n", @@ -2408,14 +3030,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1b21b70", + "metadata": { + "editable": true + }, "source": [ "and our inputs as a $3\\times 2$ design matrix" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c7f60db1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix}2 & 0\\\\ 0 & 1 \\\\ 0 & 0\\end{bmatrix},\n", @@ -2424,17 +3052,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "908ab8d8", + "metadata": { + "editable": true + }, "source": [ "meaning that we have two features and two unknown parameters $\\beta_0$ and $\\beta_1$ to be determined either by ordinary least squares, Ridge or Lasso regression.\n", "\n", - "\n", "For ordinary least squares (OLS) we know that the optimal solution is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "aebb6349", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2443,14 +3076,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c5e7c53f", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "2197be2d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\begin{bmatrix}2 \\\\ 2\\end{bmatrix},\n", @@ -2459,17 +3098,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d6f2196", + "metadata": { + "editable": true + }, "source": [ "The code which implements this simpler case is presented after the discussion of Ridge and Lasso.\n", "\n", - "\n", "For Ridge regression we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f340903", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\left( \\boldsymbol{X}^T\\boldsymbol{X}+\\lambda\\boldsymbol{I}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}.\n", @@ -2478,14 +3122,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "11b0427e", + "metadata": { + "editable": true + }, "source": [ "Inserting the above values we obtain that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "963a0089", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{Ridge}}=\\begin{bmatrix}\\frac{8}{4+\\lambda} \\\\ \\frac{2}{1+\\lambda}\\end{bmatrix},\n", @@ -2494,21 +3144,25 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7db2daaa", + "metadata": { + "editable": true + }, "source": [ "There is normally a constraint on the value of $\\vert\\vert \\boldsymbol{\\beta}\\vert\\vert_2$ via the parameter $\\lambda$.\n", "Let us for simplicity assume that $\\beta_0^2+\\beta_1^2=1$ as constraint. This will allow us to find an expression for the optimal values of $\\beta$ and $\\lambda$.\n", "\n", "To see this, let us write the cost function for Ridge regression. \n", "\n", - "\n", - "\n", "We define the MSE without the $1/n$ factor and have then, using that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "688d8588", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}\\boldsymbol{\\beta}=\\begin{bmatrix} 2\\beta_0 \\\\ \\beta_1 \\\\0 \\end{bmatrix},\n", @@ -2517,7 +3171,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "711738d9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\beta_0^2+\\beta_1^2),\n", @@ -2526,14 +3183,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6c949f8e", + "metadata": { + "editable": true + }, "source": [ "and taking the derivative with respect to $\\beta_0$ we get" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0bbc3b07", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{8}{4+\\lambda},\n", @@ -2542,14 +3205,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1cbf8a76", + "metadata": { + "editable": true + }, "source": [ "and for $\\beta_1$ we obtain" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "8f10e5bd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{2}{1+\\lambda},\n", @@ -2558,14 +3227,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b547328c", + "metadata": { + "editable": true + }, "source": [ "Using the constraint for $\\beta_0^2+\\beta_1^2=1$ we can constrain $\\lambda$ by solving" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "707c1a57", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\frac{8}{4+\\lambda}\\right)^2+\\left(\\frac{2}{1+\\lambda}\\right)^2=1,\n", @@ -2574,18 +3249,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b90e6997", + "metadata": { + "editable": true + }, "source": [ "which gives $\\lambda=4.571$ and $\\beta_0=0.933$ and $\\beta_1=0.359$.\n", "\n", - "\n", "For Lasso we need now, keeping a constraint on $\\vert\\beta_0\\vert+\\vert\\beta_1\\vert=1$, to take the derivative of the absolute values of $\\beta_0$\n", "and $\\beta_1$. This gives us the following derivatives of the cost function" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "e4f6ca20", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=(4-2\\beta_0)^2+(2-\\beta_1)^2+\\lambda(\\vert\\beta_0\\vert+\\vert\\beta_1\\vert),\n", @@ -2594,7 +3274,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b3d7018c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_0}=-4(4-2\\beta_0)+\\lambda\\mathrm{sgn}(\\beta_0)=0,\n", @@ -2603,14 +3286,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9e6f1823", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ea3b2bf0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C(\\boldsymbol{\\beta})}{\\partial \\beta_1}=-2(2-\\beta_1)+\\lambda\\mathrm{sgn}(\\beta_1)=0.\n", @@ -2619,7 +3308,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "484b5cd4", + "metadata": { + "editable": true + }, "source": [ "We have now four cases to solve besides the trivial cases $\\beta_0$ and/or $\\beta_1$ are zero, namely\n", "1. $\\beta_0 > 0$ and $\\beta_1 > 0$,\n", @@ -2635,7 +3327,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4861f625", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-4(4-2\\beta_0)+\\lambda=0,\n", @@ -2644,14 +3339,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9928eadb", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c94a1223", + "metadata": { + "editable": true + }, "source": [ "$$\n", "-2(2-\\beta_1)+\\lambda=0.\n", @@ -2660,14 +3361,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9bcaff12", + "metadata": { + "editable": true + }, "source": [ "which yields" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1b7020d6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_0=\\frac{16+\\lambda}{8},\n", @@ -2676,14 +3383,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "51fce0e9", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c1fe81b2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_1=\\frac{4+\\lambda}{2}.\n", @@ -2692,11 +3405,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "414a2e5b", + "metadata": { + "editable": true + }, "source": [ "Using the constraint on $\\beta_0$ and $\\beta_1$ we can then find the optimal value of $\\lambda$ for the different cases. We leave this as an exercise to you.\n", "\n", - "\n", "Here we set up the OLS, Ridge and Lasso functionality in order to study the above example. Note that here we have opted for a set of values of $\\lambda$, meaning that we need to perform a search in order to find the optimal values.\n", "\n", "First we study and compare the OLS and Ridge results. The next code compares all three methods.\n", @@ -2705,7 +3420,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, + "id": "57451fca", "metadata": { "collapsed": false, "editable": true @@ -2767,7 +3483,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6d10b060", + "metadata": { + "editable": true + }, "source": [ "We see here that we reach a plateau for the Ridge results. Writing out the coefficients $\\boldsymbol{\\beta}$, we that they are getting smaller and smaller and our error stabilizes since the predicted values of $\\tilde{\\boldsymbol{y}}$ approach zero.\n", "\n", @@ -2780,7 +3499,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, + "id": "100f7dbb", "metadata": { "collapsed": false, "editable": true @@ -2847,7 +3567,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3d50bfd5", + "metadata": { + "editable": true + }, "source": [ "We bring then back our exponential function example and study all\n", "three regression methods. Depending on the level of noise, we note\n", @@ -2862,7 +3585,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, + "id": "409f405d", "metadata": { "collapsed": false, "editable": true @@ -2951,315 +3675,26 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "50e9be28", + "metadata": { + "editable": true + }, "source": [ "Both these example send a clear message. The addition of a\n", "shrinkage/regularization term implies that we need to perform a search\n", "for the optimal values of $\\lambda$. We will see this throughout these\n", "series of lectures.\n", "\n", - "\n", - "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*.\n", - "The following code example solves the simpler problem we discussed above, where we have added the latter python file." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [], - "source": [ - "from cvxopt import matrix, spdiag, mul, div, sqrt, normal, setseed\n", - "from cvxopt import blas, lapack, solvers, sparse, spmatrix\n", - "import math\n", - "\n", - "try:\n", - " import mosek\n", - " import sys\n", - " __MOSEK = True\n", - "except: __MOSEK = False\n", - "\n", - "if __MOSEK:\n", - "\n", - " def l1regls_mosek(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize || A*x - b ||_2^2 + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars( 2*n) # number of variables\n", - " task.appendcons( 2*n) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " Q = matrix(0.0, (n,n)) \n", - " blas.syrk(A, Q, alpha = 2.0, trans='T')\n", - "\n", - " I = []\n", - " for i in range(n):\n", - " I.extend(range(i,n))\n", - "\n", - " J = []\n", - " for i in range(n):\n", - " J.extend((n-i)*[i])\n", - "\n", - " task.putqobj(I, J, list(Q[matrix(I) + matrix(J)*n]))\n", - " task.putclist(range(2*n), list(-2*A.T*b) + n*[1.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var,\n", - " 0, 2*n, 2*n*[mosek.boundkey.fr], 2*n*[0.0], 2*n*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - " def l1regls_mosek2(A, b):\n", - " \"\"\"\n", - "\n", - " Returns the solution of l1-norm regularized least-squares problem\n", - "\n", - " minimize w'*w + e'*u\n", - "\n", - " subject to -u <= x <= u\n", - "\n", - " A*x - w = b\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - "\n", - " env = mosek.Env()\n", - " task = env.Task(0,0)\n", - " task.set_Stream(mosek.streamtype.log, lambda x: sys.stdout.write(x))\n", - "\n", - " task.appendvars(2*n + m) # number of variables\n", - " task.appendcons(2*n + m) # number of constraints\n", - "\n", - " # input quadratic objective\n", - " task.putqobj(range(2*n,2*n+m), range(2*n,2*n+m), m*[2.0])\n", - "\n", - " task.putclist(range(2*n+m), n*[0.0] + n*[1.0] + m*[0.0]) # setup linear objective\n", - "\n", - " # input constraint matrix row by row\n", - " for i in range(n):\n", - " task.putarow( i, [i, n+i], [1.0, -1.0])\n", - " task.putarow( n+i, [i, n+i], [1.0, 1.0])\n", - "\n", - " for i in range(m):\n", - " task.putarow( 2*n+i, range(n) + [2*n+i], list(A[i,:]) + [-1.0])\n", - "\n", - " # setup bounds on constraints\n", - " task.putboundslice(mosek.accmode.con,\n", - " 0, n, n*[mosek.boundkey.up], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " n, 2*n, n*[mosek.boundkey.lo], n*[0.0], n*[0.0])\n", - " task.putboundslice(mosek.accmode.con,\n", - " 2*n, 2*n+m, m*[mosek.boundkey.fx], list(b), list(b))\n", - "\n", - " # setup variable bounds\n", - " task.putboundslice(mosek.accmode.var, 0, 2*n+m, (2*n+m)*[mosek.boundkey.fr], \n", - " (2*n+m)*[0.0], (2*n+m)*[0.0])\n", - "\n", - " # optimize the task\n", - " task.putobjsense(mosek.objsense.minimize)\n", - " task.optimize()\n", - " task.solutionsummary(mosek.streamtype.log)\n", - " x = n*[0.0]\n", - " task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, n, x)\n", - "\n", - " return matrix(x)\n", - "\n", - "def l1regls(A, b):\n", - " \"\"\"\n", - " \n", - " Returns the solution of l1-norm regularized least-squares problem\n", - " \n", - " minimize || A*x - b ||_2^2 + || x ||_1.\n", - "\n", - " \"\"\"\n", - "\n", - " m, n = A.size\n", - " q = matrix(1.0, (2*n,1))\n", - " q[:n] = -2.0 * A.T * b\n", - "\n", - " def P(u, v, alpha = 1.0, beta = 0.0 ):\n", - " \"\"\"\n", - " v := alpha * 2.0 * [ A'*A, 0; 0, 0 ] * u + beta * v \n", - " \"\"\"\n", - " v *= beta\n", - " v[:n] += alpha * 2.0 * A.T * (A * u[:n])\n", - "\n", - "\n", - " def G(u, v, alpha=1.0, beta=0.0, trans='N'):\n", - " \"\"\"\n", - " v := alpha*[I, -I; -I, -I] * u + beta * v (trans = 'N' or 'T')\n", - " \"\"\"\n", - "\n", - " v *= beta\n", - " v[:n] += alpha*(u[:n] - u[n:])\n", - " v[n:] += alpha*(-u[:n] - u[n:])\n", - "\n", - " h = matrix(0.0, (2*n,1))\n", - "\n", - "\n", - " # Customized solver for the KKT system \n", - " #\n", - " # [ 2.0*A'*A 0 I -I ] [x[:n] ] [bx[:n] ]\n", - " # [ 0 0 -I -I ] [x[n:] ] = [bx[n:] ].\n", - " # [ I -I -D1^-1 0 ] [zl[:n]] [bzl[:n]]\n", - " # [ -I -I 0 -D2^-1 ] [zl[n:]] [bzl[n:]]\n", - " #\n", - " # where D1 = W['di'][:n]**2, D2 = W['di'][:n]**2.\n", - " # \n", - " # We first eliminate zl and x[n:]:\n", - " #\n", - " # ( 2*A'*A + 4*D1*D2*(D1+D2)^-1 ) * x[:n] = \n", - " # bx[:n] - (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] \n", - " #\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " #\n", - " # zl[:n] = D1 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2 * (-x[:n] - x[n:] - bzl[n:] ).\n", - " #\n", - " # The first equation has the form\n", - " #\n", - " # (A'*A + D)*x[:n] = rhs\n", - " #\n", - " # and is equivalent to\n", - " #\n", - " # [ D A' ] [ x:n] ] = [ rhs ]\n", - " # [ A -I ] [ v ] [ 0 ].\n", - " #\n", - " # It can be solved as \n", - " #\n", - " # ( A*D^-1*A' + I ) * v = A * D^-1 * rhs\n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - "\n", - " S = matrix(0.0, (m,m))\n", - " Asc = matrix(0.0, (m,n))\n", - " v = matrix(0.0, (m,1))\n", - "\n", - " def Fkkt(W):\n", - "\n", - " # Factor \n", - " #\n", - " # S = A*D^-1*A' + I \n", - " #\n", - " # where D = 2*D1*D2*(D1+D2)^-1, D1 = d[:n]**-2, D2 = d[n:]**-2.\n", - "\n", - " d1, d2 = W['di'][:n]**2, W['di'][n:]**2\n", - "\n", - " # ds is square root of diagonal of D\n", - " ds = math.sqrt(2.0) * div( mul( W['di'][:n], W['di'][n:]), \n", - " sqrt(d1+d2) )\n", - " d3 = div(d2 - d1, d1 + d2)\n", - " \n", - " # Asc = A*diag(d)^-1/2\n", - " Asc = A * spdiag(ds**-1)\n", - "\n", - " # S = I + A * D^-1 * A'\n", - " blas.syrk(Asc, S)\n", - " S[::m+1] += 1.0 \n", - " lapack.potrf(S)\n", - "\n", - " def g(x, y, z):\n", - "\n", - " x[:n] = 0.5 * ( x[:n] - mul(d3, x[n:]) + \n", - " mul(d1, z[:n] + mul(d3, z[:n])) - mul(d2, z[n:] - \n", - " mul(d3, z[n:])) )\n", - " x[:n] = div( x[:n], ds) \n", - "\n", - " # Solve\n", - " #\n", - " # S * v = 0.5 * A * D^-1 * ( bx[:n] - \n", - " # (D2-D1)*(D1+D2)^-1 * bx[n:] + \n", - " # D1 * ( I + (D2-D1)*(D1+D2)^-1 ) * bzl[:n] - \n", - " # D2 * ( I - (D2-D1)*(D1+D2)^-1 ) * bzl[n:] )\n", - " \n", - " blas.gemv(Asc, x, v)\n", - " lapack.potrs(S, v)\n", - " \n", - " # x[:n] = D^-1 * ( rhs - A'*v ).\n", - " blas.gemv(Asc, v, x, alpha=-1.0, beta=1.0, trans='T')\n", - " x[:n] = div(x[:n], ds)\n", - "\n", - " # x[n:] = (D1+D2)^-1 * ( bx[n:] - D1*bzl[:n] - D2*bzl[n:] ) \n", - " # - (D2-D1)*(D1+D2)^-1 * x[:n] \n", - " x[n:] = div( x[n:] - mul(d1, z[:n]) - mul(d2, z[n:]), d1+d2 )\\\n", - " - mul( d3, x[:n] )\n", - " \n", - " # zl[:n] = D1^1/2 * ( x[:n] - x[n:] - bzl[:n] )\n", - " # zl[n:] = D2^1/2 * ( -x[:n] - x[n:] - bzl[n:] ).\n", - " z[:n] = mul( W['di'][:n], x[:n] - x[n:] - z[:n] ) \n", - " z[n:] = mul( W['di'][n:], -x[:n] - x[n:] - z[n:] ) \n", - "\n", - " return g\n", - "\n", - " return solvers.coneqp(P, q, G, h, kktsolver = Fkkt)['x'][:n]" + "As a small addendum, we note that you can also solve this problem using the convex optimization package [CVXOPT](https://cvxopt.org/examples/mlbook/l1regls.html). This requires, in addition to having installed **CVXOPT**, you need to download the file *l1regl.py*." ] }, { "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we call the above functions and solve the problem, as done here" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "id": "4c5c2565", "metadata": { - "collapsed": false, "editable": true }, - "outputs": [], "source": [ - "from cvxopt import matrix, normal\n", - "\n", - "X = matrix( [ [ 2, 0, 1], [0, 1, 3]])\n", - "y = matrix( [4, 2, 3])\n", - "x = l1regls(X,y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**More text will be added to this example.**\n", - "\n", "## Linking the regression analysis with a statistical interpretation\n", "\n", "We will now couple the discussions of ordinary least squares, Ridge\n", @@ -3270,7 +3705,6 @@ "parameter can reduce considerably the variance of the parameters\n", "$\\beta$.\n", "\n", - "\n", "The\n", "advantage of doing linear regression is that we actually end up with\n", "analytical expressions for several statistical quantities. \n", @@ -3278,7 +3712,6 @@ "derive quantities like the variance and other expectation values in a\n", "rather straightforward way.\n", "\n", - "\n", "It is assumed that $\\varepsilon_i\n", "\\sim \\mathcal{N}(0, \\sigma^2)$ and the $\\varepsilon_{i}$ are\n", "independent, i.e.:" @@ -3286,7 +3719,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f264b531", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3299,7 +3735,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "800b179f", + "metadata": { + "editable": true + }, "source": [ "The randomness of $\\varepsilon_i$ implies that\n", "$\\mathbf{y}_i$ is also a random variable. In particular,\n", @@ -3312,8 +3751,6 @@ "notation above $\\mathbf{X}_{i,\\ast}$ means that we are looking at the\n", "row number $i$ and perform a sum over all values $p$.\n", "\n", - "\n", - "\n", "The assumption we have made here can be summarized as (and this is going to be useful when we discuss the bias-variance trade off)\n", "that there exists a function $f(\\boldsymbol{x})$ and a normal distributed error $\\boldsymbol{\\varepsilon}\\sim \\mathcal{N}(0, \\sigma^2)$\n", "which describe our data" @@ -3321,7 +3758,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b4815186", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y} = f(\\boldsymbol{x})+\\boldsymbol{\\varepsilon}\n", @@ -3330,7 +3770,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2a343970", + "metadata": { + "editable": true + }, "source": [ "We approximate this function with our model from the solution of the linear regression equations, that is our\n", "function $f$ is approximated by $\\boldsymbol{\\tilde{y}}$ where we want to minimize $(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2$, our MSE, with" @@ -3338,7 +3781,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "358077b0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\tilde{y}} = \\boldsymbol{X}\\boldsymbol{\\beta}.\n", @@ -3347,14 +3793,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "73f23e81", + "metadata": { + "editable": true + }, "source": [ "We can calculate the expectation value of $\\boldsymbol{y}$ for a given element $i$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bebdffa9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \n", @@ -3367,7 +3819,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8c38cb47", + "metadata": { + "editable": true + }, "source": [ "while\n", "its variance is" @@ -3375,7 +3830,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "193c47ee", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*} \\mbox{Var}(y_i) & = \\mathbb{E} \\{ [y_i\n", @@ -3395,18 +3853,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "92832b0a", + "metadata": { + "editable": true + }, "source": [ "Hence, $y_i \\sim \\mathcal{N}( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}, \\sigma^2)$, that is $\\boldsymbol{y}$ follows a normal distribution with \n", "mean value $\\boldsymbol{X}\\boldsymbol{\\beta}$ and variance $\\sigma^2$ (not be confused with the singular values of the SVD). \n", "\n", - "\n", "With the OLS expressions for the parameters $\\boldsymbol{\\beta}$ we can evaluate the expectation value" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "5f517886", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}(\\boldsymbol{\\beta}) = \\mathbb{E}[ (\\mathbf{X}^{\\top} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1}\\mathbf{X}^{T} \\mathbb{E}[ \\mathbf{Y}]=(\\mathbf{X}^{T} \\mathbf{X})^{-1} \\mathbf{X}^{T}\\mathbf{X}\\boldsymbol{\\beta}=\\boldsymbol{\\beta}.\n", @@ -3415,7 +3878,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9dea445", + "metadata": { + "editable": true + }, "source": [ "This means that the estimator of the regression parameters is unbiased.\n", "\n", @@ -3426,7 +3892,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3aececb1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{eqnarray*}\n", @@ -3454,7 +3923,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38f2849", + "metadata": { + "editable": true + }, "source": [ "where we have used that $\\mathbb{E} (\\mathbf{Y} \\mathbf{Y}^{T}) =\n", "\\mathbf{X} \\, \\boldsymbol{\\beta} \\, \\boldsymbol{\\beta}^{T} \\, \\mathbf{X}^{T} +\n", @@ -3464,7 +3936,6 @@ "$\\boldsymbol{\\sigma}^2 (\\boldsymbol{\\beta}_j ) = \\boldsymbol{\\sigma}^2 [(\\mathbf{X}^{T} \\mathbf{X})^{-1}]_{jj} $. This may be used to\n", "construct a confidence interval for the estimates.\n", "\n", - "\n", "In a similar way, we can obtain analytical expressions for say the\n", "expectation values of the parameters $\\boldsymbol{\\beta}$ and their variance\n", "when we employ Ridge regression, allowing us again to define a confidence interval. \n", @@ -3474,7 +3945,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "47dbc181", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big]=(\\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I}_{pp})^{-1} (\\mathbf{X}^{\\top} \\mathbf{X})\\boldsymbol{\\beta}^{\\mathrm{OLS}}.\n", @@ -3483,7 +3957,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a409614d", + "metadata": { + "editable": true + }, "source": [ "We see clearly that \n", "$\\mathbb{E} \\big[ \\boldsymbol{\\beta}^{\\mathrm{Ridge}} \\big] \\not= \\boldsymbol{\\beta}^{\\mathrm{OLS}}$ for any $\\lambda > 0$. We say then that the ridge estimator is biased.\n", @@ -3493,7 +3970,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "32e59beb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{Ridge}}]=\\sigma^2[ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1} \\mathbf{X}^{T} \\mathbf{X} \\{ [ \\mathbf{X}^{\\top} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T},\n", @@ -3502,7 +3982,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5d38011", + "metadata": { + "editable": true + }, "source": [ "and it is easy to see that if the parameter $\\lambda$ goes to infinity then the variance of Ridge parameters $\\boldsymbol{\\beta}$ goes to zero. \n", "\n", @@ -3511,7 +3994,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "999a6bc6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mbox{Var}[\\boldsymbol{\\beta}^{\\mathrm{OLS}}]-\\mbox{Var}(\\boldsymbol{\\beta}^{\\mathrm{Ridge}})=\\sigma^2 [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}[ 2\\lambda\\mathbf{I} + \\lambda^2 (\\mathbf{X}^{T} \\mathbf{X})^{-1} ] \\{ [ \\mathbf{X}^{T} \\mathbf{X} + \\lambda \\mathbf{I} ]^{-1}\\}^{T}.\n", @@ -3520,14 +4006,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "888f1db7", + "metadata": { + "editable": true + }, "source": [ "The difference is non-negative definite since each component of the\n", "matrix product is non-negative definite. \n", - "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below. \n", - "\n", - "\n", - "\n", + "This means the variance we obtain with the standard OLS will always for $\\lambda > 0$ be larger than the variance of $\\boldsymbol{\\beta}$ obtained with the Ridge estimator. This has interesting consequences when we discuss the so-called bias-variance trade-off below." + ] + }, + { + "cell_type": "markdown", + "id": "76360bbe", + "metadata": { + "editable": true + }, + "source": [ "## Deriving OLS from a probability distribution\n", "\n", "Our basic assumption when we derived the OLS equations was to assume\n", @@ -3546,7 +4041,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b1976cd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "y_i\\sim \\mathcal{N}(\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta}, \\sigma^2)=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -3555,7 +4053,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5ff419a1", + "metadata": { + "editable": true + }, "source": [ "We assume now that the various $y_i$ values are stochastically distributed according to the above Gaussian distribution. \n", "We define this distribution as" @@ -3563,7 +4064,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "82730c14", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(y_i, \\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]},\n", @@ -3572,7 +4076,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4982965d", + "metadata": { + "editable": true + }, "source": [ "which reads as finding the likelihood of an event $y_i$ with the input variables $\\boldsymbol{X}$ given the parameters (to be determined) $\\boldsymbol{\\beta}$.\n", "\n", @@ -3581,7 +4088,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab4c31a7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{y},\\boldsymbol{X}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}=\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta}).\n", @@ -3590,7 +4100,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "768cb1fc", + "metadata": { + "editable": true + }, "source": [ "We will write this in a more compact form reserving $\\boldsymbol{D}$ for the domain of events, including the ouputs (targets) and the inputs. That is\n", "in case we have a simple one-dimensional input and output case" @@ -3598,7 +4111,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f9f0c7f3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})].\n", @@ -3607,7 +4123,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c617cdd7", + "metadata": { + "editable": true + }, "source": [ "In the more general case the various inputs should be replaced by the possible features represented by the input data set $\\boldsymbol{X}$. \n", "We can now rewrite the above probability as" @@ -3615,7 +4134,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "760dd73f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -3624,27 +4146,27 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0fd8cbb0", + "metadata": { + "editable": true + }, "source": [ "It is a conditional probability (see below) and reads as the\n", "likelihood of a domain of events $\\boldsymbol{D}$ given a set of parameters\n", "$\\boldsymbol{\\beta}$.\n", "\n", - "\n", "In statistics, maximum likelihood estimation (MLE) is a method of\n", "estimating the parameters of an assumed probability distribution,\n", "given some observed data. This is achieved by maximizing a likelihood\n", "function so that, under the assumed statistical model, the observed\n", "data is the most probable. \n", "\n", - "\n", "We will assume here that our events are given by the above Gaussian\n", "distribution and we will determine the optimal parameters $\\beta$ by\n", "maximizing the above PDF. However, computing the derivatives of a\n", "product function is cumbersome and can easily lead to overflow and/or\n", "underflowproblems, with potentials for loss of numerical precision.\n", "\n", - "\n", "In practice, it is more convenient to maximize the logarithm of the\n", "PDF because it is a monotonically increasing function of the argument.\n", "Alternatively, and this will be our option, we will minimize the\n", @@ -3654,15 +4176,15 @@ "Note also that maximization/minimization of the logarithm of the PDF\n", "is equivalent to the maximization/minimization of the function itself.\n", "\n", - "\n", - "\n", - "\n", "We could now define a new cost function to minimize, namely the negative logarithm of the above PDF" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "bbfab5d3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=-\\log{\\prod_{i=0}^{n-1}p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})}=-\\sum_{i=0}^{n-1}\\log{p(y_i,\\boldsymbol{X}\\vert\\boldsymbol{\\beta})},\n", @@ -3671,14 +4193,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f4ee97d7", + "metadata": { + "editable": true + }, "source": [ "which becomes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1e74d52d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{n}{2}\\log{2\\pi\\sigma^2}+\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}.\n", @@ -3687,14 +4215,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "b983cb4c", + "metadata": { + "editable": true + }, "source": [ "Taking the derivative of the *new* cost function with respect to the parameters $\\beta$ we recognize our familiar OLS equation, namely" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c90a8ed0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta}\\right) =0,\n", @@ -3703,14 +4237,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f38fcc19", + "metadata": { + "editable": true + }, "source": [ "which leads to the well-known OLS equation for the optimal paramters $\\beta$" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "348010f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{\\boldsymbol{\\beta}}^{\\mathrm{OLS}}=\\left(\\boldsymbol{X}^T\\boldsymbol{X}\\right)^{-1}\\boldsymbol{X}^T\\boldsymbol{y}!\n", @@ -3719,11 +4259,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd33a62d", + "metadata": { + "editable": true + }, "source": [ "Before we make a similar analysis for Ridge and Lasso regression, we need a short reminder on statistics. \n", "\n", - "\n", "A central theorem in statistics is Bayes' theorem. This theorem plays a similar role as the good old Pythagoras' theorem in geometry.\n", "Bayes' theorem is extremely simple to derive. But to do so we need some basic axioms from statistics.\n", "\n", @@ -3737,7 +4279,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "2bb675c1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X)+p(Y)-p(X \\cap Y).\n", @@ -3746,14 +4291,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d1ff7ab5", + "metadata": { + "editable": true + }, "source": [ "The product rule (aka joint probability) is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "80d51bf1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X \\cup Y)= p(X,Y)= p(X\\vert Y)p(Y)=p(Y\\vert X)p(X),\n", @@ -3762,20 +4313,24 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3eb856c7", + "metadata": { + "editable": true + }, "source": [ "where we read $p(X\\vert Y)$ as the likelihood of obtaining $X$ given $Y$.\n", "\n", "If we have independent events then $p(X,Y)=p(X)p(Y)$.\n", "\n", - "\n", - "\n", "The marginal probability is defined in terms of only one of the set of variables $X,Y$. For a discrete probability we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "84c98a40", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X)=\\sum_{i=0}^{n-1}p(X,Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert Y=y_i)p(Y=y_i)=\\sum_{i=0}^{n-1}p(X\\vert y_i)p(y_i).\n", @@ -3784,14 +4339,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "094f6489", + "metadata": { + "editable": true + }, "source": [ "The conditional probability, if $p(Y) > 0$, is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "40b87dab", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)}=\\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}.\n", @@ -3800,14 +4361,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "02ee6009", + "metadata": { + "editable": true + }, "source": [ "If we combine the conditional probability with the marginal probability and the standard product rule, we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c9b83f7e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{p(Y)},\n", @@ -3816,14 +4383,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "28693db1", + "metadata": { + "editable": true + }, "source": [ "which we can rewrite as" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "cd0819c2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X\\vert Y)= \\frac{p(X,Y)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)}=\\frac{p(Y\\vert X)p(X)}{\\sum_{i=0}^{n-1}p(Y\\vert X=x_i)p(x_i)},\n", @@ -3832,11 +4405,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c73d36a3", + "metadata": { + "editable": true + }, "source": [ "which is Bayes' theorem. It allows us to evaluate the uncertainty in in $X$ after we have observed $Y$. We can easily interchange $X$ with $Y$. \n", "\n", - "\n", "The quantity $p(Y\\vert X)$ on the right-hand side of the theorem is\n", "evaluated for the observed data $Y$ and can be viewed as a function of\n", "the parameter space represented by $X$. This function is not\n", @@ -3849,7 +4424,6 @@ "\n", "Let us try to illustrate Bayes' theorem through an example.\n", "\n", - "\n", "Let us suppose that you are undergoing a series of mammography scans\n", "in order to rule out possible breast cancer cases. We define the\n", "sensitivity for a positive event by the variable $X$. It takes binary\n", @@ -3867,7 +4441,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "779d9389", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=1) =0.8.\n", @@ -3876,7 +4453,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "63db00a0", + "metadata": { + "editable": true + }, "source": [ "This obviously sounds scary since many would conclude that if the test\n", "is positive, there is a likelihood of $80\\%$ for having cancer. It is\n", @@ -3886,7 +4466,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ab01099c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1\\vert X=1),\n", @@ -3895,12 +4478,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ec0ebb28", + "metadata": { + "editable": true + }, "source": [ "instead of $p(X=1\\vert Y=1)$.\n", "\n", - "\n", - "\n", "If we look at various national surveys on breast cancer, the general\n", "likelihood of developing breast cancer is a very small number. Let us\n", "assume that the prior probability in the population as a whole is" @@ -3908,7 +4492,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "4c432161", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(Y=1) =0.004.\n", @@ -3917,7 +4504,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "03d0cdb8", + "metadata": { + "editable": true + }, "source": [ "We need also to account for the fact that the test may produce a false\n", "positive result (false alarm). Let us here assume that we have" @@ -3925,7 +4515,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d7a0ad2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(X=1\\vert Y=0) =0.1.\n", @@ -3934,7 +4527,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "fcdc27a1", + "metadata": { + "editable": true + }, "source": [ "Using Bayes' theorem we can then find the posterior probability that\n", "the person has breast cancer in case of a positive test, that is we\n", @@ -3943,7 +4539,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e773eb9e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3958,7 +4557,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "3892720e", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3973,12 +4575,21 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c68513be", + "metadata": { + "editable": true + }, + "source": [ + "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!" + ] + }, + { + "cell_type": "markdown", + "id": "db1bcf38", + "metadata": { + "editable": true + }, "source": [ - "That is, in case of a positive test, there is only a $3\\%$ chance of having breast cancer!\n", - "\n", - "\n", - "\n", "## Bayes' Theorem and Ridge and Lasso Regression\n", "\n", "Hitherto we have discussed Ridge and Lasso regression in terms of a\n", @@ -3988,7 +4599,6 @@ "\n", "Before we proceed let us perform a Ridge, Lasso and OLS analysis of a polynomial fit. \n", "\n", - "\n", "We will play around with a study of the values for the optimal\n", "parameters $\\boldsymbol{\\beta}$ using OLS, Ridge and Lasso regression. For\n", "OLS, you will notice as function of the noise and polynomial degree,\n", @@ -4003,7 +4613,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, + "id": "aa27ede9", "metadata": { "collapsed": false, "editable": true @@ -4077,7 +4688,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "66975598", + "metadata": { + "editable": true + }, "source": [ "How can we understand this?\n", "\n", @@ -4103,7 +4717,8 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, + "id": "f90a238f", "metadata": { "collapsed": false, "editable": true @@ -4152,7 +4767,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d32f4700", + "metadata": { + "editable": true + }, "source": [ "As an exercise, repeat these calculations with ordinary least squares\n", "only with and without noise. Calculate thereafter the variance of the\n", @@ -4160,11 +4778,16 @@ "noise. Here we recommend to use $\\sigma^2=1$ as variance for the\n", "added noise (which follows a normal distribution with mean value zero).\n", "Comment your results. If you have a large noise term, do the parameters $\\beta_j$ vary more as function\n", - "model complexity? And what about their variance? \n", - "\n", - "\n", - "\n", - "\n", + "model complexity? And what about their variance?" + ] + }, + { + "cell_type": "markdown", + "id": "5292b482", + "metadata": { + "editable": true + }, + "source": [ "## Linking Bayes' Theorem with Ridge and Lasso Regression\n", "\n", "We have seen that Ridge regression suppresses those features which\n", @@ -4178,7 +4801,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b827637", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{D}=[(x_0,y_0), (x_1,y_1),\\dots, (x_{n-1},y_{n-1})],\n", @@ -4187,14 +4813,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6e73b7d4", + "metadata": { + "editable": true + }, "source": [ "is given by" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "ead2878e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}.\n", @@ -4203,14 +4835,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1302f31e", + "metadata": { + "editable": true + }, "source": [ "In Bayes' theorem this function plays the role of the so-called likelihood. We could now ask the question what is the posterior probability of a parameter set $\\boldsymbol{\\beta}$ given a domain of events $\\boldsymbol{D}$? That is, how can we define the posterior probability" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "dd411d77", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D}).\n", @@ -4219,14 +4857,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "01dcd800", + "metadata": { + "editable": true + }, "source": [ "Bayes' theorem comes to our rescue here since (omitting the normalization constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "0a3fa1e5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})\\propto p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})p(\\boldsymbol{\\beta}).\n", @@ -4235,25 +4879,28 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "e5ce5ac4", + "metadata": { + "editable": true + }, "source": [ "We have a model for $p(\\boldsymbol{D}\\vert\\boldsymbol{\\beta})$ but need one for the **prior** $p(\\boldsymbol{\\beta}$! \n", "\n", - "\n", - "\n", "With the posterior probability defined by a likelihood which we have\n", "already modeled and an unknown prior, we are now ready to make\n", "additional models for the prior.\n", "\n", "We can, based on our discussions of the variance of $\\boldsymbol{\\beta}$ and\n", "the mean value, assume that the prior for the values $\\boldsymbol{\\beta}$ is\n", - "given by a Gaussian with mean value zero and variance $\\tau^2$, that\n", - "is" + "given by a Gaussian with mean value zero and variance $\\tau^2$, that" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "9221bb65", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4262,14 +4909,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0e7f22c4", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "3565934d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta\\vert\\boldsymbol{D})}=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\beta_j^2}{2\\tau^2}\\right)}.\n", @@ -4278,7 +4931,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5c4b9c3a", + "metadata": { + "editable": true + }, "source": [ "We can now optimize this quantity with respect to $\\boldsymbol{\\beta}$. As we\n", "did for OLS, this is most conveniently done by taking the negative\n", @@ -4288,7 +4944,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f91f265b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{2\\tau^2}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4297,14 +4956,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a0427716", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/2\\tau^2$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "117eb03b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta})=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_2^2,\n", @@ -4313,17 +4978,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "9015a44a", + "metadata": { + "editable": true + }, "source": [ "which is our Ridge cost function! Nice, isn't it?\n", "\n", - "\n", "To derive the Lasso cost function, we simply replace the Gaussian prior with an exponential distribution ([Laplace in this case](https://en.wikipedia.org/wiki/Laplace_distribution)) with zero mean value, that is" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "a184ac5a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta})=\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4332,14 +5002,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ae799fbe", + "metadata": { + "editable": true + }, "source": [ "Our posterior probability becomes then (omitting the normalization factor which is just a constant)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "055d1b54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "p(\\boldsymbol{\\beta}\\vert\\boldsymbol{D})=\\prod_{i=0}^{n-1}\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp{\\left[-\\frac{(y_i-\\boldsymbol{X}_{i,*}\\boldsymbol{\\beta})^2}{2\\sigma^2}\\right]}\\prod_{j=0}^{p-1}\\exp{\\left(-\\frac{\\vert\\beta_j\\vert}{\\tau}\\right)}.\n", @@ -4348,7 +5024,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "104615f6", + "metadata": { + "editable": true + }, "source": [ "Taking the negative\n", "logarithm of the posterior probability and leaving out the\n", @@ -4357,7 +5036,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8d868c3b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\frac{1}{\\tau}\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4366,14 +5048,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "c88440ff", + "metadata": { + "editable": true + }, "source": [ "and replacing $1/\\tau$ with $\\lambda$ we have" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "07c1232a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\beta}=\\frac{\\vert\\vert (\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\beta})\\vert\\vert_2^2}{2\\sigma^2}+\\lambda\\vert\\vert\\boldsymbol{\\beta}\\vert\\vert_1,\n", @@ -4382,11 +5070,13 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "8416dffb", + "metadata": { + "editable": true + }, "source": [ "which is our Lasso cost function! \n", "\n", - "\n", "Plotting these prior functions shows us that we can use the parameter\n", "$\\lambda$ to shrink or increase the role of a given parameter\n", "$\\beta_j$. The variance for the Laplace distribution is\n", @@ -4399,5 +5089,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 4 + "nbformat_minor": 5 }