updating
This commit is contained in:
@@ -148,542 +148,6 @@ At the heart of basically all ML algorithms there are so-called minimization alg
|
||||
|
||||
|
||||
|
||||
===== Software and needed installations =====
|
||||
|
||||
We will make extensive use of Python as programming language and its
|
||||
myriad of available libraries. You will find
|
||||
Jupyter notebooks invaluable in your work. You can run _R_
|
||||
codes in the Jupyter/IPython notebooks, with the immediate benefit of
|
||||
visualizing your data. You can also use compiled languages like C++,
|
||||
Rust, Julia, Fortran etc if you prefer. The focus in these lectures will be
|
||||
on Python.
|
||||
|
||||
|
||||
If you have Python installed (we strongly recommend Python3) and you feel
|
||||
pretty familiar with installing different packages, we recommend that
|
||||
you install the following Python packages via _pip_ as
|
||||
|
||||
o pip install numpy scipy matplotlib ipython scikit-learn mglearn sympy pandas pillow
|
||||
|
||||
For Python3, replace _pip_ with _pip3_.
|
||||
|
||||
For OSX users we recommend, after having installed Xcode, to
|
||||
install _brew_. Brew allows for a seamless installation of additional
|
||||
software via for example
|
||||
|
||||
o brew install python3
|
||||
|
||||
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
|
||||
|
||||
o sudo apt-get install python3 (or python for pyhton2.7)
|
||||
|
||||
etc etc.
|
||||
|
||||
|
||||
|
||||
===== Python installers =====
|
||||
|
||||
If you don't want to perform these operations separately and venture
|
||||
into the hassle of exploring how to set up dependencies and paths, we
|
||||
recommend two widely used distrubutions which set up all relevant
|
||||
dependencies for Python, namely
|
||||
|
||||
* "Anaconda":"https://docs.anaconda.com/",
|
||||
|
||||
which 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_.
|
||||
|
||||
* "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.
|
||||
|
||||
Furthermore, "Google's Colab":"https://colab.research.google.com/notebooks/welcome.ipynb" is a free Jupyter notebook environment that requires
|
||||
no setup and runs entirely in the cloud. Try it out!
|
||||
|
||||
|
||||
===== Useful Python libraries =====
|
||||
Here we list several useful Python libraries we strongly recommend (if you use anaconda many of these are already there)
|
||||
|
||||
* "NumPy":"https://www.numpy.org/" is a highly popular library for large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays
|
||||
* "The pandas":"https://pandas.pydata.org/" library provides high-performance, easy-to-use data structures and data analysis tools
|
||||
* "Xarray":"http://xarray.pydata.org/en/stable/" is a Python package that makes working with labelled multi-dimensional arrays simple, efficient, and fun!
|
||||
* "Scipy":"https://www.scipy.org/" (pronounced “Sigh Pie”) is a Python-based ecosystem of open-source software for mathematics, science, and engineering.
|
||||
* "Matplotlib":"https://matplotlib.org/" is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats and interactive environments across platforms.
|
||||
* "Autograd":"https://github.com/HIPS/autograd" can automatically differentiate native Python and Numpy code. It can handle a large subset of Python's features, including loops, ifs, recursion and closures, and it can even take derivatives of derivatives of derivatives
|
||||
* "SymPy":"https://www.sympy.org/en/index.html" is a Python library for symbolic mathematics.
|
||||
* "scikit-learn":"https://scikit-learn.org/stable/" has simple and efficient tools for machine learning, data mining and data analysis
|
||||
* "TensorFlow":"https://www.tensorflow.org/" is a Python library for fast numerical computing created and released by Google
|
||||
* "Keras":"https://keras.io/" is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano
|
||||
* And many more such as "pytorch":"https://pytorch.org/", "Theano":"https://pypi.org/project/Theano/" etc
|
||||
|
||||
|
||||
===== Installing R, C++, cython or Julia =====
|
||||
|
||||
You will also find it convenient to utilize _R_. We will mainly
|
||||
use Python during our lectures and in various projects and exercises.
|
||||
Those of you
|
||||
already familiar with _R_ should feel free to continue using _R_, keeping
|
||||
however an eye on the parallel Python set ups. Similarly, if you are a
|
||||
Python afecionado, feel free to explore _R_ as well. Jupyter/Ipython
|
||||
notebook allows you to run _R_ codes interactively in your
|
||||
browser. The software library _R_ is really tailored for statistical data analysis
|
||||
and allows for an easy usage of the tools and algorithms we will discuss in these
|
||||
lectures.
|
||||
|
||||
To install _R_ with Jupyter notebook
|
||||
"follow the link here":"https://mpacer.org/maths/r-kernel-for-ipython-notebook"
|
||||
|
||||
|
||||
|
||||
|
||||
===== Installing R, C++, cython, Numba etc =====
|
||||
|
||||
|
||||
For the C++ aficionados, Jupyter/IPython notebook allows you also to
|
||||
install C++ and run codes written in this language interactively in
|
||||
the browser. Since we will emphasize writing many of the algorithms
|
||||
yourself, you can thus opt for either Python or C++ (or Fortran or other compiled languages) as programming
|
||||
languages.
|
||||
|
||||
To add more entropy, _cython_ can also be used when running your
|
||||
notebooks. It means that Python with the jupyter notebook
|
||||
setup allows you to integrate widely popular softwares and tools for
|
||||
scientific computing. Similarly, the
|
||||
"Numba Python package":"https://numba.pydata.org/" delivers increased performance
|
||||
capabilities with minimal rewrites of your codes. With its
|
||||
versatility, including symbolic operations, Python offers a unique
|
||||
computational environment. Your jupyter notebook can easily be
|
||||
converted into a nicely rendered _PDF_ file or a Latex file for
|
||||
further processing. For example, convert to latex as
|
||||
|
||||
!bc
|
||||
pycod jupyter nbconvert filename.ipynb --to latex
|
||||
!ec
|
||||
|
||||
And to add more versatility, the Python package "SymPy":"http://www.sympy.org/en/index.html" is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) and is entirely written in Python.
|
||||
|
||||
Finally, if you wish to use the light mark-up language
|
||||
"doconce":"https://github.com/hplgit/doconce" you can convert a standard ascii text file into various HTML
|
||||
formats, ipython notebooks, latex files, pdf files etc with minimal edits. These lectures were generated using _doconce_.
|
||||
|
||||
|
||||
|
||||
===== Numpy examples and Important Matrix and vector handling packages =====
|
||||
|
||||
There are several central software libraries for linear algebra and eigenvalue problems. Several of the more
|
||||
popular ones have been wrapped into ofter software packages like those from the widely used text _Numerical Recipes_. The original source codes in many of the available packages are often taken from the widely used
|
||||
software package LAPACK, which follows two other popular packages
|
||||
developed in the 1970s, namely EISPACK and LINPACK. We describe them shortly here.
|
||||
|
||||
* LINPACK: package for linear equations and least square problems.
|
||||
* LAPACK:package for solving symmetric, unsymmetric and generalized eigenvalue problems. From LAPACK's website URL: "http://www.netlib.org" it is possible to download for free all source codes from this library. Both C/C++ and Fortran versions are available.
|
||||
* BLAS (I, II and III): (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations. Blas I is vector operations, II vector-matrix operations and III matrix-matrix operations. Highly parallelized and efficient codes, all available for download from URL: "http://www.netlib.org".
|
||||
|
||||
|
||||
===== Basic Matrix Features =====
|
||||
|
||||
Matrix properties reminder
|
||||
!bt
|
||||
\[
|
||||
\mathbf{A} =
|
||||
\begin{bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\
|
||||
a_{21} & a_{22} & a_{23} & a_{24} \\
|
||||
a_{31} & a_{32} & a_{33} & a_{34} \\
|
||||
a_{41} & a_{42} & a_{43} & a_{44}
|
||||
\end{bmatrix}\qquad
|
||||
\mathbf{I} =
|
||||
\begin{bmatrix} 1 & 0 & 0 & 0 \\
|
||||
0 & 1 & 0 & 0 \\
|
||||
0 & 0 & 1 & 0 \\
|
||||
0 & 0 & 0 & 1
|
||||
\end{bmatrix}
|
||||
\]
|
||||
!et
|
||||
|
||||
|
||||
|
||||
The inverse of a matrix is defined by
|
||||
|
||||
!bt
|
||||
\[
|
||||
\mathbf{A}^{-1} \cdot \mathbf{A} = I
|
||||
\]
|
||||
!et
|
||||
|
||||
|
||||
|----------------------------------------------------------------------|
|
||||
| Relations | Name | matrix elements |
|
||||
|----------------------------------------------------------------------|
|
||||
| $A = A^{T}$ | symmetric | $a_{ij} = a_{ji}$ |
|
||||
| $A = \left (A^{T} \right )^{-1}$ | real orthogonal | $\sum_k a_{ik} a_{jk} = \sum_k a_{ki} a_{kj} = \delta_{ij}$ |
|
||||
| $A = A^{ * }$ | real matrix | $a_{ij} = a_{ij}^{ * }$ |
|
||||
| $A = A^{\dagger}$ | hermitian | $a_{ij} = a_{ji}^{ * }$ |
|
||||
| $A = \left (A^{\dagger} \right )^{-1}$ | unitary | $\sum_k a_{ik} a_{jk}^{ * } = \sum_k a_{ki}^{ * } a_{kj} = \delta_{ij}$ |
|
||||
|----------------------------------------------------------------------|
|
||||
|
||||
|
||||
|
||||
=== Some famous Matrices ===
|
||||
|
||||
* Diagonal if $a_{ij}=0$ for $i\ne j$
|
||||
* Upper triangular if $a_{ij}=0$ for $i > j$
|
||||
* Lower triangular if $a_{ij}=0$ for $i < j$
|
||||
* Upper Hessenberg if $a_{ij}=0$ for $i > j+1$
|
||||
* Lower Hessenberg if $a_{ij}=0$ for $i < j+1$
|
||||
* Tridiagonal if $a_{ij}=0$ for $|i -j| > 1$
|
||||
* Lower banded with bandwidth $p$: $a_{ij}=0$ for $i > j+p$
|
||||
* Upper banded with bandwidth $p$: $a_{ij}=0$ for $i < j+p$
|
||||
* Banded, block upper triangular, block lower triangular....
|
||||
|
||||
|
||||
|
||||
=== More Basic Matrix Features ===
|
||||
|
||||
Some Equivalent Statements
|
||||
For an $N\times N$ matrix $\mathbf{A}$ the following properties are all equivalent
|
||||
|
||||
* If the inverse of $\mathbf{A}$ exists, $\mathbf{A}$ is nonsingular.
|
||||
* The equation $\mathbf{Ax}=0$ implies $\mathbf{x}=0$.
|
||||
* The rows of $\mathbf{A}$ form a basis of $R^N$.
|
||||
* The columns of $\mathbf{A}$ form a basis of $R^N$.
|
||||
* $\mathbf{A}$ is a product of elementary matrices.
|
||||
* $0$ is not eigenvalue of $\mathbf{A}$.
|
||||
|
||||
|
||||
|
||||
===== Numpy and arrays =====
|
||||
"Numpy":"http://www.numpy.org/" provides an easy way to handle arrays in Python. The standard way to import this library is as
|
||||
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
!ec
|
||||
Here follows a simple example where we set up an array of ten elements, all determined by random numbers drawn according to the normal distribution,
|
||||
!bc pycod
|
||||
n = 10
|
||||
x = np.random.normal(size=n)
|
||||
print(x)
|
||||
!ec
|
||||
We defined a vector $x$ with $n=10$ elements with its values given by the Normal distribution $N(0,1)$.
|
||||
Another alternative is to declare a vector as follows
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
x = np.array([1, 2, 3])
|
||||
print(x)
|
||||
!ec
|
||||
Here we have defined a vector with three elements, with $x_0=1$, $x_1=2$ and $x_2=3$. Note that both Python and C++
|
||||
start numbering array elements from $0$ and on. This means that a vector with $n$ elements has a sequence of entities $x_0, x_1, x_2, \dots, x_{n-1}$. We could also let (recommended) Numpy to compute the logarithms of a specific array as
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
x = np.log(np.array([4, 7, 8]))
|
||||
print(x)
|
||||
!ec
|
||||
|
||||
In the last example we used Numpy's unary function $np.log$. This function is
|
||||
highly tuned to compute array elements since the code is vectorized
|
||||
and does not require looping. We normaly recommend that you use the
|
||||
Numpy intrinsic functions instead of the corresponding _log_ function
|
||||
from Python's _math_ module. The looping is done explicitely by the
|
||||
_np.log_ function. The alternative, and slower way to compute the
|
||||
logarithms of a vector would be to write
|
||||
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
from math import log
|
||||
x = np.array([4, 7, 8])
|
||||
for i in range(0, len(x)):
|
||||
x[i] = log(x[i])
|
||||
print(x)
|
||||
!ec
|
||||
We note that our code is much longer already and we need to import the _log_ function from the _math_ module.
|
||||
The attentive reader will also notice that the output is $[1, 1, 2]$. Python interprets automagically our numbers as integers (like the _automatic_ keyword in C++). To change this we could define our array elements to be double precision numbers as
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
x = np.log(np.array([4, 7, 8], dtype = np.float64))
|
||||
print(x)
|
||||
!ec
|
||||
or simply write them as double precision numbers (Python uses 64 bits as default for floating point type variables), that is
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
x = np.log(np.array([4.0, 7.0, 8.0])
|
||||
print(x)
|
||||
!ec
|
||||
To check the number of bytes (remember that one byte contains eight bits for double precision variables), you can use simple use the _itemsize_ functionality (the array $x$ is actually an object which inherits the functionalities defined in Numpy) as
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
x = np.log(np.array([4.0, 7.0, 8.0])
|
||||
print(x.itemsize)
|
||||
!ec
|
||||
|
||||
|
||||
===== Matrices in Python =====
|
||||
|
||||
Having defined vectors, we are now ready to try out matrices. We can
|
||||
define a $3 \times 3 $ real matrix $\hat{A}$ as (recall that we user
|
||||
lowercase letters for vectors and uppercase letters for matrices)
|
||||
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
A = np.log(np.array([ [4.0, 7.0, 8.0], [3.0, 10.0, 11.0], [4.0, 5.0, 7.0] ]))
|
||||
print(A)
|
||||
!ec
|
||||
If we use the _shape_ function we would get $(3, 3)$ as output, that is verifying that our matrix is a $3\times 3$ matrix. We can slice the matrix and print for example the first column (Python organized matrix elements in a row-major order, see below) as
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
A = np.log(np.array([ [4.0, 7.0, 8.0], [3.0, 10.0, 11.0], [4.0, 5.0, 7.0] ]))
|
||||
# print the first column, row-major order and elements start with 0
|
||||
print(A[:,0])
|
||||
!ec
|
||||
We can continue this was by printing out other columns or rows. The example here prints out the second column
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
A = np.log(np.array([ [4.0, 7.0, 8.0], [3.0, 10.0, 11.0], [4.0, 5.0, 7.0] ]))
|
||||
# print the first column, row-major order and elements start with 0
|
||||
print(A[1,:])
|
||||
!ec
|
||||
Numpy contains many other functionalities that allow us to slice, subdivide etc etc arrays. We strongly recommend that you look up the "Numpy website for more details":"http://www.numpy.org/". Useful functions when defining a matrix are the _np.zeros_ function which declares a matrix of a given dimension and sets all elements to zero
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
n = 10
|
||||
# define a matrix of dimension 10 x 10 and set all elements to zero
|
||||
A = np.zeros( (n, n) )
|
||||
print(A)
|
||||
!ec
|
||||
or initializing all elements to
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
n = 10
|
||||
# define a matrix of dimension 10 x 10 and set all elements to one
|
||||
A = np.ones( (n, n) )
|
||||
print(A)
|
||||
!ec
|
||||
or as unitarily distributed random numbers (see the material on random number generators in the statistics part)
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
n = 10
|
||||
# define a matrix of dimension 10 x 10 and set all elements to random numbers with x \in [0, 1]
|
||||
A = np.random.rand(n, n)
|
||||
print(A)
|
||||
!ec
|
||||
|
||||
As we will see throughout these lectures, there are several extremely useful functionalities in Numpy.
|
||||
As an example, consider the discussion of the covariance matrix. Suppose we have defined three vectors
|
||||
$\hat{x}, \hat{y}, \hat{z}$ with $n$ elements each. The covariance matrix is defined as
|
||||
!bt
|
||||
\[
|
||||
\hat{\Sigma} = \begin{bmatrix} \sigma_{xx} & \sigma_{xy} & \sigma_{xz} \\
|
||||
\sigma_{yx} & \sigma_{yy} & \sigma_{yz} \\
|
||||
\sigma_{zx} & \sigma_{zy} & \sigma_{zz}
|
||||
\end{bmatrix},
|
||||
\]
|
||||
!et
|
||||
where for example
|
||||
!bt
|
||||
\[
|
||||
\sigma_{xy} =\frac{1}{n} \sum_{i=0}^{n-1}(x_i- \overline{x})(y_i- \overline{y}).
|
||||
\]
|
||||
!et
|
||||
The Numpy function _np.cov_ calculates the covariance elements using the factor $1/(n-1)$ instead of $1/n$ since it assumes we do not have the exact mean values.
|
||||
The following simple function uses the _np.vstack_ function which takes each vector of dimension $1\times n$ and produces a $3\times n$ matrix $\hat{W}$
|
||||
!bt
|
||||
\[
|
||||
\hat{W} = \begin{bmatrix} x_0 & y_0 & z_0 \\
|
||||
x_1 & y_1 & z_1 \\
|
||||
x_2 & y_2 & z_2 \\
|
||||
\dots & \dots & \dots \\
|
||||
x_{n-2} & y_{n-2} & z_{n-2} \\
|
||||
x_{n-1} & y_{n-1} & z_{n-1}
|
||||
\end{bmatrix},
|
||||
\]
|
||||
!et
|
||||
|
||||
which in turn is converted into into the $3\times 3$ covariance matrix
|
||||
$\hat{\Sigma}$ via the Numpy function _np.cov()_. We note that we can also calculate
|
||||
the mean value of each set of samples $\hat{x}$ etc using the Numpy
|
||||
function _np.mean(x)_. We can also extract the eigenvalues of the
|
||||
covariance matrix through the _np.linalg.eig()_ function.
|
||||
|
||||
!bc pycod
|
||||
# Importing various packages
|
||||
import numpy as np
|
||||
|
||||
n = 100
|
||||
x = np.random.normal(size=n)
|
||||
print(np.mean(x))
|
||||
y = 4+3*x+np.random.normal(size=n)
|
||||
print(np.mean(y))
|
||||
z = x**3+np.random.normal(size=n)
|
||||
print(np.mean(z))
|
||||
W = np.vstack((x, y, z))
|
||||
Sigma = np.cov(W)
|
||||
print(Sigma)
|
||||
Eigvals, Eigvecs = np.linalg.eig(Sigma)
|
||||
print(Eigvals)
|
||||
!ec
|
||||
|
||||
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from scipy import sparse
|
||||
eye = np.eye(4)
|
||||
print(eye)
|
||||
sparse_mtx = sparse.csr_matrix(eye)
|
||||
print(sparse_mtx)
|
||||
x = np.linspace(-10,10,100)
|
||||
y = np.sin(x)
|
||||
plt.plot(x,y,marker='x')
|
||||
plt.show()
|
||||
!ec
|
||||
|
||||
|
||||
===== Meet the Pandas =====
|
||||
|
||||
|
||||
#FIGURE: [fig/pandas.jpg, width=600 frac=0.8]
|
||||
|
||||
Another useful Python package is
|
||||
"pandas":"https://pandas.pydata.org/", which is an open source library
|
||||
providing high-performance, easy-to-use data structures and data
|
||||
analysis tools for Python. _pandas_ stands for panel data, a term borrowed from econometrics and is an efficient library for data analysis with an emphasis on tabular data.
|
||||
_pandas_ has two major classes, the _DataFrame_ class with two-dimensional data objects and tabular data organized in columns and the class _Series_ with a focus on one-dimensional data objects. Both classes allow you to index data easily as we will see in the examples below.
|
||||
_pandas_ allows you also to perform mathematical operations on the data, spanning from simple reshapings of vectors and matrices to statistical operations.
|
||||
|
||||
The following simple example shows how we can, in an easy way make tables of our data. Here we define a data set which includes names, place of birth and date of birth, and displays the data in an easy to read way. We will see repeated use of _pandas_, in particular in connection with classification of data.
|
||||
|
||||
!bc pycod
|
||||
import pandas as pd
|
||||
from IPython.display import display
|
||||
data = {'First Name': ["Frodo", "Bilbo", "Aragorn II", "Samwise"],
|
||||
'Last Name': ["Baggins", "Baggins","Elessar","Gamgee"],
|
||||
'Place of birth': ["Shire", "Shire", "Eriador", "Shire"],
|
||||
'Date of Birth T.A.': [2968, 2890, 2931, 2980]
|
||||
}
|
||||
data_pandas = pd.DataFrame(data)
|
||||
display(data_pandas)
|
||||
!ec
|
||||
|
||||
In the above we have imported _pandas_ with the shorthand _pd_, the latter has become the standard way we import _pandas_. We make then a list of various variables
|
||||
and reorganize the aboves lists into a _DataFrame_ and then print out a neat table with specific column labels as *Name*, *place of birth* and *date of birth*.
|
||||
Displaying these results, we see that the indices are given by the default numbers from zero to three.
|
||||
_pandas_ is extremely flexible and we can easily change the above indices by defining a new type of indexing as
|
||||
!bc pycod
|
||||
data_pandas = pd.DataFrame(data,index=['Frodo','Bilbo','Aragorn','Sam'])
|
||||
display(data_pandas)
|
||||
!ec
|
||||
Thereafter we display the content of the row which begins with the index _Aragorn_
|
||||
!bc pycod
|
||||
display(data_pandas.loc['Aragorn'])
|
||||
!ec
|
||||
|
||||
We can easily append data to this, for example
|
||||
!bc pycod
|
||||
new_hobbit = {'First Name': ["Peregrin"],
|
||||
'Last Name': ["Took"],
|
||||
'Place of birth': ["Shire"],
|
||||
'Date of Birth T.A.': [2990]
|
||||
}
|
||||
data_pandas=data_pandas.append(pd.DataFrame(new_hobbit, index=['Pippin']))
|
||||
display(data_pandas)
|
||||
!ec
|
||||
|
||||
|
||||
Here are other examples where we use the _DataFrame_ functionality to handle arrays, now with more interesting features for us, namely numbers. We set up a matrix
|
||||
of dimensionality $10\times 5$ and compute the mean value and standard deviation of each column. Similarly, we can perform mathematial operations like squaring the matrix elements and many other operations.
|
||||
!bc pycod
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from IPython.display import display
|
||||
np.random.seed(100)
|
||||
# setting up a 10 x 5 matrix
|
||||
rows = 10
|
||||
cols = 5
|
||||
a = np.random.randn(rows,cols)
|
||||
df = pd.DataFrame(a)
|
||||
display(df)
|
||||
print(df.mean())
|
||||
print(df.std())
|
||||
display(df**2)
|
||||
!ec
|
||||
|
||||
Thereafter we can select specific columns only and plot final results
|
||||
!bc pycod
|
||||
df.columns = ['First', 'Second', 'Third', 'Fourth', 'Fifth']
|
||||
df.index = np.arange(10)
|
||||
|
||||
display(df)
|
||||
print(df['Second'].mean() )
|
||||
print(df.info())
|
||||
print(df.describe())
|
||||
|
||||
from pylab import plt, mpl
|
||||
plt.style.use('seaborn')
|
||||
mpl.rcParams['font.family'] = 'serif'
|
||||
|
||||
df.cumsum().plot(lw=2.0, figsize=(10,6))
|
||||
plt.show()
|
||||
|
||||
|
||||
df.plot.bar(figsize=(10,6), rot=15)
|
||||
plt.show()
|
||||
!ec
|
||||
We can produce a $4\times 4$ matrix
|
||||
!bc pycod
|
||||
b = np.arange(16).reshape((4,4))
|
||||
print(b)
|
||||
df1 = pd.DataFrame(b)
|
||||
print(df1)
|
||||
!ec
|
||||
and many other operations.
|
||||
|
||||
The _Series_ class is another important class included in
|
||||
_pandas_. You can view it as a specialization of _DataFrame_ but where
|
||||
we have just a single column of data. It shares many of the same features as _DataFrame. As with _DataFrame_,
|
||||
most operations are vectorized, achieving thereby a high performance when dealing with computations of arrays, in particular labeled arrays.
|
||||
As we will see below it leads also to a very concice code close to the mathematical operations we may be interested in.
|
||||
For multidimensional arrays, we recommend strongly "xarray":"http://xarray.pydata.org/en/stable/". _xarray_ has much of the same flexibility as _pandas_, but allows for the extension to higher dimensions than two. We will see examples later of the usage of both _pandas_ and _xarray_.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
In order to study various Machine Learning algorithms, we need to
|
||||
access data. Acccessing data is an essential step in all machine
|
||||
learning algorithms. In particular, setting up the so-called _design
|
||||
matrix_ (to be defined below) is often the first element we need in
|
||||
order to perform our calculations. To set up the design matrix means
|
||||
reading (and later, when the calculations are done, writing) data
|
||||
in various formats, The formats span from reading files from disk,
|
||||
loading data from databases and interacting with online sources
|
||||
like web application programming interfaces (APIs).
|
||||
|
||||
In handling various input formats, as discussed above, we will mainly stay with _pandas_,
|
||||
a Python package which allows us, in a seamless and painless way, to
|
||||
deal with a multitude of formats, from standard _csv_ (comma separated
|
||||
values) files, via _excel_, _html_ to _hdf5_ formats. With _pandas_
|
||||
and the _DataFrame_ and _Series_ functionalities we are able to convert text data
|
||||
into the calculational formats we need for a specific algorithm. And our code is going to be
|
||||
pretty close the basic mathematical expressions.
|
||||
|
||||
Our first data set is going to be a classic from nuclear physics, namely all
|
||||
available data on binding energies. Don't be intimidated if you are not familiar with nuclear physics. It serves simply as an example here of a data set.
|
||||
|
||||
We will show some of the
|
||||
strengths of packages like _Scikit-Learn_ in fitting nuclear binding energies to
|
||||
specific functions using linear regression first. Then, as a teaser, we will show you how
|
||||
you can easily implement other algorithms like decision trees and random forests and neural networks.
|
||||
|
||||
But before we really start with nuclear physics data, let's just look at some simpler polynomial fitting cases, such as,
|
||||
(don't be offended) fitting straight lines!
|
||||
|
||||
|
||||
|
||||
|
||||
===== Simple linear regression model using _scikit-learn_ =====
|
||||
@@ -951,7 +415,8 @@ ways of dealing with outliers.
|
||||
The Huber cost function is defined as
|
||||
!bt
|
||||
\[
|
||||
H_{\delta}(a)={\begin{cases}{\frac {1}{2}}{a^{2}}&{\text{for }}|a|\leq \delta ,\\\delta (|a|-{\frac {1}{2}}\delta ),&{\text{otherwise.}}\end{cases}}}.
|
||||
H_{\delta}(a)=\left\{\begin{array}\frac{1}{2}a^{2}&{\text{for }}|a|\leq \delta ,\\ \delta (|a|-\frac {1}{2}\del\
|
||||
ta ),&{\text{otherwise.}\end{array}\right.
|
||||
\]
|
||||
!et
|
||||
Here $a=\bm{y} - \bm{\tilde{y}}$.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user