From 9e63679895600788c0658a3705bc07673d8de3dd Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Mon, 2 Sep 2024 21:51:40 +0200 Subject: [PATCH] project 1 --- .../2024/Project1/html/._Project1-bs000.html | 763 +++++++++++++++ .../2024/Project1/html/Project1-bs.html | 763 +++++++++++++++ doc/Projects/2024/Project1/html/Project1.html | 784 +++++++++++++++ .../2024/Project1/ipynb/Project1.ipynb | 924 ++++++++++++++++++ .../Project1/ipynb/ipynb-Project1-src.tar.gz | Bin 0 -> 193 bytes doc/Projects/2024/Project1/pdf/Project1.p.tex | 703 +++++++++++++ doc/Projects/2024/Project1/pdf/Project1.pdf | Bin 0 -> 272873 bytes doc/Projects/2024/Project1/pdf/Project1.tex | 671 +++++++++++++ .../Projects/2024/Project1/Project1.do.txt | 35 +- 9 files changed, 4637 insertions(+), 6 deletions(-) create mode 100644 doc/Projects/2024/Project1/html/._Project1-bs000.html create mode 100644 doc/Projects/2024/Project1/html/Project1-bs.html create mode 100644 doc/Projects/2024/Project1/html/Project1.html create mode 100644 doc/Projects/2024/Project1/ipynb/Project1.ipynb create mode 100644 doc/Projects/2024/Project1/ipynb/ipynb-Project1-src.tar.gz create mode 100644 doc/Projects/2024/Project1/pdf/Project1.p.tex create mode 100644 doc/Projects/2024/Project1/pdf/Project1.pdf create mode 100644 doc/Projects/2024/Project1/pdf/Project1.tex diff --git a/doc/Projects/2024/Project1/html/._Project1-bs000.html b/doc/Projects/2024/Project1/html/._Project1-bs000.html new file mode 100644 index 000000000..fa17ccef5 --- /dev/null +++ b/doc/Projects/2024/Project1/html/._Project1-bs000.html @@ -0,0 +1,763 @@ + + + + + + + +Project 1 on Machine Learning, deadline October 7 (midnight), 2024 + + + + + + + + + + + + + + + + + + + + +
+

 

 

 

+ + +
+
+

Project 1 on Machine Learning, deadline October 7 (midnight), 2024

+
+ + +
+Data Analysis and Machine Learning FYS-STK3155/FYS4155 +
+ +
+University of Oslo, Norway +
+
+
+

September 2

+
+
+ + +
+

Preamble: Note on writing reports, using reference material, AI and other tools

+ +

We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb gives some guidance. See also the grading suggestion at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md. +

+ +

When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at https://scikit-learn.org/dev/about.html. +

+ +

We enocurage you to use tools like +ChatGPT in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. +

+ +

On scaling, we recommend reading the following section from the scikit-learn software description, see https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section

+

Regression analysis and resampling methods

+ +

The main aim of this project is to study in more detail various +regression methods, including the Ordinary Least Squares (OLS) method. +In addition to the scientific part, in this course we want also to +give you an experience in writing scientific reports. The format for +the delivery of your answers is namely that of a scientific report. At +for example +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md +we detail how to write a report. Furthermore, at +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/ +you can find examples of previous reports. How to write reports will +also be discussed during the various lab sessions. +

+ +

A small recommendation when developing the codes here. Instead of +jumping on to the two-dimensional function described below, we +recommend to do the code development and testing with a simpler +one-dimensional function, similar to those discussed in the exercises +of weeks 35 and 36. A simple test, as discussed during the lectures the first +three weeks is to set the design matrix equal to the identity +matrix. Then your model should give a mean square error which is exactly equal to zero. +When you are sure that your codes function well, you can then replace +the one-dimensional test function with the two-dimensional Franke function +discussed here. +

+ +

The Franke function serves as a stepping stone towards the analysis of +real topographic data. The latter is the last part of this project. +

+

Description of two-dimensional function

+ +

We will first study how to fit polynomials to a specific +two-dimensional function called Franke's +function. This +is a function which has been widely used when testing various +interpolation and fitting algorithms. Furthermore, after having +established the model and the method, we will employ resamling +techniques such as cross-validation and/or bootstrap in order to perform a +proper assessment of our models. We will also study in detail the +so-called Bias-Variance trade off. +

+ +

The Franke function, which is a weighted sum of four exponentials reads as follows

+$$ +\begin{align*} +f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)}+\frac{3}{4}\exp{\left(-\frac{(9x+1)^2}{49}- \frac{(9y+1)}{10}\right)} \\ +&+\frac{1}{2}\exp{\left(-\frac{(9x-7)^2}{4} - \frac{(9y-3)^2}{4}\right)} -\frac{1}{5}\exp{\left(-(9x-4)^2 - (9y-7)^2\right) }. +\end{align*} +$$ + +

The function will be defined for \( x,y\in [0,1] \). In a sense, our data are thus scaled to a particular domain for the input values.

+ +

Our first step will +be to perform an OLS regression analysis of this function, trying out +a polynomial fit with an \( x \) and a \( y \) dependence of the form \( [x, y, +x^2, y^2, xy, \dots] \). We will also include bootstrap first as a +resampling technique. After that we will include the cross-validation +technique. +

+ +

We can +use a uniform distribution to set up the arrays of values for \( x \) and +\( y \), or as in the example below just a set of fixed values for \( x \) and +\( y \) with a given step size. We will fit a function (for example a +polynomial) of \( x \) and \( y \). Thereafter we will repeat much of the +same procedure using the Ridge and Lasso regression methods, +introducing thus a dependence on the bias (penalty) \( \lambda \). +

+ +

Finally we are going to use (real) digital terrain data and try to +reproduce these data using the same methods. We will also try to go +beyond the second-order polynomials metioned above and explore +which polynomial fits the data best. +

+ +

The Python code for the Franke function is included here (it performs also a three-dimensional plot of it)

+ + +
+
+
+
+
+
from mpl_toolkits.mplot3d import Axes3D
+import matplotlib.pyplot as plt
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import numpy as np
+from random import random, seed
+
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+
+# Make data.
+x = np.arange(0, 1, 0.05)
+y = np.arange(0, 1, 0.05)
+x, y = np.meshgrid(x,y)
+
+
+def FrankeFunction(x,y):
+    term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
+    term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
+    term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
+    term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
+    return term1 + term2 + term3 + term4
+
+
+z = FrankeFunction(x, y)
+
+# Plot the surface.
+surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,
+                       linewidth=0, antialiased=False)
+
+# Customize the z axis.
+ax.set_zlim(-0.10, 1.40)
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Part a) : Ordinary Least Square (OLS) on the Franke function

+ +

We will generate our own dataset for a function +\( \mathrm{FrankeFunction}(x,y) \) with \( x,y \in [0,1] \). The function +\( f(x,y) \) is the Franke function. You should explore also the addition +of an added stochastic noise to this function using the normal +distribution \( N(0,1) \). +

+ +

Write your own code (using either a matrix inversion or a singular +value decomposition from e.g., numpy ) and perform a standard ordinary least square regression +analysis using polynomials in \( x \) and \( y \) up to fifth order. +

+ +

Evaluate the mean Squared error (MSE)

+ +$$ MSE(\boldsymbol{y},\tilde{\boldsymbol{y}}) = \frac{1}{n} +\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2, +$$ + +

and the \( R^2 \) score function. If \( \tilde{\boldsymbol{y}}_i \) is the predicted +value of the \( i-th \) sample and \( y_i \) is the corresponding true value, +then the score \( R^2 \) is defined as +

+ +$$ +R^2(\boldsymbol{y}, \tilde{\boldsymbol{y}}) = 1 - \frac{\sum_{i=0}^{n - 1} (y_i - \tilde{y}_i)^2}{\sum_{i=0}^{n - 1} (y_i - \bar{y})^2}, +$$ + +

where we have defined the mean value of \( \boldsymbol{y} \) as

+ +$$ +\bar{y} = \frac{1}{n} \sum_{i=0}^{n - 1} y_i. +$$ + +

Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five). +Plot also the parameters \( \beta \) as you increase the order of the polynomial. Comment your results. +

+ +

Your code has to include a scaling/centering of the data (for example by +subtracting the mean value), and +a split of the data in training and test data. For this exercise you can +either write your own code or use for example the function for +splitting training data provided by the library Scikit-Learn (make +sure you have installed it). This function is called +\( train\_test\_split \). You should present a critical discussion of why and how you have scaled or not scaled the data. +

+ +

It is normal in essentially all Machine Learning studies to split the +data in a training set and a test set (eventually also an additional +validation set). There +is no explicit recipe for how much data should be included as training +data and say test data. An accepted rule of thumb is to use +approximately \( 2/3 \) to \( 4/5 \) of the data as training data. +

+ +

You can easily reuse the solutions to your exercises from week 35 and week 36. +See also the lecture slides from week 35 and week 36. +

+

Part b): Adding Ridge regression for the Franke function

+ +

Write your own code for the Ridge method, either using matrix +inversion or the singular value decomposition as done in the previous +exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here. +

+ +

Perform the same analysis as you did in the previous exercise but now for different values of \( \lambda \). Compare and +analyze your results with those obtained in part a) with the ordinary least squares method. Study the +dependence on \( \lambda \). +

+

Part c): Adding Lasso for the Franke function

+ +

This exercise is essentially a repeat of the previous two ones, but now +with Lasso regression. Write either your own code (difficult and optional) or, in this case, +you can also use the functionalities of Scikit-Learn (recommended). Keep in mind that the library Scikit-Learn excludes the intercept by default. +Give a +critical discussion of the three methods and a judgement of which +model fits the data best. +

+

Part d): Paper and pencil part

+ +

This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer). The exercise is also part of the weekly exercises for week 37.

+ +

The assumption we have made is +that there exists a continuous function \( f(\boldsymbol{x}) \) and a normal distributed error \( \boldsymbol{\varepsilon}\sim N(0, \sigma^2) \) +which describes our data +

+$$ +\boldsymbol{y} = f(\boldsymbol{x})+\boldsymbol{\varepsilon} +$$ + +

We then approximate this function \( f(\boldsymbol{x}) \) with our model \( \boldsymbol{\tilde{y}} \) from the solution of the linear regression equations (ordinary least squares OLS), that is our +function \( f \) is approximated by \( \boldsymbol{\tilde{y}} \) where we minimized \( (\boldsymbol{y}-\boldsymbol{\tilde{y}})^2 \), with +

+$$ +\boldsymbol{\tilde{y}} = \boldsymbol{X}\boldsymbol{\beta}. +$$ + +

The matrix \( \boldsymbol{X} \) is the so-called design or feature matrix.

+ +

Show that the expectation value of \( \boldsymbol{y} \) for a given element \( i \)

+$$ +\mathbb{E}(y_i) =\sum_{j}x_{ij} \beta_j=\mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, +$$ + +

and that +its variance is +

+$$ +\mbox{Var}(y_i) = \sigma^2. +$$ + +

Hence, \( y_i \sim N( \mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, \sigma^2) \), that is \( \boldsymbol{y} \) follows a normal distribution with +mean value \( \boldsymbol{X}\boldsymbol{\beta} \) and variance \( \sigma^2 \). +

+ +

With the OLS expressions for the optimal parameters \( \boldsymbol{\hat{\beta}} \) show that

+$$ +\mathbb{E}(\boldsymbol{\hat{\beta}}) = \boldsymbol{\beta}. +$$ + +

Show finally that the variance of \( \boldsymbol{\beta} \) is

+$$ +\mbox{Var}(\boldsymbol{\hat{\beta}}) = \sigma^2 \, (\mathbf{X}^{T} \mathbf{X})^{-1}. +$$ + +

We can use the last expression when we define a so-called confidence interval for the parameters \( \beta \). +A given parameter \( \beta_j \) is given by the diagonal matrix element of the above matrix. +

+

Part e): Bias-variance trade-off and resampling techniques

+ +

Our aim here is to study the bias-variance trade-off by implementing the bootstrap resampling technique. +We will only use the simpler ordinary least squares here. +

+ +

With a code which does OLS and includes resampling techniques, +we will now discuss the bias-variance trade-off in the context of +continuous predictions such as regression. However, many of the +intuitions and ideas discussed here also carry over to classification +tasks and basically all Machine Learning algorithms. +

+ +

Before you perform an analysis of the bias-variance trade-off on your test data, make +first a figure similar to Fig. 2.11 of Hastie, Tibshirani, and +Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to +indicate possible regions of low/high bias and variance. You will most likely not get an +equally smooth curve! +

+ +

With this result we move on to the bias-variance trade-off analysis.

+ +

Consider a +dataset \( \mathcal{L} \) consisting of the data +\( \mathbf{X}_\mathcal{L}=\{(y_j, \boldsymbol{x}_j), j=0\ldots n-1\} \). +

+ +

As in part d), we assume that the true data is generated from a noisy model

+ +$$ +\boldsymbol{y}=f(\boldsymbol{x}) + \boldsymbol{\epsilon}. +$$ + +

Here \( \epsilon \) is normally distributed with mean zero and standard +deviation \( \sigma^2 \). +

+ +

In our derivation of the ordinary least squares method we defined then +an approximation to the function \( f \) in terms of the parameters +\( \boldsymbol{\beta} \) and the design matrix \( \boldsymbol{X} \) which embody our model, +that is \( \boldsymbol{\tilde{y}}=\boldsymbol{X}\boldsymbol{\beta} \). +

+ +

The parameters \( \boldsymbol{\beta} \) are in turn found by optimizing the mean +squared error via the so-called cost function +

+ +$$ +C(\boldsymbol{X},\boldsymbol{\beta}) =\frac{1}{n}\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2=\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]. +$$ + +

Here the expected value \( \mathbb{E} \) is the sample value.

+ +

Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a +term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise. +That is, show that +

+$$ +\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]=\mathrm{Bias}[\tilde{y}]+\mathrm{var}[\tilde{y}]+\sigma^2, +$$ + +

with

+$$ +\mathrm{Bias}[\tilde{y}]=\mathbb{E}\left[\left(\boldsymbol{y}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right], +$$ + +

and

+$$ +\mathrm{var}[\tilde{y}]=\mathbb{E}\left[\left(\tilde{\boldsymbol{y}}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right]=\frac{1}{n}\sum_i(\tilde{y}_i-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right])^2. +$$ + +

The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38. +Explain what the terms mean and discuss their interpretations. +

+ +

Perform then a bias-variance analysis of the Franke function by +studying the MSE value as function of the complexity of your model. +

+ +

Discuss the bias and variance trade-off as function +of your model complexity (the degree of the polynomial) and the number +of data points, and possibly also your training and test data using the bootstrap resampling method. +You can follow the code example in the jupyter-book at https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html#the-bias-variance-tradeoff. +

+

Part f): Cross-validation as resampling techniques, adding more complexity

+ +

The aim here is to write your own code for another widely popular +resampling technique, the so-called cross-validation method. +

+ +

Implement the \( k \)-fold cross-validation algorithm (write your own +code) and evaluate again the MSE function resulting +from the test folds. You can compare your own code with that from +Scikit-Learn if needed. +

+ +

Compare the MSE you get from your cross-validation code with the one +you got from your bootstrap code. Comment your results. Try \( 5-10 \) +folds. You can also compare your own cross-validation code with the +one provided by Scikit-Learn. +

+ +

In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression.

+

Part g): Analysis of real data

+ +

With our codes functioning and having been tested properly on a +simpler function we are now ready to look at real data. We will +essentially repeat in this exercise what was done in exercises a-f. However, we +need first to download the data and prepare properly the inputs to our +codes. We are going to download digital terrain data from the website +https://earthexplorer.usgs.gov/, +

+ +

Or, if you prefer, we have placed selected datafiles at https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles

+ +

In order to obtain data for a specific region, you need to register as +a user (free) at this website and then decide upon which area you want +to fetch the digital terrain data from. In order to be able to read +the data properly, you need to specify that the format should be SRTM +Arc-Second Global and download the data as a GeoTIF file. The +files are then stored in tif format which can be imported into a +Python program using +

+ + + +
+
+
+
+
+
scipy.misc.imread
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Here is a simple part of a Python code which reads and plots the data +from such files +

+ + + +
+
+
+
+
+
import numpy as np
+from imageio import imread
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+
+# Load the terrain
+terrain1 = imread('SRTM_data_Norway_1.tif')
+# Show the terrain
+plt.figure()
+plt.title('Terrain over Norway 1')
+plt.imshow(terrain1, cmap='gray')
+plt.xlabel('X')
+plt.ylabel('Y')
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

If you should have problems in downloading the digital terrain data, +we provide two examples under the data folder of project 1. One is +from a region close to Stavanger in Norway and the other Møsvatn +Austfjell, again in Norway. +Feel free to produce your own terrain data. +

+ +

Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example kaggle.com for examples.

+ +

Our final part deals with the parameterization of your digital terrain +data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial +approximation and cross-validation as resampling technique to evaluate which +model fits the data best. +

+ +

At the end, you should present a critical evaluation of your results +and discuss the applicability of these regression methods to the type +of data presented here (either the terrain data we propose or other data sets). +

+

Background literature

+ +
    +
  1. For a discussion and derivation of the variances and mean squared errors using linear regression, see the Lecture notes on ridge regression by Wessel N. van Wieringen
  2. +
  3. The textbook of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer, chapters 3 and 7 are the most relevant ones for the analysis here.
  4. +
+

Introduction to numerical projects

+ +

Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers.

+ + +

Format for electronic delivery of report and programs

+ +

The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report:

+ + +

Finally, +we encourage you to collaborate. Optimal working groups consist of +2-3 students. You can then hand in a common report. +

+

Software and needed installations

+ +

If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, +we recommend that you install the following Python packages via pip as +

+
    +
  1. pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow
  2. +
+

For Python3, replace pip with pip3.

+ +

See below for a discussion of tensorflow and scikit-learn.

+ +

For OSX users we recommend also, after having installed Xcode, to install brew. Brew allows +for a seamless installation of additional software via for example +

+
    +
  1. brew install python3
  2. +
+

For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution +you can use pip as well and simply install Python as +

+
    +
  1. sudo apt-get install python3 (or python for python2.7)
  2. +
+

etc etc.

+ +

If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely

+
    +
  1. Anaconda Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system conda
  2. +
  3. Enthought canopy is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license.
  4. +
+

Popular software packages written in Python for ML are

+ + +

These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +

+ +

+ +

+ +
+ + + + + + + diff --git a/doc/Projects/2024/Project1/html/Project1-bs.html b/doc/Projects/2024/Project1/html/Project1-bs.html new file mode 100644 index 000000000..fa17ccef5 --- /dev/null +++ b/doc/Projects/2024/Project1/html/Project1-bs.html @@ -0,0 +1,763 @@ + + + + + + + +Project 1 on Machine Learning, deadline October 7 (midnight), 2024 + + + + + + + + + + + + + + + + + + + + +
+

 

 

 

+ + +
+
+

Project 1 on Machine Learning, deadline October 7 (midnight), 2024

+
+ + +
+Data Analysis and Machine Learning FYS-STK3155/FYS4155 +
+ +
+University of Oslo, Norway +
+
+
+

September 2

+
+
+ + +
+

Preamble: Note on writing reports, using reference material, AI and other tools

+ +

We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb gives some guidance. See also the grading suggestion at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md. +

+ +

When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at https://scikit-learn.org/dev/about.html. +

+ +

We enocurage you to use tools like +ChatGPT in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. +

+ +

On scaling, we recommend reading the following section from the scikit-learn software description, see https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section

+

Regression analysis and resampling methods

+ +

The main aim of this project is to study in more detail various +regression methods, including the Ordinary Least Squares (OLS) method. +In addition to the scientific part, in this course we want also to +give you an experience in writing scientific reports. The format for +the delivery of your answers is namely that of a scientific report. At +for example +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md +we detail how to write a report. Furthermore, at +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/ +you can find examples of previous reports. How to write reports will +also be discussed during the various lab sessions. +

+ +

A small recommendation when developing the codes here. Instead of +jumping on to the two-dimensional function described below, we +recommend to do the code development and testing with a simpler +one-dimensional function, similar to those discussed in the exercises +of weeks 35 and 36. A simple test, as discussed during the lectures the first +three weeks is to set the design matrix equal to the identity +matrix. Then your model should give a mean square error which is exactly equal to zero. +When you are sure that your codes function well, you can then replace +the one-dimensional test function with the two-dimensional Franke function +discussed here. +

+ +

The Franke function serves as a stepping stone towards the analysis of +real topographic data. The latter is the last part of this project. +

+

Description of two-dimensional function

+ +

We will first study how to fit polynomials to a specific +two-dimensional function called Franke's +function. This +is a function which has been widely used when testing various +interpolation and fitting algorithms. Furthermore, after having +established the model and the method, we will employ resamling +techniques such as cross-validation and/or bootstrap in order to perform a +proper assessment of our models. We will also study in detail the +so-called Bias-Variance trade off. +

+ +

The Franke function, which is a weighted sum of four exponentials reads as follows

+$$ +\begin{align*} +f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)}+\frac{3}{4}\exp{\left(-\frac{(9x+1)^2}{49}- \frac{(9y+1)}{10}\right)} \\ +&+\frac{1}{2}\exp{\left(-\frac{(9x-7)^2}{4} - \frac{(9y-3)^2}{4}\right)} -\frac{1}{5}\exp{\left(-(9x-4)^2 - (9y-7)^2\right) }. +\end{align*} +$$ + +

The function will be defined for \( x,y\in [0,1] \). In a sense, our data are thus scaled to a particular domain for the input values.

+ +

Our first step will +be to perform an OLS regression analysis of this function, trying out +a polynomial fit with an \( x \) and a \( y \) dependence of the form \( [x, y, +x^2, y^2, xy, \dots] \). We will also include bootstrap first as a +resampling technique. After that we will include the cross-validation +technique. +

+ +

We can +use a uniform distribution to set up the arrays of values for \( x \) and +\( y \), or as in the example below just a set of fixed values for \( x \) and +\( y \) with a given step size. We will fit a function (for example a +polynomial) of \( x \) and \( y \). Thereafter we will repeat much of the +same procedure using the Ridge and Lasso regression methods, +introducing thus a dependence on the bias (penalty) \( \lambda \). +

+ +

Finally we are going to use (real) digital terrain data and try to +reproduce these data using the same methods. We will also try to go +beyond the second-order polynomials metioned above and explore +which polynomial fits the data best. +

+ +

The Python code for the Franke function is included here (it performs also a three-dimensional plot of it)

+ + +
+
+
+
+
+
from mpl_toolkits.mplot3d import Axes3D
+import matplotlib.pyplot as plt
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import numpy as np
+from random import random, seed
+
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+
+# Make data.
+x = np.arange(0, 1, 0.05)
+y = np.arange(0, 1, 0.05)
+x, y = np.meshgrid(x,y)
+
+
+def FrankeFunction(x,y):
+    term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
+    term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
+    term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
+    term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
+    return term1 + term2 + term3 + term4
+
+
+z = FrankeFunction(x, y)
+
+# Plot the surface.
+surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,
+                       linewidth=0, antialiased=False)
+
+# Customize the z axis.
+ax.set_zlim(-0.10, 1.40)
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Part a) : Ordinary Least Square (OLS) on the Franke function

+ +

We will generate our own dataset for a function +\( \mathrm{FrankeFunction}(x,y) \) with \( x,y \in [0,1] \). The function +\( f(x,y) \) is the Franke function. You should explore also the addition +of an added stochastic noise to this function using the normal +distribution \( N(0,1) \). +

+ +

Write your own code (using either a matrix inversion or a singular +value decomposition from e.g., numpy ) and perform a standard ordinary least square regression +analysis using polynomials in \( x \) and \( y \) up to fifth order. +

+ +

Evaluate the mean Squared error (MSE)

+ +$$ MSE(\boldsymbol{y},\tilde{\boldsymbol{y}}) = \frac{1}{n} +\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2, +$$ + +

and the \( R^2 \) score function. If \( \tilde{\boldsymbol{y}}_i \) is the predicted +value of the \( i-th \) sample and \( y_i \) is the corresponding true value, +then the score \( R^2 \) is defined as +

+ +$$ +R^2(\boldsymbol{y}, \tilde{\boldsymbol{y}}) = 1 - \frac{\sum_{i=0}^{n - 1} (y_i - \tilde{y}_i)^2}{\sum_{i=0}^{n - 1} (y_i - \bar{y})^2}, +$$ + +

where we have defined the mean value of \( \boldsymbol{y} \) as

+ +$$ +\bar{y} = \frac{1}{n} \sum_{i=0}^{n - 1} y_i. +$$ + +

Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five). +Plot also the parameters \( \beta \) as you increase the order of the polynomial. Comment your results. +

+ +

Your code has to include a scaling/centering of the data (for example by +subtracting the mean value), and +a split of the data in training and test data. For this exercise you can +either write your own code or use for example the function for +splitting training data provided by the library Scikit-Learn (make +sure you have installed it). This function is called +\( train\_test\_split \). You should present a critical discussion of why and how you have scaled or not scaled the data. +

+ +

It is normal in essentially all Machine Learning studies to split the +data in a training set and a test set (eventually also an additional +validation set). There +is no explicit recipe for how much data should be included as training +data and say test data. An accepted rule of thumb is to use +approximately \( 2/3 \) to \( 4/5 \) of the data as training data. +

+ +

You can easily reuse the solutions to your exercises from week 35 and week 36. +See also the lecture slides from week 35 and week 36. +

+

Part b): Adding Ridge regression for the Franke function

+ +

Write your own code for the Ridge method, either using matrix +inversion or the singular value decomposition as done in the previous +exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here. +

+ +

Perform the same analysis as you did in the previous exercise but now for different values of \( \lambda \). Compare and +analyze your results with those obtained in part a) with the ordinary least squares method. Study the +dependence on \( \lambda \). +

+

Part c): Adding Lasso for the Franke function

+ +

This exercise is essentially a repeat of the previous two ones, but now +with Lasso regression. Write either your own code (difficult and optional) or, in this case, +you can also use the functionalities of Scikit-Learn (recommended). Keep in mind that the library Scikit-Learn excludes the intercept by default. +Give a +critical discussion of the three methods and a judgement of which +model fits the data best. +

+

Part d): Paper and pencil part

+ +

This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer). The exercise is also part of the weekly exercises for week 37.

+ +

The assumption we have made is +that there exists a continuous function \( f(\boldsymbol{x}) \) and a normal distributed error \( \boldsymbol{\varepsilon}\sim N(0, \sigma^2) \) +which describes our data +

+$$ +\boldsymbol{y} = f(\boldsymbol{x})+\boldsymbol{\varepsilon} +$$ + +

We then approximate this function \( f(\boldsymbol{x}) \) with our model \( \boldsymbol{\tilde{y}} \) from the solution of the linear regression equations (ordinary least squares OLS), that is our +function \( f \) is approximated by \( \boldsymbol{\tilde{y}} \) where we minimized \( (\boldsymbol{y}-\boldsymbol{\tilde{y}})^2 \), with +

+$$ +\boldsymbol{\tilde{y}} = \boldsymbol{X}\boldsymbol{\beta}. +$$ + +

The matrix \( \boldsymbol{X} \) is the so-called design or feature matrix.

+ +

Show that the expectation value of \( \boldsymbol{y} \) for a given element \( i \)

+$$ +\mathbb{E}(y_i) =\sum_{j}x_{ij} \beta_j=\mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, +$$ + +

and that +its variance is +

+$$ +\mbox{Var}(y_i) = \sigma^2. +$$ + +

Hence, \( y_i \sim N( \mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, \sigma^2) \), that is \( \boldsymbol{y} \) follows a normal distribution with +mean value \( \boldsymbol{X}\boldsymbol{\beta} \) and variance \( \sigma^2 \). +

+ +

With the OLS expressions for the optimal parameters \( \boldsymbol{\hat{\beta}} \) show that

+$$ +\mathbb{E}(\boldsymbol{\hat{\beta}}) = \boldsymbol{\beta}. +$$ + +

Show finally that the variance of \( \boldsymbol{\beta} \) is

+$$ +\mbox{Var}(\boldsymbol{\hat{\beta}}) = \sigma^2 \, (\mathbf{X}^{T} \mathbf{X})^{-1}. +$$ + +

We can use the last expression when we define a so-called confidence interval for the parameters \( \beta \). +A given parameter \( \beta_j \) is given by the diagonal matrix element of the above matrix. +

+

Part e): Bias-variance trade-off and resampling techniques

+ +

Our aim here is to study the bias-variance trade-off by implementing the bootstrap resampling technique. +We will only use the simpler ordinary least squares here. +

+ +

With a code which does OLS and includes resampling techniques, +we will now discuss the bias-variance trade-off in the context of +continuous predictions such as regression. However, many of the +intuitions and ideas discussed here also carry over to classification +tasks and basically all Machine Learning algorithms. +

+ +

Before you perform an analysis of the bias-variance trade-off on your test data, make +first a figure similar to Fig. 2.11 of Hastie, Tibshirani, and +Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to +indicate possible regions of low/high bias and variance. You will most likely not get an +equally smooth curve! +

+ +

With this result we move on to the bias-variance trade-off analysis.

+ +

Consider a +dataset \( \mathcal{L} \) consisting of the data +\( \mathbf{X}_\mathcal{L}=\{(y_j, \boldsymbol{x}_j), j=0\ldots n-1\} \). +

+ +

As in part d), we assume that the true data is generated from a noisy model

+ +$$ +\boldsymbol{y}=f(\boldsymbol{x}) + \boldsymbol{\epsilon}. +$$ + +

Here \( \epsilon \) is normally distributed with mean zero and standard +deviation \( \sigma^2 \). +

+ +

In our derivation of the ordinary least squares method we defined then +an approximation to the function \( f \) in terms of the parameters +\( \boldsymbol{\beta} \) and the design matrix \( \boldsymbol{X} \) which embody our model, +that is \( \boldsymbol{\tilde{y}}=\boldsymbol{X}\boldsymbol{\beta} \). +

+ +

The parameters \( \boldsymbol{\beta} \) are in turn found by optimizing the mean +squared error via the so-called cost function +

+ +$$ +C(\boldsymbol{X},\boldsymbol{\beta}) =\frac{1}{n}\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2=\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]. +$$ + +

Here the expected value \( \mathbb{E} \) is the sample value.

+ +

Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a +term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise. +That is, show that +

+$$ +\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]=\mathrm{Bias}[\tilde{y}]+\mathrm{var}[\tilde{y}]+\sigma^2, +$$ + +

with

+$$ +\mathrm{Bias}[\tilde{y}]=\mathbb{E}\left[\left(\boldsymbol{y}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right], +$$ + +

and

+$$ +\mathrm{var}[\tilde{y}]=\mathbb{E}\left[\left(\tilde{\boldsymbol{y}}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right]=\frac{1}{n}\sum_i(\tilde{y}_i-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right])^2. +$$ + +

The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38. +Explain what the terms mean and discuss their interpretations. +

+ +

Perform then a bias-variance analysis of the Franke function by +studying the MSE value as function of the complexity of your model. +

+ +

Discuss the bias and variance trade-off as function +of your model complexity (the degree of the polynomial) and the number +of data points, and possibly also your training and test data using the bootstrap resampling method. +You can follow the code example in the jupyter-book at https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html#the-bias-variance-tradeoff. +

+

Part f): Cross-validation as resampling techniques, adding more complexity

+ +

The aim here is to write your own code for another widely popular +resampling technique, the so-called cross-validation method. +

+ +

Implement the \( k \)-fold cross-validation algorithm (write your own +code) and evaluate again the MSE function resulting +from the test folds. You can compare your own code with that from +Scikit-Learn if needed. +

+ +

Compare the MSE you get from your cross-validation code with the one +you got from your bootstrap code. Comment your results. Try \( 5-10 \) +folds. You can also compare your own cross-validation code with the +one provided by Scikit-Learn. +

+ +

In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression.

+

Part g): Analysis of real data

+ +

With our codes functioning and having been tested properly on a +simpler function we are now ready to look at real data. We will +essentially repeat in this exercise what was done in exercises a-f. However, we +need first to download the data and prepare properly the inputs to our +codes. We are going to download digital terrain data from the website +https://earthexplorer.usgs.gov/, +

+ +

Or, if you prefer, we have placed selected datafiles at https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles

+ +

In order to obtain data for a specific region, you need to register as +a user (free) at this website and then decide upon which area you want +to fetch the digital terrain data from. In order to be able to read +the data properly, you need to specify that the format should be SRTM +Arc-Second Global and download the data as a GeoTIF file. The +files are then stored in tif format which can be imported into a +Python program using +

+ + + +
+
+
+
+
+
scipy.misc.imread
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Here is a simple part of a Python code which reads and plots the data +from such files +

+ + + +
+
+
+
+
+
import numpy as np
+from imageio import imread
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+
+# Load the terrain
+terrain1 = imread('SRTM_data_Norway_1.tif')
+# Show the terrain
+plt.figure()
+plt.title('Terrain over Norway 1')
+plt.imshow(terrain1, cmap='gray')
+plt.xlabel('X')
+plt.ylabel('Y')
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

If you should have problems in downloading the digital terrain data, +we provide two examples under the data folder of project 1. One is +from a region close to Stavanger in Norway and the other Møsvatn +Austfjell, again in Norway. +Feel free to produce your own terrain data. +

+ +

Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example kaggle.com for examples.

+ +

Our final part deals with the parameterization of your digital terrain +data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial +approximation and cross-validation as resampling technique to evaluate which +model fits the data best. +

+ +

At the end, you should present a critical evaluation of your results +and discuss the applicability of these regression methods to the type +of data presented here (either the terrain data we propose or other data sets). +

+

Background literature

+ +
    +
  1. For a discussion and derivation of the variances and mean squared errors using linear regression, see the Lecture notes on ridge regression by Wessel N. van Wieringen
  2. +
  3. The textbook of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer, chapters 3 and 7 are the most relevant ones for the analysis here.
  4. +
+

Introduction to numerical projects

+ +

Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers.

+ + +

Format for electronic delivery of report and programs

+ +

The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report:

+ + +

Finally, +we encourage you to collaborate. Optimal working groups consist of +2-3 students. You can then hand in a common report. +

+

Software and needed installations

+ +

If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, +we recommend that you install the following Python packages via pip as +

+
    +
  1. pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow
  2. +
+

For Python3, replace pip with pip3.

+ +

See below for a discussion of tensorflow and scikit-learn.

+ +

For OSX users we recommend also, after having installed Xcode, to install brew. Brew allows +for a seamless installation of additional software via for example +

+
    +
  1. brew install python3
  2. +
+

For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution +you can use pip as well and simply install Python as +

+
    +
  1. sudo apt-get install python3 (or python for python2.7)
  2. +
+

etc etc.

+ +

If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely

+
    +
  1. Anaconda Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system conda
  2. +
  3. Enthought canopy is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license.
  4. +
+

Popular software packages written in Python for ML are

+ + +

These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +

+ +

+ +

+ +
+ + + + + + + diff --git a/doc/Projects/2024/Project1/html/Project1.html b/doc/Projects/2024/Project1/html/Project1.html new file mode 100644 index 000000000..42b54e81b --- /dev/null +++ b/doc/Projects/2024/Project1/html/Project1.html @@ -0,0 +1,784 @@ + + + + + + + +Project 1 on Machine Learning, deadline October 7 (midnight), 2024 + + + + + + + + + + + + + + +
+

Project 1 on Machine Learning, deadline October 7 (midnight), 2024

+
+ + +
+Data Analysis and Machine Learning FYS-STK3155/FYS4155 +
+ +
+University of Oslo, Norway +
+
+
+

September 2

+
+
+

Preamble: Note on writing reports, using reference material, AI and other tools

+ +

We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb gives some guidance. See also the grading suggestion at https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md. +

+ +

When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at https://scikit-learn.org/dev/about.html. +

+ +

We enocurage you to use tools like +ChatGPT in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. +

+ +

On scaling, we recommend reading the following section from the scikit-learn software description, see https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section

+

Regression analysis and resampling methods

+ +

The main aim of this project is to study in more detail various +regression methods, including the Ordinary Least Squares (OLS) method. +In addition to the scientific part, in this course we want also to +give you an experience in writing scientific reports. The format for +the delivery of your answers is namely that of a scientific report. At +for example +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md +we detail how to write a report. Furthermore, at +https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/ +you can find examples of previous reports. How to write reports will +also be discussed during the various lab sessions. +

+ +

A small recommendation when developing the codes here. Instead of +jumping on to the two-dimensional function described below, we +recommend to do the code development and testing with a simpler +one-dimensional function, similar to those discussed in the exercises +of weeks 35 and 36. A simple test, as discussed during the lectures the first +three weeks is to set the design matrix equal to the identity +matrix. Then your model should give a mean square error which is exactly equal to zero. +When you are sure that your codes function well, you can then replace +the one-dimensional test function with the two-dimensional Franke function +discussed here. +

+ +

The Franke function serves as a stepping stone towards the analysis of +real topographic data. The latter is the last part of this project. +

+

Description of two-dimensional function

+ +

We will first study how to fit polynomials to a specific +two-dimensional function called Franke's +function. This +is a function which has been widely used when testing various +interpolation and fitting algorithms. Furthermore, after having +established the model and the method, we will employ resamling +techniques such as cross-validation and/or bootstrap in order to perform a +proper assessment of our models. We will also study in detail the +so-called Bias-Variance trade off. +

+ +

The Franke function, which is a weighted sum of four exponentials reads as follows

+$$ +\begin{align*} +f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)}+\frac{3}{4}\exp{\left(-\frac{(9x+1)^2}{49}- \frac{(9y+1)}{10}\right)} \\ +&+\frac{1}{2}\exp{\left(-\frac{(9x-7)^2}{4} - \frac{(9y-3)^2}{4}\right)} -\frac{1}{5}\exp{\left(-(9x-4)^2 - (9y-7)^2\right) }. +\end{align*} +$$ + +

The function will be defined for \( x,y\in [0,1] \). In a sense, our data are thus scaled to a particular domain for the input values.

+ +

Our first step will +be to perform an OLS regression analysis of this function, trying out +a polynomial fit with an \( x \) and a \( y \) dependence of the form \( [x, y, +x^2, y^2, xy, \dots] \). We will also include bootstrap first as a +resampling technique. After that we will include the cross-validation +technique. +

+ +

We can +use a uniform distribution to set up the arrays of values for \( x \) and +\( y \), or as in the example below just a set of fixed values for \( x \) and +\( y \) with a given step size. We will fit a function (for example a +polynomial) of \( x \) and \( y \). Thereafter we will repeat much of the +same procedure using the Ridge and Lasso regression methods, +introducing thus a dependence on the bias (penalty) \( \lambda \). +

+ +

Finally we are going to use (real) digital terrain data and try to +reproduce these data using the same methods. We will also try to go +beyond the second-order polynomials metioned above and explore +which polynomial fits the data best. +

+ +

The Python code for the Franke function is included here (it performs also a three-dimensional plot of it)

+ + +
+
+
+
+
+
from mpl_toolkits.mplot3d import Axes3D
+import matplotlib.pyplot as plt
+from matplotlib import cm
+from matplotlib.ticker import LinearLocator, FormatStrFormatter
+import numpy as np
+from random import random, seed
+
+fig = plt.figure()
+ax = fig.gca(projection='3d')
+
+# Make data.
+x = np.arange(0, 1, 0.05)
+y = np.arange(0, 1, 0.05)
+x, y = np.meshgrid(x,y)
+
+
+def FrankeFunction(x,y):
+    term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))
+    term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))
+    term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))
+    term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)
+    return term1 + term2 + term3 + term4
+
+
+z = FrankeFunction(x, y)
+
+# Plot the surface.
+surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,
+                       linewidth=0, antialiased=False)
+
+# Customize the z axis.
+ax.set_zlim(-0.10, 1.40)
+ax.zaxis.set_major_locator(LinearLocator(10))
+ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
+
+# Add a color bar which maps values to colors.
+fig.colorbar(surf, shrink=0.5, aspect=5)
+
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Part a) : Ordinary Least Square (OLS) on the Franke function

+ +

We will generate our own dataset for a function +\( \mathrm{FrankeFunction}(x,y) \) with \( x,y \in [0,1] \). The function +\( f(x,y) \) is the Franke function. You should explore also the addition +of an added stochastic noise to this function using the normal +distribution \( N(0,1) \). +

+ +

Write your own code (using either a matrix inversion or a singular +value decomposition from e.g., numpy ) and perform a standard ordinary least square regression +analysis using polynomials in \( x \) and \( y \) up to fifth order. +

+ +

Evaluate the mean Squared error (MSE)

+ +$$ MSE(\boldsymbol{y},\tilde{\boldsymbol{y}}) = \frac{1}{n} +\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2, +$$ + +

and the \( R^2 \) score function. If \( \tilde{\boldsymbol{y}}_i \) is the predicted +value of the \( i-th \) sample and \( y_i \) is the corresponding true value, +then the score \( R^2 \) is defined as +

+ +$$ +R^2(\boldsymbol{y}, \tilde{\boldsymbol{y}}) = 1 - \frac{\sum_{i=0}^{n - 1} (y_i - \tilde{y}_i)^2}{\sum_{i=0}^{n - 1} (y_i - \bar{y})^2}, +$$ + +

where we have defined the mean value of \( \boldsymbol{y} \) as

+ +$$ +\bar{y} = \frac{1}{n} \sum_{i=0}^{n - 1} y_i. +$$ + +

Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five). +Plot also the parameters \( \beta \) as you increase the order of the polynomial. Comment your results. +

+ +

Your code has to include a scaling/centering of the data (for example by +subtracting the mean value), and +a split of the data in training and test data. For this exercise you can +either write your own code or use for example the function for +splitting training data provided by the library Scikit-Learn (make +sure you have installed it). This function is called +\( train\_test\_split \). You should present a critical discussion of why and how you have scaled or not scaled the data. +

+ +

It is normal in essentially all Machine Learning studies to split the +data in a training set and a test set (eventually also an additional +validation set). There +is no explicit recipe for how much data should be included as training +data and say test data. An accepted rule of thumb is to use +approximately \( 2/3 \) to \( 4/5 \) of the data as training data. +

+ +

You can easily reuse the solutions to your exercises from week 35 and week 36. +See also the lecture slides from week 35 and week 36. +

+

Part b): Adding Ridge regression for the Franke function

+ +

Write your own code for the Ridge method, either using matrix +inversion or the singular value decomposition as done in the previous +exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here. +

+ +

Perform the same analysis as you did in the previous exercise but now for different values of \( \lambda \). Compare and +analyze your results with those obtained in part a) with the ordinary least squares method. Study the +dependence on \( \lambda \). +

+

Part c): Adding Lasso for the Franke function

+ +

This exercise is essentially a repeat of the previous two ones, but now +with Lasso regression. Write either your own code (difficult and optional) or, in this case, +you can also use the functionalities of Scikit-Learn (recommended). Keep in mind that the library Scikit-Learn excludes the intercept by default. +Give a +critical discussion of the three methods and a judgement of which +model fits the data best. +

+

Part d): Paper and pencil part

+ +

This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer). The exercise is also part of the weekly exercises for week 37.

+ +

The assumption we have made is +that there exists a continuous function \( f(\boldsymbol{x}) \) and a normal distributed error \( \boldsymbol{\varepsilon}\sim N(0, \sigma^2) \) +which describes our data +

+$$ +\boldsymbol{y} = f(\boldsymbol{x})+\boldsymbol{\varepsilon} +$$ + +

We then approximate this function \( f(\boldsymbol{x}) \) with our model \( \boldsymbol{\tilde{y}} \) from the solution of the linear regression equations (ordinary least squares OLS), that is our +function \( f \) is approximated by \( \boldsymbol{\tilde{y}} \) where we minimized \( (\boldsymbol{y}-\boldsymbol{\tilde{y}})^2 \), with +

+$$ +\boldsymbol{\tilde{y}} = \boldsymbol{X}\boldsymbol{\beta}. +$$ + +

The matrix \( \boldsymbol{X} \) is the so-called design or feature matrix.

+ +

Show that the expectation value of \( \boldsymbol{y} \) for a given element \( i \)

+$$ +\mathbb{E}(y_i) =\sum_{j}x_{ij} \beta_j=\mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, +$$ + +

and that +its variance is +

+$$ +\mbox{Var}(y_i) = \sigma^2. +$$ + +

Hence, \( y_i \sim N( \mathbf{X}_{i, \ast} \, \boldsymbol{\beta}, \sigma^2) \), that is \( \boldsymbol{y} \) follows a normal distribution with +mean value \( \boldsymbol{X}\boldsymbol{\beta} \) and variance \( \sigma^2 \). +

+ +

With the OLS expressions for the optimal parameters \( \boldsymbol{\hat{\beta}} \) show that

+$$ +\mathbb{E}(\boldsymbol{\hat{\beta}}) = \boldsymbol{\beta}. +$$ + +

Show finally that the variance of \( \boldsymbol{\beta} \) is

+$$ +\mbox{Var}(\boldsymbol{\hat{\beta}}) = \sigma^2 \, (\mathbf{X}^{T} \mathbf{X})^{-1}. +$$ + +

We can use the last expression when we define a so-called confidence interval for the parameters \( \beta \). +A given parameter \( \beta_j \) is given by the diagonal matrix element of the above matrix. +

+

Part e): Bias-variance trade-off and resampling techniques

+ +

Our aim here is to study the bias-variance trade-off by implementing the bootstrap resampling technique. +We will only use the simpler ordinary least squares here. +

+ +

With a code which does OLS and includes resampling techniques, +we will now discuss the bias-variance trade-off in the context of +continuous predictions such as regression. However, many of the +intuitions and ideas discussed here also carry over to classification +tasks and basically all Machine Learning algorithms. +

+ +

Before you perform an analysis of the bias-variance trade-off on your test data, make +first a figure similar to Fig. 2.11 of Hastie, Tibshirani, and +Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to +indicate possible regions of low/high bias and variance. You will most likely not get an +equally smooth curve! +

+ +

With this result we move on to the bias-variance trade-off analysis.

+ +

Consider a +dataset \( \mathcal{L} \) consisting of the data +\( \mathbf{X}_\mathcal{L}=\{(y_j, \boldsymbol{x}_j), j=0\ldots n-1\} \). +

+ +

As in part d), we assume that the true data is generated from a noisy model

+ +$$ +\boldsymbol{y}=f(\boldsymbol{x}) + \boldsymbol{\epsilon}. +$$ + +

Here \( \epsilon \) is normally distributed with mean zero and standard +deviation \( \sigma^2 \). +

+ +

In our derivation of the ordinary least squares method we defined then +an approximation to the function \( f \) in terms of the parameters +\( \boldsymbol{\beta} \) and the design matrix \( \boldsymbol{X} \) which embody our model, +that is \( \boldsymbol{\tilde{y}}=\boldsymbol{X}\boldsymbol{\beta} \). +

+ +

The parameters \( \boldsymbol{\beta} \) are in turn found by optimizing the mean +squared error via the so-called cost function +

+ +$$ +C(\boldsymbol{X},\boldsymbol{\beta}) =\frac{1}{n}\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2=\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]. +$$ + +

Here the expected value \( \mathbb{E} \) is the sample value.

+ +

Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a +term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise. +That is, show that +

+$$ +\mathbb{E}\left[(\boldsymbol{y}-\boldsymbol{\tilde{y}})^2\right]=\mathrm{Bias}[\tilde{y}]+\mathrm{var}[\tilde{y}]+\sigma^2, +$$ + +

with

+$$ +\mathrm{Bias}[\tilde{y}]=\mathbb{E}\left[\left(\boldsymbol{y}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right], +$$ + +

and

+$$ +\mathrm{var}[\tilde{y}]=\mathbb{E}\left[\left(\tilde{\boldsymbol{y}}-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right]\right)^2\right]=\frac{1}{n}\sum_i(\tilde{y}_i-\mathbb{E}\left[\boldsymbol{\tilde{y}}\right])^2. +$$ + +

The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38. +Explain what the terms mean and discuss their interpretations. +

+ +

Perform then a bias-variance analysis of the Franke function by +studying the MSE value as function of the complexity of your model. +

+ +

Discuss the bias and variance trade-off as function +of your model complexity (the degree of the polynomial) and the number +of data points, and possibly also your training and test data using the bootstrap resampling method. +You can follow the code example in the jupyter-book at https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html#the-bias-variance-tradeoff. +

+

Part f): Cross-validation as resampling techniques, adding more complexity

+ +

The aim here is to write your own code for another widely popular +resampling technique, the so-called cross-validation method. +

+ +

Implement the \( k \)-fold cross-validation algorithm (write your own +code) and evaluate again the MSE function resulting +from the test folds. You can compare your own code with that from +Scikit-Learn if needed. +

+ +

Compare the MSE you get from your cross-validation code with the one +you got from your bootstrap code. Comment your results. Try \( 5-10 \) +folds. You can also compare your own cross-validation code with the +one provided by Scikit-Learn. +

+ +

In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression.

+

Part g): Analysis of real data

+ +

With our codes functioning and having been tested properly on a +simpler function we are now ready to look at real data. We will +essentially repeat in this exercise what was done in exercises a-f. However, we +need first to download the data and prepare properly the inputs to our +codes. We are going to download digital terrain data from the website +https://earthexplorer.usgs.gov/, +

+ +

Or, if you prefer, we have placed selected datafiles at https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles

+ +

In order to obtain data for a specific region, you need to register as +a user (free) at this website and then decide upon which area you want +to fetch the digital terrain data from. In order to be able to read +the data properly, you need to specify that the format should be SRTM +Arc-Second Global and download the data as a GeoTIF file. The +files are then stored in tif format which can be imported into a +Python program using +

+ + + +
+
+
+
+
+
scipy.misc.imread
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Here is a simple part of a Python code which reads and plots the data +from such files +

+ + + +
+
+
+
+
+
import numpy as np
+from imageio import imread
+import matplotlib.pyplot as plt
+from mpl_toolkits.mplot3d import Axes3D
+from matplotlib import cm
+
+# Load the terrain
+terrain1 = imread('SRTM_data_Norway_1.tif')
+# Show the terrain
+plt.figure()
+plt.title('Terrain over Norway 1')
+plt.imshow(terrain1, cmap='gray')
+plt.xlabel('X')
+plt.ylabel('Y')
+plt.show()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

If you should have problems in downloading the digital terrain data, +we provide two examples under the data folder of project 1. One is +from a region close to Stavanger in Norway and the other Møsvatn +Austfjell, again in Norway. +Feel free to produce your own terrain data. +

+ +

Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example kaggle.com for examples.

+ +

Our final part deals with the parameterization of your digital terrain +data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial +approximation and cross-validation as resampling technique to evaluate which +model fits the data best. +

+ +

At the end, you should present a critical evaluation of your results +and discuss the applicability of these regression methods to the type +of data presented here (either the terrain data we propose or other data sets). +

+

Background literature

+ +
    +
  1. For a discussion and derivation of the variances and mean squared errors using linear regression, see the Lecture notes on ridge regression by Wessel N. van Wieringen
  2. +
  3. The textbook of Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer, chapters 3 and 7 are the most relevant ones for the analysis here.
  4. +
+

Introduction to numerical projects

+ +

Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers.

+ + +

Format for electronic delivery of report and programs

+ +

The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report:

+ + +

Finally, +we encourage you to collaborate. Optimal working groups consist of +2-3 students. You can then hand in a common report. +

+

Software and needed installations

+ +

If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, +we recommend that you install the following Python packages via pip as +

+
    +
  1. pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow
  2. +
+

For Python3, replace pip with pip3.

+ +

See below for a discussion of tensorflow and scikit-learn.

+ +

For OSX users we recommend also, after having installed Xcode, to install brew. Brew allows +for a seamless installation of additional software via for example +

+
    +
  1. brew install python3
  2. +
+

For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution +you can use pip as well and simply install Python as +

+
    +
  1. sudo apt-get install python3 (or python for python2.7)
  2. +
+

etc etc.

+ +

If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely

+
    +
  1. Anaconda Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system conda
  2. +
  3. Enthought canopy is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license.
  4. +
+

Popular software packages written in Python for ML are

+ + +

These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. +

+ + + + + diff --git a/doc/Projects/2024/Project1/ipynb/Project1.ipynb b/doc/Projects/2024/Project1/ipynb/Project1.ipynb new file mode 100644 index 000000000..71e7871a5 --- /dev/null +++ b/doc/Projects/2024/Project1/ipynb/Project1.ipynb @@ -0,0 +1,924 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f29d1e5a", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "60f7a134", + "metadata": { + "editable": true + }, + "source": [ + "# Project 1 on Machine Learning, deadline October 7 (midnight), 2024\n", + "**[Data Analysis and Machine Learning FYS-STK3155/FYS4155](http://www.uio.no/studier/emner/matnat/fys/FYS3155/index-eng.html)**, University of Oslo, Norway\n", + "\n", + "Date: **September 2**" + ] + }, + { + "cell_type": "markdown", + "id": "43b931d0", + "metadata": { + "editable": true + }, + "source": [ + "## Preamble: Note on writing reports, using reference material, AI and other tools\n", + "\n", + "We want you to answer the three different projects by handing reports written like a standard scientific/technical report.\n", + "The link at gives some guidance. See also the grading suggestion at .\n", + "\n", + "When using codes from different sources that you have not developed yourself,\n", + "you should refer to these in the bibliography of your report, indicating wherefrom you\n", + "got the code, whether this is from the lecture notes, softwares like\n", + "Scikit-Learn, TensorFlow, PyTorch or other sources. These should\n", + "always be cited correctly. How to cite some of the libraries is often\n", + "indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at . \n", + "\n", + "We enocurage you to use tools like\n", + "[ChatGPT](https://openai.com/chatgpt/) in writing the report. If you use for example ChatGPT,\n", + "please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can\n", + "be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material.\n", + "\n", + "On scaling, we recommend reading the following section from the scikit-learn software description, see " + ] + }, + { + "cell_type": "markdown", + "id": "131f84dc", + "metadata": { + "editable": true + }, + "source": [ + "## Regression analysis and resampling methods\n", + "\n", + "The main aim of this project is to study in more detail various\n", + "regression methods, including the Ordinary Least Squares (OLS) method.\n", + "In addition to the scientific part, in this course we want also to\n", + "give you an experience in writing scientific reports. The format for\n", + "the delivery of your answers is namely that of a scientific report. At\n", + "for example\n", + "\n", + "we detail how to write a report. Furthermore, at\n", + "\n", + "you can find examples of previous reports. How to write reports will\n", + "also be discussed during the various lab sessions.\n", + "\n", + "**A small recommendation when developing the codes here**. Instead of\n", + "jumping on to the two-dimensional function described below, we\n", + "recommend to do the code development and testing with a simpler\n", + "one-dimensional function, similar to those discussed in the exercises\n", + "of weeks 35 and 36. A simple test, as discussed during the lectures the first\n", + "three weeks is to set the design matrix equal to the identity\n", + "matrix. Then your model should give a mean square error which is exactly equal to zero.\n", + "When you are sure that your codes function well, you can then replace\n", + "the one-dimensional test function with the two-dimensional **Franke** function\n", + "discussed here.\n", + "\n", + "The Franke function serves as a stepping stone towards the analysis of\n", + "real topographic data. The latter is the last part of this project." + ] + }, + { + "cell_type": "markdown", + "id": "335be2ea", + "metadata": { + "editable": true + }, + "source": [ + "### Description of two-dimensional function\n", + "\n", + "We will first study how to fit polynomials to a specific\n", + "two-dimensional function called [Franke's\n", + "function](http://www.dtic.mil/dtic/tr/fulltext/u2/a081688.pdf). This\n", + "is a function which has been widely used when testing various\n", + "interpolation and fitting algorithms. Furthermore, after having\n", + "established the model and the method, we will employ resamling\n", + "techniques such as cross-validation and/or bootstrap in order to perform a\n", + "proper assessment of our models. We will also study in detail the\n", + "so-called Bias-Variance trade off.\n", + "\n", + "The Franke function, which is a weighted sum of four exponentials reads as follows" + ] + }, + { + "cell_type": "markdown", + "id": "a77e527b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{align*}\n", + "f(x,y) &= \\frac{3}{4}\\exp{\\left(-\\frac{(9x-2)^2}{4} - \\frac{(9y-2)^2}{4}\\right)}+\\frac{3}{4}\\exp{\\left(-\\frac{(9x+1)^2}{49}- \\frac{(9y+1)}{10}\\right)} \\\\\n", + "&+\\frac{1}{2}\\exp{\\left(-\\frac{(9x-7)^2}{4} - \\frac{(9y-3)^2}{4}\\right)} -\\frac{1}{5}\\exp{\\left(-(9x-4)^2 - (9y-7)^2\\right) }.\n", + "\\end{align*}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "071b756f", + "metadata": { + "editable": true + }, + "source": [ + "The function will be defined for $x,y\\in [0,1]$. In a sense, our data are thus scaled to a particular domain for the input values.\n", + "\n", + "Our first step will\n", + "be to perform an OLS regression analysis of this function, trying out\n", + "a polynomial fit with an $x$ and a $y$ dependence of the form $[x, y,\n", + "x^2, y^2, xy, \\dots]$. We will also include bootstrap first as a\n", + "resampling technique. After that we will include the cross-validation\n", + "technique.\n", + "\n", + "We can\n", + "use a uniform distribution to set up the arrays of values for $x$ and\n", + "$y$, or as in the example below just a set of fixed values for $x$ and\n", + "$y$ with a given step size. We will fit a function (for example a\n", + "polynomial) of $x$ and $y$. Thereafter we will repeat much of the\n", + "same procedure using the Ridge and Lasso regression methods,\n", + "introducing thus a dependence on the bias (penalty) $\\lambda$.\n", + "\n", + "Finally we are going to use (real) digital terrain data and try to\n", + "reproduce these data using the same methods. We will also try to go\n", + "beyond the second-order polynomials metioned above and explore \n", + "which polynomial fits the data best.\n", + "\n", + "The Python code for the Franke function is included here (it performs also a three-dimensional plot of it)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "eae160df", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import cm\n", + "from matplotlib.ticker import LinearLocator, FormatStrFormatter\n", + "import numpy as np\n", + "from random import random, seed\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca(projection='3d')\n", + "\n", + "# Make data.\n", + "x = np.arange(0, 1, 0.05)\n", + "y = np.arange(0, 1, 0.05)\n", + "x, y = np.meshgrid(x,y)\n", + "\n", + "\n", + "def FrankeFunction(x,y):\n", + " term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2))\n", + " term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1))\n", + " term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2))\n", + " term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2)\n", + " return term1 + term2 + term3 + term4\n", + "\n", + "\n", + "z = FrankeFunction(x, y)\n", + "\n", + "# Plot the surface.\n", + "surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,\n", + " linewidth=0, antialiased=False)\n", + "\n", + "# Customize the z axis.\n", + "ax.set_zlim(-0.10, 1.40)\n", + "ax.zaxis.set_major_locator(LinearLocator(10))\n", + "ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))\n", + "\n", + "# Add a color bar which maps values to colors.\n", + "fig.colorbar(surf, shrink=0.5, aspect=5)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c2cfaf54", + "metadata": { + "editable": true + }, + "source": [ + "### Part a) : Ordinary Least Square (OLS) on the Franke function\n", + "\n", + "We will generate our own dataset for a function\n", + "$\\mathrm{FrankeFunction}(x,y)$ with $x,y \\in [0,1]$. The function\n", + "$f(x,y)$ is the Franke function. You should explore also the addition\n", + "of an added stochastic noise to this function using the normal\n", + "distribution $N(0,1)$.\n", + "\n", + "*Write your own code* (using either a matrix inversion or a singular\n", + "value decomposition from e.g., **numpy** ) and perform a standard **ordinary least square regression**\n", + "analysis using polynomials in $x$ and $y$ up to fifth order.\n", + "\n", + "Evaluate the mean Squared error (MSE)" + ] + }, + { + "cell_type": "markdown", + "id": "a7cd4d8f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "MSE(\\boldsymbol{y},\\tilde{\\boldsymbol{y}}) = \\frac{1}{n}\n", + "\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c0bbdb51", + "metadata": { + "editable": true + }, + "source": [ + "and the $R^2$ score function. If $\\tilde{\\boldsymbol{y}}_i$ is the predicted\n", + "value of the $i-th$ sample and $y_i$ is the corresponding true value,\n", + "then the score $R^2$ is defined as" + ] + }, + { + "cell_type": "markdown", + "id": "ddee9b4b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "R^2(\\boldsymbol{y}, \\tilde{\\boldsymbol{y}}) = 1 - \\frac{\\sum_{i=0}^{n - 1} (y_i - \\tilde{y}_i)^2}{\\sum_{i=0}^{n - 1} (y_i - \\bar{y})^2},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6f220536", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined the mean value of $\\boldsymbol{y}$ as" + ] + }, + { + "cell_type": "markdown", + "id": "feb5938f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\bar{y} = \\frac{1}{n} \\sum_{i=0}^{n - 1} y_i.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8ca0b371", + "metadata": { + "editable": true + }, + "source": [ + "Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five).\n", + "Plot also the parameters $\\beta$ as you increase the order of the polynomial. Comment your results.\n", + "\n", + "Your code has to include a scaling/centering of the data (for example by\n", + "subtracting the mean value), and\n", + "a split of the data in training and test data. For this exercise you can\n", + "either write your own code or use for example the function for\n", + "splitting training data provided by the library **Scikit-Learn** (make\n", + "sure you have installed it). This function is called\n", + "$train\\_test\\_split$. **You should present a critical discussion of why and how you have scaled or not scaled the data**.\n", + "\n", + "It is normal in essentially all Machine Learning studies to split the\n", + "data in a training set and a test set (eventually also an additional\n", + "validation set). There\n", + "is no explicit recipe for how much data should be included as training\n", + "data and say test data. An accepted rule of thumb is to use\n", + "approximately $2/3$ to $4/5$ of the data as training data.\n", + "\n", + "You can easily reuse the solutions to your exercises from week 35 and week 36.\n", + "See also the lecture slides from week 35 and week 36." + ] + }, + { + "cell_type": "markdown", + "id": "17494425", + "metadata": { + "editable": true + }, + "source": [ + "### Part b): Adding Ridge regression for the Franke function\n", + "\n", + "Write your own code for the Ridge method, either using matrix\n", + "inversion or the singular value decomposition as done in the previous\n", + "exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here.\n", + "\n", + "Perform the same analysis as you did in the previous exercise but now for different values of $\\lambda$. Compare and\n", + "analyze your results with those obtained in part a) with the ordinary least squares method. Study the\n", + "dependence on $\\lambda$." + ] + }, + { + "cell_type": "markdown", + "id": "79411fbf", + "metadata": { + "editable": true + }, + "source": [ + "### Part c): Adding Lasso for the Franke function\n", + "\n", + "This exercise is essentially a repeat of the previous two ones, but now\n", + "with Lasso regression. Write either your own code (difficult and optional) or, in this case,\n", + "you can also use the functionalities of **Scikit-Learn** (recommended). Keep in mind that the library **Scikit-Learn** excludes the intercept by default. \n", + "Give a\n", + "critical discussion of the three methods and a judgement of which\n", + "model fits the data best." + ] + }, + { + "cell_type": "markdown", + "id": "0de10c86", + "metadata": { + "editable": true + }, + "source": [ + "### Part d): Paper and pencil part\n", + "\n", + "This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of [Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer](https://www.springer.com/gp/book/9780387848570)). The exercise is also part of the weekly exercises for week 37.\n", + "\n", + "The assumption we have made is \n", + "that there exists a continuous function $f(\\boldsymbol{x})$ and a normal distributed error $\\boldsymbol{\\varepsilon}\\sim N(0, \\sigma^2)$\n", + "which describes our data" + ] + }, + { + "cell_type": "markdown", + "id": "b284b2d9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{y} = f(\\boldsymbol{x})+\\boldsymbol{\\varepsilon}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3a862737", + "metadata": { + "editable": true + }, + "source": [ + "We then approximate this function $f(\\boldsymbol{x})$ with our model $\\boldsymbol{\\tilde{y}}$ from the solution of the linear regression equations (ordinary least squares OLS), that is our\n", + "function $f$ is approximated by $\\boldsymbol{\\tilde{y}}$ where we minimized $(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2$, with" + ] + }, + { + "cell_type": "markdown", + "id": "8ca87494", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{\\tilde{y}} = \\boldsymbol{X}\\boldsymbol{\\beta}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a253c39b", + "metadata": { + "editable": true + }, + "source": [ + "The matrix $\\boldsymbol{X}$ is the so-called design or feature matrix. \n", + "\n", + "Show that the expectation value of $\\boldsymbol{y}$ for a given element $i$" + ] + }, + { + "cell_type": "markdown", + "id": "9c38fb19", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbb{E}(y_i) =\\sum_{j}x_{ij} \\beta_j=\\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8d59d872", + "metadata": { + "editable": true + }, + "source": [ + "and that\n", + "its variance is" + ] + }, + { + "cell_type": "markdown", + "id": "0efd8089", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mbox{Var}(y_i) = \\sigma^2.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1a8121b6", + "metadata": { + "editable": true + }, + "source": [ + "Hence, $y_i \\sim N( \\mathbf{X}_{i, \\ast} \\, \\boldsymbol{\\beta}, \\sigma^2)$, that is $\\boldsymbol{y}$ follows a normal distribution with \n", + "mean value $\\boldsymbol{X}\\boldsymbol{\\beta}$ and variance $\\sigma^2$.\n", + "\n", + "With the OLS expressions for the optimal parameters $\\boldsymbol{\\hat{\\beta}}$ show that" + ] + }, + { + "cell_type": "markdown", + "id": "544da2b4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbb{E}(\\boldsymbol{\\hat{\\beta}}) = \\boldsymbol{\\beta}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "73fd411a", + "metadata": { + "editable": true + }, + "source": [ + "Show finally that the variance of $\\boldsymbol{\\beta}$ is" + ] + }, + { + "cell_type": "markdown", + "id": "b7160507", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mbox{Var}(\\boldsymbol{\\hat{\\beta}}) = \\sigma^2 \\, (\\mathbf{X}^{T} \\mathbf{X})^{-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b18ae3c3", + "metadata": { + "editable": true + }, + "source": [ + "We can use the last expression when we define a so-called confidence interval for the parameters $\\beta$. \n", + "A given parameter $\\beta_j$ is given by the diagonal matrix element of the above matrix." + ] + }, + { + "cell_type": "markdown", + "id": "a57a5e8c", + "metadata": { + "editable": true + }, + "source": [ + "### Part e): Bias-variance trade-off and resampling techniques\n", + "\n", + "Our aim here is to study the bias-variance trade-off by implementing the **bootstrap** resampling technique.\n", + "**We will only use the simpler ordinary least squares here**.\n", + "\n", + "With a code which does OLS and includes resampling techniques, \n", + "we will now discuss the bias-variance trade-off in the context of\n", + "continuous predictions such as regression. However, many of the\n", + "intuitions and ideas discussed here also carry over to classification\n", + "tasks and basically all Machine Learning algorithms. \n", + "\n", + "Before you perform an analysis of the bias-variance trade-off on your test data, make\n", + "first a figure similar to Fig. 2.11 of Hastie, Tibshirani, and\n", + "Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to \n", + "indicate possible regions of low/high bias and variance. You will most likely not get an\n", + "equally smooth curve!\n", + "\n", + "With this result we move on to the bias-variance trade-off analysis.\n", + "\n", + "Consider a\n", + "dataset $\\mathcal{L}$ consisting of the data\n", + "$\\mathbf{X}_\\mathcal{L}=\\{(y_j, \\boldsymbol{x}_j), j=0\\ldots n-1\\}$.\n", + "\n", + "As in part d), we assume that the true data is generated from a noisy model" + ] + }, + { + "cell_type": "markdown", + "id": "0a45f635", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{y}=f(\\boldsymbol{x}) + \\boldsymbol{\\epsilon}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ac85531a", + "metadata": { + "editable": true + }, + "source": [ + "Here $\\epsilon$ is normally distributed with mean zero and standard\n", + "deviation $\\sigma^2$.\n", + "\n", + "In our derivation of the ordinary least squares method we defined then\n", + "an approximation to the function $f$ in terms of the parameters\n", + "$\\boldsymbol{\\beta}$ and the design matrix $\\boldsymbol{X}$ which embody our model,\n", + "that is $\\boldsymbol{\\tilde{y}}=\\boldsymbol{X}\\boldsymbol{\\beta}$.\n", + "\n", + "The parameters $\\boldsymbol{\\beta}$ are in turn found by optimizing the mean\n", + "squared error via the so-called cost function" + ] + }, + { + "cell_type": "markdown", + "id": "69061e11", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C(\\boldsymbol{X},\\boldsymbol{\\beta}) =\\frac{1}{n}\\sum_{i=0}^{n-1}(y_i-\\tilde{y}_i)^2=\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right].\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b0ed607f", + "metadata": { + "editable": true + }, + "source": [ + "Here the expected value $\\mathbb{E}$ is the sample value. \n", + "\n", + "Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a\n", + "term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise.\n", + "That is, show that" + ] + }, + { + "cell_type": "markdown", + "id": "3ab15499", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbb{E}\\left[(\\boldsymbol{y}-\\boldsymbol{\\tilde{y}})^2\\right]=\\mathrm{Bias}[\\tilde{y}]+\\mathrm{var}[\\tilde{y}]+\\sigma^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f1c5e132", + "metadata": { + "editable": true + }, + "source": [ + "with" + ] + }, + { + "cell_type": "markdown", + "id": "60f2d431", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathrm{Bias}[\\tilde{y}]=\\mathbb{E}\\left[\\left(\\boldsymbol{y}-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right]\\right)^2\\right],\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "572f071d", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "89eb115c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathrm{var}[\\tilde{y}]=\\mathbb{E}\\left[\\left(\\tilde{\\boldsymbol{y}}-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right]\\right)^2\\right]=\\frac{1}{n}\\sum_i(\\tilde{y}_i-\\mathbb{E}\\left[\\boldsymbol{\\tilde{y}}\\right])^2.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9061bf93", + "metadata": { + "editable": true + }, + "source": [ + "The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38.\n", + "Explain what the terms mean and discuss their interpretations.\n", + "\n", + "Perform then a bias-variance analysis of the Franke function by\n", + "studying the MSE value as function of the complexity of your model.\n", + "\n", + "Discuss the bias and variance trade-off as function\n", + "of your model complexity (the degree of the polynomial) and the number\n", + "of data points, and possibly also your training and test data using the **bootstrap** resampling method.\n", + "You can follow the code example in the jupyter-book at ." + ] + }, + { + "cell_type": "markdown", + "id": "1df7ce8d", + "metadata": { + "editable": true + }, + "source": [ + "### Part f): Cross-validation as resampling techniques, adding more complexity\n", + "\n", + "The aim here is to write your own code for another widely popular\n", + "resampling technique, the so-called cross-validation method. \n", + "\n", + "Implement the $k$-fold cross-validation algorithm (write your own\n", + "code) and evaluate again the MSE function resulting\n", + "from the test folds. You can compare your own code with that from\n", + "**Scikit-Learn** if needed. \n", + "\n", + "Compare the MSE you get from your cross-validation code with the one\n", + "you got from your **bootstrap** code. Comment your results. Try $5-10$\n", + "folds. You can also compare your own cross-validation code with the\n", + "one provided by **Scikit-Learn**.\n", + "\n", + "In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression." + ] + }, + { + "cell_type": "markdown", + "id": "f99f3b0c", + "metadata": { + "editable": true + }, + "source": [ + "### Part g): Analysis of real data\n", + "\n", + "With our codes functioning and having been tested properly on a\n", + "simpler function we are now ready to look at real data. We will\n", + "essentially repeat in this exercise what was done in exercises a-f. However, we\n", + "need first to download the data and prepare properly the inputs to our\n", + "codes. We are going to download digital terrain data from the website\n", + ",\n", + "\n", + "Or, if you prefer, we have placed selected datafiles at \n", + "\n", + "In order to obtain data for a specific region, you need to register as\n", + "a user (free) at this website and then decide upon which area you want\n", + "to fetch the digital terrain data from. In order to be able to read\n", + "the data properly, you need to specify that the format should be **SRTM\n", + "Arc-Second Global** and download the data as a **GeoTIF** file. The\n", + "files are then stored in *tif* format which can be imported into a\n", + "Python program using" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d9d2d89a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "scipy.misc.imread" + ] + }, + { + "cell_type": "markdown", + "id": "59f5b1a6", + "metadata": { + "editable": true + }, + "source": [ + "Here is a simple part of a Python code which reads and plots the data\n", + "from such files" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ab7fd531", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from imageio import imread\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "from matplotlib import cm\n", + "\n", + "# Load the terrain\n", + "terrain1 = imread('SRTM_data_Norway_1.tif')\n", + "# Show the terrain\n", + "plt.figure()\n", + "plt.title('Terrain over Norway 1')\n", + "plt.imshow(terrain1, cmap='gray')\n", + "plt.xlabel('X')\n", + "plt.ylabel('Y')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "271b3252", + "metadata": { + "editable": true + }, + "source": [ + "If you should have problems in downloading the digital terrain data,\n", + "we provide two examples under the data folder of project 1. One is\n", + "from a region close to Stavanger in Norway and the other Møsvatn\n", + "Austfjell, again in Norway.\n", + "Feel free to produce your own terrain data.\n", + "\n", + "Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example [kaggle.com](https://www.kaggle.com/datasets) for examples.\n", + "\n", + "Our final part deals with the parameterization of your digital terrain\n", + "data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial\n", + "approximation and cross-validation as resampling technique to evaluate which\n", + "model fits the data best.\n", + "\n", + "At the end, you should present a critical evaluation of your results\n", + "and discuss the applicability of these regression methods to the type\n", + "of data presented here (either the terrain data we propose or other data sets)." + ] + }, + { + "cell_type": "markdown", + "id": "6555e3ff", + "metadata": { + "editable": true + }, + "source": [ + "## Background literature\n", + "\n", + "1. For a discussion and derivation of the variances and mean squared errors using linear regression, see the [Lecture notes on ridge regression by Wessel N. van Wieringen](https://arxiv.org/abs/1509.09169)\n", + "\n", + "2. The textbook of [Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer](https://www.springer.com/gp/book/9780387848570), chapters 3 and 7 are the most relevant ones for the analysis here." + ] + }, + { + "cell_type": "markdown", + "id": "8289021b", + "metadata": { + "editable": true + }, + "source": [ + "## Introduction to numerical projects\n", + "\n", + "Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers. \n", + "\n", + " * Give a short description of the nature of the problem and the eventual numerical methods you have used.\n", + "\n", + " * Describe the algorithm you have used and/or developed. Here you may find it convenient to use pseudocoding. In many cases you can describe the algorithm in the program itself.\n", + "\n", + " * Include the source code of your program. Comment your program properly. You should have the code at your GitHub/GitLab link. You can also place the code in an appendix of your report.\n", + "\n", + " * If possible, try to find analytic solutions, or known limits in order to test your program when developing the code.\n", + "\n", + " * Include your results either in figure form or in a table. Remember to label your results. All tables and figures should have relevant captions and labels on the axes.\n", + "\n", + " * Try to evaluate the reliabilty and numerical stability/precision of your results. If possible, include a qualitative and/or quantitative discussion of the numerical stability, eventual loss of precision etc.\n", + "\n", + " * Try to give an interpretation of you results in your answers to the problems.\n", + "\n", + " * Critique: if possible include your comments and reflections about the exercise, whether you felt you learnt something, ideas for improvements and other thoughts you've made when solving the exercise. We wish to keep this course at the interactive level and your comments can help us improve it.\n", + "\n", + " * Try to establish a practice where you log your work at the computerlab. You may find such a logbook very handy at later stages in your work, especially when you don't properly remember what a previous test version of your program did. Here you could also record the time spent on solving the exercise, various algorithms you may have tested or other topics which you feel worthy of mentioning." + ] + }, + { + "cell_type": "markdown", + "id": "4349e2d3", + "metadata": { + "editable": true + }, + "source": [ + "## Format for electronic delivery of report and programs\n", + "\n", + "The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report:\n", + "\n", + " * Use Canvas to hand in your projects, log in at with your normal UiO username and password.\n", + "\n", + " * Upload **only** the report file or the link to your GitHub/GitLab or similar typo of repos! For the source code file(s) you have developed please provide us with your link to your GitHub/GitLab or similar domain. The report file should include all of your discussions and a list of the codes you have developed. Do not include library files which are available at the course homepage, unless you have made specific changes to them.\n", + "\n", + " * In your GitHub/GitLab or similar repository, please include a folder which contains selected results. These can be in the form of output from your code for a selected set of runs and input parameters.\n", + "\n", + "Finally, \n", + "we encourage you to collaborate. Optimal working groups consist of \n", + "2-3 students. You can then hand in a common report." + ] + }, + { + "cell_type": "markdown", + "id": "274e1581", + "metadata": { + "editable": true + }, + "source": [ + "## Software and needed installations\n", + "\n", + "If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, \n", + "we recommend that you install the following Python packages via **pip** as\n", + "1. pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow\n", + "\n", + "For Python3, replace **pip** with **pip3**.\n", + "\n", + "See below for a discussion of **tensorflow** and **scikit-learn**. \n", + "\n", + "For OSX users we recommend also, after having installed Xcode, to install **brew**. Brew allows \n", + "for a seamless installation of additional software via for example\n", + "1. brew install python3\n", + "\n", + "For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution\n", + "you can use **pip** as well and simply install Python as \n", + "1. sudo apt-get install python3 (or python for python2.7)\n", + "\n", + "etc etc. \n", + "\n", + "If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely\n", + "1. [Anaconda](https://docs.anaconda.com/) Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system **conda**\n", + "\n", + "2. [Enthought canopy](https://www.enthought.com/product/canopy/) is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license.\n", + "\n", + "Popular software packages written in Python for ML are\n", + "\n", + "* [Scikit-learn](http://scikit-learn.org/stable/), \n", + "\n", + "* [Tensorflow](https://www.tensorflow.org/),\n", + "\n", + "* [PyTorch](http://pytorch.org/) and \n", + "\n", + "* [Keras](https://keras.io/).\n", + "\n", + "These are all freely available at their respective GitHub sites. They \n", + "encompass communities of developers in the thousands or more. And the number\n", + "of code developers and contributors keeps increasing." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/Projects/2024/Project1/ipynb/ipynb-Project1-src.tar.gz b/doc/Projects/2024/Project1/ipynb/ipynb-Project1-src.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b6c496c20958f8daab2ccf578a51f4a806fa0d73 GIT binary patch literal 193 zcmV;y06za8iwFQD7uIF~1MSaE3c@fD1>mlGia9|^Y?`hGUAPd6c!AWWHq~Zol7hXx z{Q+GmZi)!`HjglmFmu?hH~Vem?k-piA%rsqW2QWrlC0+Ugwhl!<2+$BWW{!hkxc%;F*8oSSbs;talY^(CB22c!A7dEl-X{s_k_S v1xh;(!N^;uj0B;35JjP!LM^UgYw&DDW25lb=Xjpyd0%<}aDog000;m8j+<7S literal 0 HcmV?d00001 diff --git a/doc/Projects/2024/Project1/pdf/Project1.p.tex b/doc/Projects/2024/Project1/pdf/Project1.p.tex new file mode 100644 index 000000000..bd8d91402 --- /dev/null +++ b/doc/Projects/2024/Project1/pdf/Project1.p.tex @@ -0,0 +1,703 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/doconce/doconce/) +%% doconce format latex Project1.do.txt --print_latex_style=trac --latex_admon=paragraph +%% +% #ifdef PTEX2TEX_EXPLANATION +%% +%% The file follows the ptex2tex extended LaTeX format, see +%% ptex2tex: https://code.google.com/p/ptex2tex/ +%% +%% Run +%% ptex2tex myfile +%% or +%% doconce ptex2tex myfile +%% +%% to turn myfile.p.tex into an ordinary LaTeX file myfile.tex. +%% (The ptex2tex program: https://code.google.com/p/ptex2tex) +%% Many preprocess options can be added to ptex2tex or doconce ptex2tex +%% +%% ptex2tex -DMINTED myfile +%% doconce ptex2tex myfile envir=minted +%% +%% ptex2tex will typeset code environments according to a global or local +%% .ptex2tex.cfg configure file. doconce ptex2tex will typeset code +%% according to options on the command line (just type doconce ptex2tex to +%% see examples). If doconce ptex2tex has envir=minted, it enables the +%% minted style without needing -DMINTED. +% #endif + +% #define PREAMBLE + +% #ifdef PREAMBLE +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{ptex2tex} +% #ifdef MINTED +\usepackage{minted} +\usemintedstyle{default} +% #endif + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE +% #endif + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Project 1 on Machine Learning, deadline October 7 (midnight), 2024 +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf \href{{http://www.uio.no/studier/emner/matnat/fys/FYS3155/index-eng.html}}{Data Analysis and Machine Learning FYS-STK3155/FYS4155}} +\end{center} + + \begin{center} +% List of all institutions: +\centerline{{\small University of Oslo, Norway}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +September 2 +\end{center} +% --- end date --- + +\vspace{1cm} + + +\subsection{Preamble: Note on writing reports, using reference material, AI and other tools} + +We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at \href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb}} gives some guidance. See also the grading suggestion at \href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}. + +When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at \href{{https://scikit-learn.org/dev/about.html}}{\nolinkurl{https://scikit-learn.org/dev/about.html}}. + +We enocurage you to use tools like +\href{{https://openai.com/chatgpt/}}{ChatGPT} in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. + +On scaling, we recommend reading the following section from the scikit-learn software description, see \href{{https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section}}{\nolinkurl{https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html\#plot-all-scaling-standard-scaler-section}} + +\subsection{Regression analysis and resampling methods} + +The main aim of this project is to study in more detail various +regression methods, including the Ordinary Least Squares (OLS) method. +In addition to the scientific part, in this course we want also to +give you an experience in writing scientific reports. The format for +the delivery of your answers is namely that of a scientific report. At +for example +\href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}} +we detail how to write a report. Furthermore, at +\href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/}} +you can find examples of previous reports. How to write reports will +also be discussed during the various lab sessions. + +\textbf{A small recommendation when developing the codes here}. Instead of +jumping on to the two-dimensional function described below, we +recommend to do the code development and testing with a simpler +one-dimensional function, similar to those discussed in the exercises +of weeks 35 and 36. A simple test, as discussed during the lectures the first +three weeks is to set the design matrix equal to the identity +matrix. Then your model should give a mean square error which is exactly equal to zero. +When you are sure that your codes function well, you can then replace +the one-dimensional test function with the two-dimensional \textbf{Franke} function +discussed here. + +The Franke function serves as a stepping stone towards the analysis of +real topographic data. The latter is the last part of this project. + +\paragraph{Description of two-dimensional function.} +We will first study how to fit polynomials to a specific +two-dimensional function called \href{{http://www.dtic.mil/dtic/tr/fulltext/u2/a081688.pdf}}{Franke's +function}. This +is a function which has been widely used when testing various +interpolation and fitting algorithms. Furthermore, after having +established the model and the method, we will employ resamling +techniques such as cross-validation and/or bootstrap in order to perform a +proper assessment of our models. We will also study in detail the +so-called Bias-Variance trade off. + +The Franke function, which is a weighted sum of four exponentials reads as follows +\begin{align*} +f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)}+\frac{3}{4}\exp{\left(-\frac{(9x+1)^2}{49}- \frac{(9y+1)}{10}\right)} \\ +&+\frac{1}{2}\exp{\left(-\frac{(9x-7)^2}{4} - \frac{(9y-3)^2}{4}\right)} -\frac{1}{5}\exp{\left(-(9x-4)^2 - (9y-7)^2\right) }. +\end{align*} + +The function will be defined for $x,y\in [0,1]$. In a sense, our data are thus scaled to a particular domain for the input values. + +Our first step will +be to perform an OLS regression analysis of this function, trying out +a polynomial fit with an $x$ and a $y$ dependence of the form $[x, y, +x^2, y^2, xy, \dots]$. We will also include bootstrap first as a +resampling technique. After that we will include the cross-validation +technique. + +We can +use a uniform distribution to set up the arrays of values for $x$ and +$y$, or as in the example below just a set of fixed values for $x$ and +$y$ with a given step size. We will fit a function (for example a +polynomial) of $x$ and $y$. Thereafter we will repeat much of the +same procedure using the Ridge and Lasso regression methods, +introducing thus a dependence on the bias (penalty) $\lambda$. + +Finally we are going to use (real) digital terrain data and try to +reproduce these data using the same methods. We will also try to go +beyond the second-order polynomials metioned above and explore +which polynomial fits the data best. + +The Python code for the Franke function is included here (it performs also a three-dimensional plot of it) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\bpycod +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FormatStrFormatter +import numpy as np +from random import random, seed + +fig = plt.figure() +ax = fig.gca(projection='3d') + +# Make data. +x = np.arange(0, 1, 0.05) +y = np.arange(0, 1, 0.05) +x, y = np.meshgrid(x,y) + + +def FrankeFunction(x,y): + term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2)) + term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1)) + term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2)) + term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2) + return term1 + term2 + term3 + term4 + + +z = FrankeFunction(x, y) + +# Plot the surface. +surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm, + linewidth=0, antialiased=False) + +# Customize the z axis. +ax.set_zlim(-0.10, 1.40) +ax.zaxis.set_major_locator(LinearLocator(10)) +ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) + +# Add a color bar which maps values to colors. +fig.colorbar(surf, shrink=0.5, aspect=5) + +plt.show() + + +\epycod + + +\paragraph{Part a) : Ordinary Least Square (OLS) on the Franke function.} +We will generate our own dataset for a function +$\mathrm{FrankeFunction}(x,y)$ with $x,y \in [0,1]$. The function +$f(x,y)$ is the Franke function. You should explore also the addition +of an added stochastic noise to this function using the normal +distribution $N(0,1)$. + +\emph{Write your own code} (using either a matrix inversion or a singular +value decomposition from e.g., \textbf{numpy} ) and perform a standard \textbf{ordinary least square regression} +analysis using polynomials in $x$ and $y$ up to fifth order. + +Evaluate the mean Squared error (MSE) + +\[ MSE(\bm{y},\tilde{\bm{y}}) = \frac{1}{n} +\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2, +\] + +and the $R^2$ score function. If $\tilde{\bm{y}}_i$ is the predicted +value of the $i-th$ sample and $y_i$ is the corresponding true value, +then the score $R^2$ is defined as + +\[ +R^2(\bm{y}, \tilde{\bm{y}}) = 1 - \frac{\sum_{i=0}^{n - 1} (y_i - \tilde{y}_i)^2}{\sum_{i=0}^{n - 1} (y_i - \bar{y})^2}, +\] + +where we have defined the mean value of $\bm{y}$ as + +\[ +\bar{y} = \frac{1}{n} \sum_{i=0}^{n - 1} y_i. +\] + +Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five). +Plot also the parameters $\beta$ as you increase the order of the polynomial. Comment your results. + +Your code has to include a scaling/centering of the data (for example by +subtracting the mean value), and +a split of the data in training and test data. For this exercise you can +either write your own code or use for example the function for +splitting training data provided by the library \textbf{Scikit-Learn} (make +sure you have installed it). This function is called +$train\_test\_split$. \textbf{You should present a critical discussion of why and how you have scaled or not scaled the data}. + +It is normal in essentially all Machine Learning studies to split the +data in a training set and a test set (eventually also an additional +validation set). There +is no explicit recipe for how much data should be included as training +data and say test data. An accepted rule of thumb is to use +approximately $2/3$ to $4/5$ of the data as training data. + +You can easily reuse the solutions to your exercises from week 35 and week 36. +See also the lecture slides from week 35 and week 36. + +\paragraph{Part b): Adding Ridge regression for the Franke function.} +Write your own code for the Ridge method, either using matrix +inversion or the singular value decomposition as done in the previous +exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here. + +Perform the same analysis as you did in the previous exercise but now for different values of $\lambda$. Compare and +analyze your results with those obtained in part a) with the ordinary least squares method. Study the +dependence on $\lambda$. + +\paragraph{Part c): Adding Lasso for the Franke function.} +This exercise is essentially a repeat of the previous two ones, but now +with Lasso regression. Write either your own code (difficult and optional) or, in this case, +you can also use the functionalities of \textbf{Scikit-Learn} (recommended). Keep in mind that the library \textbf{Scikit-Learn} excludes the intercept by default. +Give a +critical discussion of the three methods and a judgement of which +model fits the data best. + +\paragraph{Part d): Paper and pencil part.} +This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of \href{{https://www.springer.com/gp/book/9780387848570}}{Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer}). The exercise is also part of the weekly exercises for week 37. + +The assumption we have made is +that there exists a continuous function $f(\bm{x})$ and a normal distributed error $\bm{\varepsilon}\sim N(0, \sigma^2)$ +which describes our data +\[ +\bm{y} = f(\bm{x})+\bm{\varepsilon} +\] + +We then approximate this function $f(\bm{x})$ with our model $\bm{\tilde{y}}$ from the solution of the linear regression equations (ordinary least squares OLS), that is our +function $f$ is approximated by $\bm{\tilde{y}}$ where we minimized $(\bm{y}-\bm{\tilde{y}})^2$, with +\[ +\bm{\tilde{y}} = \bm{X}\bm{\beta}. +\] +The matrix $\bm{X}$ is the so-called design or feature matrix. + +Show that the expectation value of $\bm{y}$ for a given element $i$ +\[ +\mathbb{E}(y_i) =\sum_{j}x_{ij} \beta_j=\mathbf{X}_{i, \ast} \, \bm{\beta}, +\] +and that +its variance is +\[ +\mbox{Var}(y_i) = \sigma^2. +\] +Hence, $y_i \sim N( \mathbf{X}_{i, \ast} \, \bm{\beta}, \sigma^2)$, that is $\bm{y}$ follows a normal distribution with +mean value $\bm{X}\bm{\beta}$ and variance $\sigma^2$. + +With the OLS expressions for the optimal parameters $\bm{\hat{\beta}}$ show that +\[ +\mathbb{E}(\bm{\hat{\beta}}) = \bm{\beta}. +\] +Show finally that the variance of $\bm{\beta}$ is +\[ +\mbox{Var}(\bm{\hat{\beta}}) = \sigma^2 \, (\mathbf{X}^{T} \mathbf{X})^{-1}. +\] + +We can use the last expression when we define a so-called confidence interval for the parameters $\beta$. +A given parameter $\beta_j$ is given by the diagonal matrix element of the above matrix. + +\paragraph{Part e): Bias-variance trade-off and resampling techniques.} +Our aim here is to study the bias-variance trade-off by implementing the \textbf{bootstrap} resampling technique. +\textbf{We will only use the simpler ordinary least squares here}. + +With a code which does OLS and includes resampling techniques, +we will now discuss the bias-variance trade-off in the context of +continuous predictions such as regression. However, many of the +intuitions and ideas discussed here also carry over to classification +tasks and basically all Machine Learning algorithms. + +Before you perform an analysis of the bias-variance trade-off on your test data, make +first a figure similar to Fig.~2.11 of Hastie, Tibshirani, and +Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to +indicate possible regions of low/high bias and variance. You will most likely not get an +equally smooth curve! + +With this result we move on to the bias-variance trade-off analysis. + +Consider a +dataset $\mathcal{L}$ consisting of the data +$\mathbf{X}_\mathcal{L}=\{(y_j, \boldsymbol{x}_j), j=0\ldots n-1\}$. + +As in part d), we assume that the true data is generated from a noisy model + +\[ +\bm{y}=f(\boldsymbol{x}) + \bm{\epsilon}. +\] + +Here $\epsilon$ is normally distributed with mean zero and standard +deviation $\sigma^2$. + +In our derivation of the ordinary least squares method we defined then +an approximation to the function $f$ in terms of the parameters +$\bm{\beta}$ and the design matrix $\bm{X}$ which embody our model, +that is $\bm{\tilde{y}}=\bm{X}\bm{\beta}$. + +The parameters $\bm{\beta}$ are in turn found by optimizing the mean +squared error via the so-called cost function + +\[ +C(\bm{X},\bm{\beta}) =\frac{1}{n}\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2=\mathbb{E}\left[(\bm{y}-\bm{\tilde{y}})^2\right]. +\] +Here the expected value $\mathbb{E}$ is the sample value. + +Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a +term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise. +That is, show that +\[ +\mathbb{E}\left[(\bm{y}-\bm{\tilde{y}})^2\right]=\mathrm{Bias}[\tilde{y}]+\mathrm{var}[\tilde{y}]+\sigma^2, +\] +with +\[ +\mathrm{Bias}[\tilde{y}]=\mathbb{E}\left[\left(\bm{y}-\mathbb{E}\left[\bm{\tilde{y}}\right]\right)^2\right], +\] +and +\[ +\mathrm{var}[\tilde{y}]=\mathbb{E}\left[\left(\tilde{\bm{y}}-\mathbb{E}\left[\bm{\tilde{y}}\right]\right)^2\right]=\frac{1}{n}\sum_i(\tilde{y}_i-\mathbb{E}\left[\bm{\tilde{y}}\right])^2. +\] +The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38. +Explain what the terms mean and discuss their interpretations. + +Perform then a bias-variance analysis of the Franke function by +studying the MSE value as function of the complexity of your model. + +Discuss the bias and variance trade-off as function +of your model complexity (the degree of the polynomial) and the number +of data points, and possibly also your training and test data using the \textbf{bootstrap} resampling method. +You can follow the code example in the jupyter-book at \href{{https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html#the-bias-variance-tradeoff}}{\nolinkurl{https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html\#the-bias-variance-tradeoff}}. + +\paragraph{Part f): Cross-validation as resampling techniques, adding more complexity.} +The aim here is to write your own code for another widely popular +resampling technique, the so-called cross-validation method. + +Implement the $k$-fold cross-validation algorithm (write your own +code) and evaluate again the MSE function resulting +from the test folds. You can compare your own code with that from +\textbf{Scikit-Learn} if needed. + +Compare the MSE you get from your cross-validation code with the one +you got from your \textbf{bootstrap} code. Comment your results. Try $5-10$ +folds. You can also compare your own cross-validation code with the +one provided by \textbf{Scikit-Learn}. + +In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression. + +\paragraph{Part g): Analysis of real data.} +With our codes functioning and having been tested properly on a +simpler function we are now ready to look at real data. We will +essentially repeat in this exercise what was done in exercises a-f. However, we +need first to download the data and prepare properly the inputs to our +codes. We are going to download digital terrain data from the website +\href{{https://earthexplorer.usgs.gov/}}{\nolinkurl{https://earthexplorer.usgs.gov/}}, + +Or, if you prefer, we have placed selected datafiles at \href{{https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles}} + +In order to obtain data for a specific region, you need to register as +a user (free) at this website and then decide upon which area you want +to fetch the digital terrain data from. In order to be able to read +the data properly, you need to specify that the format should be \textbf{SRTM +Arc-Second Global} and download the data as a \textbf{GeoTIF} file. The +files are then stored in \emph{tif} format which can be imported into a +Python program using + + + +\bpycod +scipy.misc.imread + +\epycod + + +Here is a simple part of a Python code which reads and plots the data +from such files + + + + + + + + + + + + + + + + + +\bpycod +import numpy as np +from imageio import imread +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm + +# Load the terrain +terrain1 = imread('SRTM_data_Norway_1.tif') +# Show the terrain +plt.figure() +plt.title('Terrain over Norway 1') +plt.imshow(terrain1, cmap='gray') +plt.xlabel('X') +plt.ylabel('Y') +plt.show() + +\epycod + + +If you should have problems in downloading the digital terrain data, +we provide two examples under the data folder of project 1. One is +from a region close to Stavanger in Norway and the other Møsvatn +Austfjell, again in Norway. +Feel free to produce your own terrain data. + +Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example \href{{https://www.kaggle.com/datasets}}{kaggle.com} for examples. + +Our final part deals with the parameterization of your digital terrain +data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial +approximation and cross-validation as resampling technique to evaluate which +model fits the data best. + +At the end, you should present a critical evaluation of your results +and discuss the applicability of these regression methods to the type +of data presented here (either the terrain data we propose or other data sets). + +\subsection{Background literature} + +\begin{enumerate} +\item For a discussion and derivation of the variances and mean squared errors using linear regression, see the \href{{https://arxiv.org/abs/1509.09169}}{Lecture notes on ridge regression by Wessel N. van Wieringen} + +\item The textbook of \href{{https://www.springer.com/gp/book/9780387848570}}{Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer}, chapters 3 and 7 are the most relevant ones for the analysis here. +\end{enumerate} + +\noindent +\subsection{Introduction to numerical projects} + +Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers. + +\begin{itemize} + \item Give a short description of the nature of the problem and the eventual numerical methods you have used. + + \item Describe the algorithm you have used and/or developed. Here you may find it convenient to use pseudocoding. In many cases you can describe the algorithm in the program itself. + + \item Include the source code of your program. Comment your program properly. You should have the code at your GitHub/GitLab link. You can also place the code in an appendix of your report. + + \item If possible, try to find analytic solutions, or known limits in order to test your program when developing the code. + + \item Include your results either in figure form or in a table. Remember to label your results. All tables and figures should have relevant captions and labels on the axes. + + \item Try to evaluate the reliabilty and numerical stability/precision of your results. If possible, include a qualitative and/or quantitative discussion of the numerical stability, eventual loss of precision etc. + + \item Try to give an interpretation of you results in your answers to the problems. + + \item Critique: if possible include your comments and reflections about the exercise, whether you felt you learnt something, ideas for improvements and other thoughts you've made when solving the exercise. We wish to keep this course at the interactive level and your comments can help us improve it. + + \item Try to establish a practice where you log your work at the computerlab. You may find such a logbook very handy at later stages in your work, especially when you don't properly remember what a previous test version of your program did. Here you could also record the time spent on solving the exercise, various algorithms you may have tested or other topics which you feel worthy of mentioning. +\end{itemize} + +\noindent +\subsection{Format for electronic delivery of report and programs} + +The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report: + +\begin{itemize} + \item Use Canvas to hand in your projects, log in at \href{{https://www.uio.no/english/services/it/education/canvas/}}{\nolinkurl{https://www.uio.no/english/services/it/education/canvas/}} with your normal UiO username and password. + + \item Upload \textbf{only} the report file or the link to your GitHub/GitLab or similar typo of repos! For the source code file(s) you have developed please provide us with your link to your GitHub/GitLab or similar domain. The report file should include all of your discussions and a list of the codes you have developed. Do not include library files which are available at the course homepage, unless you have made specific changes to them. + + \item In your GitHub/GitLab or similar repository, please include a folder which contains selected results. These can be in the form of output from your code for a selected set of runs and input parameters. +\end{itemize} + +\noindent +Finally, +we encourage you to collaborate. Optimal working groups consist of +2-3 students. You can then hand in a common report. + +\subsection{Software and needed installations} + +If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, +we recommend that you install the following Python packages via \textbf{pip} as +\begin{enumerate} +\item pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow +\end{enumerate} + +\noindent +For Python3, replace \textbf{pip} with \textbf{pip3}. + +See below for a discussion of \textbf{tensorflow} and \textbf{scikit-learn}. + +For OSX users we recommend also, after having installed Xcode, to install \textbf{brew}. Brew allows +for a seamless installation of additional software via for example +\begin{enumerate} +\item brew install python3 +\end{enumerate} + +\noindent +For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution +you can use \textbf{pip} as well and simply install Python as +\begin{enumerate} +\item sudo apt-get install python3 (or python for python2.7) +\end{enumerate} + +\noindent +etc etc. + +If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely +\begin{enumerate} +\item \href{{https://docs.anaconda.com/}}{Anaconda} Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system \textbf{conda} + +\item \href{{https://www.enthought.com/product/canopy/}}{Enthought canopy} is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license. +\end{enumerate} + +\noindent +Popular software packages written in Python for ML are + +\begin{itemize} +\item \href{{http://scikit-learn.org/stable/}}{Scikit-learn}, + +\item \href{{https://www.tensorflow.org/}}{Tensorflow}, + +\item \href{{http://pytorch.org/}}{PyTorch} and + +\item \href{{https://keras.io/}}{Keras}. +\end{itemize} + +\noindent +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. + + +% ------------------- end of main content --------------- + +% #ifdef PREAMBLE +\end{document} +% #endif + diff --git a/doc/Projects/2024/Project1/pdf/Project1.pdf b/doc/Projects/2024/Project1/pdf/Project1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cb9449876ba394a016bc5063658cc0e299902fac GIT binary patch literal 272873 zcma&MLzE`KwuSkpZQHhO+qP}1(zb0|m9}l$sI-l~ue)dO4qlATAl8aW#EJdweaI9= z#p#&n*`Uehmq*s2nOF!J2_1~Bp?P_s8D!1uEnF=LnVFf`3IE>(%^+@N>uTmq$RKWO z^z)}rSg>!rpPnw!d!~(b#=fq{6+sIk zoRA8>NmS=bs)%H=?Y{38*5bJBQ9s)_kc_K@^L7pv4{VDN8h=mp*X--^V&;J;GKdp{ zSw7jY1&UZH4VgU{gc|L2K4eRuGN$jrTZ;x@{S_Oa2x#bsa#^2A4*!uoLS`LHd)eC3)+N8RU5n- zeE3a=P0i7(aL^&Viih*aF*Rgm9`Rk-h;SNu>Ea;$>~q8qm%sj}@Q_t+kUQ{RSUQ0O z0Xl)?Q9hzrGsO#OTgFiWJsDR3;q*~B%@Ee2ER=Q-WIKO+-riC5Ao=nNPwv-h41-tu zpl^ugr5!gN;bI$^8N(_OV&76}lnd&v#v}PAk;N12$EThWP1;n@3Dmf}@|cr)c93!| zig1GX&WSxdvCf-yt8;0O_9j_2XgPT_+J!)xvp2^4!F_n7!h`?rij!-ZWpc2GXKUwN z34v{IULzS_Ze>SL97~dTiB~cSmXum5$zf0VJVC(7xZEASed6P-IhO>F!4@_8oL40P zQi@o0_Vte@D)SSPQrLbhE@r_sc@b`c@oPI}1RP@Zz?>p9P^=MpV5OhsiGF`zRS5u2z%Uryjn3zTL_B-7;;_?y88O&D4TQ_glA z@(eX!@SE@#%TA&B(Usy3P}Ka{II4Phq@r^_3#G0KY878Sms8r#r^&x&N$ioPjKE++ zUx#V%>X#Hzb4+~g+SV~tA}8OSObMrF^QtG}5ns@SQms{2btbaNPAhkn9x-!wcENA30%r6a5S-V|3s^c_{a0vgV*cthS*L zv`N6Y0!0|<=tJy(>|oCa%=kG2vU#AxR)D>c_&9m^T~{C5i;r#*Xlhj5Np;DK@Vs(T zqZ!Zl*&}$u32S*JdCa+daL&{u7Jc?Q)~utVpp~Zi$X-##%VBL;{)Lsh;|^%=7%7zy zIm@ZN1&c8m+yOA;f5OZ|d^sQe5~(eQ(hWg zRK(IUDV^OzF*ckO;X}%$tL_$L1+E&iQ}@jhR*^EVXcrC)16ua({{$ZXqv6llm=1p; zQ0u$Q*wnVY(YHLf29Rt4&FX^=xFH;u(j!}6D_#hMZYd9Y@q_HaF2}vm-7G;8<7Pnf z*rx+nrmXE=lP$}8KdJM?BPF5TBFoQ4%{fy$h8^PQ)Gu%nn1klYVQXJaTFkIb!06`1 zn?#RGw};+E_YD2d=5T$o)@qTyE)@PiBz(U8aVtc2ASyWUywFednPNsVPIYN6ez?0n zrL>z^3`&W(`Os9WTQV@0G`m#_poB+!YcR1iBEr(OEO+kS&=hB##RJfRci|N+>0*xF z2&!JhAAqnd@AMk+4!31&Ov83F<$?etaE`iS+~W$qwV}z#R8?LsZhfvBpk4kj@8xuv zpjz#68HhqmdmvQKg7$hC8mt61Pe~}KhnQ|7kHuWIV?R4)`wduj!sIjEO{5lFkXj01FseMg{Xip@axJF)jPFF6K62S z>G{x)GZ%LNygqFhO&DG z*4HGj<9*Df^La5AI#tfa>*ky&BL@6k(ncaJ(zmzI^Y%tF_Fj!STVQ{zt@%3tI?o_9 zQ#*E_ic$D4N+qH*gNC2)ZV@(5w9> z2gL3njSmlVwzxv-Kg%Dlz-@7p*SNS?3-mkYMC**Fo12!5m;)?y3*BcZbQ$UshkTA!>@D1^e z4OAc|u%83tOk0G1YhURx#o62#4R#M z`b4PgtAHhTCJ4W5Vl?=(jx=+}soHY`|2V?J&`B|BAm?bdl{aQKBPJtwRX<~D4i8C?aaN*Y8RfHZN!}kS#p-9UD@pG~Whn|O}Kwr;) zuHnqRe$Bx_J}go0p3+}nBPs? z^Y?X~Wmi*&-dgq6ZPrJ*^GZvbfgfe-SW)%G_nKVeD4#sZ?S(moyN!70IXh7nva%Rx z4G1!In`A8tH^p1NJ!`_TxmAqp>Pf708qhG8_RyN8co$6-T>=Z+L|HFTmVi=u^}S7U zIkkX*~gZ zHG*f*(zw1@Z#~KC8UvTabW}tE&6x|4(<)*&>X72!=3MWLRLnNj*;Xm0+d?nF7Yv`V z-`j}HkwIx|>ljbbZ{LQZpu7GByGpDs*+B#HwPYug9Io5052ioJkj-O1$@{6BLf{am zIBDf4d^3tM3>k&KUu7&W<%e{X63lcF)Jlc{>5mBzCf7{4(5!J)vcou#9Sr9i>CYb=e*I71=57)tj&tT>MUcr zv6E8YU2JL~Apj}~k&DbaD_JR(=A4UwAY{wH{XuS+7n}@Q(09S;0O%b91H)6eKNYXn zdzo#xi-Mf<29`bgfBZ$G78A+!Hb4gQzA|bU(CBLw;M5&oyFOt!88zUFw`3f$pwCdvAOyQM>51kLNM_XHY zvYWDRLW0zNZZChSJI}f}@?y87V4kt1^ye3cA}2qlNUUF_rBy@xvA{0f*|^(DEE{6X z-VJ+MUlCdlX4qa-?5d34Vw3w*!w-AhyU%7e;L`$79TJ!-3(PPP$Enfg1j957^Sdk4 zJ}AT4q)UK}5zu^6Yx64`z}J~u|2R%>ssv#sf2SZxj{k-X2FAp#1dHYnjjXrb#bcZLQ_#TuZb52#*$(-ECr6PDMM!pHK*g&sNDnmRoOmRh}+Y*#> zvcfWjD}$d#d(u4ea@oA>?#aH#K|yNn!0?)k@$xuYDxrG$h0ik_?GNU*iVT5N8k$eY zYQ$n35R0ftXU=V>&NdsAA>YM|Y#eMY`0N2<2~PxpX5MLKkuMnIu~0KD{-B_Q5Yp%lt?qVSKf-)at0WJx5$L zmA_zs#}iqF9l#pZI(iX%7#I8RW01tEafToK#7pT0bQ zX|qKltS;=Fn9IQ+q*>%QrD+ebz=vA8hBhI)eiXt8 z#jge6P0oZv*Y1o<>qyb|DKBb&r!>w)u$) zu1=jQ&C+>FKb=vSW=$Z;s`3CQ|YC$9kC*wAl=2B-vw1+Jb zuy+~8!W)&h7g^rlFh>|V4MF@Q!K6_fIt-mmTmMB2yXw8D*Ndvta}i%JaU3!9Ejj^g zX^MrbF4p4FSvnYPc~5BLbQ-9Ob$vnL!vyJGY4E~~H=dfqAzO(O6un21u)xzF?#AL~ z<~o_SYP_~BdXJbB|lC(c7@>>BN@ z)MHZ0L;k93#w8J4(CztXGe7*J{3Uem(-hXsGRFm(CryVVFSLna8tf}cX8FWSv|yio zfBVcXl~!WWzbVaOti-!2qqKT}5C#S7r&k8b4uvAeT&lm>{rW1CV15LCD?zKM(XMfK z*!`u%uz3rGW!o3a8ywyl49Xo5+ZsV|_>q5aXQKRzbSft+J+=W5BX>>)LhLZ2Ouzz4 zl|@(^ioqq5kj$3w{cC>lHZUy#GpykhAKs&-WVDb@djCgb+{x`iN!b55K{QEkj-!j zi`9tac+z>Rm1(ORGJ;-6q1i+i@T%myDW|v-Fx)NrJidz&*VS?2aWI zlWg*D=EzbYZM^9R%i;l5hlT4pW<%53!AlnUtBzk5{-w?Hx^C^*jdY?53Lm~5>*CQ| zzq)m91&cD+DvQPsS|hWg3XAkFd1sVUvXBt|!tNZE4L#v-kGj@(ed+ci?a7r?c6kcU z(lB<2fnKS#Jf%w@sUsh%yd10CgqPY>O|SUM-7HbeYIG@>_tsTtE8M@*Q(klW5{?1r zf{|a+{0W^CLNjt4$&KIgwQ2s5ej0>yD}OW{{nxBY$$|d(w}-w9wiya9IYpZN12oZ| zK^tRu(rmH|nflB;r4uB&c^h+$i6@wkYA%io;h!50#j8KnM0GcPj>U!qO;pAt$N_$! z?^?4n+3UB{9|tW*+Q07xR;~=bFGY7+g(-NDd&jJbgSfyU12r}=;}llvA2tbHrght} z&LrSNxy&HfkM!3Fsw|3q`?qJ06JmTFUYDvv94DWv3Hxqspq)CFo@brJm~|GV||V%n~%)q*??F-!mTn zrF3lLPpNlH-i!TXCOm4i{k9XN@CY_#b8T1;pu-uV^#Ea-diMhIHL;I*G-pJH7QOp^ z$tI{+NQsA2`?MMp;vzm>k=hJ`xnzX_S zyFMbjOzQY+kWK^_0YS2Jk24I36BvxqQga5>e#NW)yJsLMXhdqh;yEzUO)HlbBEQ*H zT}Tvm2Yb6m&ifCmBh%G7GCf!d<&tfCA)57B!xl2x-2IC)=*KQ-I-H*D<1!LvZ^T4U=diy~oHe(Auy;+`>D`7Wg-)L!y{p!JPD zaPf_*^uF1&Ifugz`LOP-hS>C@L+}l3jX}7KJ7d}iJHu8>Hlmnm=mQ=^K-T`XG|*KQ zTTq0Pmf>mRYFoZ0?|~Kj(v6-wSUvJysh$SO6r$s^h&`P{-2gBwx(-?IqXElc zC@ea!Uf-xx`El2#FaqVAaU}gtz)nW%Kv%v~gW(LJHru_|GJ{ZTtVpbq>VdmoC{HXs zYBtz64rt{;UovXrc?xG_4Gjd%Vx>bFH{?$R0X-57frp?hf6yzN#ud?B;G50gQ#7}L zh_wzVE&cle^qc-g43~ngo4|}OSv7qsnpa$i_&g1mac{|K64eEgh= z8Dn{y-M!CM@aWa^-`(Z2cRV(wlo=e}xXA&$3qkJrQaA#~C}q{;kjg7Xm{{oW_;=`{ zs?ze}n%j5X4W>?2yA0WgSItV=P-8h*8tsm=P?pjg^dDt=E7CaB0Q0q=VW@v7H|bKP z)`R||0fKD2{kcAp)TYPI3z{Pw&^T9;SOp7+0px9FRf<9+C_XY1xMC9KWKo(@Q9eVfFO`8{$f7sGNTr*P zd6=6aM}UNS(8d4p+a8`M5ceGe38D@7i{9UW(yj05gxTe$!zVRc4U&vkg$71HjiKJA zE7|<(S%mkqf*W`Q7JxbiZdIX%QVF1biP>zvSC5pkSZz&mfdnzAdr?7n`0%kyG<_FZ z`J@}RSXCtEf6S4j$B(fE2^T%iSI&q9?IMz6hHK(lz4pS@TpfujVRcxy-5&r zKyWNLBfq20D#2!Mtu0De)AKUhRtV<)oJi1ja{vAt$fcDFr7PFv%%E8aP(U~<P72zCj3%>pnVND40yvd8}D->Y|zh(J@qMh3v(T;G?t^=Ghr?4 zj70Ods9A_u1?71h8-zD0-pBHe%)6hHFT1ChkX)F3#&4uy*d-;-)LX zx~N&ecsr{|U_4K?Y+Y2A;Y=!BNy;ziYF=zbWaK1R=PRsQ4%@CxiR?v6br2!6&&?82&Y~Cz$c3j8UT^t(XHZOMn7Svd5C3*zfLtK-|;vVauDfz zpJ|1kZV_Ho_;#w+tdaqV`Pq?EdYAhYMUSeEvb|4^sF;<731h_~kwJcK2+Qq)Zap`P zYbj79B<=o2d^vjf!|=+@j19)w7%PNpY|r*u7;{`;)LxC5+JvuiDC1S`$nZ1fDU@Op zeXtZzL#P!#C0C=?aMc`azJ_nNFdDDkd(kb%)0EE!8&a>Cv&ZqGEI6LNJ8oNlAR=2@y?oS0eYecU^_Y z)`d^OzJdNd1H!rJEklrHvZJ;#5KIy@cQ#_d1c1$N_phqx^P>?N5jKUr;kr> zDNWJ~=q3y-^T)*KQ&+!z09J`D%@sse=ij>3M2IQ;3jt39i%#A&vN14?sI_YFIT=UQh7YDpD>Fd#erN0+PS`O4GvVI~OP(NKoc%{1wDI41^La zuYTzLfD{42{z@U}fq#L9TX5DJ{%fZ-Pha5r2`3&=v;9oL*|(KJ*z4_@bRc|QmCIyV z&7>MpWQkr2A3lDMIv&rWQbwqm$MwBnEp^|V0FnNQmj1wobK>lF4cL@CW83~h-Q47) z^*VQE90hFvYRU{e4lfCJHF}XXVO>dIT{yp4SC?!VE$gs<8odkdK9u$E?hpz?d&hFj zc&aOF1UOHA=Y9A`h^DNi}pZdvlomjBFIK0ZPr%VK8<}{n5Uc6dC z(+O-JxOEfq3t`F+%NV~4;Y@S|Jfeg|g+y5GK%eCq|M@;l$I-`)O7Mh*(OG$MuvUKBc1QUiiI zoh2mLB>>q3S36oI?U7~rN9Mv|W*dR9#NW?jIBh(LBbzjdC=?2Q4YG;%{P_wjH7^5w z4n}NIsMFJczYoS9lFblBCOak=f&DAHe9zJj(IPq9GENHIpk9bRUeWsuoClT;7H7I> zg{mg4nP|f$I$(eS2`sks@~V_l18NwRnNl<$SUyM!6fg_O%MH2@p@h8azcF9De55Jx zgxm+CVB-aKfQUpFs)zZ{u>s&avZH_c1iOHYoc9G;Qs@7qQS0}kI3`VR+wpOVcA7^# zRCmE-61H)shjobR1LE#ozS$9yY^#Ip%w)E_^KizDlHDd_;|+v{d+#CTyLMmH5WgV> z`+YF*=k)iGBI&26-Ay;(|FXi|5JN%DW25q#r=B&_SP@n;Hq+4{#D7{NK}kk%);Sgr z`k8w2Sr|Wj=?iXBj1L=^1K@<8QUH=zq6Pp$AYs-nAl0X9s*rUf34Sbbj%F`Jac?@m z3D|I5y=J1>To#nm8PR+Wlw_QSJE`*V={jNFh2e1ncNzI;DTrPi@_j-bdxoV!jO`iT z{EUw5Un|)C-}Rst$4nS9{VW+|UZylE7K)2Md2TO_^s;r-PpST65LVN z%7et~fIuLaNi-3T3!dt|0(Mf{yer@CJuT1~jw>JH|15$<3W8=rS&H z(Oy36Xl4U^fr<2Uxg_|C1X=LcQPKcLS>7NYuYr0B?Bt%wnD>HSxO~1I|4y7&0%L%$ zW(B-&n}9J`m7>rFOfHZ(@AW6PV;)4r-Do)(o*Rq>?USGu>XYW6h6yEL2Z(^EpSB&c z-0F+D7MPT5U>-$#NQj_rYoUor3i|ImtnuXJReMbD%^hx?w-(w#N7%NMWxtVj%vr;L zhoeZij_%R{I`7dHyaj^GP&s4UZ%kcC4h(XfSB|UF?j4rGEg)%0L^9EEwuufw&7fsx zgga*f%yK$LoxC1$Yti%aeAy|Xlb_N+)BDpV3lS@t!8<)&&L*^27A`Av$ z1wtD7duWRd;kl|5nv1kM;Tjany}Zp&CrJD#Ya3K-6da7uo)w(%2n3OOg<`yrjAhuK z>^TrO-t4opoPv}$Gp1rx!3~AK#cT(*8h+_Hm0=*9=!Y~& zqUKvwK$-jHl)@YF6)S&+t<1qnTq?ZhyC_)N{DxRdgQi%Us@PazZ-{soZ2Z{#*>Wg` z$Nfw@74c@a8d4CXX-yDzhQB47##QU!%%|UW*tivSTAD@csegE#Auw>3`w{I&A4I`kcLM>!mm&kYCNa-(?!sc>~oD>xe0pX z%s-_wy|(9S9Xsmrt|{;e*OA0J{r#M81I;IyKGF5A32D$#rN%KK9rz+8ABqH%y_@+R zdMpWX_+w6)NwW;Q6GchF%=^(c)rP0lUfhzjBHI&$=`370ps)s7(g%%IQW6s~uvFLa z7=Lg?uu;Y{*O%GC{yt*qGe^YX>2r&YTX=PgFfY#(V^0>85i6-6rONPg8#Q~wW~_R6PYIyBYInH=O0xrj@MpeEuM_4k%LG| zEX2TnS<09vn%fX9i_wuXl&dB0VICT+3fyySaT$9^`-xoNb|Z{5)_C>l?O~wQHX(-c zD{DU&>Z7~<{=B*2D3L~7-}OgA9UdKA8`j=Sx~z``XTOtHy!{WjQ-Qq{4z%S_u4agD zat@qRVY%+84B`A6{t=!N^}TMLe?hiAPmSh;6fls%{VwcNFM{7uER_^TnJnjfG)Gwp zX+P0OyEX=cY%b6cth?I1;z96!Se7ev1%ANQVJ_9gIQ)UXhb?%Cti#|Wtke4EhbJ^% zv01?`a9F1wbi%3v9^t#e@K za+&S#@*U#Pl`eZ5wVVoB&b~Z4J-a$erEIG5_HRjDG*v#TpPe*UKp~gC+62ddH`@up z7;CK_tnTcv>N4S4wi~KzmF~EjQ6p+r;n-Hw;JtJ_xom*4`06Kc=T_J2p+PvvxG21E zcQerY{`}A>a4TESGB!yuFM>qfbG=4tlPuXW_mm(sKx$#G{=D028?$b&&fdCvi@4lU z@mx=p!*pG#tRK9qyP!sgH0;2%QUq((wS}E028+DT|G9wYLePn1OMN~`l&8slxLb$N zR#kto5UsE^xQ#p{mz5pcE|O-8~}D>f&PSLZqMl zr=LJ3HxLqC+1V@NkKC#G2Es4b?57~E7mPVIbl~I+*>buH&1i%_ODB;{ES55K3~H)o zs`3g`9%9u!8D5yS%Axkl4Lczg>ajrFe!i$EWqYux(~$8erhxeqiNsO^!PN>ZyXuCP z5r~8v0w^=bNdh>_PxOQvhJ)k4XwCaSBH0u4KmHOT@+fdKhz9i1?(^5K&$5yiWZb?5 zx1k)=bupSefMz>-m%!i!tta0&XHpIF@6R#FLo^A2;}8(hu1OmA62h=vp`<|ZL`t}K z1r2nmNr?8=vug@q&wb>gqOI%0kI%NRezHyqXTN(-`c!at;ZKT=#`WeA(vDmF;k`D? zh6h>}0=Kc+~I#c0LSm$1DKYzC#Lywfa zwZWJ%9cpsYG4Hk;TCRY&665Zl>Dtec73$CDzkRiF5n$MVdyJS90H`+?cumd{LYc(Q zZjf{P0PFKLrVd=`$rd8gClTtHx-X;-#o2+9j6q5SBh^UWEfvg_&|(ftM#S5$JAO_A zSj*0h6^N_=7ESK1xYw!erooN3A4JB|1sMR4!YA}L6D$?!03;y*kP3f@a{+e-I9D@c z8By$j=BsL;OO}%By3$ znn^T=FuDZi;7Yd8?O?&%?Ue&pX%wu)xFGLCsT}|qiu86;UqLRUxf7*e-FfGz$6rMV zH^H#UXdwC8nIwA#ah%K8cdpHGf9{^EXXgIQJgWs>`QI5e!+iDv$tryYWOZGIr(r(c zfqE?8esp0!Sj(yUUN*X4Hd5S}tLU!S+{8T1&$vJ+>IoH9zKk__;dLK)hZGp#^%n~> zld+&*p90#WlP1iR;)$%&R0BwJOM)~rLkuQi3(Tl9s_sOov(}rBA1Q0bmfww9J`2si7=rO{% z84QD$DmH|h{wRtwsnxs`#D?32O6~-=*J?&y9%TB|7>82N-W*gWw6#J2J=fp_Zc{U{ zYGx|~0%BNQ+4h^FR#o*dsLR+W66kXg-0}H;BSS9GWuU<;tVZ{l6`=SnvJ|3!@)7`` z)@_0h+zNOq4Z;fLzD_MCqld9cX{R`ZtCKMKO4ZStChmux~lTs!z{hxi;4Jit!5R@h)aLjA=h}S>QjjA&j9J0CS)1T^ShOcvyq`6152pG|DB}(){7Yr<1 zXb)e$7+6J7bTde*aPZHx<2vG8q>)d2`m`R^+h-+QUYwW@Qf&F0=%l0avh(c zJzMZltB&A)_ySx*Rd|A<%+7Jz;=P<2d^vp)MZh+lpcVYbhVY$x7Nx%r2S-g(Z1hE7 zr)if_jc*w>!en2iy5zW?jr#Eimqm8);5blW#}>DtRcBKcO$w@g5F;yrTJlV$qzg9b zRf2zps%g0a+0G!P)6Jk0uS`dS-W#0YHt?5|vJ4lR^U@ z#7!BAOjO;fEU=FbP%4Ut(MG+MuGv7q0CtT!5~Fsmc|dza;<6R`_WW>;EPX4t{HXIg zTP3hX(UK%KuJgFr9DiS};pkn)8-rw>mnbR&IwW&ClnZ+=O@{gWaLL@v8-p^Ds32VM zGeUc+MC%_juU+1nG5(dNa^{s8ejFM|8bsD0nPjOin9m8b^aScPS(tC&snt0xcC3&; zk!F`LX@2Nl&%_SoH2A|ij(lg#(qaojDN*Rv{QjNE?8I2}^r)6kJNMbpqTe4-C2($; z26)#WC7g(4z7_lhDbX=BdS=EZvwUi1^jt0jUnJNTwe`MMyA;kqk-DRw%DZg-|3D@O z3cw0@lTiY`MdDtB1yJ&JsV=8dAC!TmnP^5bkKdNcNDEe3_Hh>2MTO0sZ5)sHyD+F} z0x?%7O7!%)SB1bV4(T|q4-k9NUk}t}tF-6nkTbHhNr`HQU{}<l^mA;HqpedD7yIpQx(e;VuHPi5bg_5rNEwWrhIRC zt$;}dQ$TV-)e1oPQ*DEeFH@qC>?-ujAqil+j{X8TY*PB)t1MW~(uH{w4e}7Etey~_ za}iB6rpg#u{}@_-jadROo-{BAjMo*%XERMmf0E1mbc?5(1-I!|u2;2xxT-n|IecM_ zY!q<*)SM2B&3pry7SNA*3=x*wVMNoH4nl4j2&Wo*?YLcFj+^XDPQmy~E21esX~Egg z+1y1uRC?jc2u<^${;+Z?r`Pf>^n^srwI^2JlpY@mREvuLR%37JF>=lmm<^+1G=`L( z5Qwayq|M}_!IRa#;(He{%zQUpoxJIRVjSdKSnA>Ie79fB-GGC6m?xCThlGE1kx7PY~CKd+iIBTgJ`J~eY&8)2AU6tp`y9P-lvuFzRMy?cYF^4FbkF-UKFqljbV^AMl)j=+U>E}Upj zGyC(QVt~~v@^@jawSA4rKje6n$*KX{9WWf--x0U!>-K%|d&YeY_}_HG&h=mDgqiFA zJf{7h%*o~dqZ31W#SvT+{r>(szTrx@oD@BIYqiu8cAo%ANm1A!W;L|HtbZos zkCh75X?Xvx3|?WqQop@-^A)0-GpkXIJNHn7_{v%)9hX-aItr}&zW?htNW|D?(uBiZ z+j3;}O|!Ig2*aU4t&r#W@0*WySM{@MWW!`<_g<%=O5jKtBhakaS&5U&?p@-6GK3F%a%4E=9r_JnD)I(0~MWXEEUKO~xWcnmB1(iGB@ysTWv|~RHDz8IKW&SXx(f#F;=KqT&tDVfduey$E7PTEr9A!)dsdGGN zI_&2oD8^rab8f2hnynJ=6V#G$Y{ZV~#O|c!%kQF9P_5G$#A!NsYY$IX=U;;#&+61( z+BOutiSrH>>U{qEFo3Gjq{+ClN z2-o0XILgkp$#eio{}JCzid}o!jEcdl>shJ2OB%PVXc2|{92|mytwoo+th$h5yQx4K zVy1bd!<0#+IpAY2UBJ`nNH4Fzmxn-WzYO>6W?q+vJg8lj!%TuhU%>IZvloR`Sy&pk zQE6bB1F_};nq%3@S#R%&N0wY~W0hB;b4aZYcil;E;D`>h0#n|_9XB_6x)I;-HrYbH ztD%d2{gyG$+i9qx+J1m{BNs30#!uz&Uw%eFaU;ACruseevx=>uK8_nBcDnEDk6!$b zxtnv(QEI+gNE5L}4WuVl4-*)HU~CzfIfFXHbl!SBG&0NdG975t!}#1S-#rlSQCVdK zVi16bmY1TQJ}FFi_pIx~er#)*Y-zsH5MZ7T(fkM`O5rcz7NEr75}imR$WA=Rh8O&Z zCED~IIBbR-Z}8_1C@Z9j=)qaCyE>!d7@#eLYy+&-S8nTcrv)x@QCXaEhjTa#4Hwsu zri{9(e0Z30Y{FEDijv01@X<;0FR2zVuX~9ha@M7h|M2I#HTVL6dDyrw^yLaENr+qm=328 zt(Mqm#|cX^Zt~bDvkyrsuZ~&ic+*Q=G_7zrbYPvsXzWxaOblMpSon$EnR_lu=98t}E9a>NihUWt{cM1S>+xj}=% z9(~ioxoXT%gG7%z6L#Gj0!%nnd>LrgVY`1xSB9HDY)a-rbp4<4xY~0Dt#%udC}2~| z2j69pEb)x~M0i%_rb*dM4yzB(X`zUk`keGSI$#Zv{7um{!WAIZNI* zo){pWoEKjHn@JPQ(8`-(l3U`xoDR+!Eou-*9x`ohJ4SOhi=}+a-zac?+rZsAY)CZF z_bMmqoF*Cxi~!90$h@K=ISBzToTba?JX0~FIXtV;)#*fh5}N`ii)1mvF6z>xz0tS~ zC{O;yN!|-*`OO8)IXGiFJV|jY%z)Vz@=1rV2eZ~JU|g&%=T>8SS9V*iS0XI8Po^^f zI;Z>dOymOb0) z0?_}2foHI2Zdf2NwG^rt_f<-W?xa{71UkYxAs9x0$_nxZEJQXDa6DfSiqS!o8{q?} zAw|!RY(KYcJl>0)#bL#)1O5zYB=Oc2cg-HS`CDb2LCJpSG$MU3e}txRGJ?zR{@P<( zI*>N#Zb9;LcNZauVgzX-J*K@w_FZ`>TPlc~H1kJ~i++ifYai?|=Xk9o%v@xL81&#L12)%z-(O&n}T`$&0Ok+M`y0A=%MLmRR~+0BBY_9_~dtT zJF!832uARgt`Mea^ZmAsWK;SRu$TJ3X7woDj}mwIJ9L{%?zfHVY0-E0*c=9@4cV~T zRPcs^>93xqqgn_Wez&XCws4iHI&5q=e)MgE!k5oXBy;Xf&xk}K>bowrHM~xi;%2MH zMKAIclj7il4#BE#qu6Jj&FeICc3sW$n`R z`XpyiYX-oWl1%iIwq%QBy`iy#l(jr(bpSaBO33r+&T}@w9xQpH5Fhxt9u6m(>TvdV zHUh!Y3OYV<(jtHfpZ6dB0ibEAX1DJh=DGb0i@K%+&y;$zA+}%7P#R>KK``(=##)^j zP^a>O%SYdotGofscgg|*PIMM=gw~)x?Z#vVRROz9v5zOstcACs0Q7iYzcp99d+C2>X^fzy@2i7~^xRisC*2TX2 zy(j?>=M1Ac-iQ7(;Cn0cwoiY$gBv6yAnTfv0Iw0Lg7;XKU+D{u6O?_%2{17#clXLF zDI)J*@}ts%rN~k^ajGiTlH&t@W}RopS4|G0NRSNdu5p(PxuYync2LjMSfo^rHLM`s zck5AjTOXwedT436eHiO7bWl)@--*3tD;m?iUvWAX^XeGkiBM0b4+*shN>l)hlwgpx z^=r2CVx*<-Z%a1-#j!#rSOa~xAJk{;nemS~4IcL807q8j^|`Sgn_QR!6OyaVJ9U80 zmj9DE^PR*I&rbQ@rEXs7!qX$XJuKNkBs9<|1%RNLHz1gCcHe|HbrpO4v`IU3mS#LQ z+L;#x?S%Tt@ctk!pXuRlr`ymcFDPryUU&jnSaAVyh7#jMSZ3M3iwH>cplNbp@e0<) zW{=ci%-OkN2;L zn_gjkQTvxSE1d%&XM(DXQ$HCm???&wVOP=at#HaOqh50+oq-KbW_T1dIoRP zk>%~}^|G5$2k|iAQlwRTNH96jq=9xP;8-v0bnfY*PZ^rwgj^L~#+43Y>EpaDAtz`} zmR#q$yJR5;UXdIW!o23aI5EE5`ox&%LBZF>7xqchJw>0uj)~T#~E>bi<~qp1Wrl6|EYDH&@=HqS6MbYScdEr2em{| z1ehhktDwW!2tMEFpB7tG=-FgEt7Vo@d}p?_lZQ*!9PghP>b?2&Hx6}+ipM;a2QtEE zz4OsMhbBAHpXLp-S}J$1LlUCRpzbdFzCVDsb$GdiJs`bKM_f3o4k~FW8wGX2fQxeO`_Q5#5tq=eC2Z?bS*cjXAP0(59HF+ zq|YoqgcqYXj^lsaT7i9Ags<1DTf2u{<*=s z$!s{zIRh>HcB;xj7YSY5-Q>71eqGHY+bL;7VfYNCesBCE)p#A!Q>ozmcSl7`&ui`n zHRPu&AQK~rGa83jhqch(?U4?i(ahjK6%!lle<~(MHfE0h?LH@4LnC%W6vgMI7O9R7 zmA+t<*X@udb1()&cDW7`D!{EiuPkLSjR*~oX}M>oqQ+9Os3?8QTM>WgnzN_E5%d1FYPea3 z&K9-MO`Em^mgiQVGJ8a4ln<-Oa!pRkZ}beJO2+|!ifYbAL9s?xq26moj5|QOX~lSH zrC6LtccYKSJK0r4XRaTDZHCzv-~;<{Qm~E~Mg8;iinyCi8aE$XXpBs86&VEfdh{SC zPR+9`=c%!VoncDzbxm87I9cQ}-mfi`O`bEZ`y z-)LE*sV@(sdKD{@`BH5{?11q{HI;e1f(HIL1N{8YMuy54X}R9>L}LG>EjaLmG<=(coMVpk>YjEXmP0}3yk1#x9> zlGbm;MKnzS9}zM3N4`bLiESfoCXTkU_+~TWuWa}Y8!hW`rki9N9&y(_22ODdg}8T0 z~|@9i>+|RR)lN4(+XZWYJ_< zBRvr(AC1D8oI7HH;{kzd?#Pm3?EBut{%rz(OebUWPcz?!y{&Xpk>_F1-gUjR%qk(> zZ31lnTJ$NOy^!2(;JC9>L1F|@k~Ry}3h36*8m{J@>Xp;8Qc!-y?e~uYu1D;ivK7^B zm9#-05d5nCS-HK#5t;z86#R&BFM5qY+PdxKxA(v?KsQ6r@-Fa&uibmWW)0$2z4l4y zC0K$uzL_s*aa9TxE)x6t+^-S(DQmbD0B)o>koV3cr>s9;9M#-zeFWIU4f|^HnG*~{ z7NcLBGdvWPEnDZ?ZM36MiNrK_N9a&t#fl-KYaygT!F za2zVC7-n|N2`IO88EGgymM>m5k=QQK@3(-}0Gtk^`11CBK8vzQ8q%7?>tAU~dk zw7%1zvFgc;Ob#ijD=`a4-0n0j`L0ob$_;2OvN>gKwVHd#GWk@Bsv|35Ni^&)!-S4O zU{=9AGYv^teTjOA9U~}w_&#bpB2oQFTkt%n=BM5<3O&0G+cr)9#fmpED*i$m9d|h* z`$I>)z&!-93`0}Lkfs=>lGEG%IC`w!@gow0zAwC2VCq5W%n=}BhGi72EztOenFve8 z9dkAJQwhao^NsGy)uy_&MX}#^p~$7^0B9I<Ow_hw4cW z;8;k|V6+PQ)J&qy$i6TL`y&Njhf|a%wbm+>TGnw>!|QqobsfwR3A0Gc4OY*%54 z&116{=VwH)T?O{(F;=kFyI$qMY*6 zEDurahsT~YV$EnrhPGJhZz|Gdb~`k$KWLxnZ_sRqg+3(zXTQxhFJ?4@2|4+X6$f&& z?-M_GgpI{@1NQ4ZXmwpp`ltL$l6;-x*o2QKz+0K^Dz`STixMT)nyY|-tJ-GhmYgV3$`89_8H|W|PqPzrKG_Xdj`FlUsi@wtCpS#OdE41TpX7oO(Ja z3H`s>&Ptep2RYg+kS?O0WM#tZQ>Udgbp#gXj`11>&rwmBB_)nbkCZFryI{&DdPwG` zTL|V-31|QW?G_Hilxp4D&h;@=vbZsI-=ddf#r&5I#`we5UO9ynWugE+`aD5IX%)hh zIcgfxwcZx-wmIC>DH1<~ac1{9$NV=h`y^FGt(bxP6yjXOwokau1l5M6=^m>b@&LH$ z(6>FLobdjaCIKmJ!JHm>lNjAe8(ww3BL9o@T|0CEr zL7_pPbPmu9OHp;21HyB}`J(HUjsbHLF|=zRZs;LUOQG6E0j20)=vaqD;NOBZrkIKY z&`b_~=34xa>B-Wj86mLzES(Bv`7HqQWr@g4bgIRl_Ey}WAe@s3)==RgK)mth5N zEyx0felT8>J1zW#6b;)~WT=vAiu^{_PoF?Z;SoycjfI~Z8XynTID_#XB}_gbe#>JF zpnT>w1U?}1d1%#4{Iel_9$&cA-$u(~;-V$>h@kkH?{aZ@I+6V1Y_Mmy`W~0D1X~** zCZ1#5E6H`@ORFP2Co!n=#1-}FE{#tm#IeG@`2EqIORER&69y?5WtUmc1cAUMywaKm z>*XPNt`0FxWxz4VE{+~M8ONORXB-M7x0Oq;Ic=cMj#ME>Zel%A!SYD)ObUlc;lT*F z?Jwr)>j4B>+t(6J8Lc^pA~6LxuSWc?zoS7qq#E*{MIbEK*V1D=>|IMm8o9`WR9uo8 zvPFx+24IWAf*WC}i4}oJ&e#bWhg;6;Eu%RU`cO_}H78k%^G()|FGZ;!|2VRRVHJU# zuZd;sA%E16{N|RcPhb6fbyHcmIpqT|-N+|25DS5RKlD~3nqczA)C<$8N+|Nnk6|Ce-ik^^d0&L`rN%~B|ZCWO)0 zG@s>&vS#1Cp^C=sIMQG^W*FwhIfQH#c6 zuQgwEiQ`ev35fhg3V3Sy=BE>21awik)SBbwU7l0j#t{R5lB@_Q5Eb438XL~XEWsRf zgihnT*IT@P?=E z+1KpAB@17Whi~hUety|HJWXwMhFL0LSRm7=#w$xEiJ+mmQz$0?<6gYe=)!+JAJfV` zxB;wsqP%x_*XN+q9t$naM{Hfc=;vRj5*^Na*m~%Eg0!xSP@R3oBx2niJxUcJX?} z8#Yy1ttQT_qRkk$?L2 zrwB79Xpl;#i)zq_1XH*4?uRZ->HKMYwNFfO;M*gK^*?bUK4{556FoRy$!v;%uf7cV z&S%jQGn>nMwecw0aHSbcxLR&H)d@HI4QMH}b!TDk&kf`UW-^6ASRgH<5~nqrpVno z`!+}+t`-LlFlGEM4)lD}ocN@Gbr__EY;56ytSzfN*Ul_Jbxuj-ooI2*(Zh|^eW&b( zoa0ZeWphWqu$Ado+1?ZnQHcD=Ipz24uu2P6LsIp?gl~G@Yoz=ob~zl=va`E47G23F zy|Imwt!uT><)M~55|HIoqnHz!!SncBqFB#B<0!9>V`MITPQhx6#gRh`|Pm z-*3HhmyblxE>IedM1rxGZ9=4Ay~IX?bNOiAV`!d+E-YuH+(>O0DN8$UbXr-^d)fyb z!h7BP96x|(rtA1ByR8K7L7Il4%8{hMmOi(mFibU%zpVa~F6Do=e^S%42tJuUMy^yY zPC0K}e`k;~;WoB^B=NZmZ*JcILJU5F0{3NdYeEW1gd4@=5iW(jz6`X*d=B}}8D>Y0 zcjXU#`nMC*$!jtE7t!|q@vE73F%QoFueIXwz#)UH)f8k)>fo&sl`4$t3mP*=P zdN6^$0;yk1?L+5Gq)k6xeRN?YK-b1MO0rOCNL z+5s^GDY5=4@f7+%>N=**VV_YUWK_X@*j$xglFRZ|B+4%hz&1U(5rQwQkm`2;!iMcgyC72t1*RDiorNESi6?j{n8 zxA{%^rSB$bb@!(keY|_ffZ6g1EJQ%O{4!S-#NPZ%ifP@*IzuOvWOV5XH3poNTelbJ z-J4;yhqXwN2j^h&qai;VH`S*1Vca)4+v_r;%>j5s_|&C*ttpZ{wW4p3v>;%4Xf#Sv8K6T&7#~Z|J3l;S^1B$d&$(x?WAFveIwpCY;E8iXNdBB zD;~Xi?>zOy*L0>g`$f3nc8OzwYh1>p)?8=-HU#O65URtbjwpYIV9$8Y>hnK)w3dYs zsVv8>^9*jKT*WU(-q5}(e~y!Vf+Q@Q4rE3rBb*bsP9BJd<7e_UU+56)&cJ_+hlZmP z*q>W|U`0t<3rd_(JAFY2O!Y4LMAt_M-zYXRGAJ#T)ar9P&R^0?xaHB-p(*d|0ciWh zXTYPSY2-c*y>DIJKF=52j_of%-LV1vE+m6p^Ra{AuT$%T96I8LMVZidyKLT)-1QKi z$nmU^1ntYL4|``~boWjgtuidA&E;le7IQWILU!ReBfA5{1)~z(t_RF@B5C{iU&=%^ zEB`h>cj{0W)vnQ-SBX%&vhmFJvU#+dr8=}rA1E87yu@!?1-OCT6 ztDnEKS)WctWriRy(sJ~lMS7xQ>4thk?pF`HB=2?cTo)9J_09cGtG9f9M&O|=QP4V|6ibUj4W*bYj3VgV|#+0uorv7<@C;@_XAG(=fJDkI10vaj!N)8M91ukL(~ zO16%}Hg~+iHh2Cq^J3@XT92B^NZm-Xv5C)GFFl}Gl1V)^AY7FB@pXLDH$oEA^3(QX zpxFla<=9Ogg%T&0>GrEsB<-m2iKfc8*4pNA;Q7xOXmb}bBXmfjRal;7OxN5%IqBO2 z`tc*Nvn<*(UTdmJp^B%a%9hUx_PSB6zASQC3Eu!)UOi$fTZ4GOP14>B_W{_t8d&wl z3s$U?iff&KV%#}CF(KE>82c=!cgHm#UDsjO;s}hJ`;i&fiL`I6!eIxnu=3crvNczZ z3BKdXTwcwoe3#CrpkZQ>87y*ML44+8py(R+L=glf($B_!j4t(8NbSHyP;(0y-p+gp)O@;yNP7$3jWH5?b;uP9v%QE{a!g1+c8G17uiu?Jg z&NDkG>YBSb7I9=|#r;?8s-m8!d0IwA?-)tAtp0<@ZJ`QoVG@9HG03T2iU0d4#W>L2bmvBbKA1D7wld>H zV1?Q6!xYD9M??4A9@5nN+=Kh_7k23!jW8U%d*G94?JDXc?rToNKxAf|LyH73Q)8H& zp~bL<`uOfyk=qN_EpWlDnXdL;Dm>l8YfsFsvfuL%XGkzPh8RU3@#ShNW32x3__QM#P-ZdpSZ|YegM}HzqrV4q@_xvo@X9+FV*P1$*lgRzC7DX!J3Xh zLWukQK1@RY8GL+j#leU$p4S31^FDLkV$Ez|U0SRZ;pAtHU z(#+0u2gZe+|H+x2*psbiVzEUYBA8ZE+t^{#}s=kFZ$KU5mlbL?Ini-cMNTE?6 zX;Lavn85`R>=t|o%ox%4Ff%C*$io3Q%HFCFhALgzj#)EshNAxYf92s7N#d!8qAMl` z`*o&m4IoD&I`g+HBf8#ZAG$k&GYttKX#a8?S;2^DV4hg(3KHt;@la95S3e)z9m)iw zxMbJTibw-1`_9lzAI^eA+=)|Yqj$4Y{wXAQ1+x7@yIY`JdLC^2Sb0P%hD!{B{~WXM zbCQPo3~E`d*elQ}2C)(24G#ThBQ=CEs$BJkPXmFbRn@KB3KGc;A}qrkf9_JV{RV>)gXQFDCo7KG6M4dV4jC1 zL2W?Qy|!cR`YqzWU9qGbe+mL={qn*ccbwC^sIbVPQ1gh03I(N#kIuio2Gl~x?hf;z zV`?UWX87-`K^Y@#s0#VHZw&zyDYRzluC~ce>oRb$nnQ0v!D`?9HoVX*rLH})j04RI8g_#g+LaqJjR-& z{ke;9rsn4s(S#i9ccU7cxCqo)j99dw`T+uAiYG{oly~LWM2Mhbj@`ra)**CVX1V!v z3fPB7&#h6_B$CV%m&RbueP-8}RGv)J&IlcUVy1A(7yPCGX3X`R^q;xBCh;Ocm|&K{ zc_m?-^!wQ6H&HHP$e-D25kAs7k#`>-gZkb3bJ5pp%kuQn>xJJ+R5B|V{^69PC#6rkJNw=+Yr~PBdJV0u!Fa53BHMceMtj4BAJpgReR#rt|24JSoZ`wAa< zuW**dTrWUY&T!T=n9e{9`>^V3d!*j?!f$KZkF?SZfy1@e^(V)gET(gd1S#L)4xra^ zPynSgR&*ZdoYW3yOXc%xSa3OEQl(AYIgD;1>>jr(Od4#Xi@W33=Pw|j+%#iVB<#4) zb^o5FUXT7BdD}^cgUp`1Web<$DkOKTVIY3kWVr$RmKzs9X=$nbqW9_(muowl1PFkm z;gBE-uBd}pF(X^$SYc)S`ms*wqu#}N5rOEXz5zg|PX9b6R761nKT9^#znDrP7l(*6 zjlPNOfh%ewbcOg%W(h=_mRYIIFb!nw%`m4@?R#^*8b6)fEKMDk`$;HbMX@3&fpv^5 zHX8bOLCsSZwYG*@1oLRf(PW2ZM(x(Cn>PIJie9(o08`?mwvL1VsgO0;%OgFSZi4z8 z<96WJO6*)CPnE5+Qu>NIsIsR)j>qzD10_|+4~CKi@0rz)u*y-k=N>C_b z`lk#~hf{B?!f%aNx}5V@$BM^PIM9{OPbQSH8F?+uoC7N)ax!n;2;D3c5DL0Cgs^wv z?J1GY{g>_4J7vj9sj}1JdSX`AIKrYdW4o1|7n@?}Mx$P9%4-MxoWc`4FW?Aqeo|Ui z5iA(F$nl}Yp3R;&41ZZdx&Ja_GBEy^{Vx;a|GLm2SzRjeU!lXl`+T!B%1aSaNV^x9 zYTUAlnU3Q*${Z#qe#nH-&8TBUeOMPefPY|Pas;+aZIaHlt=IPpTN1zn?b_EZ;oi?p z4xg7tf~DG!O3pFhWI=XNf=HisEj)X4oSm*gCkM@evT^Id`Nir{i%7-j8IoebywgcZ zNok{H#I)jtXrE(?dGS>C(RZU%WKjn6$&w4t;Ep+_#Y${@{$3;F`!`p|2-9Y;9G}aF zkfvxe*2#brdln}~beGyE!^aQz4{oyL3THXBtdwFoYb|-EMF*a2uqf^gq9o~@-Yyl2 ztOb`CyyCokX+2#ap6zORrv`uSFf7kq!3Oe2~F65Cs%= zjDGo?)&f;sitf02i5GF|wWWtQE53p!mJAIPgQBMa`ja_2pZAh3MjE!pL!pRB470be z23-daHj;5sa7`fx(&O(!Yo-)l9%xbwan3MiT9Qu{2g1YacG24+A`Kf4emxYmBTW^; z1MQ-s^Bv9C4)Oq9&?ld|>)M40ve%C)J@c{$C6k~(O=@+_FOUnKyH179xSKlZBIYg3 z(eJ~j@q1L`V(gLgLMYQb&N4QyjW1N+zlTwfPc&o;@B!#kXHBGSYIEkl|2jc1AgW_e zva{FDtLShEijPQWEigu1?^aI@V-3iHS2W9{s3* zN{#aUr8|kb_)tpB7m#OcbF1HwS9H;%H&_qQ<-#KhD}-gYo0OA-8ANhOHYtCp$DJG& zQHhiK-ptOLK{N@eJ|+ zXL>t;EYh$zv|^kc?Q)z9KFW}%*zeSCnPIH44h+o+n?%V1LMTTrunX*?9wlO!c)UnHf``dH*pnh88itAB01dna1($8d@~HY$2sdwxngd2 z-wzLE^@F{S?>y81*BW%lvFJp_Fgr^4$gqw*4??zbd8`?ZNyZSN(MUw{l6Gtd1geNt z>G#bz6rpp_Mq2^~@K|cIB$`@C#oktUi#^7qEStd2ItNR%3BzS5zrSLA!~VOl#U9G| zV?q#^WhjcdPNlsl4KVRmdL>TPexvxl-@!N@zo+P@t>tYS1b{i7RvFAr6Pcv>C-a!D zsM&u3dR_^1`H@blYcf|1nnY*T=m$M%Q&qqr4uPH-(^~C#m@Sd9Mz8V=molGsBBCS3G91`kF>E znrIAG9NL@stf-B`sC6a@a(_U$etC>01W^z6c^s43d(Q~({v`ql^-1M~5CGz=C|i!B zcsOl*nlpaS?!aTWuct&NMCl_>D8Md0t z91${sz)l{`!F0e<6v@~7>3@?C{h^|D^}j6e*c6`3ZgibDK_@JnDx3>2v1NY6jE_Jv zW4nVG%spEA46hZU`LdJ8F3p%=+yV@&wYjz_&GC#%WDIFj2BkvE&%ZAi#;^&B-@2pC zeTEQYjwBN^Ux$B2z%PKnayrOCs|8#BUefs>Q}zE$CFl<}!`Q|~mj%b1K|Ub=VXj%g zZjaxttDVgZFj29pLGZWF52`cuDh1uaE>e+SbI`|!SEZkxJQ9cT^&eUw%GSUssA6yy- z07n|$hKh9~066}c7d#T3{_#~H@!<W^8c)#X2POhO zjn%=V+^&XSw9py#dn<&>^ELu4dwAtmi7C7Dk)iQCAaHJcjXPX4I zfn}scW#gVdq^l)V7@Juv5+Mkmnia#ZG8D;}nJSf#bi~xs7s!0L3F)$Rfza5+lXKyH zqh;sA`WQKW(WX-DCv*gHP&K40>zd>1bq(<`FNEd??~N8hK4r-`J|1@@Wro^CR1-HtP_y$yNy2>%wq3agaefW{+TGVJ6+ z9oNbw{h@}{GYQV!?6Ap=L2#jR!GQtXN-a-WI5qImzyhif@=nun?E4Gt{jU6n5-0*5 z4;gxw06&G7qxZjzS&aXMrOC|vf3xri{{MTkrW9rDHt6BHPSj4xL7OeT z*LhufGYSB3nRXWlF$2tkxKwdTaBnXQp|Fb(F4%PfkcwW13&iCxT?H^UY)j)l=d3TW z%Jz#1stmy$pap^ns^Ue)GMK4l8-@6HVN*{=^aQ~O{C?h479|h1uI|jUlXD?iOzDh1JV&YvRua;P zh0S67q+`3JtiGa`&Lu!38y5O2jY^;U^zwp!zN?1^=>#8tGLa0f3mqzKF8|SyQpf1~ zri~9MI`A*r|2zu+?|EC<-QI+NPR`I$$;k$WPL|*wUG;yCg5zH&0(K_W|EFM$>0co8 zf1AhL($cWo5dWV%rn$bJ3;yQiIRK*%=&!qrU%E)#q@n9FJ&2~EwXLxN5(U}Y%ZEy0 z1c}!4XwnIze&Up=bA83dX)R*Bd_R;>Ka8XVyFmh)Cahi4tmt4~5QZ=%3_Ofc7gT_D z6A=u|bPfqKaU5s<7?*&#HT2D`br;HSUs@dHgFye+uZds`F$nq2GBsmP4>x`r8&_z0%f(f5ZHzK8e(QRl=E0gB{5BT2Z0?icGM$^}ygOU&{s>&qZ7=+D;M|Aml^ zIk(8Q3O++LU96K$dCWe0-^#|CoZ17Oss8 z-ZM`iAb_HvnvD$1h$Ickj#(2+9sgMRACLY!%JhbRZGZ?YuxNL+;#Cnui)es4AH0uA z9GMH*3zRfh-+IRS4W2J7)vt+IlpOe0mQ(706#>mvyqFp8xp?!CgnDU=HnjKC zAy|b@^dZ+NxoGlkW&g_GB=oZU`cP8AKXECPoQ+a3ntX6KeXtA zZ}2?=HsRtYRu+3sH?*@ZN7LVOQ1w_QESe{Y$|CpihhBzO-1zOZ>n0Orvl62f`*3w` z6J{HivB$2@4U>!oo;{q`{7vqJczo5o-u6Yl`R|U3Dl^^hI$l>QZ{B`tS9DrmJrz2A ze{^fkMW-_hu2dH~G|`u)a8@!KGE;T#o{hA!zCPFE{)+JAs^ZI5z9n~F+nW0Rqn#R z-5|5c?+SlTx3n@$$WmXPc4H!f%AkL?S7jYPOL%{J7EIu(O+3t1v#^p_!ma zw6&bhIEwB}=k>SgN`x554VM)?Q5$ONpc$VqUBXS5V<3`@?h}I~MT1Z=N``~`DG2aBy-Q$?wA5W*qfNYM z0BAZ5A$i>QwwvBy0t<0 z&{*iAFl%JHD#}_KfO^KL;SsqyllO#?eXwZHI*zb(Usu%#I}i#%5w*!9B+$U>9LpA1 z{u%p+U#tH4{M3tg2K9g)m&luWvt$Lhh0PmF-UJHE;Rr@tLf6)Z#wo(h8}`=;c|Z)3 zVUp%(s1G9EBGu*gcfe6&g)$mVF((1<8IaQkqMc-nUBIM(C4C-Cqw=ZXcK}we5QdqZ zFpSQb5sVVX9n*9z&Wjm&>K5&|zogJk&w92j|2>kUNNuFk_d%gw+sB5XA}MQktQIwF#3CDHt~3bmzo zw#Tl{Zx3spi>#rhVL1>F_r5q>*vLHjPn>I9;3`8MbL6Wmfb5sOI{OFr)3j}Fsv*@q zq-(Yx!HS7Fu+U@3$hXVq?3$@5jUfZS-xG79g6_T%I zbGyPm@z>YQF^&=)>UjK0lj%IQ$o&S3Z8QpD6T>jpj=UWGsX5TRBeOx6T;~W|$YiX8-lfa&h zhd#W;hq=u$>FyP>$AVzp!dX~c&+L5%jR|v7|7Rpg^ik)=j$;EoCR1nl_#X8~b~%LG zTH9+vUQu^Ge!r!Lce4cp)~{nnm6;OonGAOxV_-!oWozrXWLg@Q}Bq68x=(if38Arg_sZ;UP8?wVb8K3U3hD+s}B`cZ->a zs*@su`Ot|AQ4(UtNRwNOR!P!{@5PtHNeuhQ<;h{ZWL+)r?6V zW`9qhj98q(eV$jOfi?l^=Rk`~Ph$8&wORpA+d@?U0S~(-43;4#8i}2?7D*hl=}xS` zCE)(tQq?3ivtMt$!YX!+O&+BNO#Z0Iw5dxsJr+(!EXb?B zOygSEkMIgUK@q7lU4L~CL_7H#3dM4;X!!6SD}h2+gX{0==4 zkz0$L@eh1Vy7th3f#)XZ20Y#O)tdOKRHZ#)=-m>Yy%7FzYO52@S!lzNi|XcBmevNc zR}^Ki5hG!_XC^#Fv{Z2UO1vCCF8DfRmM}7XzxBSq-)R->!KM{^zT#A^sk5g})6#uQ zNR7xA+L9B?80^VVQPxh1jf0o5JU=<)_TAJ6sQi#*>7yMbXI2bi2<~qZS93@^(G}01 zyii;BodMbo-(r`l)*3`D8{D4rmo~hc8n6567d78a_X=lD9Q!WOj=Iit+t;k6ux1AS zPSunL$N9-plj%^o-FVtDAo*#I-><-?@_tpskQh!U|4v)Sb%TAR2`Jm;DtPA52!NLT zk^}EB0MG>b8Ptnuj7Z#)cIJ^c92f>)_=1E;vJA5z;f-0}f}Xd_4<0_#&5dKUVbJ`` z?!&csWH@>IZ&m#8unOkBB@f=?{lnXIX&BSCJ!=IY0tj;|Tb7E)C+mt3Bw-99tDUv% zkES~Tm#+QaH1udNQF{3e>YeF~7mZP}ID|yz2}mD?91pjc6`-5vJ4ikZe1IuOyAM&h zTl0oTVyI-Sgsg4>cBA@Jjb;i>t=yJ`@cZ0`6(XEnE@J%yQh@M0Uo5YL(|P-gE=W@r zmvmZwT+_f3hf5N9K4*N9Ggctf6WI`0>#0?!OZ)Ob`7+Cxh{ZAupTY|&I_4nk#r=|@ z`MNtcJmZo4b!`{wWH5c@82D!+k;DV!8)nJrL`?iz&OM=8f$sX|WqmZFAqWqR&2??Ag)#Gn$rc1HQYe*ui_!jf3RC%0*-b6a)GRJ{wWeNc(rHgN)EyDX zQCqZphcH;OTei3V0K0K#V)AB<7}{=-my&{AJB z=GyO+Gxco*qK)C_vZ50+Sx?KL3nKFBqDH`aCg}AS&<>9L?AXziUvC=-;b`Bm+9+H- z5CH+v3_J5n*1pFV zlZHgk_g&ssUx1CY%WfTo`xHVd6JAYD?clNGAJbA}HN(=NC*lS|(+KMt=j{UoS$b-} zU?Vc3hD$!mk$@Q=(*_Jf#{Qn5JzA+XK`(k`VP4D_S_F=9l*AI=9g`nu^SWujjTM=h z$8;3gkMbYfqg%zbagIRFnGAN`Ij+?to#2; #De#{BxA~-3`Fr}y|pQ1Ddduo#f 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 `XX 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 literal 0 HcmV?d00001 diff --git a/doc/Projects/2024/Project1/pdf/Project1.tex b/doc/Projects/2024/Project1/pdf/Project1.tex new file mode 100644 index 000000000..eefb1ed98 --- /dev/null +++ b/doc/Projects/2024/Project1/pdf/Project1.tex @@ -0,0 +1,671 @@ +%% +%% Automatically generated file from DocOnce source +%% (https://github.com/doconce/doconce/) +%% doconce format latex Project1.do.txt --print_latex_style=trac --latex_admon=paragraph +%% + + +%-------------------- begin preamble ---------------------- + +\documentclass[% +oneside, % oneside: electronic viewing, twoside: printing +final, % draft: marks overfull hboxes, figures with paths +10pt]{article} + +\listfiles % print all files needed to compile this document + +\usepackage{relsize,makeidx,color,setspace,amsmath,amsfonts,amssymb} +\usepackage[table]{xcolor} +\usepackage{bm,ltablex,microtype} + +\usepackage[pdftex]{graphicx} + +\usepackage{fancyvrb} % packages needed for verbatim environments + +\usepackage[T1]{fontenc} +%\usepackage[latin1]{inputenc} +\usepackage{ucs} +\usepackage[utf8x]{inputenc} + +\usepackage{lmodern} % Latin Modern fonts derived from Computer Modern + +% Hyperlinks in PDF: +\definecolor{linkcolor}{rgb}{0,0,0.4} +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, + colorlinks=true, + linkcolor=linkcolor, + urlcolor=linkcolor, + citecolor=black, + filecolor=black, + %filecolor=blue, + pdfmenubar=true, + pdftoolbar=true, + bookmarksdepth=3 % Uncomment (and tweak) for PDF bookmarks with more levels than the TOC + } +%\hyperbaseurl{} % hyperlinks are relative to this root + +\setcounter{tocdepth}{2} % levels in table of contents + +% prevent orhpans and widows +\clubpenalty = 10000 +\widowpenalty = 10000 + +% --- end of standard preamble for documents --- + + +% insert custom LaTeX commands... + +\raggedbottom +\makeindex +\usepackage[totoc]{idxlayout} % for index in the toc +\usepackage[nottoc]{tocbibind} % for references/bibliography in the toc + +%-------------------- end preamble ---------------------- + +\begin{document} + +% matching end for #ifdef PREAMBLE + +\newcommand{\exercisesection}[1]{\subsection*{#1}} + + +% ------------------- main content ---------------------- + + + +% ----------------- title ------------------------- + +\thispagestyle{empty} + +\begin{center} +{\LARGE\bf +\begin{spacing}{1.25} +Project 1 on Machine Learning, deadline October 7 (midnight), 2024 +\end{spacing} +} +\end{center} + +% ----------------- author(s) ------------------------- + +\begin{center} +{\bf \href{{http://www.uio.no/studier/emner/matnat/fys/FYS3155/index-eng.html}}{Data Analysis and Machine Learning FYS-STK3155/FYS4155}} +\end{center} + + \begin{center} +% List of all institutions: +\centerline{{\small University of Oslo, Norway}} +\end{center} + +% ----------------- end author(s) ------------------------- + +% --- begin date --- +\begin{center} +September 2 +\end{center} +% --- end date --- + +\vspace{1cm} + + +\subsection*{Preamble: Note on writing reports, using reference material, AI and other tools} + +We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at \href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb}} gives some guidance. See also the grading suggestion at \href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}. + +When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at \href{{https://scikit-learn.org/dev/about.html}}{\nolinkurl{https://scikit-learn.org/dev/about.html}}. + +We enocurage you to use tools like +\href{{https://openai.com/chatgpt/}}{ChatGPT} in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. + +On scaling, we recommend reading the following section from the scikit-learn software description, see \href{{https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section}}{\nolinkurl{https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html\#plot-all-scaling-standard-scaler-section}} + +\subsection*{Regression analysis and resampling methods} + +The main aim of this project is to study in more detail various +regression methods, including the Ordinary Least Squares (OLS) method. +In addition to the scientific part, in this course we want also to +give you an experience in writing scientific reports. The format for +the delivery of your answers is namely that of a scientific report. At +for example +\href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md}} +we detail how to write a report. Furthermore, at +\href{{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ReportExample/}} +you can find examples of previous reports. How to write reports will +also be discussed during the various lab sessions. + +\textbf{A small recommendation when developing the codes here}. Instead of +jumping on to the two-dimensional function described below, we +recommend to do the code development and testing with a simpler +one-dimensional function, similar to those discussed in the exercises +of weeks 35 and 36. A simple test, as discussed during the lectures the first +three weeks is to set the design matrix equal to the identity +matrix. Then your model should give a mean square error which is exactly equal to zero. +When you are sure that your codes function well, you can then replace +the one-dimensional test function with the two-dimensional \textbf{Franke} function +discussed here. + +The Franke function serves as a stepping stone towards the analysis of +real topographic data. The latter is the last part of this project. + +\paragraph{Description of two-dimensional function.} +We will first study how to fit polynomials to a specific +two-dimensional function called \href{{http://www.dtic.mil/dtic/tr/fulltext/u2/a081688.pdf}}{Franke's +function}. This +is a function which has been widely used when testing various +interpolation and fitting algorithms. Furthermore, after having +established the model and the method, we will employ resamling +techniques such as cross-validation and/or bootstrap in order to perform a +proper assessment of our models. We will also study in detail the +so-called Bias-Variance trade off. + +The Franke function, which is a weighted sum of four exponentials reads as follows +\begin{align*} +f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)}+\frac{3}{4}\exp{\left(-\frac{(9x+1)^2}{49}- \frac{(9y+1)}{10}\right)} \\ +&+\frac{1}{2}\exp{\left(-\frac{(9x-7)^2}{4} - \frac{(9y-3)^2}{4}\right)} -\frac{1}{5}\exp{\left(-(9x-4)^2 - (9y-7)^2\right) }. +\end{align*} + +The function will be defined for $x,y\in [0,1]$. In a sense, our data are thus scaled to a particular domain for the input values. + +Our first step will +be to perform an OLS regression analysis of this function, trying out +a polynomial fit with an $x$ and a $y$ dependence of the form $[x, y, +x^2, y^2, xy, \dots]$. We will also include bootstrap first as a +resampling technique. After that we will include the cross-validation +technique. + +We can +use a uniform distribution to set up the arrays of values for $x$ and +$y$, or as in the example below just a set of fixed values for $x$ and +$y$ with a given step size. We will fit a function (for example a +polynomial) of $x$ and $y$. Thereafter we will repeat much of the +same procedure using the Ridge and Lasso regression methods, +introducing thus a dependence on the bias (penalty) $\lambda$. + +Finally we are going to use (real) digital terrain data and try to +reproduce these data using the same methods. We will also try to go +beyond the second-order polynomials metioned above and explore +which polynomial fits the data best. + +The Python code for the Franke function is included here (it performs also a three-dimensional plot of it) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\begin{verbatim} +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FormatStrFormatter +import numpy as np +from random import random, seed + +fig = plt.figure() +ax = fig.gca(projection='3d') + +# Make data. +x = np.arange(0, 1, 0.05) +y = np.arange(0, 1, 0.05) +x, y = np.meshgrid(x,y) + + +def FrankeFunction(x,y): + term1 = 0.75*np.exp(-(0.25*(9*x-2)**2) - 0.25*((9*y-2)**2)) + term2 = 0.75*np.exp(-((9*x+1)**2)/49.0 - 0.1*(9*y+1)) + term3 = 0.5*np.exp(-(9*x-7)**2/4.0 - 0.25*((9*y-3)**2)) + term4 = -0.2*np.exp(-(9*x-4)**2 - (9*y-7)**2) + return term1 + term2 + term3 + term4 + + +z = FrankeFunction(x, y) + +# Plot the surface. +surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm, + linewidth=0, antialiased=False) + +# Customize the z axis. +ax.set_zlim(-0.10, 1.40) +ax.zaxis.set_major_locator(LinearLocator(10)) +ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) + +# Add a color bar which maps values to colors. +fig.colorbar(surf, shrink=0.5, aspect=5) + +plt.show() + + +\end{verbatim} + + +\paragraph{Part a) : Ordinary Least Square (OLS) on the Franke function.} +We will generate our own dataset for a function +$\mathrm{FrankeFunction}(x,y)$ with $x,y \in [0,1]$. The function +$f(x,y)$ is the Franke function. You should explore also the addition +of an added stochastic noise to this function using the normal +distribution $N(0,1)$. + +\emph{Write your own code} (using either a matrix inversion or a singular +value decomposition from e.g., \textbf{numpy} ) and perform a standard \textbf{ordinary least square regression} +analysis using polynomials in $x$ and $y$ up to fifth order. + +Evaluate the mean Squared error (MSE) + +\[ MSE(\bm{y},\tilde{\bm{y}}) = \frac{1}{n} +\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2, +\] + +and the $R^2$ score function. If $\tilde{\bm{y}}_i$ is the predicted +value of the $i-th$ sample and $y_i$ is the corresponding true value, +then the score $R^2$ is defined as + +\[ +R^2(\bm{y}, \tilde{\bm{y}}) = 1 - \frac{\sum_{i=0}^{n - 1} (y_i - \tilde{y}_i)^2}{\sum_{i=0}^{n - 1} (y_i - \bar{y})^2}, +\] + +where we have defined the mean value of $\bm{y}$ as + +\[ +\bar{y} = \frac{1}{n} \sum_{i=0}^{n - 1} y_i. +\] + +Plot the resulting scores (MSE and R$^2$) as functions of the polynomial degree (here up to polymial degree five). +Plot also the parameters $\beta$ as you increase the order of the polynomial. Comment your results. + +Your code has to include a scaling/centering of the data (for example by +subtracting the mean value), and +a split of the data in training and test data. For this exercise you can +either write your own code or use for example the function for +splitting training data provided by the library \textbf{Scikit-Learn} (make +sure you have installed it). This function is called +$train\_test\_split$. \textbf{You should present a critical discussion of why and how you have scaled or not scaled the data}. + +It is normal in essentially all Machine Learning studies to split the +data in a training set and a test set (eventually also an additional +validation set). There +is no explicit recipe for how much data should be included as training +data and say test data. An accepted rule of thumb is to use +approximately $2/3$ to $4/5$ of the data as training data. + +You can easily reuse the solutions to your exercises from week 35 and week 36. +See also the lecture slides from week 35 and week 36. + +\paragraph{Part b): Adding Ridge regression for the Franke function.} +Write your own code for the Ridge method, either using matrix +inversion or the singular value decomposition as done in the previous +exercise. The lecture notes from week 35 and 36 contain more information. Furthermore, the numerical exercise from week 36 is something you can reuse here. + +Perform the same analysis as you did in the previous exercise but now for different values of $\lambda$. Compare and +analyze your results with those obtained in part a) with the ordinary least squares method. Study the +dependence on $\lambda$. + +\paragraph{Part c): Adding Lasso for the Franke function.} +This exercise is essentially a repeat of the previous two ones, but now +with Lasso regression. Write either your own code (difficult and optional) or, in this case, +you can also use the functionalities of \textbf{Scikit-Learn} (recommended). Keep in mind that the library \textbf{Scikit-Learn} excludes the intercept by default. +Give a +critical discussion of the three methods and a judgement of which +model fits the data best. + +\paragraph{Part d): Paper and pencil part.} +This exercise deals with various mean values and variances in linear regression method (here it may be useful to look up chapter 3, equation (3.8) of \href{{https://www.springer.com/gp/book/9780387848570}}{Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer}). The exercise is also part of the weekly exercises for week 37. + +The assumption we have made is +that there exists a continuous function $f(\bm{x})$ and a normal distributed error $\bm{\varepsilon}\sim N(0, \sigma^2)$ +which describes our data +\[ +\bm{y} = f(\bm{x})+\bm{\varepsilon} +\] + +We then approximate this function $f(\bm{x})$ with our model $\bm{\tilde{y}}$ from the solution of the linear regression equations (ordinary least squares OLS), that is our +function $f$ is approximated by $\bm{\tilde{y}}$ where we minimized $(\bm{y}-\bm{\tilde{y}})^2$, with +\[ +\bm{\tilde{y}} = \bm{X}\bm{\beta}. +\] +The matrix $\bm{X}$ is the so-called design or feature matrix. + +Show that the expectation value of $\bm{y}$ for a given element $i$ +\[ +\mathbb{E}(y_i) =\sum_{j}x_{ij} \beta_j=\mathbf{X}_{i, \ast} \, \bm{\beta}, +\] +and that +its variance is +\[ +\mbox{Var}(y_i) = \sigma^2. +\] +Hence, $y_i \sim N( \mathbf{X}_{i, \ast} \, \bm{\beta}, \sigma^2)$, that is $\bm{y}$ follows a normal distribution with +mean value $\bm{X}\bm{\beta}$ and variance $\sigma^2$. + +With the OLS expressions for the optimal parameters $\bm{\hat{\beta}}$ show that +\[ +\mathbb{E}(\bm{\hat{\beta}}) = \bm{\beta}. +\] +Show finally that the variance of $\bm{\beta}$ is +\[ +\mbox{Var}(\bm{\hat{\beta}}) = \sigma^2 \, (\mathbf{X}^{T} \mathbf{X})^{-1}. +\] + +We can use the last expression when we define a so-called confidence interval for the parameters $\beta$. +A given parameter $\beta_j$ is given by the diagonal matrix element of the above matrix. + +\paragraph{Part e): Bias-variance trade-off and resampling techniques.} +Our aim here is to study the bias-variance trade-off by implementing the \textbf{bootstrap} resampling technique. +\textbf{We will only use the simpler ordinary least squares here}. + +With a code which does OLS and includes resampling techniques, +we will now discuss the bias-variance trade-off in the context of +continuous predictions such as regression. However, many of the +intuitions and ideas discussed here also carry over to classification +tasks and basically all Machine Learning algorithms. + +Before you perform an analysis of the bias-variance trade-off on your test data, make +first a figure similar to Fig.~2.11 of Hastie, Tibshirani, and +Friedman. Figure 2.11 of this reference displays only the test and training MSEs. The test MSE can be used to +indicate possible regions of low/high bias and variance. You will most likely not get an +equally smooth curve! + +With this result we move on to the bias-variance trade-off analysis. + +Consider a +dataset $\mathcal{L}$ consisting of the data +$\mathbf{X}_\mathcal{L}=\{(y_j, \boldsymbol{x}_j), j=0\ldots n-1\}$. + +As in part d), we assume that the true data is generated from a noisy model + +\[ +\bm{y}=f(\boldsymbol{x}) + \bm{\epsilon}. +\] + +Here $\epsilon$ is normally distributed with mean zero and standard +deviation $\sigma^2$. + +In our derivation of the ordinary least squares method we defined then +an approximation to the function $f$ in terms of the parameters +$\bm{\beta}$ and the design matrix $\bm{X}$ which embody our model, +that is $\bm{\tilde{y}}=\bm{X}\bm{\beta}$. + +The parameters $\bm{\beta}$ are in turn found by optimizing the mean +squared error via the so-called cost function + +\[ +C(\bm{X},\bm{\beta}) =\frac{1}{n}\sum_{i=0}^{n-1}(y_i-\tilde{y}_i)^2=\mathbb{E}\left[(\bm{y}-\bm{\tilde{y}})^2\right]. +\] +Here the expected value $\mathbb{E}$ is the sample value. + +Show that you can rewrite this in terms of a term which contains the variance of the model itself (the so-called variance term), a +term which measures the deviation from the true data and the mean value of the model (the bias term) and finally the variance of the noise. +That is, show that +\[ +\mathbb{E}\left[(\bm{y}-\bm{\tilde{y}})^2\right]=\mathrm{Bias}[\tilde{y}]+\mathrm{var}[\tilde{y}]+\sigma^2, +\] +with +\[ +\mathrm{Bias}[\tilde{y}]=\mathbb{E}\left[\left(\bm{y}-\mathbb{E}\left[\bm{\tilde{y}}\right]\right)^2\right], +\] +and +\[ +\mathrm{var}[\tilde{y}]=\mathbb{E}\left[\left(\tilde{\bm{y}}-\mathbb{E}\left[\bm{\tilde{y}}\right]\right)^2\right]=\frac{1}{n}\sum_i(\tilde{y}_i-\mathbb{E}\left[\bm{\tilde{y}}\right])^2. +\] +The answer to this exercise should be included in the theory part of the report. This exercise is also part of the weekly exercises of week 38. +Explain what the terms mean and discuss their interpretations. + +Perform then a bias-variance analysis of the Franke function by +studying the MSE value as function of the complexity of your model. + +Discuss the bias and variance trade-off as function +of your model complexity (the degree of the polynomial) and the number +of data points, and possibly also your training and test data using the \textbf{bootstrap} resampling method. +You can follow the code example in the jupyter-book at \href{{https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html#the-bias-variance-tradeoff}}{\nolinkurl{https://compphysics.github.io/MachineLearning/doc/LectureNotes/_build/html/chapter3.html\#the-bias-variance-tradeoff}}. + +\paragraph{Part f): Cross-validation as resampling techniques, adding more complexity.} +The aim here is to write your own code for another widely popular +resampling technique, the so-called cross-validation method. + +Implement the $k$-fold cross-validation algorithm (write your own +code) and evaluate again the MSE function resulting +from the test folds. You can compare your own code with that from +\textbf{Scikit-Learn} if needed. + +Compare the MSE you get from your cross-validation code with the one +you got from your \textbf{bootstrap} code. Comment your results. Try $5-10$ +folds. You can also compare your own cross-validation code with the +one provided by \textbf{Scikit-Learn}. + +In addition to using the ordinary least squares method, you should include both Ridge and Lasso regression. + +\paragraph{Part g): Analysis of real data.} +With our codes functioning and having been tested properly on a +simpler function we are now ready to look at real data. We will +essentially repeat in this exercise what was done in exercises a-f. However, we +need first to download the data and prepare properly the inputs to our +codes. We are going to download digital terrain data from the website +\href{{https://earthexplorer.usgs.gov/}}{\nolinkurl{https://earthexplorer.usgs.gov/}}, + +Or, if you prefer, we have placed selected datafiles at \href{{https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles}}{\nolinkurl{https://github.com/CompPhysics/MachineLearning/tree/master/doc/Projects/2023/Project1/DataFiles}} + +In order to obtain data for a specific region, you need to register as +a user (free) at this website and then decide upon which area you want +to fetch the digital terrain data from. In order to be able to read +the data properly, you need to specify that the format should be \textbf{SRTM +Arc-Second Global} and download the data as a \textbf{GeoTIF} file. The +files are then stored in \emph{tif} format which can be imported into a +Python program using + + + +\begin{verbatim} +scipy.misc.imread + +\end{verbatim} + + +Here is a simple part of a Python code which reads and plots the data +from such files + + + + + + + + + + + + + + + + + +\begin{verbatim} +import numpy as np +from imageio import imread +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm + +# Load the terrain +terrain1 = imread('SRTM_data_Norway_1.tif') +# Show the terrain +plt.figure() +plt.title('Terrain over Norway 1') +plt.imshow(terrain1, cmap='gray') +plt.xlabel('X') +plt.ylabel('Y') +plt.show() + +\end{verbatim} + + +If you should have problems in downloading the digital terrain data, +we provide two examples under the data folder of project 1. One is +from a region close to Stavanger in Norway and the other Møsvatn +Austfjell, again in Norway. +Feel free to produce your own terrain data. + +Alternatively, if you would like to use another data set, feel free to do so. This could be data close to your reseach area or simply a data set you found interesting. See for example \href{{https://www.kaggle.com/datasets}}{kaggle.com} for examples. + +Our final part deals with the parameterization of your digital terrain +data (or your own data). We will apply all three methods for linear regression, the same type (or higher order) of polynomial +approximation and cross-validation as resampling technique to evaluate which +model fits the data best. + +At the end, you should present a critical evaluation of your results +and discuss the applicability of these regression methods to the type +of data presented here (either the terrain data we propose or other data sets). + +\subsection*{Background literature} + +\begin{enumerate} +\item For a discussion and derivation of the variances and mean squared errors using linear regression, see the \href{{https://arxiv.org/abs/1509.09169}}{Lecture notes on ridge regression by Wessel N. van Wieringen} + +\item The textbook of \href{{https://www.springer.com/gp/book/9780387848570}}{Trevor Hastie, Robert Tibshirani, Jerome H. Friedman, The Elements of Statistical Learning, Springer}, chapters 3 and 7 are the most relevant ones for the analysis here. +\end{enumerate} + +\noindent +\subsection*{Introduction to numerical projects} + +Here follows a brief recipe and recommendation on how to answer the various questions when preparing your answers. + +\begin{itemize} + \item Give a short description of the nature of the problem and the eventual numerical methods you have used. + + \item Describe the algorithm you have used and/or developed. Here you may find it convenient to use pseudocoding. In many cases you can describe the algorithm in the program itself. + + \item Include the source code of your program. Comment your program properly. You should have the code at your GitHub/GitLab link. You can also place the code in an appendix of your report. + + \item If possible, try to find analytic solutions, or known limits in order to test your program when developing the code. + + \item Include your results either in figure form or in a table. Remember to label your results. All tables and figures should have relevant captions and labels on the axes. + + \item Try to evaluate the reliabilty and numerical stability/precision of your results. If possible, include a qualitative and/or quantitative discussion of the numerical stability, eventual loss of precision etc. + + \item Try to give an interpretation of you results in your answers to the problems. + + \item Critique: if possible include your comments and reflections about the exercise, whether you felt you learnt something, ideas for improvements and other thoughts you've made when solving the exercise. We wish to keep this course at the interactive level and your comments can help us improve it. + + \item Try to establish a practice where you log your work at the computerlab. You may find such a logbook very handy at later stages in your work, especially when you don't properly remember what a previous test version of your program did. Here you could also record the time spent on solving the exercise, various algorithms you may have tested or other topics which you feel worthy of mentioning. +\end{itemize} + +\noindent +\subsection*{Format for electronic delivery of report and programs} + +The preferred format for the report is a PDF file. You can also use DOC or postscript formats or as an ipython notebook file. As programming language we prefer that you choose between C/C++, Fortran2008, Julia or Python. The following prescription should be followed when preparing the report: + +\begin{itemize} + \item Use Canvas to hand in your projects, log in at \href{{https://www.uio.no/english/services/it/education/canvas/}}{\nolinkurl{https://www.uio.no/english/services/it/education/canvas/}} with your normal UiO username and password. + + \item Upload \textbf{only} the report file or the link to your GitHub/GitLab or similar typo of repos! For the source code file(s) you have developed please provide us with your link to your GitHub/GitLab or similar domain. The report file should include all of your discussions and a list of the codes you have developed. Do not include library files which are available at the course homepage, unless you have made specific changes to them. + + \item In your GitHub/GitLab or similar repository, please include a folder which contains selected results. These can be in the form of output from your code for a selected set of runs and input parameters. +\end{itemize} + +\noindent +Finally, +we encourage you to collaborate. Optimal working groups consist of +2-3 students. You can then hand in a common report. + +\subsection*{Software and needed installations} + +If you have Python installed (we recommend Python3) and you feel pretty familiar with installing different packages, +we recommend that you install the following Python packages via \textbf{pip} as +\begin{enumerate} +\item pip install numpy scipy matplotlib ipython scikit-learn tensorflow sympy pandas pillow +\end{enumerate} + +\noindent +For Python3, replace \textbf{pip} with \textbf{pip3}. + +See below for a discussion of \textbf{tensorflow} and \textbf{scikit-learn}. + +For OSX users we recommend also, after having installed Xcode, to install \textbf{brew}. Brew allows +for a seamless installation of additional software via for example +\begin{enumerate} +\item brew install python3 +\end{enumerate} + +\noindent +For Linux users, with its variety of distributions like for example the widely popular Ubuntu distribution +you can use \textbf{pip} as well and simply install Python as +\begin{enumerate} +\item sudo apt-get install python3 (or python for python2.7) +\end{enumerate} + +\noindent +etc etc. + +If you don't want to install various Python packages with their dependencies separately, we recommend two widely used distrubutions which set up all relevant dependencies for Python, namely +\begin{enumerate} +\item \href{{https://docs.anaconda.com/}}{Anaconda} Anaconda is an open source distribution of the Python and R programming languages for large-scale data processing, predictive analytics, and scientific computing, that aims to simplify package management and deployment. Package versions are managed by the package management system \textbf{conda} + +\item \href{{https://www.enthought.com/product/canopy/}}{Enthought canopy} is a Python distribution for scientific and analytic computing distribution and analysis environment, available for free and under a commercial license. +\end{enumerate} + +\noindent +Popular software packages written in Python for ML are + +\begin{itemize} +\item \href{{http://scikit-learn.org/stable/}}{Scikit-learn}, + +\item \href{{https://www.tensorflow.org/}}{Tensorflow}, + +\item \href{{http://pytorch.org/}}{PyTorch} and + +\item \href{{https://keras.io/}}{Keras}. +\end{itemize} + +\noindent +These are all freely available at their respective GitHub sites. They +encompass communities of developers in the thousands or more. And the number +of code developers and contributors keeps increasing. + + +% ------------------- end of main content --------------- + +\end{document} + diff --git a/doc/src/Projects/2024/Project1/Project1.do.txt b/doc/src/Projects/2024/Project1/Project1.do.txt index 4ef5eb238..562d72ec9 100644 --- a/doc/src/Projects/2024/Project1/Project1.do.txt +++ b/doc/src/Projects/2024/Project1/Project1.do.txt @@ -1,8 +1,32 @@ -TITLE: Project 1 on Machine Learning, deadline October 9 (midnight), 2024 +TITLE: Project 1 on Machine Learning, deadline October 7 (midnight), 2024 AUTHOR: "Data Analysis and Machine Learning FYS-STK3155/FYS4155":"http://www.uio.no/studier/emner/matnat/fys/FYS3155/index-eng.html" at University of Oslo, Norway DATE: September 2 -===== Note on using reference material, AI and other tools ===== + + + + +===== Preamble: Note on writing reports, using reference material, AI and other tools ===== + +We want you to answer the three different projects by handing reports written like a standard scientific/technical report. +The link at URL:"https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/ProjectWriting/projectwriting.ipynb" gives some guidance. See also the grading suggestion at URL:"https://github.com/CompPhysics/MachineLearning/blob/master/doc/Projects/EvaluationGrading/EvaluationForm.md". + +When using codes from different sources that you have not developed yourself, +you should refer to these in the bibliography of your report, indicating wherefrom you +got the code, whether this is from the lecture notes, softwares like +Scikit-Learn, TensorFlow, PyTorch or other sources. These should +always be cited correctly. How to cite some of the libraries is often +indicated from their corresponding GitHub sites or websites, see for example how to cite Scikit-Learn at URL:"https://scikit-learn.org/dev/about.html". + +We enocurage you to use tools like +"ChatGPT":"https://openai.com/chatgpt/" in writing the report. If you use for example ChatGPT, +please do cite it properly and include (if possible) your questions and answers as an addition to the report. This can +be uplodaed to for example your website, GitHub/GitLab or similar as supplemental material. + + +On scaling, we recommend reading the following section from the scikit-learn software description, see URL:"https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#plot-all-scaling-standard-scaler-section" + + ===== Regression analysis and resampling methods ===== @@ -27,7 +51,7 @@ jumping on to the two-dimensional function described below, we recommend to do the code development and testing with a simpler one-dimensional function, similar to those discussed in the exercises of weeks 35 and 36. A simple test, as discussed during the lectures the first -two weeks is to set the design matrix equal to the identity +three weeks is to set the design matrix equal to the identity matrix. Then your model should give a mean square error which is exactly equal to zero. When you are sure that your codes function well, you can then replace the one-dimensional test function with the two-dimensional _Franke_ function @@ -36,8 +60,6 @@ discussed here. The Franke function serves as a stepping stone towards the analysis of real topographic data. The latter is the last part of this project. -May be change the Franke function - === Description of two-dimensional function === @@ -62,9 +84,10 @@ f(x,y) &= \frac{3}{4}\exp{\left(-\frac{(9x-2)^2}{4} - \frac{(9y-2)^2}{4}\right)} The function will be defined for $x,y\in [0,1]$. In a sense, our data are thus scaled to a particular domain for the input values. + Our first step will be to perform an OLS regression analysis of this function, trying out -a polynomial fit with an $x$ and $y$ dependence of the form $[x, y, +a polynomial fit with an $x$ and a $y$ dependence of the form $[x, y, x^2, y^2, xy, \dots]$. We will also include bootstrap first as a resampling technique. After that we will include the cross-validation technique.