@@ -26,7 +26,7 @@ class IncrementalCovarianceCorrelation:
2626 for row in range(nX):
2727 ic.update(m1[row,:], m2[row,:])
2828
29- reference_covariance = (1 / (nX - 1)) * np.matmul((m1 - np.mean( m1, axis=0)).T, (m2 - np.mean (m2, axis=0)))
29+ reference_covariance = (1 / (nX - 1)) * np.matmul((m1 - np.getMean()( m1, axis=0)).T, (m2 - np.getMean() (m2, axis=0)))
3030 reference_m1_stddev = np.std(m1, axis=0, ddof=1)
3131 reference_m2_stddev = np.std(m2, axis=0, ddof=1)
3232 reference_1_over_m1_stddev = (1 / numpy_m1_stddev).reshape(numpy_m1_stddev.size, 1)
@@ -41,57 +41,61 @@ class IncrementalCovarianceCorrelation:
4141
4242 def __init__ (self , nX , nY ):
4343 """Initialize with the #columns for matrices A and B"""
44- self .nX = nX
45- self .nY = nY
46- self .imX = IncrementalMeanVariance (nX )
47- self .imY = IncrementalMeanVariance (nY )
48- self .cov = np .zeros ((nX , nY ), dtype = np .float64 )
49- self .n = 0
44+ self ._nX = nX
45+ self ._nXY = nY
46+ self ._imX = IncrementalMeanVariance (nX )
47+ self ._imY = IncrementalMeanVariance (nY )
48+ self ._cov = np .zeros ((nX , nY ), dtype = np .float64 )
49+ self ._n = 0
5050
5151 def update (self , x , y ):
5252 """Updates the covariance matrix with a single row of matrix A and a single row of matrix B"""
53- if len (x ) != self .nX :
53+ if len (x ) != self ._nX :
5454 raise Exception ("wrong x length" )
55- if len (y ) != self .nY :
55+ if len (y ) != self ._nXY :
5656 raise Exception ("wrong y length" )
5757
58- self .n += 1
59- f = (self .n - 1 ) / self .n
58+ self ._n += 1
59+ f = (self ._n - 1 ) / self ._n
6060
61- mfX = (x - self .imX . mean ) * f
62- mfY = y - self .imY . mean
61+ mfX = (x - self ._imX . getMean () ) * f
62+ mfY = y - self ._imY . getMean ()
6363
64- self .cov += np .tensordot (mfX , mfY , axes = 0 )
64+ self ._cov += np .tensordot (mfX , mfY , axes = 0 )
6565
66- self .imX .update (x )
67- self .imY .update (y )
66+ self ._imX .update (x )
67+ self ._imY .update (y )
6868
6969 def add (self , x : IncrementalCovarianceCorrelation ):
7070 """Merges another object of IncrementalCovarianceCorrelation into this co-variance matrix. This is useful in
7171 parallelized computations, where different nodes compute co-variances over different
7272 ranges of rows"""
73- n = self .n + x .n
74- f = (self .n * x .n ** 2 + x .n * self .n ** 2 ) / (n ** 2 )
73+ n = self ._n + x ._n
74+ f = (self ._n * x ._n ** 2 + x ._n * self ._n ** 2 ) / (n ** 2 )
7575
76- deltaX = self .imX . mean - x .imX . mean
76+ deltaX = self ._imX . getMean () - x ._imX . getMean ()
7777 deltaX = deltaX .reshape (deltaX .size , 1 ) * f
7878
79- deltaY = self .imY . mean - x .imY . mean
79+ deltaY = self ._imY . getMean () - x ._imY . getMean ()
8080 deltaY = deltaY .reshape (1 , deltaY .size )
8181
82- self .cov += x .cov + deltaX * deltaY
83- self .n = n
84- self .imX .add (x .imX )
85- self .imY .add (x .imY )
82+ self ._cov += x ._cov + deltaX * deltaY
83+ self ._n = n
84+ self ._imX .add (x ._imX )
85+ self ._imY .add (x ._imY )
8686
8787 def getCovariance (self ):
8888 """Returns the scaled co-variance matrix with 1 degree of freedom"""
89- return 1 / (self .n - 1 ) * self .cov
89+ return 1 / (self ._n - 1 ) * self ._cov
9090
9191 def getCorrelation (self ):
9292 """Returns Pearson's correlation matrix"""
93- sX = 1 / np .sqrt (self .imX .getVariance ())
93+ sX = 1 / np .sqrt (self ._imX .getVariance ())
9494 sX = sX .reshape (sX .size , 1 )
95- sY = 1 / np .sqrt (self .imY .getVariance ())
95+ sY = 1 / np .sqrt (self ._imY .getVariance ())
9696 sY = sY .reshape (1 , sY .size )
97- return 1 / (self .n - 1 ) * self .cov * sX * sY
97+ return 1 / (self ._n - 1 ) * self ._cov * sX * sY
98+
99+ def getN (self ):
100+ """Number of observations"""
101+ return self ._n
0 commit comments