[Work Log] Branching prior covariance

September 10, 2013
Project Tulips
Subproject Data Association v3
Working path projects/​tulips/​trunk/​src/​matlab/​data_association_3
SVN Revision 15229
Unless otherwise noted, all filesystem paths are relative to the "Working path" named above.

In the past, we've formulated the branching prior covariance matrix by starting with an independent-curve block-diagonal covariance matrix and multiplying by an "attachment matrix." This works when the branching point appears in the index set, but we'd like to allow branching from any continuous point along the curve. Stated differently, we currently model branching using a discritized model, but we'd prefer to express branching using the underlying continuous gaussian process. This means modelling branching using the covariance function, rather than by manipulating the covariance matrix.

The key observation here is that in addition to each point's smooth curvature variance, it inherits the covariance of its parent's branch point. In order to model correlation between curves, we extend the definition of "index" to add the curve index, \(c_i\), in addition to point index and time/view index. Thus, index is now a triple: (c_i, p_i, t_i). Note that we've changed our notation; previously point index was \(t_i\) and time/view index was \(v_i\). The new notation uses \(p_i\) and \(t_i\) respectively, to avoid confusion between spacial and temporal dimensions.

Let's introduce two functions, \(\text{branch_curve}(c_i)\) and \(\text{branch_point}(c_i)\), which return the curve index and point index of curve \(c_i\)'s branch point, resepectively, or zero if \(c_i\) is a root curve. We'll also use the convenience function \(\text{branch}(i)\), which is shorthand for full branch index, i.e. the tuple \(\text{branch_curve}(c_i), \text{branch_point}(p_i), t_i)\). Note that the time-index \(t_i\) is preserved when getting the branch index.

Without loss of generality, we'll assume curves are indexed in topological order, with parents appearing occurring before descendants. If there are multiple connected components in the graph, it will be important that all root nodes have a lower index than non-root nodes, so we can add a sentinal node with index \(c_i = 0\), and attach all root curves to it before ordering. (Note to self: breadth-first search order might be simpler to describe). The branching covariance function is now:

\[ \begin{align} k\left( i, j \right) &= k\left( (c_i, p_i, t_i), (c_j, p_j, t_j) \right) \\ &= \begin{cases} k(j, i) & \text{if } c_i > c_j = 0 \\ k_\text{base} ( i, j ) + k_o(ti, tj) & \text{if } \text{isroot}(c_i) \text{ and } \text{isroot}(c_j) \text{ and } c_i = c_j && \\ k_\text{base} ( i, j ) + 0 & \text{if } \text{isroot}(c_i) \text{ and } \text{isroot}(c_j) \text{ and } c_i \neq c_j \\ k_\text{base} ( i, j ) + k(i, \text{branch}(j)) & \text{otherwise} \end{cases} \end{align} \]

For convenience, we've used the \(k(i,j) \) to stand-in for \(k\left((c_i, p_i, t_i), (c_j, p_j, t_j)\right)\). Here, \(k_\text{base}(i,j)\) is the independent curve covariance (e.g. cubic spline covariance w/ perturbations). In our case, \(k_\text{base}(\dot)\) is zero if \(c_i \neq c_j\), but this isn't necessarilly required.

Here, \(k_o\) is to marginal covariance of the first curve point. All points in the plant are measured relative to this point, so this covariance ends up in every element of the covariance matrix. Since it only measures covariance of a specific point with respect to itself, curve and point index are irrelevant to \(k_o\). Only the temporal is received, which allows us to model how the point moves over time. In the case of the Ornstein Uhlenbech process, \(k_o\) is \[ k_o = \sigma_o + \exp(|t_i - t_j|) \sigma_{o,b}) \]

Lets examine each case in the piecewise function.



Posted by Kyle Simek
blog comments powered by Disqus