From a55882e5a4e4b9b536fd2274109d7e11e06dc8a4 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 27 Sep 2018 04:47:50 +0200 Subject: [PATCH] more on steepest descent --- doc/pub/Splines/html/._Splines-bs000.html | 109 ++- doc/pub/Splines/html/._Splines-bs001.html | 109 ++- doc/pub/Splines/html/._Splines-bs002.html | 109 ++- doc/pub/Splines/html/._Splines-bs003.html | 109 ++- doc/pub/Splines/html/._Splines-bs004.html | 109 ++- doc/pub/Splines/html/._Splines-bs005.html | 109 ++- doc/pub/Splines/html/._Splines-bs006.html | 109 ++- doc/pub/Splines/html/._Splines-bs007.html | 109 ++- doc/pub/Splines/html/._Splines-bs008.html | 109 ++- doc/pub/Splines/html/._Splines-bs009.html | 109 ++- doc/pub/Splines/html/._Splines-bs010.html | 109 ++- doc/pub/Splines/html/._Splines-bs011.html | 109 ++- doc/pub/Splines/html/._Splines-bs012.html | 109 ++- doc/pub/Splines/html/._Splines-bs013.html | 109 ++- doc/pub/Splines/html/._Splines-bs014.html | 109 ++- doc/pub/Splines/html/._Splines-bs015.html | 109 ++- doc/pub/Splines/html/._Splines-bs016.html | 109 ++- doc/pub/Splines/html/._Splines-bs017.html | 109 ++- doc/pub/Splines/html/._Splines-bs018.html | 109 ++- doc/pub/Splines/html/._Splines-bs019.html | 114 ++-- doc/pub/Splines/html/._Splines-bs020.html | 163 ++--- doc/pub/Splines/html/._Splines-bs021.html | 153 ++--- doc/pub/Splines/html/._Splines-bs022.html | 151 ++--- doc/pub/Splines/html/._Splines-bs023.html | 155 +++-- doc/pub/Splines/html/._Splines-bs024.html | 121 ++-- doc/pub/Splines/html/._Splines-bs025.html | 154 +++-- doc/pub/Splines/html/._Splines-bs026.html | 175 +++-- doc/pub/Splines/html/._Splines-bs027.html | 173 ++--- doc/pub/Splines/html/._Splines-bs028.html | 144 ++-- doc/pub/Splines/html/._Splines-bs029.html | 163 ++--- doc/pub/Splines/html/._Splines-bs030.html | 129 ++-- doc/pub/Splines/html/._Splines-bs031.html | 150 ++-- doc/pub/Splines/html/._Splines-bs032.html | 170 ++--- doc/pub/Splines/html/._Splines-bs033.html | 139 ++-- doc/pub/Splines/html/._Splines-bs034.html | 182 ++--- doc/pub/Splines/html/._Splines-bs035.html | 135 ++-- doc/pub/Splines/html/._Splines-bs036.html | 165 ++--- doc/pub/Splines/html/Splines-bs.html | 109 ++- doc/pub/Splines/html/Splines-reveal.html | 531 +++++---------- doc/pub/Splines/html/Splines-solarized.html | 534 +++++---------- doc/pub/Splines/html/Splines.html | 534 +++++---------- doc/pub/Splines/ipynb/Splines.ipynb | 638 +++++------------- .../Splines/ipynb/ipynb-Splines-src.tar.gz | Bin 208 -> 210 bytes doc/pub/Splines/pdf/Splines-minted.pdf | Bin 400749 -> 394146 bytes doc/src/Splines/Splines.do.txt | 354 +++------- 45 files changed, 2914 insertions(+), 4593 deletions(-) diff --git a/doc/pub/Splines/html/._Splines-bs000.html b/doc/pub/Splines/html/._Splines-bs000.html index f8494c29a..c216dd1d9 100644 --- a/doc/pub/Splines/html/._Splines-bs000.html +++ b/doc/pub/Splines/html/._Splines-bs000.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -249,7 +234,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs001.html b/doc/pub/Splines/html/._Splines-bs001.html index ebd5e0310..e621c87b3 100644 --- a/doc/pub/Splines/html/._Splines-bs001.html +++ b/doc/pub/Splines/html/._Splines-bs001.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -235,7 +220,7 @@ some approximative/numerical method to compute the minimum.
  • 10
  • 11
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs002.html b/doc/pub/Splines/html/._Splines-bs002.html index a47b11984..8c76c24e2 100644 --- a/doc/pub/Splines/html/._Splines-bs002.html +++ b/doc/pub/Splines/html/._Splines-bs002.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -243,7 +228,7 @@ where \( \hat{\beta} \) are the weights we wish to extract from data, in our cas
  • 11
  • 12
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs003.html b/doc/pub/Splines/html/._Splines-bs003.html index 2ac5adc95..c631ad132 100644 --- a/doc/pub/Splines/html/._Splines-bs003.html +++ b/doc/pub/Splines/html/._Splines-bs003.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -248,7 +233,7 @@ This defines what we call the Hessian.
  • 12
  • 13
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs004.html b/doc/pub/Splines/html/._Splines-bs004.html index 2401ae554..df245e3c2 100644 --- a/doc/pub/Splines/html/._Splines-bs004.html +++ b/doc/pub/Splines/html/._Splines-bs004.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -249,7 +234,7 @@ If we can compute these matrices, in particular the Hessian, the above is often
  • 13
  • 14
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs005.html b/doc/pub/Splines/html/._Splines-bs005.html index ad022b42b..2c2088fdc 100644 --- a/doc/pub/Splines/html/._Splines-bs005.html +++ b/doc/pub/Splines/html/._Splines-bs005.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -243,7 +228,7 @@ discourage the use of this method.
  • 14
  • 15
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs006.html b/doc/pub/Splines/html/._Splines-bs006.html index 6f55896c7..97c27747b 100644 --- a/doc/pub/Splines/html/._Splines-bs006.html +++ b/doc/pub/Splines/html/._Splines-bs006.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -261,7 +246,7 @@ $$
  • 15
  • 16
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs007.html b/doc/pub/Splines/html/._Splines-bs007.html index fb48f2408..93c540229 100644 --- a/doc/pub/Splines/html/._Splines-bs007.html +++ b/doc/pub/Splines/html/._Splines-bs007.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -244,7 +229,7 @@ vanishes, then Newton-Raphson may fail totally
  • 16
  • 17
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs008.html b/doc/pub/Splines/html/._Splines-bs008.html index c035217c7..3aab78db6 100644 --- a/doc/pub/Splines/html/._Splines-bs008.html +++ b/doc/pub/Splines/html/._Splines-bs008.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -282,7 +267,7 @@ more than two non-linear equations. In our case, the Jacobian matrix is given by
  • 17
  • 18
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs009.html b/doc/pub/Splines/html/._Splines-bs009.html index 264ce754a..d5cf8f1fe 100644 --- a/doc/pub/Splines/html/._Splines-bs009.html +++ b/doc/pub/Splines/html/._Splines-bs009.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -252,7 +237,7 @@ we are always moving towards smaller function values, i.e a minimum.
  • 18
  • 19
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs010.html b/doc/pub/Splines/html/._Splines-bs010.html index 18fbf8251..a8d1d1e3f 100644 --- a/doc/pub/Splines/html/._Splines-bs010.html +++ b/doc/pub/Splines/html/._Splines-bs010.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -248,7 +233,7 @@ the learning rate within the context of Machine Learning.
  • 19
  • 20
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs011.html b/doc/pub/Splines/html/._Splines-bs011.html index c96d82bbe..4fab036d3 100644 --- a/doc/pub/Splines/html/._Splines-bs011.html +++ b/doc/pub/Splines/html/._Splines-bs011.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -255,7 +240,7 @@ Note that the gradient is a function of \( \mathbf{x} =
  • 20
  • 21
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs012.html b/doc/pub/Splines/html/._Splines-bs012.html index 0b9edbd30..77ef7c405 100644 --- a/doc/pub/Splines/html/._Splines-bs012.html +++ b/doc/pub/Splines/html/._Splines-bs012.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -248,7 +233,7 @@ randomness. One such method is that of Stochastic Gradient Descent
  • 21
  • 22
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs013.html b/doc/pub/Splines/html/._Splines-bs013.html index b211a4e22..4396ca41d 100644 --- a/doc/pub/Splines/html/._Splines-bs013.html +++ b/doc/pub/Splines/html/._Splines-bs013.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -249,7 +234,7 @@ regular polygons (triangles, rectangles, pentagons, etc...).
  • 22
  • 23
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs014.html b/doc/pub/Splines/html/._Splines-bs014.html index bca2a9dfa..3bd25ac38 100644 --- a/doc/pub/Splines/html/._Splines-bs014.html +++ b/doc/pub/Splines/html/._Splines-bs014.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -237,7 +222,7 @@ MathJax.Hub.Config({
  • 23
  • 24
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs015.html b/doc/pub/Splines/html/._Splines-bs015.html index e7589548b..2d6c4040e 100644 --- a/doc/pub/Splines/html/._Splines-bs015.html +++ b/doc/pub/Splines/html/._Splines-bs015.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -273,7 +258,7 @@ This condition is particularly useful since it gives us an procedure for determi
  • 24
  • 25
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs016.html b/doc/pub/Splines/html/._Splines-bs016.html index f68c92deb..c5244bd66 100644 --- a/doc/pub/Splines/html/._Splines-bs016.html +++ b/doc/pub/Splines/html/._Splines-bs016.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -260,7 +245,7 @@ This result means that if we know that the cost/loss function is convex and we a
  • 25
  • 26
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs017.html b/doc/pub/Splines/html/._Splines-bs017.html index 0497c1c2e..12414cfc1 100644 --- a/doc/pub/Splines/html/._Splines-bs017.html +++ b/doc/pub/Splines/html/._Splines-bs017.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -256,7 +241,7 @@ Using the definition of convexity, try to show that a function satisfying the pr
  • 26
  • 27
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs018.html b/doc/pub/Splines/html/._Splines-bs018.html index cefc870b1..d9c239863 100644 --- a/doc/pub/Splines/html/._Splines-bs018.html +++ b/doc/pub/Splines/html/._Splines-bs018.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -263,7 +248,7 @@ When we have found the exact solution, \( \hat{r}=0 \).
  • 27
  • 28
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs019.html b/doc/pub/Splines/html/._Splines-bs019.html index 47978e50c..c55d6ae22 100644 --- a/doc/pub/Splines/html/._Splines-bs019.html +++ b/doc/pub/Splines/html/._Splines-bs019.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,7 +191,7 @@ MathJax.Hub.Config({ -

    Conjugate gradient method

    +

    Gradient method

    The residual is zero when we reach the minimum of the quadratic equation @@ -223,9 +208,6 @@ variance, then the matrix \( \hat{A} \), which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. -

    -More details will be added here soon. -

    @@ -252,7 +234,7 @@ More details will be added here soon.

  • 28
  • 29
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs020.html b/doc/pub/Splines/html/._Splines-bs020.html index 8226361b5..30fecb335 100644 --- a/doc/pub/Splines/html/._Splines-bs020.html +++ b/doc/pub/Splines/html/._Splines-bs020.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,47 +191,25 @@ MathJax.Hub.Config({ -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    -
    -
    -

    +

    Steepest descent method

    +

    +We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). +We can assume without loss of generality that +$$ +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +$$ - -

    #include <cmath>
    -#include <iostream>
    -#include <fstream>
    -#include <iomanip>
    -#include "vectormatrixclass.h"
    -using namespace  std;
    -//   Main function begins here
    -int main(int  argc, char * argv[]){
    -  int dim = 2;
    -  Vector x(dim),xsd(dim), b(dim),x0(dim);
    -  Matrix A(dim,dim);
    -
    -  // Set our initial guess
    -  x0(0) = x0(1) = 0;
    -  // Set the matrix
    -  A(0,0) =  3;    A(1,0) =  2;   A(0,1) =  2;   A(1,1) =  6;
    -  b(0) = 2; b(1) = -8;
    -  cout << "The Matrix A that we are using: " << endl;
    -  A.Print();
    -  cout << endl;
    -  x = ConjugateGradient(A,b,x0);
    -  xsd = SteepestDescent(A,b,x0);
    -  cout << "The approximate solution using Conjugate Gradient is: " << endl;
    -  x.Print();
    -  cout << endl;
    -  cout << "The approximate solution using Steepest Descent is: " << endl;
    -  xsd.Print();
    -  cout << endl;
    -}
    -
    -

    -

    -
    +or consider the system +$$ +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +$$ +instead.

    @@ -274,7 +237,7 @@ MathJax.Hub.Config({

  • 29
  • 30
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs021.html b/doc/pub/Splines/html/._Splines-bs021.html index 18036c43b..84576198a 100644 --- a/doc/pub/Splines/html/._Splines-bs021.html +++ b/doc/pub/Splines/html/._Splines-bs021.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,35 +191,29 @@ MathJax.Hub.Config({ -

    The routine for the steepest descent method

    +

    Steepest descent method

    -

    +One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form +$$ +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +$$ + +This suggests taking the first basis vector \( \hat{p}_1 \) +to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), +which equals +$$ +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +$$ + +and +\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). - -

    Vector SteepestDescent(Matrix A, Vector b, Vector x0){
    -  int IterMax, i;
    -  int dim = x0.Dimension();
    -  const double tolerance = 1.0e-14;
    -  Vector x(dim),f(dim),z(dim);
    -  double c,alpha,d;
    -  IterMax = 30;
    -  x = x0;
    -  f = A*x-b;
    -  i = 0;
    -  while (i <= IterMax){
    -    z = A*f;
    -    c = dot(f,f);
    -    alpha = c/dot(f,z);
    -    x = x - alpha*f;
    -    f =  A*x-b;
    -    if(sqrt(dot(f,f)) < tolerance) break;
    -    i++;
    -  }
    -  return x;
    -}
    -

    @@ -266,7 +245,7 @@ MathJax.Hub.Config({
  • 30
  • 31
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs022.html b/doc/pub/Splines/html/._Splines-bs022.html index 768900c4b..e79c9ffd1 100644 --- a/doc/pub/Splines/html/._Splines-bs022.html +++ b/doc/pub/Splines/html/._Splines-bs022.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,37 +189,31 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Revisiting our first homework

    - -

    -We will use linear regression as a case study for the gradient descent -methods. Linear regression is a great test case for the gradient -descent methods discussed in the lectures since it has several -desirable properties such as: - -

      -
    1. An analytical solution (recall homework set 1).
    2. -
    3. The gradient can be computed analytically.
    4. -
    5. The cost function is convex which guarantees that gradient descent converges for small enough learning rates
    6. -
    - -We revisit the example from homework set 1 where we had +

    Gradient descent method

    +
    +
    +

    +Let \( \hat{r}_k \) be the residual at the \( k \)-th step: $$ -y_i = 5x_i^2 + 0.1\xi_i, \ i=1,\cdots,100 +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} $$ -with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). -The linear regression model is given by +Note that \( \hat{r}_k \) is the negative gradient of \( f \) at +\( \hat{x}=\hat{x}_k \), +so the gradient descent method would be to move in the direction \( \hat{r}_k \). +This gives the following expression $$ -h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} $$ +

    +
    -such that -$$ -\hat{y}_i = \beta_0 + \beta_1 x_i. -$$

    @@ -262,7 +241,7 @@ $$

  • 31
  • 32
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs023.html b/doc/pub/Splines/html/._Splines-bs023.html index 05ed134f0..5fbfa7fb8 100644 --- a/doc/pub/Splines/html/._Splines-bs023.html +++ b/doc/pub/Splines/html/._Splines-bs023.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,29 +189,43 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Gradient descent example

    - -

    -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) - -

    -It is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +

    Final expressions

    +
    +
    +

    +We can also compute the residual iteratively as $$ -X \equiv \begin{bmatrix} -1 & x_1 \\ -\vdots & \vdots \\ -1 & x_{100} & \\ -\end{bmatrix}. +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} $$ -The loss function is given by +which equals $$ -C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} $$ -and we want to find \( \beta \) such that \( C(\beta) \) is minimized. +or +$$ +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +$$ + +which gives + +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +$$ +

    +
    +

    @@ -254,7 +253,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

  • 32
  • 33
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs024.html b/doc/pub/Splines/html/._Splines-bs024.html index f44e7b0cf..e68f417f4 100644 --- a/doc/pub/Splines/html/._Splines-bs024.html +++ b/doc/pub/Splines/html/._Splines-bs024.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,17 +191,7 @@ MathJax.Hub.Config({ -

    The derivative of the cost/loss function

    - -

    -Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as -$$ -\nabla_{\beta} C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), -$$ - -where \( X \) is the design matrix defined above. +

    The Steepest descent algorithm

    @@ -244,7 +219,7 @@ where \( X \) is the design matrix defined above.

  • 33
  • 34
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs025.html b/doc/pub/Splines/html/._Splines-bs025.html index 4ef788afe..e166ae0cf 100644 --- a/doc/pub/Splines/html/._Splines-bs025.html +++ b/doc/pub/Splines/html/._Splines-bs025.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,16 +191,43 @@ MathJax.Hub.Config({ -

    The Hessian matrix

    -The Hessian matrix of \( C(\beta) \) is given by -$$ -\hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ -\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ -\end{bmatrix} = 2X^T X. -$$ +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +
    +
    +

    +

    + + +

    #include <cmath>
    +#include <iostream>
    +#include <fstream>
    +#include <iomanip>
    +#include "vectormatrixclass.h"
    +using namespace  std;
    +//   Main function begins here
    +int main(int  argc, char * argv[]){
    +  int dim = 2;
    +  Vector x(dim),xsd(dim), b(dim),x0(dim);
    +  Matrix A(dim,dim);
    +
    +  // Set our initial guess
    +  x0(0) = x0(1) = 0;
    +  // Set the matrix
    +  A(0,0) =  3;    A(1,0) =  2;   A(0,1) =  2;   A(1,1) =  6;
    +  b(0) = 2; b(1) = -8;
    +  cout << "The Matrix A that we are using: " << endl;
    +  A.Print();
    +  cout << endl;
    +  xsd = SteepestDescent(A,b,x0);
    +  cout << "The approximate solution using Steepest Descent is: " << endl;
    +  xsd.Print();
    +  cout << endl;
    +}
    +
    +

    +

    +
    -This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite.

    @@ -243,7 +255,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(

  • 34
  • 35
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs026.html b/doc/pub/Splines/html/._Splines-bs026.html index cdd5ad290..b0bd26ee6 100644 --- a/doc/pub/Splines/html/._Splines-bs026.html +++ b/doc/pub/Splines/html/._Splines-bs026.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,44 +191,40 @@ MathJax.Hub.Config({ -

    Simple program

    - -

    -We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to -$$ -\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots -$$ - -

    -We can use the expression we computed for the gradient and let use a -\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\beta C(\beta_k) || \leq \epsilon = 10^{-8} \). - -

    -And finally we can compare our solution for \( \beta \) with the analytic result given by -\( \beta= (X^TX)^{-1} X^T \mathbf{y} \). +

    The routine for the steepest descent method

    +
    +
    +

    - -

    import numpy as np
    -
    -"""
    -The following setup is just a suggestion, feel free to write it the way you like.
    -"""
    -
    -#Setup problem described in the exercise
    -N  = 100 #Nr of datapoints
    -M  = 2 #Nr of features
    -x  = np.random.rand(N) #Uniformly generated x-values in [0,1]
    -y  = 5*x**2 + 0.1*np.random.randn(N)
    -X  = np.c_[np.ones(N),x] #Construct design matrix
    -
    -#Compute beta according to normal equations to compare with GD solution
    -Xt_X_inv = np.linalg.inv(np.dot(X.T,X))
    -Xt_y     = np.dot(X.transpose(),y)
    -beta_NE = np.dot(Xt_X_inv,Xt_y)
    -print(beta_NE)
    +
    +
    Vector SteepestDescent(Matrix A, Vector b, Vector x0){
    +  int IterMax, i;
    +  int dim = x0.Dimension();
    +  const double tolerance = 1.0e-14;
    +  Vector x(dim),f(dim),z(dim);
    +  double c,alpha,d;
    +  IterMax = 30;
    +  x = x0;
    +  f = A*x-b;
    +  i = 0;
    +  while (i <= IterMax){
    +    z = A*f;
    +    c = dot(f,f);
    +    alpha = c/dot(f,z);
    +    x = x - alpha*f;
    +    f =  A*x-b;
    +    if(sqrt(dot(f,f)) < tolerance) break;
    +    i++;
    +  }
    +  return x;
    +}
     
    +

    +

    +
    + +

    @@ -270,7 +251,7 @@ beta_NE = np.35

  • 36
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs027.html b/doc/pub/Splines/html/._Splines-bs027.html index aa168e923..ca1d578bc 100644 --- a/doc/pub/Splines/html/._Splines-bs027.html +++ b/doc/pub/Splines/html/._Splines-bs027.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,54 +189,38 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Gradient Descent Example

    +

    Revisiting our first homework

    -Another simple example is here -

    +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as: - -

    # Importing various packages
    -from random import random, seed
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from mpl_toolkits.mplot3d import Axes3D
    -from matplotlib import cm
    -from matplotlib.ticker import LinearLocator, FormatStrFormatter
    -import sys
    +
      +
    1. An analytical solution (recall homework set 1).
    2. +
    3. The gradient can be computed analytically.
    4. +
    5. The cost function is convex which guarantees that gradient descent converges for small enough learning rates
    6. +
    -x = 2*np.random.rand(100,1) -y = 4+3*x+np.random.randn(100,1) +We revisit the example from homework set 1 where we had +$$ +y_i = 5x_i^2 + 0.1\xi_i, \ i=1,\cdots,100 +$$ -xb = np.c_[np.ones((100,1)), x] -beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(beta_linreg) -beta = np.random.randn(2,1) +with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). +The linear regression model is given by +$$ +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, +$$ -eta = 0.1 -Niterations = 1000 -m = 100 +such that +$$ +\hat{y}_i = \beta_0 + \beta_1 x_i. +$$ -for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) - beta -= eta*gradients - -print(beta) -xnew = np.array([[0],[2]]) -xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(beta) -ypredict2 = xbnew.dot(beta_linreg) -plt.plot(xnew, ypredict, "r-") -plt.plot(xnew, ypredict2, "b-") -plt.plot(x, y ,'ro') -plt.axis([0,2.0,0, 15.0]) -plt.xlabel(r'$x$') -plt.ylabel(r'$y$') -plt.title(r'Gradient descent example') -plt.show() -

    @@ -278,7 +247,7 @@ plt.show()

  • 36
  • 37
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs028.html b/doc/pub/Splines/html/._Splines-bs028.html index 841560ab0..0221d826d 100644 --- a/doc/pub/Splines/html/._Splines-bs028.html +++ b/doc/pub/Splines/html/._Splines-bs028.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,29 +189,30 @@ MathJax.Hub.Config({

     

     

     

    - + -

    And a corresponding example using scikit-learn

    +

    Gradient descent example

    +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) - -

    # Importing various packages
    -from random import random, seed
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from sklearn.linear_model import SGDRegressor
    +

    +It is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +$$ +X \equiv \begin{bmatrix} +1 & x_1 \\ +\vdots & \vdots \\ +1 & x_{100} & \\ +\end{bmatrix}. +$$ -x = 2*np.random.rand(100,1) -y = 4+3*x+np.random.randn(100,1) +The loss function is given by +$$ +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 +$$ + +and we want to find \( \beta \) such that \( C(\beta) \) is minimized. -xb = np.c_[np.ones((100,1)), x] -beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(beta_linreg) -sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) -sgdreg.fit(x,y.ravel()) -print(sgdreg.intercept_, sgdreg.coef_) -

    @@ -253,7 +239,7 @@ sgdreg.fit(x,y.

  • 37
  • 38
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs029.html b/doc/pub/Splines/html/._Splines-bs029.html index b7c1a94cf..1f913575d 100644 --- a/doc/pub/Splines/html/._Splines-bs029.html +++ b/doc/pub/Splines/html/._Splines-bs029.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,62 +189,20 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Gradient descent and Ridge

    +

    The derivative of the cost/loss function

    -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as $$ -C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. -$$ - -

    -In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows -$$ -\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\nabla_{\beta} C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ \sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$ -

    -We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by -$$ -\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, -$$ +where \( X \) is the design matrix defined above. -for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \). - -

    - - -

    import numpy as np
    -
    -"""
    -The following setup is just a suggestion, feel free to write it the way you like.
    -"""
    -
    -#Setup problem described in the exercise
    -N  = 100 #Nr of datapoints
    -M  = 2   #Nr of features
    -x  = np.random.rand(N)
    -y  = 5*x**2 + 0.1*np.random.randn(N)
    -
    -
    -#Compute analytic beta for Ridge regression 
    -X    = np.c_[np.ones(N),x]
    -XT_X = np.dot(X.T,X)
    -
    -l  = 0.1 #Ridge parameter lambda
    -Id = np.eye(XT_X.shape[0])
    -
    -Z = np.linalg.inv(XT_X+l*Id)
    -beta_ridge = np.dot(Z,np.dot(X.T,y))
    -
    -print(beta_ridge)
    -print(np.linalg.norm(beta_ridge)) #||beta||
    -

    @@ -286,7 +229,7 @@ beta_ridge = np

  • 38
  • 39
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs030.html b/doc/pub/Splines/html/._Splines-bs030.html index 9273bfbd6..cd86c0601 100644 --- a/doc/pub/Splines/html/._Splines-bs030.html +++ b/doc/pub/Splines/html/._Splines-bs030.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,21 +191,17 @@ MathJax.Hub.Config({ -

    Stochastic Gradient Descent

    - -

    -Stochastic gradient descent (SGD) and variants thereof address some of -the shortcomings of the Gradient descent method discussed above. - -

    -The underlying idea of SGD comes from the observation that the cost -function, which we want to minimize, can almost always be written as a -sum over \( n \) data points \( \{\mathbf{x}_i\}_{i=1}^n \), +

    The Hessian matrix

    +The Hessian matrix of \( C(\beta) \) is given by $$ -C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\beta}). +\hat{H} \equiv \begin{bmatrix} +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ +\end{bmatrix} = 2X^T X. $$ +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +

    @@ -247,7 +228,7 @@ $$

  • 39
  • 40
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs031.html b/doc/pub/Splines/html/._Splines-bs031.html index 66828afea..ef3d3335f 100644 --- a/doc/pub/Splines/html/._Splines-bs031.html +++ b/doc/pub/Splines/html/._Splines-bs031.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,23 +191,44 @@ MathJax.Hub.Config({ -

    Computation of gradients

    +

    Simple program

    -This in turn means that the gradient can be -computed as a sum over \( i \)-gradients +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to $$ -\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}). +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots $$

    -Stochasticity/randomness is introduced by only taking the -gradient on a subset of the data called minibatches. If there are \( n \) -data points and the size of each minibatch is \( M \), there will be \( n/M \) -minibatches. We denote these minibatches by \( B_k \) where -\( k=1,\cdots,n/M \). +We can use the expression we computed for the gradient and let use a +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || \leq \epsilon = 10^{-8} \). +

    +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \). +

    + + +

    import numpy as np
    +
    +"""
    +The following setup is just a suggestion, feel free to write it the way you like.
    +"""
    +
    +#Setup problem described in the exercise
    +N  = 100 #Nr of datapoints
    +M  = 2 #Nr of features
    +x  = np.random.rand(N) #Uniformly generated x-values in [0,1]
    +y  = 5*x**2 + 0.1*np.random.randn(N)
    +X  = np.c_[np.ones(N),x] #Construct design matrix
    +
    +#Compute beta according to normal equations to compare with GD solution
    +Xt_X_inv = np.linalg.inv(np.dot(X.T,X))
    +Xt_y     = np.dot(X.transpose(),y)
    +beta_NE = np.dot(Xt_X_inv,Xt_y)
    +print(beta_NE)
    +

    @@ -249,7 +255,7 @@ minibatches. We denote these minibatches by \( B_k \) where

  • 40
  • 41
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs032.html b/doc/pub/Splines/html/._Splines-bs032.html index e93b4f710..42591f222 100644 --- a/doc/pub/Splines/html/._Splines-bs032.html +++ b/doc/pub/Splines/html/._Splines-bs032.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,27 +191,52 @@ MathJax.Hub.Config({ -

    SGD example

    -As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) -and we choose to have \( M=5 \) minibathces, -then each minibatch contains two data points. In particular we have -\( B_1 = (\mathbf{x}_1,\mathbf{x}_2), \cdots, B_5 = -(\mathbf{x}_9,\mathbf{x}_{10}) \). Note that if you choose \( M=1 \) you -have only a single batch with all data points and on the other extreme, -you may choose \( M=n \) resulting in a minibatch for each datapoint, i.e -\( B_k = \mathbf{x}_k \). +

    Gradient Descent Example

    -The idea is now to approximate the gradient by replacing the sum over -all data points with a sum over the data points in one the minibatches -picked at random in each gradient descent step -$$ -\nabla_{\beta} -C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta -c_i(\mathbf{x}_i, \mathbf{\beta}). -$$ +Another simple example is here +

    + +

    # Importing various packages
    +from random import random, seed
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from mpl_toolkits.mplot3d import Axes3D
    +from matplotlib import cm
    +from matplotlib.ticker import LinearLocator, FormatStrFormatter
    +import sys
    +
    +x = 2*np.random.rand(100,1)
    +y = 4+3*x+np.random.randn(100,1)
    +
    +xb = np.c_[np.ones((100,1)), x]
    +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)
    +print(beta_linreg)
    +beta = np.random.randn(2,1)
    +
    +eta = 0.1
    +Niterations = 1000
    +m = 100
    +
    +for iter in range(Niterations):
    +    gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y)
    +    beta -= eta*gradients
    +
    +print(beta)
    +xnew = np.array([[0],[2]])
    +xbnew = np.c_[np.ones((2,1)), xnew]
    +ypredict = xbnew.dot(beta)
    +ypredict2 = xbnew.dot(beta_linreg)
    +plt.plot(xnew, ypredict, "r-")
    +plt.plot(xnew, ypredict2, "b-")
    +plt.plot(x, y ,'ro')
    +plt.axis([0,2.0,0, 15.0])
    +plt.xlabel(r'$x$')
    +plt.ylabel(r'$y$')
    +plt.title(r'Gradient descent example')
    +plt.show()
    +

    @@ -252,8 +262,6 @@ $$

  • 40
  • 41
  • 42
  • -
  • ...
  • -
  • 48
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs033.html b/doc/pub/Splines/html/._Splines-bs033.html index 88c682dbd..21dff141e 100644 --- a/doc/pub/Splines/html/._Splines-bs033.html +++ b/doc/pub/Splines/html/._Splines-bs033.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,22 +191,27 @@ MathJax.Hub.Config({ -

    The gradient step

    +

    And a corresponding example using scikit-learn

    -Thus a gradient descent step now looks like -$$ -\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}) -$$ -

    -where \( k \) is picked at random with equal -probability from \( [1,n/M] \). An iteration over the number of -minibathces (n/M) is commonly referred to as an epoch. Thus it is -typical to choose a number of epochs and for each epoch iterate over -the number of minibatches, as exemplified in the code below. + +

    # Importing various packages
    +from random import random, seed
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.linear_model import SGDRegressor
     
    +x = 2*np.random.rand(100,1)
    +y = 4+3*x+np.random.randn(100,1)
    +
    +xb = np.c_[np.ones((100,1)), x]
    +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)
    +print(beta_linreg)
    +sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1)
    +sgdreg.fit(x,y.ravel())
    +print(sgdreg.intercept_, sgdreg.coef_)
    +

    @@ -246,9 +236,6 @@ the number of minibatches, as exemplified in the code below.

  • 40
  • 41
  • 42
  • -
  • 43
  • -
  • ...
  • -
  • 48
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs034.html b/doc/pub/Splines/html/._Splines-bs034.html index 9ea34b39c..28adb0597 100644 --- a/doc/pub/Splines/html/._Splines-bs034.html +++ b/doc/pub/Splines/html/._Splines-bs034.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -204,37 +189,62 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Simple example code

    +

    Gradient descent and Ridge

    + +

    +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), +$$ +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. +$$ + +

    +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows +$$ +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). +$$ + +

    +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by +$$ +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +$$ + +for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

    -

    import numpy as np 
    +
    import numpy as np
     
    -n = 100 #100 datapoints 
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -n_epochs = 10 #number of epochs
    +"""
    +The following setup is just a suggestion, feel free to write it the way you like.
    +"""
     
    -j = 0
    -for epoch in range(1,n_epochs+1):
    -    for i in range(m):
    -        k = np.random.randint(m) #Pick the k-th minibatch at random
    -        #Compute the gradient using the data in minibatch Bk
    -        #Compute new suggestion for 
    -        j += 1
    +#Setup problem described in the exercise
    +N  = 100 #Nr of datapoints
    +M  = 2   #Nr of features
    +x  = np.random.rand(N)
    +y  = 5*x**2 + 0.1*np.random.randn(N)
    +
    +
    +#Compute analytic beta for Ridge regression 
    +X    = np.c_[np.ones(N),x]
    +XT_X = np.dot(X.T,X)
    +
    +l  = 0.1 #Ridge parameter lambda
    +Id = np.eye(XT_X.shape[0])
    +
    +Z = np.linalg.inv(XT_X+l*Id)
    +beta_ridge = np.dot(Z,np.dot(X.T,y))
    +
    +print(beta_ridge)
    +print(np.linalg.norm(beta_ridge)) #||beta||
     
    -

    -Taking the gradient only on a subset of the data has two important -benefits. First, it introduces randomness which decreases the chance -that our opmization scheme gets stuck in a local minima. Second, if -the size of the minibatches are small relative to the number of -datapoints (\( M < n \)), the computation of the gradient is much -cheaper since we sum over the datapoints in the \( k-th \) minibatch and not -all \( n \) datapoints. -

    @@ -258,10 +268,6 @@ all \( n \) datapoints.

  • 40
  • 41
  • 42
  • -
  • 43
  • -
  • 44
  • -
  • ...
  • -
  • 48
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs035.html b/doc/pub/Splines/html/._Splines-bs035.html index 3728b6100..5ec6ed1ec 100644 --- a/doc/pub/Splines/html/._Splines-bs035.html +++ b/doc/pub/Splines/html/._Splines-bs035.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,19 +191,20 @@ MathJax.Hub.Config({ -

    When do we stop?

    +

    Stochastic Gradient Descent

    -A natural question is when do we stop the search for a new minimum? -One possibility is to compute the full gradient after a given number -of epochs and check if the norm of the gradient is smaller than some -threshold and stop if true. However, the condition that the gradient -is zero is valid also for local minima, so this would only tell us -that we are close to a local/global minimum. However, we could also -evaluate the cost function at this point, store the result and -continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \beta \) that -gave the lowest value. +Stochastic gradient descent (SGD) and variants thereof address some of +the shortcomings of the Gradient descent method discussed above. + +

    +The underlying idea of SGD comes from the observation that the cost +function, which we want to minimize, can almost always be written as a +sum over \( n \) data points \( \{\mathbf{x}_i\}_{i=1}^n \), +$$ +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). +$$

    @@ -242,11 +228,6 @@ gave the lowest value.

  • 40
  • 41
  • 42
  • -
  • 43
  • -
  • 44
  • -
  • 45
  • -
  • ...
  • -
  • 48
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs036.html b/doc/pub/Splines/html/._Splines-bs036.html index 1b3b69564..a04c611a6 100644 --- a/doc/pub/Splines/html/._Splines-bs036.html +++ b/doc/pub/Splines/html/._Splines-bs036.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -206,51 +191,23 @@ MathJax.Hub.Config({ -

    Slightly different approach

    +

    Computation of gradients

    -Another approach is to let the step length \( \gamma_j \) depend on the -number of epochs in such a way that it becomes very small after a -reasonable time such that we do not move at all. +This in turn means that the gradient can be +computed as a sum over \( i \)-gradients +$$ +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). +$$

    -As an example, let \( e = 0,1,2,3,\cdots \) denote the current epoch and let \( t_0, t_1 > 0 \) be two fixed numbers. Furthermore, let \( t = e \cdot m + i \) where \( m \) is the number of minibatches and \( i=0,\cdots,m-1 \). Then the function $$\gamma_j(t; t_0, t_1) = \frac{t_0}{t+t_1} $$ goes to zero as the number of epochs gets large. I.e. we start with a step length \( \gamma_j (0; t_0, t_1) = t_0/t_1 \) which decays in time \( t \). +Stochasticity/randomness is introduced by only taking the +gradient on a subset of the data called minibatches. If there are \( n \) +data points and the size of each minibatch is \( M \), there will be \( n/M \) +minibatches. We denote these minibatches by \( B_k \) where +\( k=1,\cdots,n/M \). -

    -In this way we can fix the number of epochs, compute \( \beta \) and -evaluate the cost function at the end. Repeating the computation will -give a different result since the scheme is random by design. Then we -pick the final \( \beta \) that gives the lowest value of the cost -function. - -

    - - -

    import numpy as np 
    -
    -def step_length(t,t0,t1):
    -    return t0/(t+t1)
    -
    -n = 100 #100 datapoints 
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -n_epochs = 500 #number of epochs
    -t0 = 1.0
    -t1 = 10
    -
    -gamma_j = t0/t1
    -j = 0
    -for epoch in range(1,n_epochs+1):
    -    for i in range(m):
    -        k = np.random.randint(m) #Pick the k-th minibatch at random
    -        #Compute the gradient using the data in minibatch Bk
    -        #Compute new suggestion for beta
    -        t = epoch*m+i
    -        gamma_j = step_length(t,t0,t1)
    -        j += 1
    -
    -print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))
    -

    @@ -272,12 +229,6 @@ j = 0

  • 40
  • 41
  • 42
  • -
  • 43
  • -
  • 44
  • -
  • 45
  • -
  • 46
  • -
  • ...
  • -
  • 48
  • »
  • diff --git a/doc/pub/Splines/html/Splines-bs.html b/doc/pub/Splines/html/Splines-bs.html index f8494c29a..c216dd1d9 100644 --- a/doc/pub/Splines/html/Splines-bs.html +++ b/doc/pub/Splines/html/Splines-bs.html @@ -65,48 +65,39 @@ Automatically generated HTML file from DocOnce source ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -162,35 +153,29 @@ MathJax.Hub.Config({
  • More on convex functions
  • Some simple problems
  • Standard steepest descent
  • -
  • Conjugate gradient method
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Conjugate gradient (CG) method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method, Newton's method first
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • -
  • Conjugate gradient method
  • +
  • Gradient method
  • +
  • Steepest descent method
  • +
  • Steepest descent method
  • +
  • Gradient descent method
  • +
  • Final expressions
  • +
  • The Steepest descent algorithm
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • @@ -249,7 +234,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 48
  • +
  • 42
  • »
  • diff --git a/doc/pub/Splines/html/Splines-reveal.html b/doc/pub/Splines/html/Splines-reveal.html index b63f29483..37fcca28c 100644 --- a/doc/pub/Splines/html/Splines-reveal.html +++ b/doc/pub/Splines/html/Splines-reveal.html @@ -662,7 +662,7 @@ When we have found the exact solution, \( \hat{r}=0 \).
    -

    Conjugate gradient method

    +

    Gradient method

    The residual is zero when we reach the minimum of the quadratic equation @@ -680,14 +680,150 @@ symmetric. If we search for a minimum of the quantum mechanical variance, then the matrix \( \hat{A} \), which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. - -

    -More details will be added here soon.

    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Steepest descent method

    + +

    +We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). +We can assume without loss of generality that +

     
    +$$ +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +$$ +

     
    + +or consider the system +

     
    +$$ +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +$$ +

     
    + +instead. +

    + + +
    +

    Steepest descent method

    +
    + +

    +One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form +

     
    +$$ +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +$$ +

     
    + +This suggests taking the first basis vector \( \hat{p}_1 \) +to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), +which equals +

     
    +$$ +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +$$ +

     
    + +and +\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). + + +

    +
    + + +
    +

    Gradient descent method

    +
    + +

    +Let \( \hat{r}_k \) be the residual at the \( k \)-th step: +

     
    +$$ +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} +$$ +

     
    + +Note that \( \hat{r}_k \) is the negative gradient of \( f \) at +\( \hat{x}=\hat{x}_k \), +so the gradient descent method would be to move in the direction \( \hat{r}_k \). +This gives the following expression +

     
    +$$ +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} +$$ +

     
    +

    +
    + + +
    +

    Final expressions

    +
    + +

    +We can also compute the residual iteratively as +

     
    +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} +$$ +

     
    + +which equals +

     
    +$$ +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} +$$ +

     
    + +or +

     
    +$$ +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +$$ +

     
    + +which gives + +

     
    +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +$$ +

     
    +

    +
    + + +
    +

    The Steepest descent algorithm

    +
    + + +
    +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -713,11 +849,7 @@ More details will be added here soon. cout << "The Matrix A that we are using: " << endl; A.Print(); cout << endl; - x = ConjugateGradient(A,b,x0); xsd = SteepestDescent(A,b,x0); - cout << "The approximate solution using Conjugate Gradient is: " << endl; - x.Print(); - cout << endl; cout << "The approximate solution using Steepest Descent is: " << endl; xsd.Print(); cout << endl; @@ -729,7 +861,7 @@ More details will be added here soon.

    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -763,7 +895,7 @@ More details will be added here soon.

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -803,7 +935,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -832,7 +964,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -849,7 +981,7 @@ where \( X \) is the design matrix defined above.

    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by

     
    $$ @@ -865,7 +997,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(

    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -909,7 +1041,7 @@ beta_NE = np.dot(Xt_X_inv,Xt_y)

    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -959,7 +1091,7 @@ plt.show()

    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -984,7 +1116,7 @@ sgdreg.fit(x,y.ravel())

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1048,7 +1180,7 @@ beta_ridge = np.dot(Z,np.dot(X.T,y))

    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1068,7 +1200,7 @@ $$

    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1090,7 +1222,7 @@ minibatches. We denote these minibatches by \( B_k \) where

    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1116,7 +1248,7 @@ $$
    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1137,7 +1269,7 @@ the number of minibatches, as exemplified in the code below.

    -

    Simple example code

    +

    Simple example code

    @@ -1169,7 +1301,7 @@ all \( n \) datapoints.

    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1186,7 +1318,7 @@ gave the lowest value.

    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1236,355 +1368,6 @@ j = 0

    -
    -

    Conjugate gradient (CG) method

    -
    - -

    -The success of the CG method for finding solutions of non-linear problems is based -on the theory of conjugate gradients for linear systems of equations. It belongs -to the class of iterative methods for solving problems from linear algebra of the type -

     
    -$$ -\begin{equation*} - \hat{A}\hat{x} = \hat{b}. -\end{equation*} -$$ -

     
    - -In the iterative process we end up with a problem like - -

     
    -$$ -\begin{equation*} - \hat{r}= \hat{b}-\hat{A}\hat{x}, -\end{equation*} -$$ -

     
    - -where \( \hat{r} \) is the so-called residual or error in the iterative process. - -

    -When we have found the exact solution, \( \hat{r}=0 \). -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -The residual is zero when we reach the minimum of the quadratic equation -

     
    -$$ -\begin{equation*} - P(\hat{x})=\frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T\hat{b}, -\end{equation*} -$$ -

     
    - -with the constraint that the matrix \( \hat{A} \) is positive definite and symmetric. -If we search for a minimum of the quantum mechanical variance, then the matrix -\( \hat{A} \), which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. In our case this corresponds normally to the second derivative of the energy. -

    -
    - - -
    -

    Conjugate gradient method, Newton's method first

    -
    - -

    -We seek the minimum of the energy or the variance as function of various variational parameters. -In our case we have thus a function \( f \) whose minimum we are seeking. -In Newton's method we set \( \nabla f = 0 \) and we can thus compute the next iteration point -

     
    -$$ -\begin{equation*} -\hat{x}-\hat{x}_i=\hat{A}^{-1}\nabla f(\hat{x}_i). -\end{equation*} -$$ -

     
    - -Subtracting this equation from that of \( \hat{x}_{i+1} \) we have -

     
    -$$ -\begin{equation*} -\hat{x}_{i+1}-\hat{x}_i=\hat{A}^{-1}(\nabla f(\hat{x}_{i+1})-\nabla f(\hat{x}_i)). -\end{equation*} -$$ -

     
    -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -In the CG method we define so-called conjugate directions and two vectors -\( \hat{s} \) and \( \hat{t} \) -are said to be -conjugate if -

     
    -$$ -\begin{equation*} -\hat{s}^T\hat{A}\hat{t}= 0. -\end{equation*} -$$ -

     
    - -The philosophy of the CG method is to perform searches in various conjugate directions -of our vectors \( \hat{x}_i \) obeying the above criterion, namely -

     
    -$$ -\begin{equation*} -\hat{x}_i^T\hat{A}\hat{x}_j= 0. -\end{equation*} -$$ -

     
    - -Two vectors are conjugate if they are orthogonal with respect to -this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is conjugate to \( \hat{t} \), then \( \hat{t} \) is conjugate to \( \hat{s} \). -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -An example is given by the eigenvectors of the matrix -

     
    -$$ -\begin{equation*} -\hat{v}_i^T\hat{A}\hat{v}_j= \lambda\hat{v}_i^T\hat{v}_j, -\end{equation*} -$$ -

     
    - -which is zero unless \( i=j \). -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -Assume now that we have a symmetric positive-definite matrix \( \hat{A} \) of size -\( n\times n \). At each iteration \( i+1 \) we obtain the conjugate direction of a vector -

     
    -$$ -\begin{equation*} -\hat{x}_{i+1}=\hat{x}_{i}+\alpha_i\hat{p}_{i}. -\end{equation*} -$$ -

     
    - -We assume that \( \hat{p}_{i} \) is a sequence of \( n \) mutually conjugate directions. -Then the \( \hat{p}_{i} \) form a basis of \( R^n \) and we can expand the solution -$ \hat{A}\hat{x} = \hat{b}$ in this basis, namely - -

     
    -$$ -\begin{equation*} - \hat{x} = \sum^{n}_{i=1} \alpha_i \hat{p}_i. -\end{equation*} -$$ -

     
    -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -The coefficients are given by -

     
    -$$ -\begin{equation*} - \mathbf{A}\mathbf{x} = \sum^{n}_{i=1} \alpha_i \mathbf{A} \mathbf{p}_i = \mathbf{b}. -\end{equation*} -$$ -

     
    - -Multiplying with \( \hat{p}_k^T \) from the left gives - -

     
    -$$ -\begin{equation*} - \hat{p}_k^T \hat{A}\hat{x} = \sum^{n}_{i=1} \alpha_i\hat{p}_k^T \hat{A}\hat{p}_i= \hat{p}_k^T \hat{b}, -\end{equation*} -$$ -

     
    - -and we can define the coefficients \( \alpha_k \) as - -

     
    -$$ -\begin{equation*} - \alpha_k = \frac{\hat{p}_k^T \hat{b}}{\hat{p}_k^T \hat{A} \hat{p}_k} -\end{equation*} -$$ -

     
    -

    -
    - - -
    -

    Conjugate gradient method and iterations

    -
    - -

    -If we choose the conjugate vectors \( \hat{p}_k \) carefully, -then we may not need all of them to obtain a good approximation to the solution -\( \hat{x} \). -We want to regard the conjugate gradient method as an iterative method. -This will us to solve systems where \( n \) is so large that the direct -method would take too much time. - -

    -We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). -We can assume without loss of generality that -

     
    -$$ -\begin{equation*} -\hat{x}_0=0, -\end{equation*} -$$ -

     
    - -or consider the system -

     
    -$$ -\begin{equation*} -\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, -\end{equation*} -$$ -

     
    - -instead. -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form -

     
    -$$ -\begin{equation*} - f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. -\end{equation*} -$$ -

     
    - -This suggests taking the first basis vector \( \hat{p}_1 \) -to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), -which equals -

     
    -$$ -\begin{equation*} -\hat{A}\hat{x}_0-\hat{b}, -\end{equation*} -$$ -

     
    - -and -\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). -The other vectors in the basis will be conjugate to the gradient, -hence the name conjugate gradient method. -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -Let \( \hat{r}_k \) be the residual at the \( k \)-th step: -

     
    -$$ -\begin{equation*} -\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. -\end{equation*} -$$ -

     
    - -Note that \( \hat{r}_k \) is the negative gradient of \( f \) at -\( \hat{x}=\hat{x}_k \), -so the gradient descent method would be to move in the direction \( \hat{r}_k \). -Here, we insist that the directions \( \hat{p}_k \) are conjugate to each other, -so we take the direction closest to the gradient \( \hat{r}_k \) -under the conjugacy constraint. -This gives the following expression -

     
    -$$ -\begin{equation*} -\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. -\end{equation*} -$$ -

     
    -

    -
    - - -
    -

    Conjugate gradient method

    -
    - -

    -We can also compute the residual iteratively as -

     
    -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, - \end{equation*} -$$ -

     
    - -which equals -

     
    -$$ -\begin{equation*} -\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), - \end{equation*} -$$ -

     
    - -or -

     
    -$$ -\begin{equation*} -(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, - \end{equation*} -$$ -

     
    - -which gives - -

     
    -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, - \end{equation*} -$$ -

     
    -

    -
    - -
    diff --git a/doc/pub/Splines/html/Splines-solarized.html b/doc/pub/Splines/html/Splines-solarized.html index b342a25ff..663120f72 100644 --- a/doc/pub/Splines/html/Splines-solarized.html +++ b/doc/pub/Splines/html/Splines-solarized.html @@ -85,48 +85,39 @@ div { text-align: justify; text-justify: inter-word; } ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -639,7 +630,7 @@ When we have found the exact solution, \( \hat{r}=0 \).











    -

    Conjugate gradient method

    +

    Gradient method

    The residual is zero when we reach the minimum of the quadratic equation @@ -657,12 +648,131 @@ given by the second-derivative of the function we want to minimize. This quantity is always positive definite.

    -More details will be added here soon. +









    + +

    Steepest descent method

    + +

    +We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). +We can assume without loss of generality that +$$ +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +$$ + +or consider the system +$$ +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +$$ + +instead.











    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Steepest descent method

    +
    + +

    +One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form +$$ +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +$$ + +This suggests taking the first basis vector \( \hat{p}_1 \) +to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), +which equals +$$ +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +$$ + +and +\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). + + +

    + + +

    +









    + +

    Gradient descent method

    +
    + +

    +Let \( \hat{r}_k \) be the residual at the \( k \)-th step: +$$ +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} +$$ + +Note that \( \hat{r}_k \) is the negative gradient of \( f \) at +\( \hat{x}=\hat{x}_k \), +so the gradient descent method would be to move in the direction \( \hat{r}_k \). +This gives the following expression +$$ +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} +$$ +

    + + +

    +









    + +

    Final expressions

    +
    + +

    +We can also compute the residual iteratively as +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} +$$ + +which equals +$$ +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} +$$ + +or +$$ +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +$$ + +which gives + +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +$$ +

    + + +

    +









    + +

    The Steepest descent algorithm

    + +

    +









    + +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -689,11 +799,7 @@ More details will be added here soon. cout << "The Matrix A that we are using: " << endl; A.Print(); cout << endl; - x = ConjugateGradient(A,b,x0); xsd = SteepestDescent(A,b,x0); - cout << "The approximate solution using Conjugate Gradient is: " << endl; - x.Print(); - cout << endl; cout << "The approximate solution using Steepest Descent is: " << endl; xsd.Print(); cout << endl; @@ -706,7 +812,7 @@ More details will be added here soon.











    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -742,7 +848,7 @@ More details will be added here soon.

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -775,7 +881,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -800,7 +906,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -815,7 +921,7 @@ where \( X \) is the design matrix defined above.











    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} @@ -829,7 +935,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(











    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -870,7 +976,7 @@ beta_NE = np.dot(Xt_X_inv,Xt_y)











    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -919,7 +1025,7 @@ plt.show()











    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -943,7 +1049,7 @@ sgdreg.fit(x,y.ravel())

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1000,7 +1106,7 @@ beta_ridge = np.dot(Z,np.dot(X.T,y))











    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1018,7 +1124,7 @@ $$











    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1038,7 +1144,7 @@ minibatches. We denote these minibatches by \( B_k \) where











    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1062,7 +1168,7 @@ $$











    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1081,7 +1187,7 @@ the number of minibatches, as exemplified in the code below.











    -

    Simple example code

    +

    Simple example code

    @@ -1113,7 +1219,7 @@ all \( n \) datapoints.











    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1130,7 +1236,7 @@ gave the lowest value.











    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1175,324 +1281,6 @@ j = 0 print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))

    -

    -









    - -

    Conjugate gradient (CG) method

    -
    - -

    -The success of the CG method for finding solutions of non-linear problems is based -on the theory of conjugate gradients for linear systems of equations. It belongs -to the class of iterative methods for solving problems from linear algebra of the type -$$ -\begin{equation*} - \hat{A}\hat{x} = \hat{b}. -\end{equation*} -$$ - -In the iterative process we end up with a problem like - -$$ -\begin{equation*} - \hat{r}= \hat{b}-\hat{A}\hat{x}, -\end{equation*} -$$ - -where \( \hat{r} \) is the so-called residual or error in the iterative process. - -

    -When we have found the exact solution, \( \hat{r}=0 \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    - -

    -The residual is zero when we reach the minimum of the quadratic equation -$$ -\begin{equation*} - P(\hat{x})=\frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T\hat{b}, -\end{equation*} -$$ - -with the constraint that the matrix \( \hat{A} \) is positive definite and symmetric. -If we search for a minimum of the quantum mechanical variance, then the matrix -\( \hat{A} \), which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. In our case this corresponds normally to the second derivative of the energy. -

    - - -

    -









    - -

    Conjugate gradient method, Newton's method first

    -
    - -

    -We seek the minimum of the energy or the variance as function of various variational parameters. -In our case we have thus a function \( f \) whose minimum we are seeking. -In Newton's method we set \( \nabla f = 0 \) and we can thus compute the next iteration point -$$ -\begin{equation*} -\hat{x}-\hat{x}_i=\hat{A}^{-1}\nabla f(\hat{x}_i). -\end{equation*} -$$ - -Subtracting this equation from that of \( \hat{x}_{i+1} \) we have -$$ -\begin{equation*} -\hat{x}_{i+1}-\hat{x}_i=\hat{A}^{-1}(\nabla f(\hat{x}_{i+1})-\nabla f(\hat{x}_i)). -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -In the CG method we define so-called conjugate directions and two vectors -\( \hat{s} \) and \( \hat{t} \) -are said to be -conjugate if -$$ -\begin{equation*} -\hat{s}^T\hat{A}\hat{t}= 0. -\end{equation*} -$$ - -The philosophy of the CG method is to perform searches in various conjugate directions -of our vectors \( \hat{x}_i \) obeying the above criterion, namely -$$ -\begin{equation*} -\hat{x}_i^T\hat{A}\hat{x}_j= 0. -\end{equation*} -$$ - -Two vectors are conjugate if they are orthogonal with respect to -this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is conjugate to \( \hat{t} \), then \( \hat{t} \) is conjugate to \( \hat{s} \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -An example is given by the eigenvectors of the matrix -$$ -\begin{equation*} -\hat{v}_i^T\hat{A}\hat{v}_j= \lambda\hat{v}_i^T\hat{v}_j, -\end{equation*} -$$ - -which is zero unless \( i=j \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -Assume now that we have a symmetric positive-definite matrix \( \hat{A} \) of size -\( n\times n \). At each iteration \( i+1 \) we obtain the conjugate direction of a vector -$$ -\begin{equation*} -\hat{x}_{i+1}=\hat{x}_{i}+\alpha_i\hat{p}_{i}. -\end{equation*} -$$ - -We assume that \( \hat{p}_{i} \) is a sequence of \( n \) mutually conjugate directions. -Then the \( \hat{p}_{i} \) form a basis of \( R^n \) and we can expand the solution -$ \hat{A}\hat{x} = \hat{b}$ in this basis, namely - -$$ -\begin{equation*} - \hat{x} = \sum^{n}_{i=1} \alpha_i \hat{p}_i. -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -The coefficients are given by -$$ -\begin{equation*} - \mathbf{A}\mathbf{x} = \sum^{n}_{i=1} \alpha_i \mathbf{A} \mathbf{p}_i = \mathbf{b}. -\end{equation*} -$$ - -Multiplying with \( \hat{p}_k^T \) from the left gives - -$$ -\begin{equation*} - \hat{p}_k^T \hat{A}\hat{x} = \sum^{n}_{i=1} \alpha_i\hat{p}_k^T \hat{A}\hat{p}_i= \hat{p}_k^T \hat{b}, -\end{equation*} -$$ - -and we can define the coefficients \( \alpha_k \) as - -$$ -\begin{equation*} - \alpha_k = \frac{\hat{p}_k^T \hat{b}}{\hat{p}_k^T \hat{A} \hat{p}_k} -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method and iterations

    -
    - -

    - -

    -If we choose the conjugate vectors \( \hat{p}_k \) carefully, -then we may not need all of them to obtain a good approximation to the solution -\( \hat{x} \). -We want to regard the conjugate gradient method as an iterative method. -This will us to solve systems where \( n \) is so large that the direct -method would take too much time. - -

    -We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). -We can assume without loss of generality that -$$ -\begin{equation*} -\hat{x}_0=0, -\end{equation*} -$$ - -or consider the system -$$ -\begin{equation*} -\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, -\end{equation*} -$$ - -instead. -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form -$$ -\begin{equation*} - f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. -\end{equation*} -$$ - -This suggests taking the first basis vector \( \hat{p}_1 \) -to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), -which equals -$$ -\begin{equation*} -\hat{A}\hat{x}_0-\hat{b}, -\end{equation*} -$$ - -and -\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). -The other vectors in the basis will be conjugate to the gradient, -hence the name conjugate gradient method. -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -Let \( \hat{r}_k \) be the residual at the \( k \)-th step: -$$ -\begin{equation*} -\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. -\end{equation*} -$$ - -Note that \( \hat{r}_k \) is the negative gradient of \( f \) at -\( \hat{x}=\hat{x}_k \), -so the gradient descent method would be to move in the direction \( \hat{r}_k \). -Here, we insist that the directions \( \hat{p}_k \) are conjugate to each other, -so we take the direction closest to the gradient \( \hat{r}_k \) -under the conjugacy constraint. -This gives the following expression -$$ -\begin{equation*} -\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -We can also compute the residual iteratively as -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, - \end{equation*} -$$ - -which equals -$$ -\begin{equation*} -\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), - \end{equation*} -$$ - -or -$$ -\begin{equation*} -(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, - \end{equation*} -$$ - -which gives - -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, - \end{equation*} -$$ -

    - -

    diff --git a/doc/pub/Splines/html/Splines.html b/doc/pub/Splines/html/Splines.html index 6feb11062..30682d1e4 100644 --- a/doc/pub/Splines/html/Splines.html +++ b/doc/pub/Splines/html/Splines.html @@ -90,48 +90,39 @@ div { text-align: justify; text-justify: inter-word; } ('More on convex functions', 2, None, '___sec15'), ('Some simple problems', 2, None, '___sec16'), ('Standard steepest descent', 2, None, '___sec17'), - ('Conjugate gradient method', 2, None, '___sec18'), + ('Gradient method', 2, None, '___sec18'), + ('Steepest descent method', 2, None, '___sec19'), + ('Steepest descent method', 2, None, '___sec20'), + ('Gradient descent method', 2, None, '___sec21'), + ('Final expressions', 2, None, '___sec22'), + ('The Steepest descent algorithm', 2, None, '___sec23'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec19'), + '___sec24'), ('The routine for the steepest descent method', 2, None, - '___sec20'), - ('Revisiting our first homework', 2, None, '___sec21'), - ('Gradient descent example', 2, None, '___sec22'), - ('The derivative of the cost/loss function', 2, None, '___sec23'), - ('The Hessian matrix', 2, None, '___sec24'), - ('Simple program', 2, None, '___sec25'), - ('Gradient Descent Example', 2, None, '___sec26'), + '___sec25'), + ('Revisiting our first homework', 2, None, '___sec26'), + ('Gradient descent example', 2, None, '___sec27'), + ('The derivative of the cost/loss function', 2, None, '___sec28'), + ('The Hessian matrix', 2, None, '___sec29'), + ('Simple program', 2, None, '___sec30'), + ('Gradient Descent Example', 2, None, '___sec31'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec27'), - ('Gradient descent and Ridge', 2, None, '___sec28'), - ('Stochastic Gradient Descent', 2, None, '___sec29'), - ('Computation of gradients', 2, None, '___sec30'), - ('SGD example', 2, None, '___sec31'), - ('The gradient step', 2, None, '___sec32'), - ('Simple example code', 2, None, '___sec33'), - ('When do we stop?', 2, None, '___sec34'), - ('Slightly different approach', 2, None, '___sec35'), - ('Conjugate gradient (CG) method', 2, None, '___sec36'), - ('Conjugate gradient method', 2, None, '___sec37'), - ("Conjugate gradient method, Newton's method first", - 2, - None, - '___sec38'), - ('Conjugate gradient method', 2, None, '___sec39'), - ('Conjugate gradient method', 2, None, '___sec40'), - ('Conjugate gradient method', 2, None, '___sec41'), - ('Conjugate gradient method', 2, None, '___sec42'), - ('Conjugate gradient method and iterations', 2, None, '___sec43'), - ('Conjugate gradient method', 2, None, '___sec44'), - ('Conjugate gradient method', 2, None, '___sec45'), - ('Conjugate gradient method', 2, None, '___sec46')]} + '___sec32'), + ('Gradient descent and Ridge', 2, None, '___sec33'), + ('Stochastic Gradient Descent', 2, None, '___sec34'), + ('Computation of gradients', 2, None, '___sec35'), + ('SGD example', 2, None, '___sec36'), + ('The gradient step', 2, None, '___sec37'), + ('Simple example code', 2, None, '___sec38'), + ('When do we stop?', 2, None, '___sec39'), + ('Slightly different approach', 2, None, '___sec40')]} end of tocinfo --> @@ -644,7 +635,7 @@ When we have found the exact solution, \( \hat{r}=0 \).











    -

    Conjugate gradient method

    +

    Gradient method

    The residual is zero when we reach the minimum of the quadratic equation @@ -662,12 +653,131 @@ given by the second-derivative of the function we want to minimize. This quantity is always positive definite.

    -More details will be added here soon. +









    + +

    Steepest descent method

    + +

    +We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). +We can assume without loss of generality that +$$ +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +$$ + +or consider the system +$$ +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +$$ + +instead.











    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Steepest descent method

    +
    + +

    +One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form +$$ +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +$$ + +This suggests taking the first basis vector \( \hat{p}_1 \) +to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), +which equals +$$ +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +$$ + +and +\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). + + +

    + + +

    +









    + +

    Gradient descent method

    +
    + +

    +Let \( \hat{r}_k \) be the residual at the \( k \)-th step: +$$ +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} +$$ + +Note that \( \hat{r}_k \) is the negative gradient of \( f \) at +\( \hat{x}=\hat{x}_k \), +so the gradient descent method would be to move in the direction \( \hat{r}_k \). +This gives the following expression +$$ +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} +$$ +

    + + +

    +









    + +

    Final expressions

    +
    + +

    +We can also compute the residual iteratively as +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} +$$ + +which equals +$$ +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} +$$ + +or +$$ +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +$$ + +which gives + +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +$$ +

    + + +

    +









    + +

    The Steepest descent algorithm

    + +

    +









    + +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -694,11 +804,7 @@ More details will be added here soon. cout << "The Matrix A that we are using: " << endl; A.Print(); cout << endl; - x = ConjugateGradient(A,b,x0); xsd = SteepestDescent(A,b,x0); - cout << "The approximate solution using Conjugate Gradient is: " << endl; - x.Print(); - cout << endl; cout << "The approximate solution using Steepest Descent is: " << endl; xsd.Print(); cout << endl; @@ -711,7 +817,7 @@ More details will be added here soon.











    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -747,7 +853,7 @@ More details will be added here soon.

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -780,7 +886,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -805,7 +911,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -820,7 +926,7 @@ where \( X \) is the design matrix defined above.











    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} @@ -834,7 +940,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(











    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -875,7 +981,7 @@ beta_NE = np.









    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -924,7 +1030,7 @@ plt.show()











    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -948,7 +1054,7 @@ sgdreg.fit(x,y.

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1005,7 +1111,7 @@ beta_ridge = np











    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1023,7 +1129,7 @@ $$











    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1043,7 +1149,7 @@ minibatches. We denote these minibatches by \( B_k \) where











    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1067,7 +1173,7 @@ $$











    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1086,7 +1192,7 @@ the number of minibatches, as exemplified in the code below.











    -

    Simple example code

    +

    Simple example code

    @@ -1118,7 +1224,7 @@ all \( n \) datapoints.











    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1135,7 +1241,7 @@ gave the lowest value.











    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1180,324 +1286,6 @@ j = 0 print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))

    -

    -









    - -

    Conjugate gradient (CG) method

    -
    - -

    -The success of the CG method for finding solutions of non-linear problems is based -on the theory of conjugate gradients for linear systems of equations. It belongs -to the class of iterative methods for solving problems from linear algebra of the type -$$ -\begin{equation*} - \hat{A}\hat{x} = \hat{b}. -\end{equation*} -$$ - -In the iterative process we end up with a problem like - -$$ -\begin{equation*} - \hat{r}= \hat{b}-\hat{A}\hat{x}, -\end{equation*} -$$ - -where \( \hat{r} \) is the so-called residual or error in the iterative process. - -

    -When we have found the exact solution, \( \hat{r}=0 \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    - -

    -The residual is zero when we reach the minimum of the quadratic equation -$$ -\begin{equation*} - P(\hat{x})=\frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T\hat{b}, -\end{equation*} -$$ - -with the constraint that the matrix \( \hat{A} \) is positive definite and symmetric. -If we search for a minimum of the quantum mechanical variance, then the matrix -\( \hat{A} \), which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. In our case this corresponds normally to the second derivative of the energy. -

    - - -

    -









    - -

    Conjugate gradient method, Newton's method first

    -
    - -

    -We seek the minimum of the energy or the variance as function of various variational parameters. -In our case we have thus a function \( f \) whose minimum we are seeking. -In Newton's method we set \( \nabla f = 0 \) and we can thus compute the next iteration point -$$ -\begin{equation*} -\hat{x}-\hat{x}_i=\hat{A}^{-1}\nabla f(\hat{x}_i). -\end{equation*} -$$ - -Subtracting this equation from that of \( \hat{x}_{i+1} \) we have -$$ -\begin{equation*} -\hat{x}_{i+1}-\hat{x}_i=\hat{A}^{-1}(\nabla f(\hat{x}_{i+1})-\nabla f(\hat{x}_i)). -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -In the CG method we define so-called conjugate directions and two vectors -\( \hat{s} \) and \( \hat{t} \) -are said to be -conjugate if -$$ -\begin{equation*} -\hat{s}^T\hat{A}\hat{t}= 0. -\end{equation*} -$$ - -The philosophy of the CG method is to perform searches in various conjugate directions -of our vectors \( \hat{x}_i \) obeying the above criterion, namely -$$ -\begin{equation*} -\hat{x}_i^T\hat{A}\hat{x}_j= 0. -\end{equation*} -$$ - -Two vectors are conjugate if they are orthogonal with respect to -this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is conjugate to \( \hat{t} \), then \( \hat{t} \) is conjugate to \( \hat{s} \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -An example is given by the eigenvectors of the matrix -$$ -\begin{equation*} -\hat{v}_i^T\hat{A}\hat{v}_j= \lambda\hat{v}_i^T\hat{v}_j, -\end{equation*} -$$ - -which is zero unless \( i=j \). -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -Assume now that we have a symmetric positive-definite matrix \( \hat{A} \) of size -\( n\times n \). At each iteration \( i+1 \) we obtain the conjugate direction of a vector -$$ -\begin{equation*} -\hat{x}_{i+1}=\hat{x}_{i}+\alpha_i\hat{p}_{i}. -\end{equation*} -$$ - -We assume that \( \hat{p}_{i} \) is a sequence of \( n \) mutually conjugate directions. -Then the \( \hat{p}_{i} \) form a basis of \( R^n \) and we can expand the solution -$ \hat{A}\hat{x} = \hat{b}$ in this basis, namely - -$$ -\begin{equation*} - \hat{x} = \sum^{n}_{i=1} \alpha_i \hat{p}_i. -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -The coefficients are given by -$$ -\begin{equation*} - \mathbf{A}\mathbf{x} = \sum^{n}_{i=1} \alpha_i \mathbf{A} \mathbf{p}_i = \mathbf{b}. -\end{equation*} -$$ - -Multiplying with \( \hat{p}_k^T \) from the left gives - -$$ -\begin{equation*} - \hat{p}_k^T \hat{A}\hat{x} = \sum^{n}_{i=1} \alpha_i\hat{p}_k^T \hat{A}\hat{p}_i= \hat{p}_k^T \hat{b}, -\end{equation*} -$$ - -and we can define the coefficients \( \alpha_k \) as - -$$ -\begin{equation*} - \alpha_k = \frac{\hat{p}_k^T \hat{b}}{\hat{p}_k^T \hat{A} \hat{p}_k} -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method and iterations

    -
    - -

    - -

    -If we choose the conjugate vectors \( \hat{p}_k \) carefully, -then we may not need all of them to obtain a good approximation to the solution -\( \hat{x} \). -We want to regard the conjugate gradient method as an iterative method. -This will us to solve systems where \( n \) is so large that the direct -method would take too much time. - -

    -We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). -We can assume without loss of generality that -$$ -\begin{equation*} -\hat{x}_0=0, -\end{equation*} -$$ - -or consider the system -$$ -\begin{equation*} -\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, -\end{equation*} -$$ - -instead. -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form -$$ -\begin{equation*} - f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. -\end{equation*} -$$ - -This suggests taking the first basis vector \( \hat{p}_1 \) -to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), -which equals -$$ -\begin{equation*} -\hat{A}\hat{x}_0-\hat{b}, -\end{equation*} -$$ - -and -\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). -The other vectors in the basis will be conjugate to the gradient, -hence the name conjugate gradient method. -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -Let \( \hat{r}_k \) be the residual at the \( k \)-th step: -$$ -\begin{equation*} -\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. -\end{equation*} -$$ - -Note that \( \hat{r}_k \) is the negative gradient of \( f \) at -\( \hat{x}=\hat{x}_k \), -so the gradient descent method would be to move in the direction \( \hat{r}_k \). -Here, we insist that the directions \( \hat{p}_k \) are conjugate to each other, -so we take the direction closest to the gradient \( \hat{r}_k \) -under the conjugacy constraint. -This gives the following expression -$$ -\begin{equation*} -\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. -\end{equation*} -$$ -

    - - -

    -









    - -

    Conjugate gradient method

    -
    - -

    -We can also compute the residual iteratively as -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, - \end{equation*} -$$ - -which equals -$$ -\begin{equation*} -\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), - \end{equation*} -$$ - -or -$$ -\begin{equation*} -(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, - \end{equation*} -$$ - -which gives - -$$ -\begin{equation*} -\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, - \end{equation*} -$$ -

    - -

    diff --git a/doc/pub/Splines/ipynb/Splines.ipynb b/doc/pub/Splines/ipynb/Splines.ipynb index a46ac7740..b6216c22c 100644 --- a/doc/pub/Splines/ipynb/Splines.ipynb +++ b/doc/pub/Splines/ipynb/Splines.ipynb @@ -585,7 +585,7 @@ "\n", "When we have found the exact solution, $\\hat{r}=0$.\n", "\n", - "## Conjugate gradient method\n", + "## Gradient method\n", "\n", "The residual is zero when we reach the minimum of the quadratic equation" ] @@ -609,7 +609,189 @@ "given by the second-derivative of the function we want to minimize.\n", "This quantity is always positive definite. \n", "\n", - "More details will be added here soon.\n", + "\n", + "## Steepest descent method\n", + "\n", + "We denote the initial guess for $\\hat{x}$ as $\\hat{x}_0$. \n", + "We can assume without loss of generality that" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{x}_0=0,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "or consider the system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{A}\\hat{z} = \\hat{b}-\\hat{A}\\hat{x}_0,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "instead.\n", + "\n", + "\n", + "## Steepest descent method\n", + "One can show that the solution $\\hat{x}$ is also the unique minimizer of the quadratic form" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "f(\\hat{x}) = \\frac{1}{2}\\hat{x}^T\\hat{A}\\hat{x} - \\hat{x}^T \\hat{x} , \\quad \\hat{x}\\in\\mathbf{R}^n.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This suggests taking the first basis vector $\\hat{p}_1$ \n", + "to be the gradient of $f$ at $\\hat{x}=\\hat{x}_0$, \n", + "which equals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{A}\\hat{x}_0-\\hat{b},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and \n", + "$\\hat{x}_0=0$ it is equal $-\\hat{b}$.\n", + "\n", + "\n", + "\n", + "\n", + "## Gradient descent method\n", + "Let $\\hat{r}_k$ be the residual at the $k$-th step:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{r}_k=\\hat{b}-\\hat{A}\\hat{x}_k.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that $\\hat{r}_k$ is the negative gradient of $f$ at \n", + "$\\hat{x}=\\hat{x}_k$, \n", + "so the gradient descent method would be to move in the direction $\\hat{r}_k$. \n", + "This gives the following expression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{p}_{k+1}=\\hat{r}_k-\\frac{\\hat{p}_k^T \\hat{A}\\hat{r}_k}{\\hat{p}_k^T\\hat{A}\\hat{p}_k} \\hat{p}_k.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Final expressions\n", + "We can also compute the residual iteratively as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{r}_{k+1}=\\hat{b}-\\hat{A}\\hat{x}_{k+1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "which equals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{b}-\\hat{A}(\\hat{x}_k+\\alpha_k\\hat{p}_k),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "or" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "(\\hat{b}-\\hat{A}\\hat{x}_k)-\\alpha_k\\hat{A}\\hat{p}_k,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "which gives" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{r}_{k+1}=\\hat{r}_k-\\hat{A}\\hat{p}_{k},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Steepest descent algorithm\n", + "\n", "\n", "## Simple codes for steepest descent and conjugate gradient using a $2\\times 2$ matrix, in c++, Python code to come" ] @@ -638,11 +820,7 @@ " cout << \"The Matrix A that we are using: \" << endl;\n", " A.Print();\n", " cout << endl;\n", - " x = ConjugateGradient(A,b,x0);\n", " xsd = SteepestDescent(A,b,x0);\n", - " cout << \"The approximate solution using Conjugate Gradient is: \" << endl;\n", - " x.Print();\n", - " cout << endl;\n", " cout << \"The approximate solution using Steepest Descent is: \" << endl;\n", " xsd.Print();\n", " cout << endl;\n", @@ -1289,454 +1467,6 @@ "\n", "print(\"gamma_j after %d epochs: %g\" % (n_epochs,gamma_j))" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conjugate gradient (CG) method\n", - "The success of the CG method for finding solutions of non-linear problems is based\n", - "on the theory of conjugate gradients for linear systems of equations. It belongs\n", - "to the class of iterative methods for solving problems from linear algebra of the type" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{A}\\hat{x} = \\hat{b}.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the iterative process we end up with a problem like" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{r}= \\hat{b}-\\hat{A}\\hat{x},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "where $\\hat{r}$ is the so-called residual or error in the iterative process.\n", - "\n", - "When we have found the exact solution, $\\hat{r}=0$.\n", - "\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method\n", - "\n", - "The residual is zero when we reach the minimum of the quadratic equation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "P(\\hat{x})=\\frac{1}{2}\\hat{x}^T\\hat{A}\\hat{x} - \\hat{x}^T\\hat{b},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "with the constraint that the matrix $\\hat{A}$ is positive definite and symmetric.\n", - "If we search for a minimum of the quantum mechanical variance, then the matrix \n", - "$\\hat{A}$, which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. In our case this corresponds normally to the second derivative of the energy.\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method, Newton's method first\n", - "We seek the minimum of the energy or the variance as function of various variational parameters. \n", - "In our case we have thus a function $f$ whose minimum we are seeking.\n", - "In Newton's method we set $\\nabla f = 0$ and we can thus compute the next iteration point" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x}-\\hat{x}_i=\\hat{A}^{-1}\\nabla f(\\hat{x}_i).\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Subtracting this equation from that of $\\hat{x}_{i+1}$ we have" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x}_{i+1}-\\hat{x}_i=\\hat{A}^{-1}(\\nabla f(\\hat{x}_{i+1})-\\nabla f(\\hat{x}_i)).\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conjugate gradient method\n", - "In the CG method we define so-called conjugate directions and two vectors \n", - "$\\hat{s}$ and $\\hat{t}$\n", - "are said to be\n", - "conjugate if" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{s}^T\\hat{A}\\hat{t}= 0.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The philosophy of the CG method is to perform searches in various conjugate directions\n", - "of our vectors $\\hat{x}_i$ obeying the above criterion, namely" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x}_i^T\\hat{A}\\hat{x}_j= 0.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Two vectors are conjugate if they are orthogonal with respect to \n", - "this inner product. Being conjugate is a symmetric relation: if $\\hat{s}$ is conjugate to $\\hat{t}$, then $\\hat{t}$ is conjugate to $\\hat{s}$.\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method\n", - "An example is given by the eigenvectors of the matrix" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{v}_i^T\\hat{A}\\hat{v}_j= \\lambda\\hat{v}_i^T\\hat{v}_j,\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which is zero unless $i=j$.\n", - "\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method\n", - "Assume now that we have a symmetric positive-definite matrix $\\hat{A}$ of size\n", - "$n\\times n$. At each iteration $i+1$ we obtain the conjugate direction of a vector" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x}_{i+1}=\\hat{x}_{i}+\\alpha_i\\hat{p}_{i}.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We assume that $\\hat{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n", - "Then the $\\hat{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n", - "$ \\hat{A}\\hat{x} = \\hat{b}$ in this basis, namely" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x} = \\sum^{n}_{i=1} \\alpha_i \\hat{p}_i.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conjugate gradient method\n", - "The coefficients are given by" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Multiplying with $\\hat{p}_k^T$ from the left gives" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{p}_k^T \\hat{A}\\hat{x} = \\sum^{n}_{i=1} \\alpha_i\\hat{p}_k^T \\hat{A}\\hat{p}_i= \\hat{p}_k^T \\hat{b},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and we can define the coefficients $\\alpha_k$ as" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\alpha_k = \\frac{\\hat{p}_k^T \\hat{b}}{\\hat{p}_k^T \\hat{A} \\hat{p}_k}\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conjugate gradient method and iterations\n", - "\n", - "If we choose the conjugate vectors $\\hat{p}_k$ carefully, \n", - "then we may not need all of them to obtain a good approximation to the solution \n", - "$\\hat{x}$. \n", - "We want to regard the conjugate gradient method as an iterative method. \n", - "This will us to solve systems where $n$ is so large that the direct \n", - "method would take too much time.\n", - "\n", - "We denote the initial guess for $\\hat{x}$ as $\\hat{x}_0$. \n", - "We can assume without loss of generality that" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{x}_0=0,\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "or consider the system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{A}\\hat{z} = \\hat{b}-\\hat{A}\\hat{x}_0,\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "instead.\n", - "\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method\n", - "One can show that the solution $\\hat{x}$ is also the unique minimizer of the quadratic form" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "f(\\hat{x}) = \\frac{1}{2}\\hat{x}^T\\hat{A}\\hat{x} - \\hat{x}^T \\hat{x} , \\quad \\hat{x}\\in\\mathbf{R}^n.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This suggests taking the first basis vector $\\hat{p}_1$ \n", - "to be the gradient of $f$ at $\\hat{x}=\\hat{x}_0$, \n", - "which equals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{A}\\hat{x}_0-\\hat{b},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and \n", - "$\\hat{x}_0=0$ it is equal $-\\hat{b}$.\n", - "The other vectors in the basis will be conjugate to the gradient, \n", - "hence the name conjugate gradient method.\n", - "\n", - "\n", - "\n", - "\n", - "## Conjugate gradient method\n", - "Let $\\hat{r}_k$ be the residual at the $k$-th step:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{r}_k=\\hat{b}-\\hat{A}\\hat{x}_k.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that $\\hat{r}_k$ is the negative gradient of $f$ at \n", - "$\\hat{x}=\\hat{x}_k$, \n", - "so the gradient descent method would be to move in the direction $\\hat{r}_k$. \n", - "Here, we insist that the directions $\\hat{p}_k$ are conjugate to each other, \n", - "so we take the direction closest to the gradient $\\hat{r}_k$ \n", - "under the conjugacy constraint. \n", - "This gives the following expression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{p}_{k+1}=\\hat{r}_k-\\frac{\\hat{p}_k^T \\hat{A}\\hat{r}_k}{\\hat{p}_k^T\\hat{A}\\hat{p}_k} \\hat{p}_k.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conjugate gradient method\n", - "We can also compute the residual iteratively as" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{r}_{k+1}=\\hat{b}-\\hat{A}\\hat{x}_{k+1},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which equals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{b}-\\hat{A}(\\hat{x}_k+\\alpha_k\\hat{p}_k),\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "or" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "(\\hat{b}-\\hat{A}\\hat{x}_k)-\\alpha_k\\hat{A}\\hat{p}_k,\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which gives" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$\n", - "\\hat{r}_{k+1}=\\hat{r}_k-\\hat{A}\\hat{p}_{k},\n", - "$$" - ] } ], "metadata": {}, diff --git a/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz b/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz index 9e4fe066b44b4b4a8c8fcd6074c4716096d78fc1..b478c41faf410fd05d8ffac11e53f4782ae3bb18 100644 GIT binary patch literal 210 zcmb2|=3rRnvL>2=`R)1hS%(}1ju)P{J8I*2SP!oVb;$A7n zN?Vp!O%D3?H>Qrqn8$ec)ytpLrY`L_sg_t85*uptY*U=i%C2bJlb@qLZHk$)N~>#? zn5o!LpDU03ewB54w!hZAJG=1W4*BQnlG_i@wcQ^6MEifo^mA^J`R!LK)z7J4uK2I_ z`(MV~&Y5r7uY0`qm8ljw^E0Vg@GaZL-0aC;{p6q5epv4~KgsO>+k6IO@ZkRsmdu{; JISd*M3;+*EW^@1m literal 208 zcmb2|=3tobxF(u``R)0GU55+=juoD_J8I+Txqa(AR@(}JX|eGNmogq_UGi1Bu{~US z$MUagO8@Go_b0X`KFcE@thxT@)?l9gW5R^7vzeR I7&I6d0Gv!{UjP6A diff --git a/doc/pub/Splines/pdf/Splines-minted.pdf b/doc/pub/Splines/pdf/Splines-minted.pdf index b40638855e29a3df4c8ff8333e877c67b3ecf900..c836051598822d8393f1dfecc064d04913122bef 100644 GIT binary patch delta 92939 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

    )1A|=Y2 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 delta 99275 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 z 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�y$}RF=8st{n#qM=~t7%vG?V=qJ#osNV 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 PrMaakm#V6(zZ(|-`I@gs diff --git a/doc/src/Splines/Splines.do.txt b/doc/src/Splines/Splines.do.txt index 51367b610..acf8e10b2 100644 --- a/doc/src/Splines/Splines.do.txt +++ b/doc/src/Splines/Splines.do.txt @@ -405,7 +405,7 @@ where $\hat{r}$ is the so-called residual or error in the iterative process. When we have found the exact solution, $\hat{r}=0$. !split -===== Conjugate gradient method ===== +===== Gradient method ===== The residual is zero when we reach the minimum of the quadratic equation !bt @@ -420,7 +420,104 @@ variance, then the matrix $\hat{A}$, which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. -More details will be added here soon. + +!split +===== Steepest descent method ===== + +We denote the initial guess for $\hat{x}$ as $\hat{x}_0$. +We can assume without loss of generality that +!bt +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +!et +or consider the system +!bt +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +!et +instead. + + +!split +===== Steepest descent method ===== +!bblock +One can show that the solution $\hat{x}$ is also the unique minimizer of the quadratic form +!bt +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +!et +This suggests taking the first basis vector $\hat{p}_1$ +to be the gradient of $f$ at $\hat{x}=\hat{x}_0$, +which equals +!bt +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +!et +and +$\hat{x}_0=0$ it is equal $-\hat{b}$. + +!eblock + + +!split +===== Gradient descent method ===== +!bblock +Let $\hat{r}_k$ be the residual at the $k$-th step: +!bt +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} +!et +Note that $\hat{r}_k$ is the negative gradient of $f$ at +$\hat{x}=\hat{x}_k$, +so the gradient descent method would be to move in the direction $\hat{r}_k$. +This gives the following expression +!bt +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} +!et +!eblock + +!split +===== Final expressions ===== +!bblock +We can also compute the residual iteratively as +!bt +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} +!et +which equals +!bt +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} +!et +or +!bt +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +!et +which gives + +!bt +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +!et +!eblock + + + +!split +===== The Steepest descent algorithm ===== + !split ===== Simple codes for steepest descent and conjugate gradient using a $2\times 2$ matrix, in c++, Python code to come ===== @@ -446,11 +543,7 @@ int main(int argc, char * argv[]){ cout << "The Matrix A that we are using: " << endl; A.Print(); cout << endl; - x = ConjugateGradient(A,b,x0); xsd = SteepestDescent(A,b,x0); - cout << "The approximate solution using Conjugate Gradient is: " << endl; - x.Print(); - cout << endl; cout << "The approximate solution using Steepest Descent is: " << endl; xsd.Print(); cout << endl; @@ -895,255 +988,6 @@ print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j)) -!split -===== Conjugate gradient (CG) method ===== -!bblock -The success of the CG method for finding solutions of non-linear problems is based -on the theory of conjugate gradients for linear systems of equations. It belongs -to the class of iterative methods for solving problems from linear algebra of the type -!bt -\begin{equation*} - \hat{A}\hat{x} = \hat{b}. -\end{equation*} -!et -In the iterative process we end up with a problem like - -!bt -\begin{equation*} - \hat{r}= \hat{b}-\hat{A}\hat{x}, -\end{equation*} -!et -where $\hat{r}$ is the so-called residual or error in the iterative process. - -When we have found the exact solution, $\hat{r}=0$. -!eblock - - -!split -===== Conjugate gradient method ===== -!bblock - -The residual is zero when we reach the minimum of the quadratic equation -!bt -\begin{equation*} - P(\hat{x})=\frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T\hat{b}, -\end{equation*} -!et -with the constraint that the matrix $\hat{A}$ is positive definite and symmetric. -If we search for a minimum of the quantum mechanical variance, then the matrix -$\hat{A}$, which is called the Hessian, is given by the second-derivative of the function we want to minimize. This quantity is always positive definite. In our case this corresponds normally to the second derivative of the energy. -!eblock - - - - - -!split -===== Conjugate gradient method, Newton's method first ===== -!bblock -We seek the minimum of the energy or the variance as function of various variational parameters. -In our case we have thus a function $f$ whose minimum we are seeking. -In Newton's method we set $\nabla f = 0$ and we can thus compute the next iteration point -!bt -\begin{equation*} -\hat{x}-\hat{x}_i=\hat{A}^{-1}\nabla f(\hat{x}_i). -\end{equation*} -!et -Subtracting this equation from that of $\hat{x}_{i+1}$ we have -!bt -\begin{equation*} -\hat{x}_{i+1}-\hat{x}_i=\hat{A}^{-1}(\nabla f(\hat{x}_{i+1})-\nabla f(\hat{x}_i)). -\end{equation*} -!et -!eblock - - -!split -===== Conjugate gradient method ===== -!bblock -In the CG method we define so-called conjugate directions and two vectors -$\hat{s}$ and $\hat{t}$ -are said to be -conjugate if -!bt -\begin{equation*} -\hat{s}^T\hat{A}\hat{t}= 0. -\end{equation*} -!et -The philosophy of the CG method is to perform searches in various conjugate directions -of our vectors $\hat{x}_i$ obeying the above criterion, namely -!bt -\begin{equation*} -\hat{x}_i^T\hat{A}\hat{x}_j= 0. -\end{equation*} -!et -Two vectors are conjugate if they are orthogonal with respect to -this inner product. Being conjugate is a symmetric relation: if $\hat{s}$ is conjugate to $\hat{t}$, then $\hat{t}$ is conjugate to $\hat{s}$. -!eblock - -!split -===== Conjugate gradient method ===== -!bblock -An example is given by the eigenvectors of the matrix -!bt -\begin{equation*} -\hat{v}_i^T\hat{A}\hat{v}_j= \lambda\hat{v}_i^T\hat{v}_j, -\end{equation*} -!et -which is zero unless $i=j$. -!eblock - - -!split -===== Conjugate gradient method ===== -!bblock -Assume now that we have a symmetric positive-definite matrix $\hat{A}$ of size -$n\times n$. At each iteration $i+1$ we obtain the conjugate direction of a vector -!bt -\begin{equation*} -\hat{x}_{i+1}=\hat{x}_{i}+\alpha_i\hat{p}_{i}. -\end{equation*} -!et -We assume that $\hat{p}_{i}$ is a sequence of $n$ mutually conjugate directions. -Then the $\hat{p}_{i}$ form a basis of $R^n$ and we can expand the solution -$ \hat{A}\hat{x} = \hat{b}$ in this basis, namely - -!bt -\begin{equation*} - \hat{x} = \sum^{n}_{i=1} \alpha_i \hat{p}_i. -\end{equation*} -!et -!eblock - -!split -===== Conjugate gradient method ===== -!bblock -The coefficients are given by -!bt -\begin{equation*} - \mathbf{A}\mathbf{x} = \sum^{n}_{i=1} \alpha_i \mathbf{A} \mathbf{p}_i = \mathbf{b}. -\end{equation*} -!et -Multiplying with $\hat{p}_k^T$ from the left gives - -!bt -\begin{equation*} - \hat{p}_k^T \hat{A}\hat{x} = \sum^{n}_{i=1} \alpha_i\hat{p}_k^T \hat{A}\hat{p}_i= \hat{p}_k^T \hat{b}, -\end{equation*} -!et -and we can define the coefficients $\alpha_k$ as - -!bt -\begin{equation*} - \alpha_k = \frac{\hat{p}_k^T \hat{b}}{\hat{p}_k^T \hat{A} \hat{p}_k} -\end{equation*} -!et -!eblock - -!split -===== Conjugate gradient method and iterations ===== -!bblock - -If we choose the conjugate vectors $\hat{p}_k$ carefully, -then we may not need all of them to obtain a good approximation to the solution -$\hat{x}$. -We want to regard the conjugate gradient method as an iterative method. -This will us to solve systems where $n$ is so large that the direct -method would take too much time. - -We denote the initial guess for $\hat{x}$ as $\hat{x}_0$. -We can assume without loss of generality that -!bt -\begin{equation*} -\hat{x}_0=0, -\end{equation*} -!et -or consider the system -!bt -\begin{equation*} -\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, -\end{equation*} -!et -instead. -!eblock - - -!split -===== Conjugate gradient method ===== -!bblock -One can show that the solution $\hat{x}$ is also the unique minimizer of the quadratic form -!bt -\begin{equation*} - f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. -\end{equation*} -!et -This suggests taking the first basis vector $\hat{p}_1$ -to be the gradient of $f$ at $\hat{x}=\hat{x}_0$, -which equals -!bt -\begin{equation*} -\hat{A}\hat{x}_0-\hat{b}, -\end{equation*} -!et -and -$\hat{x}_0=0$ it is equal $-\hat{b}$. -The other vectors in the basis will be conjugate to the gradient, -hence the name conjugate gradient method. -!eblock - - -!split -===== Conjugate gradient method ===== -!bblock -Let $\hat{r}_k$ be the residual at the $k$-th step: -!bt -\begin{equation*} -\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. -\end{equation*} -!et -Note that $\hat{r}_k$ is the negative gradient of $f$ at -$\hat{x}=\hat{x}_k$, -so the gradient descent method would be to move in the direction $\hat{r}_k$. -Here, we insist that the directions $\hat{p}_k$ are conjugate to each other, -so we take the direction closest to the gradient $\hat{r}_k$ -under the conjugacy constraint. -This gives the following expression -!bt -\begin{equation*} -\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. -\end{equation*} -!et -!eblock - -!split -===== Conjugate gradient method ===== -!bblock -We can also compute the residual iteratively as -!bt -\begin{equation*} -\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, - \end{equation*} -!et -which equals -!bt -\begin{equation*} -\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), - \end{equation*} -!et -or -!bt -\begin{equation*} -(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, - \end{equation*} -!et -which gives - -!bt -\begin{equation*} -\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, - \end{equation*} -!et -!eblock