@@ -183,14 +183,17 @@ def linear_discriminant_analysis(
183183 sb = covariance_between_classes (features , labels , classes )
184184 sw = covariance_within_classes (features , labels , classes )
185185
186+ # Add regularization to Sw to avoid singular matrix
187+ sw_reg = sw + 1e-6 * np .eye (sw .shape [0 ])
188+
186189 # Solve the generalized eigenvalue problem: Sb v = λ Sw v
187- eigenvalues , eigenvectors = eigh (sb , sw )
190+ eigenvalues , eigenvectors = eigh (sb , sw_reg )
188191
189192 # Sort eigenvectors by eigenvalues (descending)
190193 idx = np .argsort (eigenvalues )[::- 1 ]
191194 eigenvectors = eigenvectors [:, idx ]
192195
193- # Take top "dimensions"
196+ # Take top "dimensions" eigenvectors
194197 filtered_eigenvectors = eigenvectors [:, :dimensions ]
195198
196199 projected_data = np .dot (filtered_eigenvectors .T , features )
@@ -200,7 +203,6 @@ def linear_discriminant_analysis(
200203 logging .error ("Dataset empty" )
201204 raise AssertionError
202205
203-
204206def locally_linear_embedding (
205207 features : np .ndarray , dimensions : int , n_neighbors : int = 12 , reg : float = 1e-3
206208) -> np .ndarray :
0 commit comments