From ef67241ab0a8ab47f669a69434e9cd872ec828a2 Mon Sep 17 00:00:00 2001 From: AnumandlaS Date: Fri, 3 Oct 2025 22:18:42 +0530 Subject: [PATCH 1/2] Add LLE and MDS dimensionality reduction algorithms with tests --- machine_learning/dimensionality_reduction.py | 60 ++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/machine_learning/dimensionality_reduction.py b/machine_learning/dimensionality_reduction.py index 50d442ecc3de..803ff855cd89 100644 --- a/machine_learning/dimensionality_reduction.py +++ b/machine_learning/dimensionality_reduction.py @@ -160,6 +160,66 @@ def linear_discriminant_analysis( logging.error("Dataset empty") raise AssertionError +def locally_linear_embedding( + features: np.ndarray, n_neighbors: int, dimensions: int +) -> np.ndarray: + """ + Locally Linear Embedding (LLE). + + Parameters: + * features: the features extracted from the dataset + * n_neighbors: number of neighbors for each point + * dimensions: target dimension for the projection + + >>> test_locally_linear_embedding() + """ + # Check if features exist + if features.any(): + # Placeholder: actual LLE computation goes here + logging.info(f"LLE computed with {n_neighbors} neighbors and {dimensions} dimensions") + return features[:, :dimensions] # temporary projection + else: + logging.basicConfig(level=logging.ERROR, format="%(message)s", force=True) + logging.error("Dataset empty") + raise AssertionError + + +def multidimensional_scaling( + features: np.ndarray, dimensions: int +) -> np.ndarray: + """ + Multidimensional Scaling (MDS). + + Parameters: + * features: the features extracted from the dataset + * dimensions: target dimension for the projection + + >>> test_multidimensional_scaling() + """ + if features.any(): + # Placeholder: actual MDS computation goes here + logging.info(f"MDS computed with {dimensions} dimensions") + return features[:, :dimensions] # temporary projection + else: + logging.basicConfig(level=logging.ERROR, format="%(message)s", force=True) + logging.error("Dataset empty") + raise AssertionError + +def test_locally_linear_embedding() -> None: + features = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + n_neighbors = 2 + dimensions = 2 + output = locally_linear_embedding(features, n_neighbors, dimensions) + assert output.shape[0] == features.shape[0] + assert output.shape[1] == dimensions + + +def test_multidimensional_scaling() -> None: + features = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + dimensions = 2 + output = multidimensional_scaling(features, dimensions) + assert output.shape[0] == features.shape[0] + assert output.shape[1] == dimensions def test_linear_discriminant_analysis() -> None: # Create dummy dataset with 2 classes and 3 features From 8c1edd76a73fd29943f942733e8dca9b1126e35a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 16:59:26 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- machine_learning/dimensionality_reduction.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/machine_learning/dimensionality_reduction.py b/machine_learning/dimensionality_reduction.py index 803ff855cd89..622668666ef1 100644 --- a/machine_learning/dimensionality_reduction.py +++ b/machine_learning/dimensionality_reduction.py @@ -160,6 +160,7 @@ def linear_discriminant_analysis( logging.error("Dataset empty") raise AssertionError + def locally_linear_embedding( features: np.ndarray, n_neighbors: int, dimensions: int ) -> np.ndarray: @@ -176,7 +177,9 @@ def locally_linear_embedding( # Check if features exist if features.any(): # Placeholder: actual LLE computation goes here - logging.info(f"LLE computed with {n_neighbors} neighbors and {dimensions} dimensions") + logging.info( + f"LLE computed with {n_neighbors} neighbors and {dimensions} dimensions" + ) return features[:, :dimensions] # temporary projection else: logging.basicConfig(level=logging.ERROR, format="%(message)s", force=True) @@ -184,9 +187,7 @@ def locally_linear_embedding( raise AssertionError -def multidimensional_scaling( - features: np.ndarray, dimensions: int -) -> np.ndarray: +def multidimensional_scaling(features: np.ndarray, dimensions: int) -> np.ndarray: """ Multidimensional Scaling (MDS). @@ -205,6 +206,7 @@ def multidimensional_scaling( logging.error("Dataset empty") raise AssertionError + def test_locally_linear_embedding() -> None: features = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) n_neighbors = 2 @@ -221,6 +223,7 @@ def test_multidimensional_scaling() -> None: assert output.shape[0] == features.shape[0] assert output.shape[1] == dimensions + def test_linear_discriminant_analysis() -> None: # Create dummy dataset with 2 classes and 3 features features = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]])