为了账号安全,请及时绑定邮箱和手机立即绑定

python中是否有检测曲线上奇异点的函数?

python中是否有检测曲线上奇异点的函数?

墨色风雨 2021-12-17 16:17:04
我需要检测从数据集绘制的给定曲线上的奇异点(极值、趋势变化、急剧变化)。首先要记住的是带有推导的拐点检测(但我没有绘制曲线的数学表达式),其次是如何检测角点。所以如果可能的话,我可以构建(使用 python)一个滑动窗口来检测这些类型的 SP(奇异点),如果可能的话,使用的库和函数是什么?
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

我刚刚抓取了您的一些数据,向您展示您可以在整个数据集上找到点,而无需使用滑动窗口(但理论上您可以):

  1. 局部极值(在原始数据中找到峰值)

  2. 最大陡度(找到一阶导数的峰值)

  3. 拐点(在二阶导数中找到峰值)

首先,让我们看一下计算导数:

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


df = pd.read_csv("Default Dataset.csv", 

                 sep=';', 

                 decimal=",", 

                 header=None)


### Interpolate linearily ###

x_new = np.linspace(0, df[0].iloc[-1], 2000)

y_new = np.interp(x_new, df[0], df[1])


### First and second derivative ###

diff1 = np.insert(np.diff(y_new), 0, 0)

diff2 = np.insert(np.diff(diff1), 0, 0)


### Plot everything ###

plt.figure(figsize=(12,3))

plt.subplot(131)

plt.plot(x_new, y_new)

plt.subplot(132)

plt.plot(x_new, diff1)

plt.subplot(133)

plt.plot(x_new, diff2)

plt.tight_layout()

在这里,我还进行了插值以在数据点之间具有相等的间距。此外,我在微分后使用函数插入一个0at 位置,以确保与原始数据的形状相同。0np.insert

//img1.sycdn.imooc.com//61bc47a30001a4b308550205.jpg

接下来,我们将找到峰值:


import peakutils as pu


ix_abs   = pu.indexes(y_new, thres=0.5, min_dist=15)

ix_diff1 = pu.indexes(diff1, thres=0.5, min_dist=15)

ix_diff2 = pu.indexes(diff2, thres=0.5, min_dist=15)


plt.scatter(x_new[ix_abs], y_new[ix_abs], color='g', label='abs')

plt.scatter(x_new[ix_diff1], y_new[ix_diff1], color='r', label='first deriv')

plt.scatter(x_new[ix_diff2], y_new[ix_diff2], color='purple', label='second deriv')


plt.plot(x_new, y_new)

plt.legend(loc='best')

//img1.sycdn.imooc.com//61bc47b10001696403790251.jpg

我正在使用peakutils包,因为它几乎在所有情况下都能很好地工作。您会看到,并未找到示例中指示的所有点。你可以玩与周围不同的参数threshold,并minimum distance找到更好的解决办法。但这应该是进一步研究的良好起点。实际上,该minimum distance参数将为您提供所需的滑动窗口


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 282 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信