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.10, 3.11, 3.12, 3.13, 3.14, and 3.15.

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.9.0

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.9.0
File Size Uploaded
kneed-0.9.0.tar.gz 13.9 kB Details

Built distribution (wheel)

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

Total release size: 24.9 kB

Release files / kneed-0.9.0.tar.gz

Download URL kneed-0.9.0.tar.gz
Size 13.9 kB
Tags Source
SHA-256 checksum
How to use checksums
61ace9fa33332d8da50107d1f8d713476a5b4606d15798a4806eef18c80e2a7d
BLAKE2b-256 checksum
How to use checksums
c88b9ee379ee81de6c9388b51e9523a2696dcdf8b70ca1ee0bef1a9d534f417d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

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

Download URL kneed-0.9.0-py3-none-any.whl
Size 11.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
db8aa5c3ef69bbf11acedf7427858d5e22a048180c475958aa77c9fdb847696e
BLAKE2b-256 checksum
How to use checksums
377fd1eb5b99f7e0628c2d7b97251410f667ac48f00983f6bd770dcdc235cec3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.6

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