{ "metadata": { "name": "", "signature": "sha256:b7d846ab27073dd62db076a49390e6431da6aa637113253ff5c77765838719fc" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import pylab as pb\n", "import scipy.stats as sp\n", "%pylab inline\n", "\n", "\n", "\n", "def generate_data(m,c,n):\n", " global mus, covs, ns\n", " mus=m\n", " covs=c\n", " ns=n\n", " l1=[]\n", " for i in range(len(mus)):\n", " l1.append(np.random.multivariate_normal(mus[i], covs[i], ns[i]))\n", " X=np.vstack(l1)\n", " return X\n", "\n", "\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Ellipse\n", "\n", "\n", "\n", "def plot_cov_ellipse(cov, pos, nstd=2, ax=None, **kwargs):\n", " #REF: http://stackoverflow.com/a/12321306/1472461\n", " \"\"\"\n", " Plots an `nstd` sigma error ellipse based on the specified covariance\n", " matrix (`cov`). Additional keyword arguments are passed on to the \n", " ellipse patch artist.\n", "\n", " Parameters\n", " ----------\n", " cov : The 2x2 covariance matrix to base the ellipse on\n", " pos : The location of the center of the ellipse. Expects a 2-element\n", " sequence of [x0, y0].\n", " nstd : The radius of the ellipse in numbers of standard deviations.\n", " Defaults to 2 standard deviations.\n", " ax : The axis that the ellipse will be plotted on. Defaults to the \n", " current axis.\n", " Additional keyword arguments are pass on to the ellipse patch.\n", "\n", " Returns\n", " -------\n", " A matplotlib ellipse artist\n", " \"\"\"\n", " def eigsorted(cov):\n", " vals, vecs = np.linalg.eigh(cov)\n", " order = vals.argsort()[::-1]\n", " return vals[order], vecs[:,order]\n", "\n", " if ax is None:\n", " ax = pb.gca()\n", "\n", " vals, vecs = eigsorted(cov)\n", " theta = np.degrees(np.arctan2(*vecs[:,0][::-1]))\n", "\n", " # Width and height are \"full\" widths, not radius\n", " width, height = 2 * nstd * np.sqrt(vals)\n", " ellip = Ellipse(xy=pos, width=width, height=height, angle=theta,alpha=0.2, **kwargs)\n", "\n", " ax.add_artist(ellip)\n", " return ellip\n", "\n", "def plot_data(X):\n", " global mus, covs, ns\n", " for i in range(len(mus)):\n", " plot_cov_ellipse(covs[i], mus[i])\n", " pb.plot(X[:,0],X[:,1],'o',ms=6)\n", "\n", "\n", "def loglikelihood(X,parameters,Z):\n", " ll=0\n", " for i in range(X.shape[0]):\n", " lt=0\n", " j=Z[i]\n", " lt+=np.log(parameters[\"taus\"][j])\n", " lt+=- 0.5*np.linalg.slogdet(parameters[\"covs\"][j])[1]\n", " #print np.linalg.inv(parameters[\"covs\"][j]).shape\n", " inm=np.dot((X[i,:]-parameters[\"mus\"][j]).reshape((1,X.shape[1])),np.linalg.inv(parameters[\"covs\"][j]))\n", " #print inm.shape\n", " \n", " lt+=- 0.5*np.dot(inm,(X[i,:]-parameters[\"mus\"][j]).reshape((X.shape[1],1)))\n", " lt+= - (len(parameters[\"mus\"])/2.0) * np.log(2*np.pi)\n", " \n", " ll+=lt\n", " return ll\n", "\n", "\n", "def estep(X,parameters):\n", " #return assignment probabilities T\n", " ts=[]\n", " mns=[]\n", " for i in range(len(parameters[\"mus\"])):\n", " mns.append(sp.multivariate_normal(mean=parameters[\"mus\"][i], cov=parameters[\"covs\"][i]))\n", "\n", " #print mns\n", " for i in range(X.shape[0]):\n", " tt=[]\n", " nsum=0.0\n", " for j in range(len(parameters[\"mus\"])):\n", " nsum+=parameters[\"taus\"][j]*mns[j].pdf(X[i,:])\n", " for j in range(len(parameters[\"mus\"])):\n", " tt.append((parameters[\"taus\"][j]*mns[j].pdf(X[i,:]))/nsum)\n", " \n", " ts.append(np.array(tt))\n", " \n", " return np.vstack(ts)\n", "\n", "def mstep(X,parameters, T):\n", " #return new parameters theta_t+1\n", " newmus=[]\n", " newcovs=[]\n", " newtaus=[]\n", " \n", " \n", " newparams={}\n", " for j in range(len(parameters[\"mus\"])):\n", " newtaus.append(1/(float(X.shape[0])) * np.sum(T[:,j]))\n", "\n", " msum=np.zeros(parameters[\"mus\"][0].shape)\n", " for i in range(X.shape[0]):\n", " msum+=T[i,j]*X[i,:]\n", " newmus.append(msum/float(np.sum(T[:,j])))\n", " \n", " csum=np.zeros(parameters[\"covs\"][0].shape)\n", " for i in range(X.shape[0]):\n", " #print (X[i,:]-newmus[j])\n", " #print np.dot((X[i,:]-newmus[j]).reshape((X.shape[1],1)),(X[i,:]-newmus[j]).reshape((1,X.shape[1])))\n", " csum+=T[i,j]*np.dot((X[i,:]-newmus[j]).reshape((X.shape[1],1)),(X[i,:]-newmus[j]).reshape((1,X.shape[1])))\n", " #print csum\n", " newcovs.append(csum/float(np.sum(T[:,j])))\n", " \n", " newparams[\"mus\"]=newmus\n", " newparams[\"covs\"]=newcovs\n", " newparams[\"taus\"]=newtaus\n", " \n", " return newparams\n", "\n", "def plotpred(X, parameters, Z):\n", " global mus, covs, ns\n", " mycolors=[\"red\",\"green\",\"blue\",\"yellow\"]\n", " for i in range(len(mus)):\n", " plot_cov_ellipse(parameters[\"covs\"][i], parameters[\"mus\"][i], color=mycolors[i])\n", " for i in range(len(mus)):\n", " pb.plot(X[:,0][np.where(Z==i)],X[:,1][np.where(Z==i)],'o',ms=6, color=mycolors[i])\n", " \n", " \n", "\n", "def step(x):\n", " if x>=0.5:\n", " return 0\n", " else:\n", " return 1\n", " \n", "vstep=np.vectorize(step)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline\n", "#print generate_data()\n", "means=[np.array([-3,5]),np.array([3,3]),np.array([-5,-4]),np.array([0.5,-2])]\n", "\n", "covs=[np.array([[1,0],[0,1]]),np.array([[1,0.5],[0.5,1]]),np.array([[2,0],[0,1.4]]),np.array([[2,-0.5],[-0.5,2]])]\n", "\n", "ns=[100,50,50, 100]\n", "\n", "\n", "X=generate_data(means, covs, ns)\n", "print X.shape\n", "plot_data(X)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n", "(300, 2)\n" ] }, { "output_type": "stream", "stream": "stderr", "text": [ "WARNING: pylab import has clobbered these variables: ['step']\n", "`%matplotlib` prevents importing * from pylab and numpy\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "parameters={\"mus\":[np.array([0.5,-0.1]),np.array([5.3,1.2]),np.array([-.2,1.1]),np.array([6,-6])],\\\n", " \"covs\": [np.array([[1.3,0.4],[0.4,1.3]]),np.array([[1,0],[0,1]]),np.array([[1,0.5],[0.5,1]]),np.array([[1.3,-0.4],[-0.4,1.3]])],\\\n", " \"taus\": [0.3,0.2,0.2,0.3]}\n", "\n", "\n", "T=estep(X,parameters)\n", "Z=np.argmax(T,axis=1)\n", "print loglikelihood(X,parameters,Z)\n", "print T.shape\n", "past=[]\n", "past.append((parameters,loglikelihood(X,parameters,Z)[0][0],Z))\n", "for i in range(50):\n", " T=estep(X,parameters)\n", " Z=np.argmax(T,axis=1)\n", " newparams=mstep(X,parameters,T)\n", " #print newparams\n", " parameters=newparams\n", " #print newparams\n", " print loglikelihood(X,parameters,Z)\n", " past.append((parameters,loglikelihood(X,parameters,Z)[0][0],Z))\n", "\n", "#print len(past)\n", "#print past[0]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[-4999.01727711]]\n", "(300, 4)\n", "[[-2220.66514883]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-2169.7073554]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-2164.8603898]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-2148.35842299]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-2038.93068375]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1976.68090819]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1947.48988125]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1937.7391345]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1936.00856604]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1935.56825023]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1934.68479364]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1931.58122941]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1929.34091732]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1925.62858235]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1922.22099993]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1919.00384678]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1915.53650223]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1912.67945371]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1910.21167729]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1907.84398807]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1905.10332812]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1903.38489095]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1902.26232094]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1901.72636337]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1900.27262105]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1899.47597449]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1898.59589333]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1898.23705127]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1898.11827969]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1898.17927671]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1898.11024976]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1897.49809384]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1897.25289078]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1897.09708407]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.80518568]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.59924636]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.44966431]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.34157726]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.26363876]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.20743756]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.16685867]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.13750511]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.11622987]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.10078172]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.08954724]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.08136674]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.07540408]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.07105463]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.06788008]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "[[-1896.06556204]]" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "plotpred(X,parameters,Z)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nERERERERERERERERERERERERERERERERCde/Brd3SDzzA2MAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from ipywidgets import StaticInteract, RangeWidget, RadioWidget\n", "#REF: https://jakevdp.github.io/blog/2013/12/05/static-interactive-widgets/\n", "mycolors2=[\"red\",\"green\",\"blue\",\"yellow\"]\n", "\n", " \n", "def plotpred2(iteration):\n", " global X\n", " global past, mycolors2\n", " global mus, covs, ns\n", " global parameters\n", " parameters=past[iteration][0]\n", " # the histogram of the data with histtype='step'\n", " fig, ax = plt.subplots(figsize=(12, 9),\n", " subplot_kw={'axisbg':'#EEEEEE',\n", " 'axisbelow':True})\n", " ax.grid(color='w', linewidth=2, linestyle='solid')\n", "\n", " \n", " for i in range(len(mus)):\n", " plot_cov_ellipse(parameters[\"covs\"][i], parameters[\"mus\"][i], color=mycolors2[i])\n", " \n", "\n", "\n", " # add a line showing the expected distribution\n", "\n", " \n", " st1=\" Current estimates:\\n\"\n", " for j in range(len(parameters[\"mus\"])):\n", " st1+=\"mu_%i: (%.2f, %.2f)\\n\" % (j,parameters[\"mus\"][j][0],parameters[\"mus\"][j][1])\n", " \n", " st2=\" Real values:\\n\"\n", " for j in range(len(parameters[\"mus\"])):\n", " st2+=\"mu_%i: (%.2f, %.2f)\\n\" % (j,mus[j][0],mus[j][1]) \n", " \n", " st3=\" Log-likelihood: %.2f\" % (past[iteration][1])\n", " \n", " #print iteration\n", " Z=past[iteration][2]\n", "\n", " for i in range(len(mus)):\n", " pb.plot(X[:,0][np.where(Z==i)],X[:,1][np.where(Z==i)],'o',ms=6, color=mycolors2[i])\n", " #pb.plot(X[:,0],X[:,1],'o',ms=6, color=mycolors2[i])\n", " #ax.set_xlim(-10, 10)\n", " #ax.set_ylim(-10, 10)\n", " ax.set_title(\"EM Algorithm: Iteration \" + str(iteration))\n", " ax.text(-9.5,2.9,st1+\"\\n\"+st2+\"\\n\"+st3)\n", " return fig\n", "\n", "\n", "#for i in range(20):\n", "# fig=plotpred2(i)\n", "# plt.savefig('foo'+str(i)+'.png')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "StaticInteract?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 124 }, { "cell_type": "code", "collapsed": false, "input": [ "StaticInteract(plotpred2,\n", " iteration=RangeWidget(0, 50, 1))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " iteration: \n", "
\n", " " ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }