Last active
November 16, 2018 10:36
-
-
Save dfulu/e011788fa30c3c76fa8386d05425ea1f to your computer and use it in GitHub Desktop.
Implemented the SOM algorithm in a standard form. Extended algorithm to a 1D circular circumference node map and a 2D toroidal surface node map.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "In this notebook I implement a classical 1D self organising map to cluster some colours\n", | |
| "\n", | |
| "I write the SOM algorithm from scratch by following the example in [ai-junkie's](#http://www.ai-junkie.com/ann/som/som1.html) blog post about it. \n", | |
| "\n", | |
| "After writing the classical 2D SOM exampe I modify the algoithm to inlude some 1D wrapping. Using this I thought I should be able to recreate the colour wheel (assuming that the colour wheel really does have some ordering in RGB values and that it is not just a perception based ordering). I thought this would be a good exercise since if applying this technique to each based systems we are going to have wrapping of coordinates as well - alhtough I suppose thinking this way is mixing up the ideas of wrapping in real space and wrapping in the SOM space." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Here I create and look at some colour data. Each pixel has three coordinates of RGB value.\n", | |
| "\n", | |
| "I don't just draw a random sample because I foud this gave less pretty (although still valid results). I instead constrain the colours to make them of a similar brightness - although this normalising routine was only stuck together and could be done much better. It does however, give me the kind of sample I want\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 54, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def constant_brightness_colour_sample1(level, N):\n", | |
| " '''Here I randomly draw some RGB values which are roughly similar brigghtnesses'''\n", | |
| " colour_data = np.random.randint(10,255,size=(*N,3))\n", | |
| " brightness = colour_data.sum(axis=2)/(255.*3)\n", | |
| " correction_factor = brightness**-1 * level\n", | |
| " colour_data = colour_data*correction_factor[:,:,np.newaxis]\n", | |
| " return np.clip(np.round(colour_data).astype(int), 0, 255)\n", | |
| "\n", | |
| "def constant_brightness_colour_sample2(level, N):\n", | |
| " '''Here I randomly draw some RGB values which are roughly similar brightnesses'''\n", | |
| " colour_data = np.zeros((*N,3))\n", | |
| " for i in range(N[0]):\n", | |
| " for j in range(N[1]):\n", | |
| " c1 = np.random.randint(0,min(256, level))\n", | |
| " c2 = np.random.randint(0,min(256, max(level-c1,0)))\n", | |
| " c3 = min(level-c1-c2, 255)\n", | |
| " cs = [c1,c2,c3]\n", | |
| " np.random.shuffle(cs) # this is inplace shuffle\n", | |
| " colour_data[i,j] = cs\n", | |
| " return colour_data.astype(int)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 139, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "N=(100,100) # number of data points. Put into square to make it plot nice\n", | |
| "level=0.6\n", | |
| "colour_data = constant_brightness_colour_sample1(level, N)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 140, | |
| "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": [ | |
| "plt.figure()\n", | |
| "plt.title('what our colour data looks like')\n", | |
| "plt.imshow(colour_data)\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "we flatten the data here so we can work with more easily. Also apply scaling." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 141, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "X = colour_data.reshape(np.product(colour_data.shape[0:2]),colour_data.shape[-1])/255." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We initiate some random weights in the map to start with" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 60, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "node_layout2D = (40,40)\n", | |
| "W2D = np.random.random(size=(*node_layout2D, 3))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 61, | |
| "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": [ | |
| "plt.figure()\n", | |
| "plt.title('initial weights in each node')\n", | |
| "plt.imshow(np.round(W2D*255).astype(int))\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 65, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def sigma(sigma_0, t, lam):\n", | |
| " '''decay constant for affected radius'''\n", | |
| " return sigma_0*np.exp(-t/float(lam))\n", | |
| "\n", | |
| "def LR(L_0, t, lam):\n", | |
| " '''learning rate at time step t'''\n", | |
| " return L_0*np.exp(-t/float(lam))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 66, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def single_update(W, x, i, sigma_0, lam, L_0, all_i, all_j):\n", | |
| " '''Apply one step of the SOM algorithm'''\n", | |
| " nearest_ind = np.unravel_index(((W - x)**2).sum(axis=2).argmin(), W.shape[:2])\n", | |
| " nodes_dist = np.sqrt((all_i - nearest_ind[0])**2 + (all_j - nearest_ind[1])**2)\n", | |
| " nearest_ind = np.unravel_index(((W - x)**2).sum(axis=2).argmin(), W.shape[:2])\n", | |
| " nodes_sqr_dist = (all_i - nearest_ind[0])**2 + (all_j - nearest_ind[1])**2\n", | |
| " nodes_dist = np.sqrt(nodes_sqr_dist)\n", | |
| "\n", | |
| " sig = sigma(sigma_0, i, lam)\n", | |
| " L = LR(L_0, i, lam)\n", | |
| " theta = np.exp(-nodes_sqr_dist/(2*sig**2))\n", | |
| "\n", | |
| " W[nodes_dist<=sig] = \\\n", | |
| " W[nodes_dist<=sig] \\\n", | |
| " + (-W[nodes_dist<=sig]+x)*L*theta[nodes_dist<=sig, np.newaxis]\n", | |
| " return W\n", | |
| "\n", | |
| "def SOM(X, W, M, L_0):\n", | |
| " '''apply M steps of the SOM algorithm'''\n", | |
| " new_weights = W.copy()\n", | |
| " sigma_0 = max(W.shape)/2.\n", | |
| " lam = M/np.log(sigma_0)\n", | |
| " \n", | |
| " all_i = np.zeros(W.shape[:2]) + np.arange(W.shape[0])[:, np.newaxis]\n", | |
| " all_j = np.zeros(W.shape[:2]) + np.arange(W.shape[1])[np.newaxis, :]\n", | |
| " \n", | |
| " for i in range(M):\n", | |
| " x = X[np.random.randint(0,X.shape[0]-1,1)[0]]\n", | |
| " new_weights = single_update(new_weights, x, i, sigma_0, lam, L_0, all_i, all_j)\n", | |
| " return new_weights\n", | |
| " " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 67, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "W2D_solved = SOM(X, W2D, 1000, 0.1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 68, | |
| "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": [ | |
| "plt.imshow(np.round(W2D_solved*255).astype(int))\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Now lets try it again in 1D" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 261, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "node_layout1D = (1,10)\n", | |
| "W1D = np.random.random(size=(*node_layout1D, 3))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 262, | |
| "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": [ | |
| "plt.figure()\n", | |
| "plt.title('initial weights in each node')\n", | |
| "plt.imshow(np.round(W1D*255).astype(int))\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 281, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "W1D_solved = SOM(X, W1D, 1000, 0.1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 282, | |
| "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": [ | |
| "plt.imshow(np.round(W1D_solved*255).astype(int))\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Lets try it with wrapping in 2D" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 283, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def loop_dist(flat_dist, N):\n", | |
| " return (flat_dist<=N/2)*flat_dist + (flat_dist>(N/2)) * (N/2-(flat_dist%(N/2)))\n", | |
| "\n", | |
| "def wrapped_sqr_distance(xy, w, h):\n", | |
| " distance = np.zeros((w,h))\n", | |
| " x_dist = np.abs(distance + np.arange(w)[:, np.newaxis] - xy[0])\n", | |
| " y_dist = np.abs(distance + np.arange(h)[np.newaxis, :] - xy[0])\n", | |
| " # now make the modification for the toroid shape\n", | |
| " x_dist = loop_dist(x_dist, w) if w!=1 else 0\n", | |
| " y_dist = loop_dist(y_dist, h) if h!=1 else 0\n", | |
| " return x_dist**2 + y_dist**2\n", | |
| "\n", | |
| "def single_update_wrapping(W, x, i, sigma_0, lam, L_0, all_i, all_j):\n", | |
| " '''Apply one step of the SOM algorithm'''\n", | |
| " nearest_ind = np.unravel_index(((W - x)**2).sum(axis=2).argmin(), W.shape[:2])\n", | |
| " nodes_sqr_dist = wrapped_sqr_distance(nearest_ind, *W.shape[:2])\n", | |
| " nodes_dist = np.sqrt(nodes_sqr_dist)\n", | |
| "\n", | |
| " sig = sigma(sigma_0, i, lam)\n", | |
| " L = LR(L_0, i, lam)\n", | |
| " theta = np.exp(-nodes_sqr_dist/(2*sig**2))\n", | |
| "\n", | |
| " W[nodes_dist<=sig] = \\\n", | |
| " W[nodes_dist<=sig] \\\n", | |
| " + (-W[nodes_dist<=sig]+x)*L*theta[nodes_dist<=sig, np.newaxis]\n", | |
| " return W\n", | |
| "\n", | |
| "def SOM_wrapping(X, W, M, L_0):\n", | |
| " '''apply M steps of the SOM algorithm'''\n", | |
| " new_weights = W.copy()\n", | |
| " sigma_0 = max(W.shape)/2.\n", | |
| " lam = M/np.log(sigma_0)\n", | |
| " \n", | |
| " all_i = np.zeros(W.shape[:2]) + np.arange(W.shape[0])[:, np.newaxis]\n", | |
| " all_j = np.zeros(W.shape[:2]) + np.arange(W.shape[1])[np.newaxis, :]\n", | |
| " \n", | |
| " for i in range(M):\n", | |
| " x = X[np.random.randint(0,X.shape[0]-1,1)[0]]\n", | |
| " new_weights = single_update_wrapping(new_weights, x, i, sigma_0, lam, L_0, all_i, all_j)\n", | |
| " return new_weights" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 284, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "W2D_wrap_solved = SOM_wrapping(X, W2D, 1000, 0.1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 285, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJztnWusZedZ33/Puux9bnPN2I5ru0lAaRuEipHcKBL9kBpSuRGSgwQVqVq5UiSoRCRoEcLlCxcVKSAg/dCK1gg3rkRJogBNVKUXyw2iSJVJCCY4uGlCmpKxxzPxZW7nnH1Zaz39sLfdOfv9v54955zZ4zPr+UmjmfPOu9d61+Xd++z/+r//x9ydIAj6R3GrBxAEwa0hJn8Q9JSY/EHQU2LyB0FPickfBD0lJn8Q9JSY/EHQU2LyB0FPOdDkN7OHzOwrZvY1M3v0sAYVBMHNx/br8DOzEvjfwPuAs8DngQ+6+5/nXnN8c8vvPHV6T1tnum9XpONy0QbgYhu5o1J9QQ9C9W2LtFFvM9eeOQa9CYmJDZvr93FX7++5nXVl0lQ3bdI2bDr58srTvmWT2VchtmF6YIbqqzfr8ma4kWsm+mZ3lp7bzCFkyNx3suty9/6Fi69waedqZsB7qZbplOHdwNfc/esAZvZx4GEgO/nvPHWaX/6xn9rTNhrqg9rZmiRt06G+k9oq3UZT6MkwqdLz0mb6tmXa99JWesqmol9uX5BOkNkY1HnQ260nddJWTAeyr3frYmf6snfbm0nbX3n1atL2tm/tytffOXklaTv1cuYG3xiljbVoA+oi3V+X+Z21bYZpY5Oem7E+XTRFem7azDTpmrWkrWz1wEx8yrl4swX5nkJX6Tfcydre++af/ttflv0UB/m1/x7gm9f8fHbeFgTBEeAgk1+9pScfX2b2I2b2BTP7wqXt9FMkCIJbw0Em/1ngvmt+vhd4YbGTuz/m7g+4+wMnNrcOsLsgCA6Tg3zn/zzwTjN7B/A88MPAP3ijF3SWfscfrevv8eP19DvOeJD5Hi++cze11hKUFpD9zj9Ix9AN0vHWmS+graffzRvTXzZNiGWe+f6Ip98Vp7XWEspxqp10pOMC8GH63frs1umkrZpclK/faNPv/INWf49fn6bXrMtoHMU4/W7NYCz7UqTHW1h6HQdTfQ46IRlMBhkVz4U+YPp7vKlrKbQqgLZM2ydiXACLUk9OC1Hse/K7e2NmHwb+K1ACj7v7l/e7vSAIVstBPvlx988Cnz2ksQRBsELC4RcEPSUmfxD0lJj8QdBTDvSd/0bpCk+ce0rVB9hVqqsWaGmG06RNKfWg3XitFmhxYeU1oeYWpVba6zZ9fV3opxtqXE1GOa6b9Hg9o+BLa+twW3btSFV127yctJ0t9L62Xrwzff2JF/W4LqdqfWH6dvQqVfDXRrpvI57GtGtpWylsywBr4imAMAgCMDquntDoc1NN02sprdfAZCDuhULfC9OFeyRnW1bEJ38Q9JSY/EHQU2LyB0FPickfBD1lpYKfF54sy81adoVuMh1qkWa0looh22vaD9kIS6VlBLuhp0LTAGEf1doiVgnxSSwDnQ0sPQ9Fbvmvp8dWtblBpJbdaUbBGnq6jakQPbfLdOkvwPNndpK2zctaqNocp9ehnGZux1os6R3r+6YUwlpbpgKpZT73OnEvWCYAYX0n3VcjzhegEgno6tw1E9bnjBV4sr5XOPXczSiIT/4g6Ckx+YOgp8TkD4KeEpM/CHpKTP4g6CmrVfstDdtUQRygLbtK1Qe4LJT9cSb8gEoov5m3wE68N5YToVIL+ylAIUI5a6FcA4ymacpRK0I7AApxbNMmcyknqbJvQhEH6ERQpqKs9Ml9ZZIGf3xlKxNusXMhaTs1uCL7bgpH9O4xbZOudsQ1203HMNnIWLLT2yNrw0Vc9y6j9gunN02dC45N23PJ1YuXN+y9QRBcl5j8QdBTYvIHQU+JyR8EPeVAgp+ZfQO4wqwMTePuD7xRfydNz82l7Kr1+DnLrhL3MgVs6EqxHj9jiTRhd1XS3vp0+dfnvMDDMk25bTttBe5EVZmi1gKYC4syubJno/SkVeLYWtOJvOPhiXSbV/Xny4tbqcBZjFN7MMCkPJ60nR6lOQMAk7ekOQFrIr6gKbTgV6kqOjnhVZS6k6XFgOm6yJHIKM2tsPdOhAg4G9vydt5FDkPt/zvu/tIhbCcIghUSv/YHQU856OR34L+Z2R+b2Y+oDteW69q+ouOjgiBYPQf9tf973P0FM7sTeNLM/pe7/8G1Hdz9MeAxgPu+7d791QMPguDQOdAnv7u/MP/7AvB7zMp2B0FwBNj3J7+ZbQKFu1+Z//vvAr/wRq9xS2vWq9p5kEmzzQQaKMuuUvUBEGENlVDaAYaetlci2KHotNJeqMJpQiEGMBHcMRR15wAmQu3vMqmxLel5yFlQEU8MrElfX021Uj4W1+HqWia8RJyaotXn5q31+aTtxS395OfM+fSJxdWTojp0IXy8gG+LMI9SX4dGBLN0me0q323ufh7Xad9xlQm9WdhGdwP23oP82n8X8Hs2eyxRAf/B3f/LAbYXBMEKOUihzq8D33WIYwmCYIXEo74g6Ckx+YOgp6x0PT8Y7YLAt/jz6+1Cr8ul7CqXZM6yq8S9NbTgNxDr29fKVKQZZMblrRC7MguuXSg1hbKaokW4drqe2W7atyZTMkyU4ZqspwLWcKRFvGMi68BFgjHAVNx6L2+kNl6AYifd7inTptJXzqTi3MYoPQeDTS22bacOZaaZFGVr0n25WrgPTMV902Vs1qpdaccAXaak2zLEJ38Q9JSY/EHQU2LyB0FPickfBD0lJn8Q9JTVp/cu2HZVaAeACwuqqp0HOmVXBmmgLbtK1QcYkirdG13aVggLLUBnQrUVQQ0AU08vheWswOrpwnT52nWNegoBdK7syMJqup4JDrkqko0zt5i5sGRnLMovDU8mbU2mNuEJ0kCQsVD2TzWZuo/H0pWnZeapy5WN9DxU27rvSFyzCTpxZioCbrpCn/NxOVjot7y/Nz75g6CnxOQPgp4Skz8IekpM/iDoKSsV/NrCuLS5d5fdUAsZJmyLA5mdq0to6Z56Pb6y7IIW9yph37RWn0al13U5AUz4mduJFuZKEU1c7mh7r+2Icl2ihBdoO3E3EOXNcmm2u+mxZUKUaQepANaa7q3Ki12uUxEQdLmtUZlut210HsApceOM1nJpxekFvriWuReEJXuUKVXnQhQemxZDm4W1/+0NfJzHJ38Q9JSY/EHQU2LyB0FPickfBD3luoKfmT0OfD9wwd2/c952GvgE8HbgG8Dfd/dXr7ctN5guBHjWmYXKhXBEZZboU4o66bkSWipsM7ceXzn3lLjXTrUw13SpqJRzdTXTjaSty4hSNMINmFN6GiEUtRlhTWQKlBdTIdEyF0Kt0T92Ud9itQivbISANtuwEDgbfbwjcT9tTdK1/5fqTfn6QojHXX1F9h2M0vvm5eP6eMeb6bjGmWyHSrg1J5ll+025IKBnHKSKZT75PwY8tND2KPCUu78TeGr+cxAER4jrTv55EY5XFpofBp6Y//sJ4AOHPK4gCG4y+/3Of5e7nwOY/31nruO15bp2L4n89CAIbgk3XfBz98fc/QF3f2D9RFqWOQiCW8N+J/95M7sbYP73hcMbUhAEq2C/9t7PAI8AH5n//ellXuQGk0U7Yqdti7Wy0WaSYAuRdppbz69KaMmUXfR6fGXZVar+rD1VqZs2VfUBOvHEoJ3q7bpQv8lYgW2cbiObCjxOr4VKFSZzzYYiD6DJrNHfalLLbD3Sn0W1i6cxGfW77sTTGE+/ldqG/go6mqSv38ikHV+tx0nb5o5+crS7lrbLcwtsr4sMhowVuGPvfe6ZRGDFdT/5zey3gf8J/HUzO2tmH2I26d9nZl8F3jf/OQiCI8R1P/nd/YOZ//reQx5LEAQrJBx+QdBTYvIHQU9ZcbkuhwXxpsms4a5FYGEr6qED1LUI4Mx5gZVil7FZKqukWo+ftewKca+dZMpqKcFuogW/dpz2ddEG4EI0rNpMmSglhgpx0Ed6XCayErqMULUzSUtz1YVeN1+M0/NbDHRig1j6TzVN7yXb1o+d66vp9Sky6RAnilQ0fOWYvu/Wr6TtO8f0Z+9UlLDzUouON7SAf4H45A+CnhKTPwh6Skz+IOgpMfmDoKfE5A+CnrLacl1Au5CUa8q6CUyVSpwLcJimyu2w1MqxsbzNUpbQEim7KogDtGVXqvpotb4Z6ScDzVgo0sKWCmCT1F7bZRygKsyDqdhuRmEWbuj8uISC3pX6KcJUlKAqMmNQ6cyq/FWlbzu263S7xUW9aLUQw10Tll9AnpxLOk+ESZU+GfBMYvLilFje3Buf/EHQW2LyB0FPickfBD0lJn8Q9JQV23tJrbQZEa8RC7YLIdYBtEIMaTstrA2LVGjKrm8XVmBVQiuXsivX42csu0rca8ZaSPRdtfY/k4swEbkIGcVPCX7q6nSi9BSAkQpVRaavi3Js0nqNLnXlw9y9kJ6biUjDLW0nM650SuyIpGGAkxdOpK/3i7LvSGQg1Ff1uRlupGL1NJNs7OXec758dm988gdBb4nJHwQ9JSZ/EPSUmPxB0FOWyfB73MwumNmz17T9nJk9b2bPzP+8/+YOMwiCw2YZtf9jwL8C/v1C+0fd/VduZGfmRr1gN83ZFofNNGlrXCvlymbZFfrQJqLdcuq1qOFXquRcUTsPdMquCuIAbdlVqj5AJ54MFLt6DOU0VYlzT02U2q9qABYqMQNw8YQmUwaRQiT9FsLGC1A1oq5fmXuKkG5DtY1dW6ePTdLQjEIkAgNcGaRPY4ZXtSq/JmzSJ21b9r1wV2pXt0xi8qDYXei3/C/z+y3XFQTBEecg3/k/bGZfmn8tOHVoIwqCYCXsd/L/OvDtwP3AOeBXcx2jVl8QvDnZ1+R39/Pu3rp7B/wG8O436Bu1+oLgTci+7L1mdvdrVXqBHwCefaP+r7/OC4oFK2yTKcE1JhU4cqmzUyG4FbXebtek222nWvxB2UJ30r5KFANkCa1cyq5a956z7Cpxr9zVfRFiWZ0ROGXgsRDm2jZz2wirtouyawCtsNFS6fNYWnot1zJlsSZVur9mmG63zpTgUuXcirE+3kGbCrobxRXZdypyK7Zf0jkBa2VqQZ+c1vd+sWj7zSRRK647+eflut4LnDGzs8DPAu81s/uZZQd8A/jRpfcYBMGbgv2W6/rNmzCWIAhWSDj8gqCnxOQPgp4Skz8Iespq03vdkuALpa5CJknWdCIvIqHWXddXa4UFVdWjAyiFjdV2lL1XK+02Tn3HqnYe6JRdFcQxG5dQfoWqDzAUp6ES+4LZ9Un2JUT1KpN2rEI+ikxwSCtU+dy9UAulvFjTav+wEJZsEag7rfRTl7GwlR8jbQOwnfQ8jtEBLOtrqZX3Ld0l2XciQkJ2al0DsCkW1f5DtPcGQXB7EpM/CHpKTP4g6Ckx+YOgp6w2vdcNWxDRpsrmCRTru0nbuBFiG1AKG64vCiFzOrFmPGf1bNpUFLKJGIOweYJOBc5ZlJUulkvZVevxc5ZdJe4JTWzW7qJMlPh8UKnGs3Gl59FKLVSpfdUj3RchDlaZvkWXisLFMBXsyrE+X3h6vnYy5djuEkm96v4CGF4WovS6vhBvHaUq7XioLegXyr33aE68VsQnfxD0lJj8QdBTYvIHQU+JyR8EPSUmfxD0lBWr/QXteG+aT1Wlqj7AtBHJqI1W5V3UXetGWoFHhHxMC2137VTCrFBTc2EeNk63292AnVlanDPtMogDbdlVSvusszheS/tapiKci3b9XEA/MSgKfX03J0LBH+hae1WT2mhdBbuU+jqsi3qDbZ2xAu+m99jxS/rcrrfpfd6V+jxudCLM40V9j46rvU8MyiZzbQXxyR8EPSUmfxD0lJj8QdBTlinXdZ+Zfc7MnjOzL5vZj8/bT5vZk2b21fnfkd0fBEeIZQS/BvhJd/+imR0D/tjMngT+MfCUu3/EzB4FHgV++o02VE877r1weU/bN0+dkX29SAWdRiT6ArgQTuqptk4WwgY7WdfrtVUSajtI+1Yi0RfAhTCXtV+Kck65d2YpMGbWcav1+MqyC1rcE/pXNpHXhYhXdZnrIBJ5C9N9mzrd37FOi4O1ELyKiRDbMnf+UOQieK3vD+W4rTOiZTFOj+3Err4OjSjNdV8rQgmAydW9BzJYXu9bqlzXOXf/4vzfV4DngHuAh4En5t2eAD6w/G6DILjV3NB3fjN7O/DdwNPAXa9l98//1iHkQRC8KVl68pvZFvA7wE+4++Xr9b/mda+X69q+uvTLgiC4ySw1+c2sZjbxf8vdf3fefN7M7p7//93ABfXaa8t1bW4dP4wxB0FwCCxTsceYFel4zt1/7Zr/+gzwCPCR+d+fvt62Bm3HPa8uuJdM/zZwzlLRY7vclH2rMnVajVVqI1CL+utru9rBNdoUopQLh19mzboMFh3pAE+EiKcCMQEKESyaK6GlwjZz6/GVc0+Je0Umk8BEcy2yBwAqIfiVhQ5drT29loOM4FfV6TYGpXCRZsTFobiWnVjjD1AJgbRzfX2LQepSHLoOpF1r0220lb7H3nZ+7707mOrzolhG7f8e4B8Bf2Zmz8zbfobZpP+kmX0I+Evgh5beaxAEt5xlynX9IWTM3PC9hzucIAhWRTj8gqCnxOQPgp4Skz8IespK1/PXXcvdo1f3tG3ufkv2PTl6a9L2/B3pWm2Al0ktwpNBZg12larBWxkrsF9J24rdVPmduj6NQ2G5tcwKd6WUm/LWAi5KjtHo93FZQiuTVizX44snA2qsMLu+iwxdW2NL8TSmypRYKz0d7zBTum29SJ8elWV6IYvMQVQiGKErMpZs8YTFLFPaq023UU4y2Q7i+gz0wytK2/sfVeZJjiI++YOgp8TkD4KeEpM/CHpKTP4g6CkrFfzKFo5f2isq1WoNOVBunkva1i/pUM5uKxVTfKTf164MUutkV2uRpBSCzkB0PXZRn8amTcXBNhPaWE7Eev6MvVeu0c+ssS9Eya+cHVmdBbUeP2fZVeLeMCPiDcX69EFxVfatyzTb4YS9LPtWdbqNSrw+F55p4rbJleBSzcp6PfuPdPF/lxF/S2GfLgZapF1fCKrNicRySEv3DILgtiImfxD0lJj8QdBTYvIHQU+JyR8EPWW15bqKDhvuDVZYy1gcT5EqxxtNxjq5ez5pe3HrmOzrQv1ui0xpL6FUd0J1HZRatd1sUwvq7kSnGRnpvtwyYR7CNtwW+lK21fLlumQJLRG6oYI4QFt2laoPsFamVu06Y9mtRRjHRiW810Blad+ySPfVZhT86SC9F6pM8IcJi3Bbalu52kI5zSjzIxECk3nCUp5cOA+5YBlBfPIHQU+JyR8EPSUmfxD0lIOU6/o5M3vezJ6Z/3n/zR9uEASHxUHKdQF81N1/Zem9mWOLKaaZ8lWlqGNfCAsswGlh6Synun572aW1RV4anpR9XYyhKVN78HRNiyz1KD22utCiVleI1NeMMFcoD2qm3nwhUoHrUWa7otSUKqGVS9lV6/Gzll0h7q1l+p4sXkr3VenzOKjS616U6biazPmqPD3esbDmAiAF0sx6emHZbetc2bRUJG2FVRxgMFm4x5Zfzr9UgOc54LXKPFfM7LVyXUEQHGEOUq4L4MNm9iUzezyq9AbB0eIg5bp+Hfh24H5mvxn8auZ1r5frurijY7iCIFg9+y7X5e7n3b119w74DeDd6rXXlus6uaEr7gRBsHqWUftlua7X6vTN+QHg2cMfXhAEN4uDlOv6oJndz0xf/Abwo9fbkNFRL9gvC9dKqovEikEtaq4B1TSVOCfVCdn3rjKtJ1qMtET6ci2eAoikX2u0PbgW0mshngAATITd1EXiK+gwD6XUAwyEeo2w/AJsTlIFvanTvqp2HuiUXRXEMWtPr6VS9QEGwgo8EJZdgFI8BZCJyYW2y3ZCVC/FOQBwEfbingsJSdu7Rtf16yoV5ayt7eOFpwuee9ogOEi5rs8uvZcgCN50hMMvCHpKTP4g6Ckx+YOgp6x2Pb9Bt7hHsf4aYE2UxUqsjHNGm6nQ9JbdtGwTwGQzFVlOo0uGNcJee6VKRcBCCI4AXqbjTezNr7V3QlaptQ23LdL37LUdLfgVwnpcZey95SAV59Y7kV8g2kCX0Mql7Kr1+FnLrhD36kzfskiFMZXOXGfSe8ek4m2hrg0goiHIfZ6akM2KSp9HhCWbzBhYtF9nuinikz8IekpM/iDoKTH5g6CnxOQPgp4Skz8IespK1X53o50uqKlCnQVo11Il1CaZ2mY7qcQ5OaMtqGfOp2r/K2f0GE4iVGbhCh1llNi6S5XjRlk3gVqFPXSZJNjkkQlMMhbUobCxFl1GKW/E8TbiaUGtwzzWi/QJi6qdBzpld1Atb9lVqv5sw+J4xTlXT0wArEj7dpl05kYUbuxa/SSlE9dMpSUDTEXQSCkSmwHKnYXtigCaHPHJHwQ9JSZ/EPSUmPxB0FNi8gdBT1mtvdcNFtYwF0JgAZiIsljFmhZ5yt3URjvMJIZNTqS20s1xzjacjm3XU8Fwq9UW1tbTpOBqooU5WbUsUxarLtP2SaUvZdGJ/IGhXstOnW63nAhhTqzFByhLYdnNrOdXJbRUyi7o9fjKsgta3BNam14zDzRC0e0ywpzKW1A2XoBC6IC+KH6/to0mHXCXyR8Ybe2dEzlxUo5p6Z5BENxWxOQPgp4Skz8IesoyAZ5rZvZHZvan83JdPz9vf4eZPW1mXzWzT5hZps51EARvRpYR/MbAg+5+dR7h/Ydm9p+Bf8asXNfHzezfAB9iluWfxQ3GC28Rg6kuQ1Q1SuDQ71XT9bRvkxFIKFPRsM6U2zo1SQUw71LB71KpI8ltIxXAbOeY7FsLYa5Gj2vi6fvsuhABAZoqHW+dcUq6WOMuM0Qz51aVqmoz6+ZbEWiZK6Gl9pdbj6+ce0rcmwz0vtpSiG1TLQg7aXvn+n52E2GfmWOQa/c9I+gunppMgKh87fU6+IzXPJr1/I8DDwKfmrc/AXxg6b0GQXDLWbZoRzmP7b4APAn8BXDR/fWs5rNE/b4gOFIsNfnnlXnuB+5lVpnnXaqbeu3ecl36mW8QBKvnhtR+d78I/D7wHuCk2etfZO4FXsi85ppyXRsHGWsQBIfIMmr/HWZ2cv7vdeD7gOeAzwE/OO/2CPDpmzXIIAgOn2XU/ruBJ8ysZPZm8Ul3/09m9ufAx83sXwB/wqye3xviZjTF3l0K8RyAobI+ZtZwC1cqdWZds2+nCu3OCd13fCL9mnJyLEpKZdJwR5P09A6u6DX627U4ERnldlOsGRdBwwBMp8ImLZ4WAAwttdwOxbkdqHphQKWyAzIfL9NBOoZKlRZDl9BSKbug1+Mry24jVH2AVuysLXTfrkvvJbfMAbfpdnPl2FQZMGszCcK2sI3Mun/FMuW6vgR8t2j/OpnKvEEQvPkJh18Q9JSY/EHQU2LyB0FPWW2AJ0a7sMuJCEEEaAbp2u6ccdHVe1hG1DJh750uljyaUwlBZjQUa9krHVJ5rEjVsg4dLHriYrr2/2qtxUGEIFSN9aU81qWi5U6TsSML0bGr0vF2GbGtM9FX2HgBarHAfcy67FuKcNJsCS2xnl2tx89ZdpW41wmxbrZdcc4zfRmn51aWaANo0m3kBD8WLeCHae8NguD2JCZ/EPSUmPxB0FNi8gdBT4nJHwQ9ZcXpvQVds6BgZ0IKRsdTBX59Ryu01KmCb5mySe3i/gEmOjX28ql0uxMhdNdj/bTgyiBVv48LCy1As3YhaTt5/qTsuysCOoruuOzrbTq2U35J9p3upAc3GKbnfFDqc2su0myz4nO6Dcso1cru2mVCalUJLWWjVUEcoC27UtUHbDGZBvQNAjBJFfyiyTxxUJ/JbS58ZO/19ewzsZT45A+CnhKTPwh6Skz+IOgpMfmDoKesVPAzh3JBuGgX1yPPcWGTbDJWUeWSVOu6ATqRCeAZm2Ul1v5fXEtP2c5xfRo3d9IxvHpci2Xro9QK3N6phbnyYpqItHFCW4z9cmrlFUGyAGyJ8Q7rVAxtOy1qDUj7VtOcUJUKryr9F6ATQqBlPrc6IfSqElr5lF0ltmUsu0rcG2lLdinOg7rHAQpxvLkiXItu5swp1PtZvmsQBLcTMfmDoKfE5A+CnhKTPwh6ykFq9X3MzP6PmT0z/3P/zR9uEASHxUFq9QH8lLt/6g1em7AYYGAZ22IlwhYyAbWonIPpeqa3UFKnmScDI5VSKyyZ4w19DLtvSRX89ct6XE7a11yHWxRtqjKXV/R2BxsiUXesn26cnlxO2lrhzy0rbYdGpdk2ulZDayIUJWPJNvmUJ/Pkp0tvaZEbImvnzcagooIzEdPCsqtUfQBXadQZe6+8HdVBQCr33wDLpPc6oGr1BUFwhNlXrT53f3r+X79oZl8ys4+amXx73FuuSz+LDoJg9eyrVp+ZfSfwz4G/Afwt4DTw05nXXlOua+uQhh0EwUHZb62+h9z93Lx89xj4d0QBjyA4Ulz3O7+Z3QFM3f3iNbX6fsnM7nb3c2ZmwAeAZ6+/O8MXRaFKywcqkbcTZZcAmjrt22bKJjVif11mffpEpNTulqnQNM6IT96m34R2jum+lzbT8Vbb+vKcJk3kbaZvlX3PFKmIV2cWw186lrafFrbjutAJxMUobfP1zDWbpOe8FdcRoBNptkWlS7eZSOpVYptXuWsmMgky9m+1Hj9n2VXiXi6BWCb1ZoS9TtyPy3KQWn3/ff7GYMAzwD/Z9yiCIFg5B6nV9+BNGVEQBCshHH5B0FNi8gdBT4nJHwQ9ZcW1+sAX3m7ajIo5GciEDtlXCLTSlgowFnXfuoy9d1oL5Vgo+3XG0nl1PR3YpNB9TTxxWFsX8jlw/q7UL7FZawV+8q001ffOkd7uaRdpxdNUvR6U6dMGACw9hmKaUcqFvbYwbRvuhLLvGVt4V6bt1ojbPKO0q6RgVTsPdMquCuKYtadtufp78nbMudUX2yPMIwiC6xGTPwh6Skz+IOgpMfmDoKestlyXOV21V6GYZJZKN4VYz5+zAguFZFLp97UOWs5kAAAEIUlEQVSxaO8yb4Eq6XdcpFbRcUa0bJT1UmUEAL6ohAJTUXoKwJq07+i47nulTpWi7TWdMNueTY/t7qmwEmccrGuj9HiLgT7e1tL2bpq5HS21GOessYU4j16IMeRKcAkRLifMqRJaWb1NrcfPrcVX+QO5+2ZxaDfg9o1P/iDoKTH5g6CnxOQPgp4Skz8IekpM/iDoKau19xpM1vYqnCrUFGAqavhN1jMWVrWNxPc476vCPDL1Asdl+iiiEfbgptTyd6dk28yjhUaotF5lEnmFlVcMC4CReBKyW+o4tYb0PGxfShOE/9rFtP7fbAypbbgY6VtscEpcy0yqsLpmoNXvtZ10f6Ot9KmNegAA4OJe8Iy3thUKfDZMV/xHLohD3boZ1zCThXRm8bAjS3zyB0FPickfBD0lJn8Q9JSY/EHQU8xF2ulN25nZt4D/O//xDPDSyna+OuK4jh6307G9zd3vWKbjSif/nh2bfcHdH7glO7+JxHEdPW7nY3sj4tf+IOgpMfmDoKfcysn/2C3c980kjuvocTsfW5Zb9p0/CIJbS/zaHwQ9ZeWT38weMrOvmNnXzOzRVe//MDGzx83sgpk9e03baTN70sy+Ov/71K0c434ws/vM7HNm9pyZfdnMfnzefqSPzczWzOyPzOxP58f18/P2d5jZ0/Pj+oSZZVac3F6sdPLPi33+a+DvAd8BfNDMvmOVYzhkPgY8tND2KPCUu78TeGr+81GjAX7S3d8FvAf4sfl1OurHNgYedPfvAu4HHjKz9wC/BHx0flyvAh+6hWNcGav+5H838DV3/7q7T4CPAw+veAyHhrv/AfDKQvPDwBPzfz/BrHz5kcLdz7n7F+f/vgI8B9zDET82n3F1/mM9/+PAg8Cn5u1H7rj2y6on/z3AN6/5+ey87XbiLnc/B7NJBNx5i8dzIMzs7cyqND/NbXBsZlaa2TPABeBJ4C+Ai+7+Wkro7XhPSlY9+dWq5Hjc8CbFzLaA3wF+wt0v3+rxHAbu3rr7/cC9zH4TfZfqttpR3RpWPfnPAvdd8/O9wAsrHsPN5ryZ3Q0w//vCLR7PvjCzmtnE/y13/915821xbADufhH4fWaaxkmz14sH3o73pGTVk//zwDvn6uoA+GHgMysew83mM8Aj838/Anz6Fo5lX5iZAb8JPOfuv3bNfx3pYzOzO8zs5Pzf68D3MdMzPgf84LzbkTuu/bJyk4+ZvR/4l0AJPO7uv7jSARwiZvbbwHuZrQo7D/ws8B+BTwJ/FfhL4IfcfVEUfFNjZn8b+B/An/H/S0j8DLPv/Uf22MzsbzIT9EpmH3yfdPdfMLNvYyY+nwb+BPiH7q4z424jwuEXBD0lHH5B0FNi8gdBT4nJHwQ9JSZ/EPSUmPxB0FNi8gdBT4nJHwQ9JSZ/EPSU/wd6QUAZu4enkAAAAABJRU5ErkJggg==\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| }, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "plt.imshow(W2D_wrap_solved)\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Plot 9 copies of the solution 3x3 so we can see the pattern and warpping properties" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 286, | |
| "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": [ | |
| "wrapped_im = np.tile(np.round(W2D_wrap_solved*255).astype(int),(3,3,1))\n", | |
| "plt.imshow(wrapped_im)\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Finally do wrapping in 1D" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 290, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "W1D_wrap_solved = np.transpose(SOM_wrapping(X, np.transpose(W1D, axes=(1,0,2)), 1000, 0.1), axes=(1,0,2))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 291, | |
| "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": [ | |
| "plt.imshow(np.round(W1D_wrap_solved*255).astype(int))\n", | |
| "plt.show()" | |
| ] | |
| } | |
| ], | |
| "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.7.0" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment