annotate src/samer/models/Covariance.java @ 3:15b93db27c04

Get StreamSource to compile, update args for demo
author samer
date Fri, 05 Apr 2019 17:00:18 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1 /*
samer@0 2 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 3 * All rights reserved.
samer@0 4 *
samer@0 5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 6 * without even the implied warranty of MERCHANTABILITY or
samer@0 7 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 8 */
samer@0 9
samer@0 10 package samer.models;
samer@0 11 import samer.core.*;
samer@0 12 import samer.core.types.*;
samer@0 13 import samer.maths.*;
samer@0 14 import samer.tools.*;
samer@0 15 import java.util.*;
samer@0 16
samer@0 17 /**
samer@0 18 Collect covariance statistics assuming input is zero mean.
samer@0 19 */
samer@0 20 public class Covariance extends NamedTask
samer@0 21 {
samer@0 22 VVector vector;
samer@0 23 Matrix C;
samer@0 24 int n, count;
samer@0 25 double [] x;
samer@0 26 double [][] _C;
samer@0 27 VDouble rate;
samer@0 28 double [] sig;
samer@0 29
samer@0 30 public Covariance(VVector vec) throws Exception
samer@0 31 {
samer@0 32 super("covariance");
samer@0 33 Shell.push(node);
samer@0 34
samer@0 35 n=vec.size();
samer@0 36 C = new Matrix("C",n,n); // second moment: sum products
samer@0 37 rate=new VDouble("rate",0.001);
samer@0 38 Shell.pop();
samer@0 39
samer@0 40 sig= new double[n];
samer@0 41 _C=C.getArray();
samer@0 42 x=vec.array();
samer@0 43 vector=vec;
samer@0 44 }
samer@0 45
samer@0 46 public void dispose() { rate.dispose(); C.dispose(); }
samer@0 47
samer@0 48 public void reset() { C.zero(); }
samer@0 49 public void getCorrelation(Matrix R) {
samer@0 50 double [][] _R=R.getArray();
samer@0 51
samer@0 52 // first get std devs and put 1s down diagonal
samer@0 53 for (int i=0; i<n; i++) {
samer@0 54 sig[i] = Math.sqrt(_C[i][i]);
samer@0 55 }
samer@0 56
samer@0 57 for (int i=0; i<n; i++) {
samer@0 58 for (int j=0; j<i; j++) { // off diagonal
samer@0 59 _R[i][j] = _C[i][j]/(sig[i]*sig[j]);
samer@0 60 // _R[j][i] = _R[i][j];
samer@0 61 }
samer@0 62 _R[i][i]=1;
samer@0 63 }
samer@0 64 R.changed();
samer@0 65 }
samer@0 66
samer@0 67
samer@0 68 public void starting() {}
samer@0 69 public void stopping() {}
samer@0 70 public void run()
samer@0 71 {
samer@0 72 double eta=rate.value;
samer@0 73
samer@0 74 for (int i=0; i<n; i++) {
samer@0 75 double [] a=_C[i];
samer@0 76 double k=x[i];
samer@0 77 for (int j=0; j<=i; j++) {
samer@0 78 a[j] += eta*(k*x[j]-a[j]);
samer@0 79 }
samer@0 80 }
samer@0 81 C.changed();
samer@0 82 }
samer@0 83 }
samer@0 84