An approximative, randomized 'eigen' algorithm
I am currently preparing some ‘demo’ teaching sessions around a few subjects:
- Multithreaded & lock-less C++
- (Kalman) filtering
- Trading strategy backtesting, the technical part, i.e. /not/ the strategies generation process per se
- likely, a few other subjects… later.
While looking at Kalman filter litterature, I had an extra look at so-called tuning methods.
Let us put some background.
In its linear, discrete time form, Kalman filters can be described by the following equations
Now, the best case is when covariance matrices $ Q_w $ & $ R_v $ are known. In my last real-world usage of filters (spot-vol dynamics of EQ implied vol surfaces, if you ask), due to the way I used data, this was not a problem as everything is ‘observable’ eventually (as in: can be measured, not the matrix rank observability).
But what do you do if you cannot really observe empirical errors? One scenario I can imagine is when you are using some sensor and, well, cross checking would require… uhh, the same sensor and it all depends on some physical calibration of your embedded system and this is just a pain, at the very last…
One possible method consists in estimating a maximum likelihood. Without much ado, it can be shown we end up with a matrix optimization problem.
One solution is to decompose $ P $, Cholesky or other. Note that $ P $ is quite sparse. To this end, I want to suggest, at least as a demo, some randomized matrix algorithm to find the Eigen decomposition. The little experience I have with generalized sparse matrix packages make it unsuitable for some embedded applications: too much code, and so, how do you embed that much code in your embedded solution? Who will audit the code?
So let us expose this algorithm.
We are dealing here with a ‘Follow the Perturbed Leader’, oracle-based eigenvector in an online setting.
We assume we have a distribution $ \mathcal{D} $ over $ \mathbb{S}_n $, the set of symmetrix matrices. More on a specific example /which can be evaluated ‘sparsely’ /.
We write $ A $, which is the matrix we want the eigenvectors of, as a sum of (possibly more sparse, possibly random) matrices $ A_\tau $. Kindly note that rescaling by a constant doesn’t change the result.
Lastly, we assume we have an ‘oracle’ $ EV(A) $ which will compute an ‘approximate’ leading eigenvector. Concretely, this is one variant of an iterative method such as $ Power $ or $ Lanczos $.
One way of evaluating $ N \sim \mathcal{D} $ is to draw a vector $ v $ of i.i.d normals and compute $ N = c . vv’ $, with $c$ some constant. (this happen to be of the form ).
Assuming we wish to compute the approximate eigenvectors, values of $A$. On possible overall algorithm can be
References