Skip to main content

K-Means clustering constrained with minimum and maximum cluster size

Project description

PyPI Python Build Status Documentation

k-means-constrained

K-means clustering implementation whereby a minimum and/or maximum size for each cluster can be specified.

This K-means implementation modifies the cluster assignment step (E in EM) by formulating it as a Minimum Cost Flow (MCF) linear network optimisation problem. This is then solved using a cost-scaling push-relabel algorithm and uses Google's Operations Research tools's SimpleMinCostFlow which is a fast C++ implementation.

This package is inspired by Bradley et al.. The original Minimum Cost Flow (MCF) network proposed by Bradley et al. has been modified so maximum cluster sizes can also be specified along with minimum cluster size.

The code is based on scikit-lean's KMeans and implements the same API with modifications.

Ref:

  1. Bradley, P. S., K. P. Bennett, and Ayhan Demiriz. "Constrained k-means clustering." Microsoft Research, Redmond (2000): 1-8.
  2. Google's SimpleMinCostFlow C++ implementation

Installation

You can install the k-means-constrained from PyPI:

pip install k-means-constrained

It is supported on Python 3.8 and above.

Example

More details can be found in the API documentation.

>>> from k_means_constrained import KMeansConstrained
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...                [4, 2], [4, 4], [4, 0]])
>>> clf = KMeansConstrained(
...     n_clusters=2,
...     size_min=2,
...     size_max=5,
...     random_state=0
... )
>>> clf.fit_predict(X)
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> clf.cluster_centers_
array([[ 1.,  2.],
       [ 4.,  2.]])
>>> clf.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

k-means-constrained-0.7.3.tar.gz (497.1 kB view hashes)

Uploaded Source

Built Distributions

k_means_constrained-0.7.3-cp311-cp311-win_amd64.whl (330.7 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

k_means_constrained-0.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

k_means_constrained-0.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

k_means_constrained-0.7.3-cp311-cp311-macosx_11_0_arm64.whl (349.2 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

k_means_constrained-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl (396.7 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

k_means_constrained-0.7.3-cp310-cp310-win_amd64.whl (332.5 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

k_means_constrained-0.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

k_means_constrained-0.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

k_means_constrained-0.7.3-cp310-cp310-macosx_11_0_arm64.whl (353.4 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

k_means_constrained-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl (402.4 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

k_means_constrained-0.7.3-cp39-cp39-win_amd64.whl (336.1 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

k_means_constrained-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

k_means_constrained-0.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

k_means_constrained-0.7.3-cp39-cp39-macosx_11_0_arm64.whl (352.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

k_means_constrained-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl (403.4 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

k_means_constrained-0.7.3-cp38-cp38-win_amd64.whl (336.9 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

k_means_constrained-0.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

k_means_constrained-0.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.1 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

k_means_constrained-0.7.3-cp38-cp38-macosx_11_0_arm64.whl (347.1 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

k_means_constrained-0.7.3-cp38-cp38-macosx_10_9_x86_64.whl (396.9 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page