Files
mikoto10032--deeplearning/books/PRML/PRML-master-Python/notebooks/ch12_Continuous_Latent_Variables.ipynb
T
2026-07-13 13:30:25 +08:00

284 lines
97 KiB
Plaintext
Executable File

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 12. Continuous Latent Variables"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn import datasets\n",
"%matplotlib inline\n",
"\n",
"from prml.dimreduction import Autoencoder, BayesianPCA, PCA\n",
"\n",
"np.random.seed(1234)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"iris = datasets.load_iris()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 12.1 Principal Component Analysis"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pca = PCA(n_components=2)\n",
"Z = pca.fit_transform(iris.data)\n",
"plt.scatter(Z[:, 0], Z[:, 1], c=iris.target)\n",
"plt.gca().set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 12.1.4 PCA for high-dimensional data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 5 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"mnist = datasets.fetch_mldata(\"MNIST original\")\n",
"mnist3 = mnist.data[np.random.choice(np.where(mnist.target == 3)[0], 200)]\n",
"pca = PCA(n_components=4)\n",
"pca.fit(mnist3)\n",
"plt.subplot(1, 5, 1)\n",
"plt.imshow(pca.mean.reshape(28, 28))\n",
"plt.axis('off')\n",
"for i, w in enumerate(pca.W.T[::-1]):\n",
" plt.subplot(1, 5, i + 2)\n",
" plt.imshow(w.reshape(28, 28))\n",
" plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 12.2.2 EM algorithm for PCA"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pca = PCA(n_components=2)\n",
"Z = pca.fit_transform(iris.data, method=\"em\")\n",
"plt.scatter(Z[:, 0], Z[:, 1], c=iris.target)\n",
"plt.gca().set_aspect('equal', adjustable='box')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 12.2.3 Bayesian PCA"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def create_toy_data(sample_size=100, ndim_hidden=1, ndim_observe=2, std=1.):\n",
" Z = np.random.normal(size=(sample_size, ndim_hidden))\n",
" mu = np.random.uniform(-5, 5, size=(ndim_observe))\n",
" W = np.random.uniform(-5, 5, (ndim_hidden, ndim_observe))\n",
"\n",
" X = Z.dot(W) + mu + np.random.normal(scale=std, size=(sample_size, ndim_observe))\n",
" return X\n",
"\n",
"def hinton(matrix, max_weight=None, ax=None):\n",
" \"\"\"Draw Hinton diagram for visualizing a weight matrix.\"\"\"\n",
" ax = ax if ax is not None else plt.gca()\n",
"\n",
" if not max_weight:\n",
" max_weight = 2 ** np.ceil(np.log(np.abs(matrix).max()) / np.log(2))\n",
"\n",
" ax.patch.set_facecolor('gray')\n",
" ax.set_aspect('equal', 'box')\n",
" ax.xaxis.set_major_locator(plt.NullLocator())\n",
" ax.yaxis.set_major_locator(plt.NullLocator())\n",
"\n",
" for (x, y), w in np.ndenumerate(matrix):\n",
" color = 'white' if w > 0 else 'black'\n",
" size = np.sqrt(np.abs(w) / max_weight)\n",
" rect = plt.Rectangle([y - size / 2, x - size / 2], size, size,\n",
" facecolor=color, edgecolor=color)\n",
" ax.add_patch(rect)\n",
"\n",
" ax.autoscale_view()\n",
" ax.invert_yaxis()\n",
" plt.xlim(-0.5, np.size(matrix, 1) - 0.5)\n",
" plt.ylim(-0.5, len(matrix) - 0.5)\n",
"\n",
"X = create_toy_data(sample_size=100, ndim_hidden=3, ndim_observe=10, std=1.)\n",
"pca = PCA(n_components=9)\n",
"pca.fit(X)\n",
"bpca = BayesianPCA(n_components=9)\n",
"bpca.fit(X, initial=\"eigen\")\n",
"plt.subplot(1, 2, 1)\n",
"plt.title(\"PCA\")\n",
"hinton(pca.W)\n",
"plt.subplot(1, 2, 2)\n",
"plt.title(\"Bayesian PCA\")\n",
"hinton(bpca.W)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### 12.4.2 Autoassociative neural networks"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"autoencoder = Autoencoder(4, 3, 2)\n",
"autoencoder.fit(iris.data, 10000, 1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"Z = autoencoder.transform(iris.data)\n",
"plt.scatter(Z[:, 0], Z[:, 1], c=iris.target)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 1
}