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
|