{
"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": 1,
"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": 1,
"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": 2,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"Figure(PyObject