{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Continuous Latent Variable Models - PCA and FA"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Preliminaries\n",
"\n",
"- Goal \n",
" - Introduction to Linear Latent Variable Models on continuous domains, specifically **factor analysis** and **principal component analysis**\n",
"- Materials \n",
" - Mandatory\n",
" - These lecture notes\n",
" - Optional\n",
" - Bishop pp. 570-573, 577-580, 584-586 (PCA and FA)\n",
" - M. Tipping and C. Bishop, [Probabilistic Principal Component Analysis](./files/bishop-ppca-jrss.pdf), Journal of the Royal Statistical Society. Series B, Vol.61, No.3, 1999 "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Continuous Latent Variable Models\n",
"\n",
"- (Recall that) mixture models use a discrete class variable."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Sometimes, it is more appropriate to think in terms of **continuous**\n",
"underlying causes (factors) that control the observed data.\n",
"\n",
" - E.g., observe test results for subjects: English, Spanish and French\n",
"\n",
"$$\\begin{align*}\n",
" \\underbrace{ \\begin{bmatrix} x_1\\;(=\\text{English})\\\\ x_2\\;(=\\text{Spanish})\\\\ x_3\\;(=\\text{French}) \\end{bmatrix} }_{\\text{observed}}% &= f(\\text{causes},\\theta) + \\text{noise}\\\\\n",
"&= \\begin{bmatrix} \\lambda_{11},\\lambda_{12}\\\\ \\lambda_{21},\\lambda_{22}\\\\ \\lambda_{31},\\lambda_{32}\\end{bmatrix} \\cdot \\underbrace{ \\begin{bmatrix} z_1\\;(=\\text{literacy})\\\\ z_2\\;(=\\text{intelligence})\\end{bmatrix} }_{\\text{causes}} + \\underbrace{\\begin{bmatrix} v_1\\\\v_2\\\\v_3\\end{bmatrix} }_{\\text{noise}}\n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- (**Unsupervised Regression**). This is like (linear) regression with unobserved inputs."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Dimensionality Reduction\n",
"\n",
"- If the dimension for the hidden 'causes' ($z$) is smaller than for the observed data ($x$), then the model (tries to) achieve **dimensionality reduction**."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Key applications include \n",
" 1. **compression** (store $z$ rather than $x$) \n",
" - Compression through **real-valued** latent variables can be far more efficient than with discrete clusters.\n",
" - E.g., with two 8-bit hidden factors, one can describe $2^{16}\\approx 10^5$ settings; this would take $2^{16}$ clusters!\n",
" 2. **noise reduction** (e.g. in biomedical, financial or speech signals)\n",
" 3. **feature extraction** (e.g. as a pre-processor for classification) \n",
" 4. **visualization** (particularly if $\\mathrm{dim}(Z)=2$) "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Example Problem: Visualization with missing data\n",
"\n",
"\n",
"- We consider 38 examples from the 18-dimensional data set from the\n",
"**Tobamovirus** data set, see section 4.1 in Tipping and Bishop (1999) (Originally from Ripley (1996)). "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- We will visualize this data set after projection onto the two principal axes (i.e., axes that explain largest data variance). "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- We will also consider the visualization problem when 20% of the data set is missing. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"38×18 Array{Int64,2}:\n",
" 17 13 14 16 4 9 14 1 13 0 11 13 5 7 1 4 11 5\n",
" 12 11 9 12 6 5 12 1 9 1 7 12 5 6 0 4 8 2\n",
" 18 16 16 16 8 6 14 1 14 0 9 12 4 8 0 2 11 3\n",
" 18 16 15 19 8 6 11 1 15 1 7 13 5 8 0 2 9 3\n",
" 17 13 13 22 8 4 18 1 10 3 8 11 7 6 1 2 10 2\n",
" 16 13 16 21 9 3 17 1 10 4 7 12 7 5 1 2 11 3\n",
" 22 19 10 16 10 4 18 1 12 2 8 11 6 8 0 1 8 2\n",
" 20 10 24 10 6 9 21 0 7 0 7 18 4 9 1 4 8 2\n",
" 20 21 12 15 9 7 11 1 9 3 8 14 6 7 0 1 10 3\n",
" 20 21 12 15 9 7 11 1 9 3 9 14 5 7 0 1 10 3\n",
" 18 11 24 10 9 6 19 0 12 0 7 14 4 11 0 4 9 1\n",
" 20 12 23 10 8 5 20 0 13 0 6 13 4 11 0 4 10 1\n",
" 18 19 18 16 8 4 12 0 12 0 10 15 8 6 1 1 12 1\n",
" ⋮ ⋮ ⋮ ⋮ \n",
" 17 12 22 10 8 5 18 0 14 0 5 13 4 10 0 3 9 1\n",
" 17 16 16 16 8 6 15 1 14 0 9 12 4 8 0 2 11 3\n",
" 19 17 15 17 7 6 15 1 14 0 8 12 4 8 0 2 10 3\n",
" 18 16 16 19 8 6 11 1 15 1 7 13 5 8 0 2 9 3\n",
" 18 17 15 17 8 6 15 1 14 0 8 12 4 8 0 3 9 3\n",
" 15 12 14 23 8 3 17 1 9 4 7 15 6 6 1 2 11 2\n",
" 13 11 14 22 7 3 17 1 10 4 8 13 6 6 1 3 11 2\n",
" 16 11 15 23 10 4 18 1 10 3 7 12 6 5 1 2 9 3\n",
" 14 11 14 25 11 3 19 2 10 2 7 12 6 5 1 2 9 3\n",
" 11 11 15 24 10 5 18 1 11 1 7 14 5 7 2 3 11 2\n",
" 15 9 12 21 8 4 21 1 10 3 7 15 7 6 1 3 10 3\n",
" 15 11 15 22 7 3 19 1 8 3 4 14 6 5 1 2 10 2"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"include(\"scripts/pca_demo_helpers.jl\")\n",
"X = readDataSet(\"datasets/virus3.dat\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Model Specification for LC-LVM\n",
"\n",
"- In this lesson, we focus on _Linear_ Continuous Latent Variable Models (**LC-LVM**). "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Introduce observation vector ${x}\\in\\mathbb{R}^D$ and $M$-dimensional (with $M \\lt D$) real-valued **latent factor** $z$:\n",
"$$\\begin{align*}\n",
" x &= W z + \\mu + \\epsilon \\\\\n",
" z &\\sim \\mathcal{N}(0,I) \\\\\n",
" \\epsilon &\\sim \\mathcal{N}(0,\\Psi)\n",
"\\end{align*}$$\n",
"or equivalently\n",
"$$\\begin{align*}\n",
"p(x|z) &= \\mathcal{N}(x|\\,W z + \\mu,\\Psi) \\tag{likelihood}\\\\\n",
"p(z) &= \\mathcal{N}(z|\\,0,I) \\tag{prior}\n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $W$ is the so-called $(D\\times M)$-dim **factor loading matrix**. The parameters of this model are given by $\\theta=\\{W,\\mu,\\Psi\\}$. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- For interesting models, the **observation noise covariance matrix** $\\Psi$ is always **diagonal**. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"\n",
"\n",
"- Note the similarity of the likelihood function in LC-LVM and [linear regression](http://nbviewer.ipython.org/github/bertdv/AIP-5SSB0/blob/master/lessons/06_linear_regression/Linear-Regression.ipynb): \n",
"$$p(y|x) = \\mathcal{N}(y|\\theta^T {x}, \\sigma^2)$$\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### LC-LVM Analysis (1): The marginal distribution $p({x})$\n",
"\n",
"- Since the product of Gaussians is Gaussian, both the joint $p(x,z) = p(x|z)p(z)$, the marginal $p(x)$ and the conditional\n",
"$p(z|x)$ distributions are also Gaussian."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- The marginal distribution for the observed data is\n",
"$$\n",
"\\boxed{ p(x) = \\mathcal{N}({x}|\\,{\\mu},W W^T + \\Psi) } \n",
"$$\n",
"since the **mean** evaluates to \n",
"$$\\begin{align*}\n",
"\\mathrm{E}[x] &= \\mathrm{E}[W z + \\mu+ \\epsilon] \\\\\n",
" &= W \\mathrm{E}[z] + \\mu + \\mathrm{E}[\\epsilon] \\\\\n",
" &= \\mu \n",
"\\end{align*}$$\n",
"and the **covariance** matrix is\n",
"$$\\begin{align*}\n",
"\\mathrm{cov}[x] &= \\mathrm{E}[({x}-{\\mu})({x}-{\\mu})^T] \\\\\n",
" &= \\mathrm{E}[(W z +\\epsilon)(W z +\\epsilon)^T] \\\\\n",
" &= W \\mathrm{E}[z z^T] W^T + \\mathrm{E}[\\epsilon \\epsilon^T] \\\\\n",
" &= W W^T + \\Psi \n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $\\Rightarrow$ **LC-LVM is just a MultiVariate Gaussian (MVG) model** $x \\sim \\mathcal{N}({\\mu},\\Sigma)$ with the restriction that\n",
"\n",
"$$\\Sigma= W W^T + \\Psi \\,.$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### The Covariance Matrix of $p(x)$ is of Intermediate Complexity\n",
"\n",
"- The effective covariance $\\mathrm{cov}[x] = W W^T + \\Psi$ is the low-rank outer product of two\n",
"long skinny matrices plus a diagonal matrix.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $\\Rightarrow$ LC-LVM provides a MVG model of **intermediate complexity**. Compare the number of free parameters:\n",
" - $D(D+1)/2$ for full Gaussian covariance $\\Sigma$\n",
" - $D(M+1)$ for LC-LVM model where $\\Sigma = W W^T + \\Psi$. \n",
" - $D$ for diagonal Gaussian covariance $\\Sigma = \\mathrm{diag}(\\sigma_i^2)$\n",
" - $1$ for isotropic Gaussian noise $\\Sigma = \\sigma^2 \\mathrm{I}$\n",
" \n",
"\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### LC-LVM Analysis (2): The Factor Loading Matrix $W$ is Not Unique\n",
"\n",
"- The factor loading matrix $W$ can only be estimated up to a rotation matrix $R$. Namely, if we rotate $W \\rightarrow WR $, then the covariance matrix for observations $x$ does not change (N.B.: a rotation (or orthogonal) matrix $R$ is a matrix such that $R^TR = R R^T = I$):\n",
"\n",
"$$\n",
"W R (W R)^T + \\Psi = W R R^T W^T + \\Psi = W W^T + \\Psi\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $\\Rightarrow$ Two persons that estimate ML parameters for FA on the same data are **not guaranteed to find the same parameters**, since any rotation of $W$ is equally likely."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $\\Rightarrow$ we can infer latent **subspaces** rather than individual components. One has to be careful when interpreting the numerical values of $W$ and $z$."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### LC-LVM analysis (3): Constraints on the Noise Variance $\\Psi$\n",
"\n",
"- When doing ML estimation for the parameters, a trivial solution for the covariance matrix $\\Sigma_x = W W^T + \\Psi$ is setting $\\hat W=0$ and $\\hat\\Psi$ equal to the sample variance of the data."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- In this case, all data correlation is explained as noise. (We'd like to avoid this.) "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- $\\Rightarrow$ The LC-LVM model is uninteresting without some restriction on the observation noise covariance matrix $\\Psi$. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- The interesting cases are mostly for diagonal $\\Psi$. Note that if $\\Psi$ is diagonal, all correlations between the $(D)$ components of $x$ **must be explained** by the rank-$M$ matrix $W W^T$. Three model choices are common:"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"##### 1. Factor Anaysis \n",
"\n",
"- In Factor Analysis (**FA**), $\\Psi$ is restricted to be _diagonal_:\n",
"\n",
"$$\\begin{align*} \n",
"\\Psi = \\mathrm{diag}(\\psi_i) \n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### LC-LVM analysis (3): Constraints on the Noise Variance $\\Psi$, cont'd\n",
"\n",
"\n",
"##### 2. Probabilistic Principal Component Analysis \n",
"\n",
"- In Probabilistic Principal Component Analysis (**pPCA**), the variances are further restricted to be the same,\n",
" \n",
"$$\\begin{align*} \n",
"\\Psi = \\sigma^2 I \n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"##### 3. Principal Component Analysis \n",
"\n",
"- The 'regular' (deterministic) Principal Component Analysis (**PCA**) procedure can be obtained by further requiring that\n",
"$$\\begin{align*} \n",
"\\Psi &= \\lim_{\\sigma^2\\rightarrow 0} \\sigma^2 I \\\\\n",
"W^T W &= I\n",
"\\end{align*}$$ \n",
"i.e., the noise model is discarded altogether and the columns of $W$ are orthonormal. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Regular PCA is a well-known deterministic procedure for dimensionality reduction (that predates pPCA)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"$\\Rightarrow$ FA, pPCA and PCA differ only by their model for the noise variance $\\Psi$ (namely, diagonal, isotropic and 'zeros')."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Typical Applications\n",
"- In PCA (or pPCA), the noise variance is assumed to be the same for all components. This is appropriate if all components of the observed data are 'shifted' versions of each other.\n",
"\n",
"$\\Rightarrow$ **PCA is very widely applied to image and signal processing tasks!**\n",
"\n",
"- Google (May-2015): [PCA \"face recognition\"] $>$ 300K hits; [PCA \"noise reduction\"] $>$ 100K hits "
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- FA is insensitive to scaling of individual components in the observed data (see appendix).\n",
"- Use FA if the data are not shifted versions of the same kind.\n",
"\n",
"$\\Rightarrow$ **FA has strong history in 'social sciences'**"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### ML estimation for pPCA Model\n",
"\n",
"- Given the generative model for pPCA \n",
"$$\\begin{align*}\n",
"p(x_n|z_n) &= \\mathcal{N}(x_n\\mid W z_n + \\mu,\\sigma^2 \\mathrm{I})\\\\\n",
"p(z_n) &= \\mathcal{N}(z_n \\mid0,\\mathrm{I})\n",
"\\end{align*}$$\n",
"and observations ${D}=\\{x_1,\\dotsc,x_N\\}$, find ML estimates for the parameters $\\theta=\\{W,\\mu,\\sigma\\}$ "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- **Inference for ${\\mu}$** is easy: ${x}$ is a multivariate Gaussian with mean ${\\mu}$, so its ML estimate is\n",
"$$ \\hat {\\mu} = \\frac{1}{N}\\sum_n {x}_n$$\n",
"Now subtract $\\hat {\\mu}$ from all data points (${x}_n:= {x}_n-\\hat {\\mu}$) and assume that we have zero-mean data."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- For ML estimation of $W$ and $\\sigma^2$, both gradient-ascent and EM are possible. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Solution method 1: Gradient-ascent on the log-likelihood \n",
"\n",
"- Work out the gradients for the log-likelihood\n",
"$$\\begin{align*}\\log\\, &p({D}|{\\theta}) \\\\ &= -\\frac{N}{2} \\log \\lvert 2\\pi(W W^T + \\sigma^2 \\mathrm{I})\\rvert -\\frac{1}{2}\\sum_n {x}_n^T(W W^T + \\sigma^2 \\mathrm{I})^{-1}{x}_n\\end{align*}$$\n",
"and optimize w.r.t. $W$ and $\\sigma^2$. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- (Similarly to ML estimation in Gaussian mixture models), it turns out to be quite difficult to work out the gradient because of the coupling between $W$ and $\\sigma^2$ (but it is possible, see [Tipping and Bishop, 1999](./files/bishop-ppca-jrss.pdf))."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Solution method 2: Use EM\n",
"\n",
"- A big bonus for EM over gradient-based methods is that EM comfortably handles missing observations, e.g. through sensor malfunction. Missing observations are simply treated as hidden variables. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- Maximizing the _expected complete-data log-likelihood_ leads to the following (see Bishop, pg.578 for derivation): "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"$$\\begin{align*}\n",
"\\textbf{E-step}:& \\\\\n",
"M &= W^T W + \\sigma^2 \\mathrm{I}\\\\\n",
"\\mathrm{E}\\left[ z_n\\right] &= M^{-1} W^T x_n \\\\\n",
"\\mathrm{E}\\left[ z_n z_n^T\\right] &= \\sigma^2 M^{-1} + \\mathrm{E}\\left[ z_n\\right] \\mathrm{E}\\left[ z_n\\right]^T\\\\\n",
"\\\\\n",
"\\textbf{M-step}:& \\\\\n",
"W_{\\text{new}} &= \\left[ \\sum_{n=1}^N x_n \\mathrm{E}\\left[z_n\\right]^T\\right] \\left[ \\sum_{n=1}^N \\mathrm{E}\\left[ z_n z_n^T\\right]\\right]^{-1} \\\\\n",
"\\sigma^2_{\\text{new}} &= \\frac{1}{ND} \\sum_{n=1}^N \\left\\{ x_n^T x_n - 2 \\mathrm{E}\\left[z_n\\right]^T W_{\\text{new}}^T x_n + \\mathrm{Tr}\\left( \\mathrm{E}\\left[ z_n z_n^T\\right] W_{\\text{new}}^T W_{\\text{new}} \\right) \\right\\}\n",
"\\end{align*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Solution method 2: Use EM, cont'd\n",
"\n",
"- Note that after $x_n$ is observed, the unobserved 'input' $z_n$ is not known exactly; the uncertainty about input $z_n$, as expressed by the covariance $$\\text{cov}(z_n) = \\mathrm{E}\\left[ z_n z_n^T\\right] - \\mathrm{E}\\left[ z_n\\right] \\mathrm{E}\\left[ z_n\\right] ^T = \\sigma^2 M^{-1}$$ can be computed _before the data point $x_n$ has been seen_. \n",
" - Exercise: Show that the precision about $z_n$ increases through observing $x_n.$\n",
" - Compare this to linear regression, where we have full knowledge about an input-output pair."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"- If there was no uncertainty about $z_n$, i.e., $\\mathrm{E}\\left[ z_n\\right] = z_n$ and $\\mathrm{E}\\left[ z_n z_n^T\\right] = z_n z_n^T$, then\n",
"$$\n",
"W_{\\text{new}} = \\left[ \\sum_{n=1}^N x_n z_n^T\\right] \\left[ \\sum_{n=1}^N z_n z_n^T\\right]^{-1}\n",
"$$\n",
" - Exercise: Verify that this solution resembles the [ML solution for linear regression](http://nbviewer.ipython.org/github/bertdv/AIP-5SSB0/blob/master/lessons/notebooks/06_Linear-Regression.ipynb). "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Example Problem Revisited\n",
"\n",
"Let's perform pPCA on the example (**Tobamovirus**) data set using EM. We'll find the two principal components ($M=2$), and then visualize the data in a 2-D plot. The implementation is quite straightforward, have a look at the [source file](https://github.com/bertdv/AIP-5SSB0/blob/master/lessons/notebooks/scripts/pca_demo_helpers.jl) if you're interested in the details."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "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eX3xxRfKycnRY489pg4dOuj+++931aYAAAB4BLcfkbxZ69at08GDB3Xw4EE1bdq03LKrjw0sKytTXl6ezp07Z182d+5c1a5dW0OHDtX58+fVp08fLV68WD4+Pk6t31HOnDmjgwcP2l8fOnRINptNjRo10p133qkff/xR+fn5OnbsmCQpLy9P0k+H/UNCQlxSMwAA8AwW40YPZ8Z1uftD3zMyMtSrV68K80eOHKnFixdr8eLFevLJJyssnz59upKTk51QIQAAzufu+29PQZC8RXwRAQDwPOy/q4fXnCMJAAAA5yJIAgAAwBSCJAAAAEwhSAIAAMAUgiQAAABMIUgCAADAFIIkAAAATCFIwiEuXbqkl19+WREREfL391fz5s316quv6sqVK64uDQAAVBOveUQi3MucOXP07rvvasmSJWrXrp22bdumJ598UlarVc8++6yrywMAANWAIAmHyMrK0uDBgzVw4EBJUrNmzfTxxx9r27ZtLq4MAABUFw5twyG6d++uL774Qvv375ck7dy5Uxs3btSAAQNcXBkAAKgujEjCIX7/+9+rqKhIUVFR8vHx0eXLlzVz5kw98sgjri4NAABUE4IkHGLFihX66KOPtGzZMrVr1042m00TJ05UWFiYRo4c6eryAABANSBIwiFeeOEFTZkyRcOHD5ckdejQQd99951mzZpFkAQAwEtwjiQc4ty5c6pVq/zXy8fHh9v/AADgRRiRhEMMGjRIM2fO1J133ql27dopJydHb775pn7zm9+4ujQAAFBNLIZhGK4uwpMVFxfLarWqqKhIgYGBri7HbZSUlGjatGlKTU3ViRMnFBYWpkceeUSvvPKKfH19XV0eAKCGY/9dPQiSt4gvIgAAnof9d/XgHEkAAACYQpAEAACAKQRJAAAAmEKQBAAAgCkESQAAAJhCkAQAAIApBEkAAACYQpAEAACAKQRJAAAAmEKQBAAAgCkESQAAAJhCkAQAAIApBEkAAACYQpAEAACAKbVdXYCnMwxDklRcXOziSgAAwM26ut++uh+HOQTJW1RSUiJJCg8Pd3ElAACgqkpKSmS1Wl1dhseyGETxW3LlyhUdO3ZMDRo0kMVicXU55RQXFys8PFxHjhxRYGCgq8txK/RN5eiXytEvlaNfKke/VM7d+sUwDJWUlCgsLEy1anGmn1mMSN6iWrVqqWnTpq4u47oC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aOPSpUuu2oxbtnz5cqNOnTrGokWLjL179xoTJ040AgICjMOHDxuGYRhJSUnlrlT+3//9X8PHx8eYPXu28fXXXxuzZ882ateuXe4KeG9Q1X5JTk420tLSjG+++cbIyckxnnzySaN27dr274+3KCkpsf+GSDLefPNNIycnx/juu+8MwzCMKVOmGElJSfb23377rVGvXj1j0qRJxt69e41FixYZderUMVauXOmqTXCIqvbL3LlzjdTUVGP//v3G7t27jSlTphiSjFWrVrlqE6rd2LFjDavVamRkZBgFBQX26dy5c/Y2NfX3xdsRJL3MyJEjDUkVpvXr19vbSDJSUlLsr69cuWJMnz7dCAkJMfz8/IwePXoYubm5zi/egX744QdjxIgRRoMGDYwGDRoYI0aMKHcrjkOHDpXrp/z8fKNHjx5Go0aNDF9fX6NFixbGhAkTjB9++MFFW1B9/vrXvxp33XWX4evra8TExJS7PUfPnj2NkSNHlmv/z3/+04iMjDTq1KljREVFedXO7+eq0i8TJ0407rzzTsPX19do3LixkZCQYGzatMkFVTvW1dvW/HK62hcjR440evbsWW6djIwMIzo62vD19TWaNWtmLFiwwPmFO1hV+2XOnDlGixYtjLp16xq33Xab0b17d+Ozzz5zTfEOUll//HJfU5N/X7yZxTD+/0xoAAAAoAo4RxIAAACmECQBAABgCkESAAAAphAkAQAAYApBEgAAAKYQJAEAAGAKQRIAAACmECQBAABgCkESAAAAphAkAQAAYApBEgAAAKb8H8jQzH9zs0LIAAAAAElFTkSuQmCC",
"text/plain": [
"PyPlot.Figure(PyObject )"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(θ, Z) = pPCA(X', 2) # uses EM, implemented in scripts/pca_demo_helpers.jl. Feel free to try more/less dimensions.\n",
"using PyPlot\n",
"plot(Z[1,:]', Z[2,:]', \"w\")\n",
"for n=1:size(Z,2)\n",
" PyPlot.text(Z[1,n], Z[2,n], string(n), fontsize=10) # put a label on the position of the data point\n",
"end\n",
"title(\"Projection of Tobamovirus data set on two dimensions (numbers correspond to data points)\", fontsize=10);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Note that the solution is not unique, but the clusters should be more or less persistent.\n",
"\n",
"Now let's randomly remove 20% of the data:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"38×18 Array{Float64,2}:\n",
" 17.0 13.0 14.0 16.0 4.0 … 7.0 NaN NaN 11.0 5.0\n",
" 12.0 11.0 9.0 12.0 6.0 NaN 0.0 4.0 NaN 2.0\n",
" 18.0 16.0 NaN 16.0 NaN NaN 0.0 2.0 11.0 3.0\n",
" 18.0 16.0 15.0 NaN 8.0 8.0 0.0 2.0 9.0 3.0\n",
" 17.0 13.0 13.0 22.0 8.0 6.0 1.0 2.0 10.0 NaN \n",
" 16.0 13.0 16.0 21.0 9.0 … 5.0 1.0 2.0 11.0 3.0\n",
" 22.0 19.0 10.0 16.0 10.0 8.0 0.0 1.0 8.0 NaN \n",
" NaN 10.0 NaN 10.0 6.0 9.0 NaN 4.0 8.0 2.0\n",
" NaN NaN 12.0 15.0 NaN 7.0 0.0 NaN 10.0 3.0\n",
" 20.0 21.0 12.0 15.0 9.0 NaN 0.0 NaN 10.0 3.0\n",
" NaN 11.0 24.0 10.0 9.0 … 11.0 NaN 4.0 9.0 1.0\n",
" 20.0 12.0 23.0 NaN 8.0 11.0 NaN 4.0 10.0 1.0\n",
" 18.0 19.0 18.0 NaN 8.0 6.0 NaN 1.0 12.0 NaN \n",
" ⋮ ⋱ ⋮ \n",
" 17.0 12.0 22.0 10.0 8.0 10.0 0.0 3.0 9.0 NaN \n",
" 17.0 16.0 16.0 NaN 8.0 8.0 0.0 2.0 NaN 3.0\n",
" 19.0 17.0 15.0 NaN NaN 8.0 0.0 2.0 10.0 NaN \n",
" 18.0 16.0 NaN 19.0 8.0 NaN 0.0 2.0 9.0 3.0\n",
" 18.0 17.0 15.0 17.0 8.0 … 8.0 0.0 3.0 9.0 3.0\n",
" 15.0 NaN 14.0 23.0 NaN 6.0 1.0 NaN 11.0 2.0\n",
" 13.0 11.0 14.0 22.0 7.0 6.0 1.0 3.0 11.0 NaN \n",
" NaN 11.0 15.0 NaN 10.0 5.0 1.0 2.0 9.0 3.0\n",
" 14.0 11.0 14.0 25.0 NaN 5.0 1.0 2.0 9.0 3.0\n",
" NaN 11.0 15.0 24.0 NaN … 7.0 2.0 NaN NaN 2.0\n",
" NaN 9.0 12.0 21.0 8.0 6.0 1.0 NaN 10.0 3.0\n",
" 15.0 11.0 15.0 22.0 7.0 5.0 1.0 2.0 10.0 2.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_corrupt = convert(Matrix{Float64}, X) # convert to floating point matrix so we can use NaN to indicate missing values\n",
"X_corrupt[rand(length(X)) .< 0.2] = NaN # set the elements of X_corrupt to NaN with probability 0.2\n",
"X_corrupt"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"PyPlot.Figure(PyObject )"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(θ, Z) = pPCA(X_corrupt', 2) # Perform pPCA on the corrupted data set\n",
"plot(Z[1,:]', Z[2,:]', \"w\")\n",
"for n=1:size(Z,2)\n",
" PyPlot.text(Z[1,n], Z[2,n], string(n), fontsize=10) # put a label on the position of the data point\n",
"end\n",
"title(\"Projection of CORRUPTED Tobamovirus data set on two dimensions\", fontsize=10);"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"As you can see, pPCA is quite robust in the face of missing data."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"-----\n",
"_The cell below loads the style file_\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"open(\"../../styles/aipstyle.html\") do f\n",
" display(\"text/html\", readstring(f))\n",
"end"
]
}
],
"metadata": {
"anaconda-cloud": {},
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Julia 0.6.1",
"language": "julia",
"name": "julia-0.6"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 1
}