数据拐点

对于一组数据,如何求拐点是一个经常需要做的事情,特别是对于拖尾的数据,这里介绍一个python工具包可以简单的判断一组list的拐点


拐点图

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/

你可能感兴趣的:(数据拐点)