@@ -15,14 +15,14 @@ def __init__(self, n_components):
1515 assert isinstance (n_components , int )
1616 self .n_components = n_components
1717
18- def fit (self , X , method = "eigen" , iter_max = 100 ):
19- """
20- maximum likelihood estimate of pca parameters
18+ def fit (self , x , method = "eigen" , iter_max = 100 ):
19+ r """Maximum likelihood estimate of pca parameters.
20+
2121 x ~ \int_z N(x|Wz+mu,sigma^2)N(z|0,I)dz
2222
2323 Parameters
2424 ----------
25- X : (sample_size, n_features) ndarray
25+ x : (sample_size, n_features) ndarray
2626 input data
2727 method : str
2828 method to estimate the parameters
@@ -46,111 +46,111 @@ def fit(self, X, method="eigen", iter_max=100):
4646 method_list = ["eigen" , "em" ]
4747 if method not in method_list :
4848 print ("availabel methods are {}" .format (method_list ))
49- self .mean = np .mean (X , axis = 0 )
50- getattr (self , method )(X - self .mean , iter_max )
49+ self .mean = np .mean (x , axis = 0 )
50+ getattr (self , method )(x - self .mean , iter_max )
5151
52- def eigen (self , X , * arg ):
53- sample_size , n_features = X .shape
52+ def eigen (self , x , * arg ):
53+ sample_size , n_features = x .shape
5454 if sample_size >= n_features :
55- cov = np .cov (X , rowvar = False )
55+ cov = np .cov (x , rowvar = False )
5656 values , vectors = np .linalg .eigh (cov )
5757 index = n_features - self .n_components
5858 else :
59- cov = np .cov (X )
59+ cov = np .cov (x )
6060 values , vectors = np .linalg .eigh (cov )
61- vectors = (X .T @ vectors ) / np .sqrt (sample_size * values )
61+ vectors = (x .T @ vectors ) / np .sqrt (sample_size * values )
6262 index = sample_size - self .n_components
63- self .I = np .eye (self .n_components )
63+ self .eye = np .eye (self .n_components )
6464 if index == 0 :
6565 self .var = 0
6666 else :
6767 self .var = np .mean (values [:index ])
6868
69- self .W = vectors [:, index :].dot (np .sqrt (np .diag (values [index :]) - self .var * self .I ))
70- self .__M = self .W .T @ self .W + self .var * self .I
69+ self .W = vectors [:, index :].dot (np .sqrt (np .diag (values [index :]) - self .var * self .eye ))
70+ self .__M = self .W .T @ self .W + self .var * self .eye
7171 self .C = self .W @ self .W .T + self .var * np .eye (n_features )
7272 if index == 0 :
7373 self .Cinv = np .linalg .inv (self .C )
7474 else :
7575 self .Cinv = np .eye (n_features ) / np .sqrt (self .var ) - self .W @ np .linalg .inv (self .__M ) @ self .W .T / self .var
7676
77- def em (self , X , iter_max ):
78- self .I = np .eye (self .n_components )
79- self .W = np .eye (np .size (X , 1 ), self .n_components )
77+ def em (self , x , iter_max ):
78+ self .eye = np .eye (self .n_components )
79+ self .W = np .eye (np .size (x , 1 ), self .n_components )
8080 self .var = 1.
8181 for i in range (iter_max ):
8282 W = np .copy (self .W )
83- stats = self ._expectation (X )
84- self ._maximization (X , * stats )
83+ stats = self ._expectation (x )
84+ self ._maximization (x , * stats )
8585 if np .allclose (W , self .W ):
8686 break
87- self .C = self .W @ self .W .T + self .var * np .eye (np .size (X , 1 ))
87+ self .C = self .W @ self .W .T + self .var * np .eye (np .size (x , 1 ))
8888 self .Cinv = np .linalg .inv (self .C )
8989
90- def _expectation (self , X ):
91- self .__M = self .W .T @ self .W + self .var * self .I
90+ def _expectation (self , x ):
91+ self .__M = self .W .T @ self .W + self .var * self .eye
9292 Minv = np .linalg .inv (self .__M )
93- Ez = X @ self .W @ Minv
93+ Ez = x @ self .W @ Minv
9494 Ezz = self .var * Minv + Ez [:, :, None ] * Ez [:, None , :]
9595 return Ez , Ezz
9696
97- def _maximization (self , X , Ez , Ezz ):
98- self .W = X .T @ Ez @ np .linalg .inv (np .sum (Ezz , axis = 0 ))
97+ def _maximization (self , x , Ez , Ezz ):
98+ self .W = x .T @ Ez @ np .linalg .inv (np .sum (Ezz , axis = 0 ))
9999 self .var = np .mean (
100- np .mean (X ** 2 , axis = 1 )
101- - 2 * np .mean (Ez @ self .W .T * X , axis = 1 )
102- + np .trace ((Ezz @ self .W .T @ self .W ).T ) / np .size (X , 1 ))
100+ np .mean (x ** 2 , axis = 1 )
101+ - 2 * np .mean (Ez @ self .W .T * x , axis = 1 )
102+ + np .trace ((Ezz @ self .W .T @ self .W ).T ) / np .size (x , 1 ))
103103
104- def transform (self , X ):
104+ def transform (self , x ):
105105 """
106106 project input data into latent space
107- p(Z|X ) = N(Z|(X -mu)WMinv, sigma^-2M)
107+ p(Z|x ) = N(Z|(x -mu)WMinv, sigma^-2M)
108108
109109 Parameters
110110 ----------
111- X : (sample_size, n_features) ndarray
111+ x : (sample_size, n_features) ndarray
112112 input data
113113
114114 Returns
115115 -------
116116 Z : (sample_size, n_components) ndarray
117117 projected input data
118118 """
119- return np .linalg .solve (self .__M , ((X - self .mean ) @ self .W ).T ).T
119+ return np .linalg .solve (self .__M , ((x - self .mean ) @ self .W ).T ).T
120120
121- def fit_transform (self , X , method = "eigen" ):
121+ def fit_transform (self , x , method = "eigen" ):
122122 """
123123 perform pca and whiten the input data
124124
125125 Parameters
126126 ----------
127- X : (sample_size, n_features) ndarray
127+ x : (sample_size, n_features) ndarray
128128 input data
129129
130130 Returns
131131 -------
132132 Z : (sample_size, n_components) ndarray
133133 projected input data
134134 """
135- self .fit (X , method )
136- return self .transform (X )
135+ self .fit (x , method )
136+ return self .transform (x )
137137
138- def proba (self , X ):
138+ def proba (self , x ):
139139 """
140140 the marginal distribution of the observed variable
141141
142142 Parameters
143143 ----------
144- X : (sample_size, n_features) ndarray
144+ x : (sample_size, n_features) ndarray
145145 input data
146146
147147 Returns
148148 -------
149149 p : (sample_size,) ndarray
150150 value of the marginal distribution
151151 """
152- d = X - self .mean
152+ d = x - self .mean
153153 return (
154154 np .exp (- 0.5 * np .sum (d @ self .Cinv * d , axis = - 1 ))
155155 / np .sqrt (np .linalg .det (self .C ))
156- / np .power (2 * np .pi , 0.5 * np .size (X , 1 )))
156+ / np .power (2 * np .pi , 0.5 * np .size (x , 1 )))
0 commit comments