4
4
5
5
6
6
class SNMFOptimizer :
7
- def __init__ (self , MM , Y0 = None , X0 = None , A = None , rho = 1e12 , eta = 610 , max_iter = 500 , tol = 5e-7 , components = None ):
8
- print ("Initializing SNMF Optimizer" )
7
+ def __init__ (
8
+ self ,
9
+ MM ,
10
+ Y0 = None ,
11
+ X0 = None ,
12
+ A = None ,
13
+ rho = 1e12 ,
14
+ eta = 610 ,
15
+ max_iter = 500 ,
16
+ tol = 5e-7 ,
17
+ components = None ,
18
+ random_state = None ,
19
+ ):
20
+
9
21
self .MM = MM
10
22
self .X0 = X0
11
23
self .Y0 = Y0
@@ -15,23 +27,22 @@ def __init__(self, MM, Y0=None, X0=None, A=None, rho=1e12, eta=610, max_iter=500
15
27
# Capture matrix dimensions
16
28
self .N , self .M = MM .shape
17
29
self .num_updates = 0
30
+ self .rng = np .random .default_rng (random_state )
18
31
19
32
if Y0 is None :
20
33
if components is None :
21
34
raise ValueError ("Must provide either Y0 or a number of components." )
22
35
else :
23
36
self .K = components
24
- self .Y0 = np . random .beta (a = 2.5 , b = 1.5 , size = (self .K , self .M )) # This is untested
37
+ self .Y0 = self . rng .beta (a = 2.5 , b = 1.5 , size = (self .K , self .M ))
25
38
else :
26
39
self .K = Y0 .shape [0 ]
27
40
28
- # Initialize A, X0 if not provided
29
41
if self .A is None :
30
- self .A = np .ones ((self .K , self .M )) + np . random . randn ( self .K , self .M ) * 1e-3 # Small perturbation
42
+ self .A = np .ones ((self .K , self .M )) + self . rng . normal ( 0 , 1e-3 , size = ( self .K , self .M ))
31
43
if self .X0 is None :
32
- self .X0 = np . random . rand ( self .N , self .K ) # Ensures values in [0,1]
44
+ self .X0 = self . rng . random (( self .N , self .K ))
33
45
34
- # Initialize solution matrices to be iterated on
35
46
self .X = np .maximum (0 , self .X0 )
36
47
self .Y = np .maximum (0 , self .Y0 )
37
48
0 commit comments