Skip to main content

kneed

Knee-point detection in Python

PyPI version Downloads Downloads Dependents codecov DOI

A Python library for detecting knee (elbow) points in curves using the Kneedle algorithm. Given a set of x and y values, kneed returns the point of maximum curvature.

Summary of curve and direction arguments

Features

  • Detect knee/elbow points in concave or convex curves
  • Support for increasing and decreasing functions
  • Automatic curve shape detection with find_shape()
  • Multiple knee detection via online mode (all_knees / all_elbows)
  • Tunable sensitivity parameter (S)
  • Multiple interpolation methods (interp1d, polynomial)
  • Built-in plotting for quick visualizations

Installation

kneed has been tested with Python 3.8, 3.9, 3.10, 3.11, and 3.12.

anaconda

conda install -c conda-forge kneed

pip

pip install kneed              # knee-detection only
pip install kneed[plot]        # also install matplotlib for visualizations

Clone from GitHub

git clone https://github.com/arvkevi/kneed.git && cd kneed
pip install -e .

Quick Start

from kneed import KneeLocator, DataGenerator

# Generate sample data
x, y = DataGenerator.figure2()

# Find the knee point
kl = KneeLocator(x, y, curve="concave", direction="increasing")
print(kl.knee)       # 0.222
print(kl.knee_y)     # 1.897

If you're unsure about the curve type and direction, use find_shape() to auto-detect:

from kneed import find_shape

direction, curve = find_shape(x, y)
kl = KneeLocator(x, y, curve=curve, direction=direction)

Usage

These steps reproduce Figure 2 from the original Kneedle manuscript.

Input Data

The DataGenerator class is a utility to generate sample datasets.

Note: x and y must be equal length arrays.

from kneed import DataGenerator, KneeLocator

x, y = DataGenerator.figure2()

print([round(i, 3) for i in x])
print([round(i, 3) for i in y])

[0.0, 0.111, 0.222, 0.333, 0.444, 0.556, 0.667, 0.778, 0.889, 1.0]
[-5.0, 0.263, 1.897, 2.692, 3.163, 3.475, 3.696, 3.861, 3.989, 4.091]

Find Knee

The knee (or elbow) point is calculated by instantiating the KneeLocator class with x, y and the appropriate curve and direction. Here, kneedle.knee and kneedle.elbow store the point of maximum curvature.

kneedle = KneeLocator(x, y, S=1.0, curve="concave", direction="increasing")

print(round(kneedle.knee, 3))
0.222

print(round(kneedle.elbow, 3))
0.222

The knee point returned is a value along the x axis. The y value at the knee can be identified:

print(round(kneedle.knee_y, 3))
1.897

Visualize

The KneeLocator class has two plotting functions for quick visualizations. Note that all (x, y) are transformed for the normalized plots

# Normalized data, normalized knee, and normalized distance curve.
kneedle.plot_knee_normalized()

Normalized knee point

# Raw data and knee.
kneedle.plot_knee()

Raw knee point

Documentation

Full documentation including parameter tuning guides, real-world examples, and API reference is available at kneed.readthedocs.io.

Interactive

An interactive Streamlit app is available to explore the effect of tuning parameters:

share.streamlit.io/arvkevi/ikneed

You can also run your own version — head over to the source code for ikneed.

ikneed

Contributing

Contributions are welcome, please refer to CONTRIBUTING to learn more about how to contribute.

Citation

If you use kneed in your research, please cite:

Satopa, V., Albrecht, J., Irwin, D., and Raghavan, B. (2011). "Finding a 'Kneedle' in a Haystack: Detecting Knee Points in System Behavior." 31st International Conference on Distributed Computing Systems Workshops, pp. 166-171.

@inproceedings{satopa2011kneedle,
  title={Finding a "Kneedle" in a Haystack: Detecting Knee Points in System Behavior},
  author={Satopa, Ville and Albrecht, Jeannie and Irwin, David and Raghavan, Barath},
  booktitle={31st International Conference on Distributed Computing Systems Workshops},
  pages={166--171},
  year={2011},
}

Metadata

Release files for kneed 0.8.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kneed 0.8.6
File Size Uploaded
kneed-0.8.6.tar.gz 13.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kneed 0.8.6
File Interpreter ABI Platform
kneed-0.8.6-py3-none-any.whl Python 3 none any Details

Total release size: 24.0 kB

Release files / kneed-0.8.6.tar.gz

Download URL kneed-0.8.6.tar.gz
Size 13.2 kB
Tags Source
SHA-256 checksum
How to use checksums
65b22727c623661701f15edf057f2e6c73e2b1ad4e68cd9ca4291675c318b5ef
BLAKE2b-256 checksum
How to use checksums
72644bb8f8a7a4627b585a66d5bec0c9b30ae5b39a4caea1775c8bfb3fb3f4cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 20, 2026.

Transparency log

Release files / kneed-0.8.6-py3-none-any.whl

Download URL kneed-0.8.6-py3-none-any.whl
Size 10.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3412e7b70bce07717386d24fab37f0f985968d1b85ea0c749a6b98caccaf65ec
BLAKE2b-256 checksum
How to use checksums
4acd23c89d53c36028bccb39f55aa5dd24c4bdaab76c4d556ad43dc8cf026918
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 20, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.8.6 This release

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.3

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

1 release file

0.3.0

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

1 release file

0.1.0

2 release files

0.0.5

1 release file

0.0.4

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page