Skip to content

Instantly share code, notes, and snippets.

@fedden
Created November 9, 2017 00:31
Show Gist options
  • Save fedden/e6a42bd9bb4b52b9b39190b3338a1f67 to your computer and use it in GitHub Desktop.
Save fedden/e6a42bd9bb4b52b9b39190b3338a1f67 to your computer and use it in GitHub Desktop.
Eigenvectors And Eigenvalues
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Imports\n",
"\n",
"The first thing we'll need is numpy, probably the most OP machine learning library! We'll also use matplotlib too to visualise what we are doing. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"from matplotlib.patches import Polygon\n",
"from matplotlib.collections import PatchCollection\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Calculating Eigenvalues and Eigenvectors\n",
"\n",
"Here we have a transformation matrix. We can compute the eigenvectors and eigenvalues using numpy. Note that numpy will scale the eigenvectors to unit vectors automatically. \n",
"\n",
"The eigenvectors tell us which direction the transformation is being steched, and the values tell us what scale factor by which it is being stretched."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"eigenvalues:\n",
" [ 1.53027756 1.16972244] \n",
"eigenvectors:\n",
" [[ 0.95709203 -0.28978415]\n",
" [ 0.28978415 0.95709203]]\n"
]
}
],
"source": [
"#transformation_matrix = np.array([[0.8, 0.2], [0.55, 1.3]])\n",
"transformation_matrix = np.array([[1.5, 0.1], [0.1, 1.2]])\n",
"eigenvalues, eigenvectors = np.linalg.eig(transformation_matrix)\n",
"\n",
"print(\"eigenvalues:\\n\", eigenvalues, \"\\neigenvectors:\\n\", eigenvectors)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Eigendecomposition\n",
"\n",
"$$\n",
"\\begin{align}\n",
"\\boldsymbol{M} = \\boldsymbol{Q} \\boldsymbol{\\Lambda} \\boldsymbol{Q}^{-1}\n",
"\\end{align}\n",
"$$\n",
"\n",
"Here in the below Python code, __M__ is the result, __Q__ are the eigenvectors (note the last one is inverse) and __V__ (upside down V == lambda) is the diagonal matrix of eigenvalues. We can assert it all worked correctly like below!"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"successful eigendecomposition!\n"
]
}
],
"source": [
"diag = np.diag(eigenvalues)\n",
"inverse = np.linalg.inv(eigenvectors)\n",
"result = eigenvectors.dot(diag).dot(inverse)\n",
"\n",
"if np.allclose(transformation_matrix, result):\n",
" print(\"successful eigendecomposition!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A Quad's Coordinates\n",
"\n",
"Here we define a square that will ultimately be warped by our transformation matrix."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"original_matrix = np.array([\n",
" [-1, -1], \n",
" [-1, 1],\n",
" [ 1, 1],\n",
" [ 1, -1]\n",
"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting The Quad\n",
"\n",
"A sanity check that we have a square. Good."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nIgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fac3c3c6898>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots()\n",
"original_quad = Polygon(original_matrix, True)\n",
"patch = PatchCollection([original_quad], \n",
" cmap=matplotlib.cm.jet,\n",
" alpha=0.2)\n",
"axes.add_collection(patch)\n",
"_ = axes.set_xlim([-2, 2])\n",
"_ = axes.set_ylim([-2, 2])\n",
"plt.gca().set_aspect('equal', adjustable='box')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Transforming The Quad\n",
"\n",
"Now we transform the quad and get a new quad."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[-1.6, -1.3],\n",
" [-1.4, 1.1],\n",
" [ 1.6, 1.3],\n",
" [ 1.4, -1.1]])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"transformed_matrix = np.dot(original_matrix,\n",
" transformation_matrix)\n",
"transformed_matrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting The Quad And The Transformation\n",
"\n",
"We can see the two quads overlaid over one another."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fac3a0760f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots()\n",
"original_quad = Polygon(original_matrix, True)\n",
"new_quad = Polygon(transformed_matrix, True)\n",
"patch = PatchCollection([original_quad, new_quad], \n",
" cmap=matplotlib.cm.jet,\n",
" alpha=0.2)\n",
"axes.add_collection(patch)\n",
"_ = axes.set_xlim([-2, 2])\n",
"_ = axes.set_ylim([-2, 2])\n",
"plt.gca().set_aspect('equal', adjustable='box')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Studying The Direction Of The Eigenvectors\n",
"\n",
"Geometrically, an eigenvector points in the direction that is stretched by the transformation. Here we get these directions."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.302775637732 -3.30277563773\n"
]
}
],
"source": [
"xs = eigenvectors[0]\n",
"ys = eigenvectors[1]\n",
"\n",
"grad_1 = ys[0] / xs[0]\n",
"grad_2 = ys[1] / xs[1]\n",
"\n",
"print(grad_1, grad_2)\n",
"\n",
"line_x = np.linspace(-2, 2, 500)\n",
"grad_line_1 = line_x * grad_1\n",
"grad_line_2 = line_x * grad_2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting The Eigenvector's Directions"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fac3a03bb70>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots()\n",
"original_quad = Polygon(original_matrix, True)\n",
"new_quad = Polygon(transformed_matrix, True)\n",
"patch = PatchCollection([original_quad, new_quad], \n",
" cmap=matplotlib.cm.jet,\n",
" alpha=0.2)\n",
"axes.add_collection(patch)\n",
"_ = axes.plot(line_x, \n",
" grad_line_1, \n",
" dashes=[5, 5])\n",
"_ = axes.plot(line_x, \n",
" grad_line_2, \n",
" dashes=[5, 5])\n",
"_ = axes.set_xlim([-2, 2])\n",
"_ = axes.set_ylim([-2, 2])\n",
"plt.gca().set_aspect('equal', adjustable='box')"
]
}
],
"metadata": {
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment