Skip to content

Instantly share code, notes, and snippets.

@pckujawa
Created December 10, 2013 02:21
Show Gist options
  • Save pckujawa/7884813 to your computer and use it in GitHub Desktop.
Save pckujawa/7884813 to your computer and use it in GitHub Desktop.
big data hw4 calibration measurements
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "hw4-monday"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": "",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 205
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### Algorithm\n\n* Choose some profile x\n* Create a matrix A\n* Simulate a measurement $y = A x + \\nu$\n\n* Assume A is known\n * R, $\\hat{x}$, $V(\\hat{x_i})$\n * (optional) Repeat measurement of x N times. collect meas info \\hat{x} and its variance\n \n* A not known\n * generate calibration signals \\phi_i\n * simulate measurement $\\psi_i = A \\phi_i + \\nu_i$\n * collect calibration info ???\n * compute A_0, J, R, \\hat{x}\n * (optional) arrange K cal., N meas of x\n \n\n"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%pylab inline",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Populating the interactive namespace from numpy and matplotlib\n"
},
{
"output_type": "stream",
"stream": "stderr",
"text": "WARNING: pylab import has clobbered these variables: ['inv', 'svd']\n`%pylab --no-import-all` prevents importing * from pylab and numpy\n"
}
],
"prompt_number": 206
},
{
"cell_type": "code",
"collapsed": false,
"input": "import numpy as np\nimport scipy\nimport scipy.linalg\nfrom scipy.linalg import (toeplitz, svd, inv)\nfrom pprint import (pprint, pformat)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 207
},
{
"cell_type": "code",
"collapsed": false,
"input": "a = [1,2,3,2,1]\nfiller = [0]*len(a)\ntoeplitz(a + filler, [a[0]] + filler)",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 208,
"text": "array([[1, 0, 0, 0, 0, 0],\n [2, 1, 0, 0, 0, 0],\n [3, 2, 1, 0, 0, 0],\n [2, 3, 2, 1, 0, 0],\n [1, 2, 3, 2, 1, 0],\n [0, 1, 2, 3, 2, 1],\n [0, 0, 1, 2, 3, 2],\n [0, 0, 0, 1, 2, 3],\n [0, 0, 0, 0, 1, 2],\n [0, 0, 0, 0, 0, 1]])"
}
],
"prompt_number": 208
},
{
"cell_type": "code",
"collapsed": false,
"input": "# Let's start by estimating only one point\n# Let \\Delta be a window looking at one future point, \n# the present, and one past point - [-1, 1]\ndeltaLen = 3\ndeltaZero = 1 # index 1 is at zero on the number line\n\ndef toeplitzify(a):\n return toeplitz(a + [0]*(deltaLen - len(a)))\n filler = [0]*(len(a))\n return np.matrix(toeplitz(a + filler, [a[0]] + filler))\n\n# To estimate, then, we need 3 measurements (y's)\nys = []\na = [1, 1] # assume A only distorts the present and one past input\nA = toeplitzify(a)\n\n# But we get y's from A*x, so we need 3 inputs (x's)\nxs = []\nb = [2, 1] # how to make 2 in [1 2 1] the zeroth diagonal?\nB = toeplitzify(b)\n\n# And we get x's from B*mu, so we need 3 mu's\nvariance_mu = 1\nmu = np.random.randn(deltaLen) * variance_mu\n#print 'A', A, 'B', B, 'mu', mu\n\n# So\nxs = np.ravel(B * np.matrix(mu).T) # matrix mult and then view as 1D\nvariance_nu = 1\noutput_noise = np.random.randn(deltaLen) * variance_nu # nu\nys = np.ravel(A * np.matrix(xs).T) + output_noise\n\n#variance_input = np.trace(B) * variance_mu # right? I don't think so\n\nprint 'A', A, 'nu', output_noise\nprint 'B', B\nprint 'mu', mu\nprint 'xs', xs\nprint 'ys', ys\n\nvariance_input = B * B.T # right?\n#svd(variance_input)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "A [[1 1 0]\n [1 1 1]\n [0 1 1]] nu [ 0.97670421 1.16324115 -0.12795557]\nB [[2 1 0]\n [1 2 1]\n [0 1 2]]\nmu [-0.72092079 1.82918758 -0.69380734]\nxs [ 0.38734599 2.24364703 0.44157291]\nys [ 3.60769724 4.23580708 2.55726437]\n"
}
],
"prompt_number": 215
},
{
"cell_type": "code",
"collapsed": false,
"input": "np.matrix(mu).shape, B.shape",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 216,
"text": "((1, 3), (3, 3))"
}
],
"prompt_number": 216
},
{
"cell_type": "code",
"collapsed": false,
"input": "def calibrate(inputs, inputCovariance, outputs, noiseCovariance):\n \"\"\"Given inputs, outputs, and their distributions, get information to \n construct an estimate as if A was unknown.\n :returns: (R, r, Q) such that \\hat{x} = R*y + r and Q is its variance (?)\n \"\"\"\n x0 = np.matrix([0]*inputs.shape[0]).T # length ok?\n x0_star = x0.T\n # Phi and psi should be column vectors stacks left to right\n phi = np.matrix(inputs).T; psi = np.matrix(outputs).T;\n F = np.matrix(inputCovariance); S = np.matrix(noiseCovariance)\n phi_star = phi.T\n G = psi * phi_star\n H = phi * phi_star\n assert G.shape[1] == H.shape[0]\n assert H.shape[0] == H.shape[1]\n # We might have some issues with the shapes of G and H\n # For 1D data, they should be 1D, but I don't want to use ravel\n \n #assert np.linalg.det(H) - 1e-5 > 0, pformat(locals())\n H_inv = H.I\n A0 = G * H_inv\n \n A0_star = A0.T\n x0x0_star = x0 * x0_star\n F_bar = F + x0x0_star\n H_invF_bar = H_inv * F_bar\n alpha = np.trace(H_invF_bar)\n \n J = alpha * S\n \n S_inv = np.ravel(S.I)[0] # KLUDGE! but how else if S is 1x1 \n F_inv = F.I\n AsSinA = A0_star * (S_inv * A0)\n alpha_mult = (1.0/(alpha + 1))\n Q_inv = alpha_mult * AsSinA + F_inv\n Q = Q_inv.I\n \n r = Q * (F_inv * x0)\n R = alpha_mult * Q * (A0 * S_inv)\n \n pprint(locals())\n globals().update(locals())\n return R, r, Q\n \nR, r, Q = calibrate(xs, variance_input, ys, variance_nu)",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "{'A0': matrix([[ 24., 0., 0.],\n [ 16., 0., 8.],\n [ 0., 1., 0.]]),\n 'A0_star': matrix([[ 24., 16., 0.],\n [ 0., 0., 1.],\n [ 0., 8., 0.]]),\n 'AsSinA': matrix([[ 832., 0., 128.],\n [ 0., 1., 0.],\n [ 128., 0., 64.]]),\n 'F': matrix([[4, 1, 0],\n [1, 4, 1],\n [0, 1, 4]]),\n 'F_bar': matrix([[4, 1, 0],\n [1, 4, 1],\n [0, 1, 4]]),\n 'F_inv': matrix([[ 0.26785714, -0.07142857, 0.01785714],\n [-0.07142857, 0.28571429, -0.07142857],\n [ 0.01785714, -0.07142857, 0.26785714]]),\n 'G': matrix([[ 1.39742707, 8.0943992 , 1.59306137],\n [ 1.6407229 , 9.50365599, 1.87041766],\n [ 0.99054611, 5.73759861, 1.12921867]]),\n 'H': matrix([[ 0.15003692, 0.86906769, 0.1710415 ],\n [ 0.86906769, 5.03395201, 0.99073375],\n [ 0.1710415 , 0.99073375, 0.19498663]]),\n 'H_inv': matrix([[ -1.11002443e+16, 9.00719925e+15, -3.60287970e+16],\n [ 9.99988890e+15, -1.55501400e+15, -8.70783391e+14],\n [ -4.10726870e+16, 0.00000000e+00, 3.60287970e+16]]),\n 'H_invF_bar': matrix([[ -3.53937779e+16, -1.11002443e+16, -1.35107989e+17],\n [ 3.84445416e+16, 2.90904952e+15, -5.03814756e+15],\n [ -1.64290748e+17, -5.04388997e+15, 1.44115188e+17]]),\n 'J': matrix([[ 1.11630460e+17]]),\n 'Q': matrix([[ 4.00000000e+00, 1.00000000e+00, -1.83186799e-14],\n [ 1.00000000e+00, 4.00000000e+00, 1.00000000e+00],\n [ -1.83186799e-14, 1.00000000e+00, 4.00000000e+00]]),\n 'Q_inv': matrix([[ 0.26785714, -0.07142857, 0.01785714],\n [-0.07142857, 0.28571429, -0.07142857],\n [ 0.01785714, -0.07142857, 0.26785714]]),\n 'R': matrix([[ 1.00331039e-15, -1.64101088e-31, 7.16650278e-17],\n [ 7.88315306e-16, 8.95812848e-18, 2.86660111e-16],\n [ 1.43330056e-16, 3.58325139e-17, 7.16650278e-17]]),\n 'S': matrix([[1]]),\n 'S_inv': 1.0,\n 'alpha': 1.1163045966536622e+17,\n 'alpha_mult': 8.958128480324209e-18,\n 'inputCovariance': array([[4, 1, 0],\n [1, 4, 1],\n [0, 1, 4]]),\n 'inputs': array([ 0.38734599, 2.24364703, 0.44157291]),\n 'noiseCovariance': 1,\n 'outputs': array([ 3.60769724, 4.23580708, 2.55726437]),\n 'phi': matrix([[ 0.38734599],\n [ 2.24364703],\n [ 0.44157291]]),\n 'phi_star': matrix([[ 0.38734599, 2.24364703, 0.44157291]]),\n 'psi': matrix([[ 3.60769724],\n [ 4.23580708],\n [ 2.55726437]]),\n 'r': matrix([[ 0.],\n [ 0.],\n [ 0.]]),\n 'x0': matrix([[0],\n [0],\n [0]]),\n 'x0_star': matrix([[0, 0, 0]]),\n 'x0x0_star': matrix([[0, 0, 0],\n [0, 0, 0],\n [0, 0, 0]])}\n"
}
],
"prompt_number": 217
},
{
"cell_type": "code",
"collapsed": false,
"input": "xhats = R * np.matrix(ys).T + r\n#print 'xhats', xhats\n\n# Why do we get zeros all the time?",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 218
},
{
"cell_type": "code",
"collapsed": false,
"input": "figsize(18, 4)\nplot(xs, color='k'); plot(ys, color='blue'); plot(xhats, color='red');",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nxL939nePKgAAAABJRU5ErkJggg==\n",
"text": "<matplotlib.figure.Figure at 0x5443f30>"
}
],
"prompt_number": 219
},
{
"cell_type": "code",
"collapsed": false,
"input": "xs, ys, xhats",
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 220,
"text": "(array([ 0.38734599, 2.24364703, 0.44157291]),\n array([ 3.60769724, 4.23580708, 2.55726437]),\n matrix([[ 3.80290654e-15],\n [ 3.61501355e-15],\n [ 8.52137485e-16]]))"
}
],
"prompt_number": 220
},
{
"cell_type": "code",
"collapsed": false,
"input": "",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment