对于一组数据,如何求拐点是一个经常需要做的事情,特别是对于拖尾的数据,这里介绍一个python工具包可以简单的判断一组list<int>的拐点
1. 安装
下面任意一种方式都可
1. conda install -c conda-forge kneed
2. pip install kneed
3. git clone https://github.com/arvkevi/kneed.git
python setup.py install
2.使用方法
假设我们有一组数据:
from kneed import KneeLocator
import matplotlib.pyplot as plt
# 需要注意x,y的长度必须一致
x = [1, 2, 3.4, 4, 5.3, 6.6, 7.4, 8.2, 9.7, 10.1]
y = [1, 2, 10, 14, 16, 17, 20, 54, 75, 89]
kneedle = KneeLocator(x, y, S=1.0, curve='convex', direction='increasing')
print(f'拐点所在的x轴是: {kneedle.elbow}')
kneedle.plot_knee() # 将数据画出来
['out']: 拐点所在的x轴是: 7.4
3.参数介绍及说明
1. 当你的数据是一个凹函数,并且是递增的,请使用:
curve='convex' and direction='increasing'
如下:
x = [1,2, 3.4, 4, 5.3, 6.6, 7.4, 8.2, 9.7, 10.1]
y = [1, 2, 10, 14, 16, 17, 20, 54, 75, 89]
kneedle = KneeLocator(x, y, S=1.0, curve='convex', direction='increasing')
kneedle.plot_knee()
print(f'拐点所在的x轴是: {kneedle.elbow}') # 拐点所在x轴的值(不是x轴索引索引)
['out'] :
拐点所在的x轴是: 7.4
2. 当你的数据是一个凹函数, 并且是递减少的, 请使用:
curve='convex' and direction='decreasing'
如下:
x = [1,2, 3.4, 4, 5.3, 6.6, 7.4, 8.2, 9.7, 10.1]
y = [89, 75, 54, 20, 17, 16, 14, 10, 2, 1]
kneedle = KneeLocator(x, y, S=1.0, curve='convex', direction='decreasing')
kneedle.plot_knee()
print(f'拐点所在的x轴是: {kneedle.elbow}')
['out']:
拐点所在的x轴是: 4.0
3. 当你的数据是一个凸函数, 并且是递增的, 请使用:
curve='concave' and direction='increasing'
x = [1,2, 3.4, 4, 5.3, 6.6, 7.4, 8.2, 9.7, 10.1]
y = [1, 10, 15, 30, 37, 38, 39, 42, 41, 41.2]
kneedle = KneeLocator(x, y, S=1.0, curve='concave', direction='increasing')
kneedle.plot_knee()
print(f'拐点所在的x轴是: {kneedle.elbow}')
['out']:
拐点所在的x轴是: 5.3
4. 当你的数据是一个凸函数, 并且是递减的, 请使用:
curve='concave' and direction='decreasing'
x = [1,2, 3.4, 4, 5.3, 6.6, 7.4, 8.2, 9.7, 10.1]
y = [41.2, 41, 42, 39, 38, 37, 30, 15, 10, 1]
kneedle = KneeLocator(x, y, S=1.0, curve='concave', direction='decreasing')
kneedle.plot_knee()
print(f'拐点所在的x轴是: {kneedle.elbow}')
['out']:
拐点所在的x轴是: 6.6
其它参数:
s: 敏感性, 原论文默认推荐为 1.0
curve: 'concave', 算法将会计算 knees(可以理解为凸函数),这时输出拐点所在x轴使用 kneedle.knees
'convex', 算法将会计算 elbows(可以理解为凹函数),这时输出拐点所在x轴使用 kneedle.elbows
direction: "increasing", "decreasing" 其中一个,分别代表递增和递减
还有一些不常用的参数详见:
https://pypi.org/project/kneed/