Skip to content

Commit

Permalink
test
Browse files Browse the repository at this point in the history
  • Loading branch information
alexgiving committed Apr 24, 2024
1 parent 4b18670 commit 3935015
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
13 changes: 11 additions & 2 deletions lkmeans/clustering.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
from copy import deepcopy
from typing import Any

import numpy as np
from numpy.typing import NDArray

from lkmeans.distance import pairwise_minkowski_distance
from lkmeans.optimizers import (bound_optimizer, mean_optimizer,
median_optimizer, slsqp_optimizer)
from lkmeans.optimizers import bound_optimizer, mean_optimizer, median_optimizer, slsqp_optimizer


def set_type(data: Any) -> NDArray:
if not isinstance(data, np.ndarray):
data = np.array(data)
return data


def assign_to_cluster(
Expand Down Expand Up @@ -79,6 +85,7 @@ def _inertia(X: NDArray, centroids: NDArray) -> float:
return np.sum(np.min(distances, axis=1))

def fit(self, X: NDArray) -> None:
X = set_type(X)
centroids = self._init_centroids(X, self.n_clusters)

iter_with_no_progress = 0
Expand Down Expand Up @@ -106,11 +113,13 @@ def fit(self, X: NDArray) -> None:
self.cluster_centers_ = deepcopy(centroids)

def predict(self, X: NDArray) -> list[int]:
X = set_type(X)
_, labels = assign_to_cluster(
X, self.cluster_centers_, self.n_clusters, self.p)
return labels

def fit_predict(self, X: NDArray) -> list[int]:
X = set_type(X)
self.fit(X)
labels = self.predict(X)
return labels
34 changes: 31 additions & 3 deletions lkmeans/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,44 @@
import numpy as np
import pandas as pd
import pytest
from numpy.typing import NDArray

from lkmeans import LKMeans

p_values = [0.5, 1, 2, 5]


def get_data() -> NDArray:
return np.random.uniform(-10,10, size=(100, 50))


@pytest.mark.api
@pytest.mark.parametrize("p", p_values)
def test_segment_slsqp_calculation(p) -> None:
data = np.random.uniform(-10,10, size=(100, 50))
@pytest.mark.parametrize('p', p_values)
def test_general_processing(p: float | int) -> None:
data = get_data()

lkmeans = LKMeans(n_clusters=2, p=p)
lkmeans.fit_predict(data)
print('Inertia', lkmeans.inertia_)
print('Centers', lkmeans.cluster_centers_)


def convert_from_ndarray(data: NDArray, type: str) -> list | pd.DataFrame | pd.Series:
if type == 'list':
return data.tolist()
if type == 'frame':
return pd.DataFrame(data.tolist())
if type == 'series':
return pd.Series(data.tolist())


@pytest.mark.api
@pytest.mark.parametrize('type', ['list', 'frame', 'series'])
def test_input_data_conversion(type: str) -> None:
data = get_data()
data = convert_from_ndarray(data, type)

lkmeans = LKMeans(n_clusters=2, p=2)
lkmeans.fit_predict(data)
print('Inertia', lkmeans.inertia_)
print('Centers', lkmeans.cluster_centers_)

0 comments on commit 3935015

Please sign in to comment.