Python 在数据中发现非常大的跳跃

Python 在数据中发现非常大的跳跃,python,numpy,outliers,Python,Numpy,Outliers,我只需要找到非常大的跳跃,这样我就可以找到簇,然后再找到噪声。样本数据如下所示: 0.000000 0.000500 0.001500 0.003000 0.005500 0.008700 0.012400 0.000000 0.000500 0.001500 0.003000 0.005500 0.008700 0.012400 0.000000 0.000500 0.001500 0.003000 0.005500 0.008700 0.012400 0.000000 0.000500 0.

我只需要找到非常大的跳跃,这样我就可以找到簇,然后再找到噪声。样本数据如下所示:

0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.012400
我需要用python来实现这一点,但也欢迎使用任何通用算法

我已经试过了

  • 查找每对连续点之间的距离
  • 求连续距离的比率
  • 找出连续比率的接近度
  • 我面临的问题是,当我使用compare函数
    numpy.allclose()
    时,它的近似因子是静态的,对于不同程度的跳转,它会停止工作,并给出误报和误报

    一些用于数据可视化的图形。每个图形中的底部图形是总点数。

    首先,你应该想象你的问题,以便更好地了解发生了什么:

    import matplotlib.pyplot as plt
    data = (0.000000, 0.000500, 0.001500, 0.003000, 0.005500, 0.008700,
            0.012400, 0.000000, 0.000500, 0.001500, 0.003000, 0.005500,
            0.008700, 0.012400, 0.000000, 0.000500, 0.001500, 0.003000,
            0.005500, 0.008700, 0.012400, 0.000000, 0.000500, 0.001500,
            0.003000, 0.005500, 0.008700, 0.012400, 0.000000, 0.000500,
            0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 0.000000,
            0.000500, 0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 
            0.012400)
    plt.scatter(range(len(data)), data)
    

    其次,您需要实现步骤检测,这在wiki上有很好的描述:

    选择一种你认为最合适的方法,并加以利用

    更新


    只是想一想:如果你的所有数据看起来都和你的例子相似,你也可以简单地尝试做一个锯齿波()最小二乘拟合()来找到“跳跃”。这可能是进一步分析的起点。

    首先,你应该想象你的问题,以便更好地了解发生了什么:

    import matplotlib.pyplot as plt
    data = (0.000000, 0.000500, 0.001500, 0.003000, 0.005500, 0.008700,
            0.012400, 0.000000, 0.000500, 0.001500, 0.003000, 0.005500,
            0.008700, 0.012400, 0.000000, 0.000500, 0.001500, 0.003000,
            0.005500, 0.008700, 0.012400, 0.000000, 0.000500, 0.001500,
            0.003000, 0.005500, 0.008700, 0.012400, 0.000000, 0.000500,
            0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 0.000000,
            0.000500, 0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 
            0.012400)
    plt.scatter(range(len(data)), data)
    

    其次,您需要实现步骤检测,这在wiki上有很好的描述:

    选择一种你认为最合适的方法,并加以利用

    更新


    只是想一想:如果你的所有数据看起来都和你的例子相似,你也可以简单地尝试做一个锯齿波()最小二乘拟合()来找到“跳跃”。这可能是进一步分析的起点。

    如果您通过以下方式“手动”计算接近度,则您的方法有效:

    将numpy导入为np
    数据=np.数组([0.000000,0.000500,0.001500,0.003000,0.005500,0.008700,
    0.012400, 0.000000, 0.000500, 0.001500, 0.003000, 0.005500,
    0.008700, 0.012400, 0.000000, 0.000500, 0.001500, 0.003000,
    0.005500, 0.008700, 0.012400, 0.000000, 0.000500, 0.001500,
    0.003000, 0.005500, 0.008700, 0.012400, 0.000000, 0.000500,
    0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 0.000000,
    0.000500, 0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 
    0.012400])
    步骤=数据[1:]-数据[:-1]
    比率=1。*步骤[1://步骤[:-1]
    跳跃=比率[1:]-比率[:-1]
    最大跳跃=np.max(跳跃)
    打印最大的跳转
    >> 3.31102877071
    
    如果您通过以下方式“手动”计算接近度,则您的方法有效:

    将numpy导入为np
    数据=np.数组([0.000000,0.000500,0.001500,0.003000,0.005500,0.008700,
    0.012400, 0.000000, 0.000500, 0.001500, 0.003000, 0.005500,
    0.008700, 0.012400, 0.000000, 0.000500, 0.001500, 0.003000,
    0.005500, 0.008700, 0.012400, 0.000000, 0.000500, 0.001500,
    0.003000, 0.005500, 0.008700, 0.012400, 0.000000, 0.000500,
    0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 0.000000,
    0.000500, 0.001500, 0.003000, 0.005500, 0.008700, 0.012400, 
    0.012400])
    步骤=数据[1:]-数据[:-1]
    比率=1。*步骤[1://步骤[:-1]
    跳跃=比率[1:]-比率[:-1]
    最大跳跃=np.max(跳跃)
    打印最大的跳转
    >> 3.31102877071
    
    这没什么特别的,但你可以试试。使用正向和反向差异,您可以检测单个异常值。如果多个异常值叠加在一起,则在复杂情况下,该方法将失败,但在简单情况下,该方法可能有效:

    import numpy as np
    x = np.arange(20)    
    # Synthetic data
    sample = np.random.randn(20)
    # Synthetic noise
    sample[np.random.randint(0, 20, 5)] += np.random.randn(5) * 100
    
    plot(x, sample, 'o')
    

    获得向前和向后的导数(它们的绝对值,因为我们关心的是差值的大小而不是方向):

    使用阈值遮罩入口(它们至少有另一个关闭的节点):

    本例中硬编码的
    5
    可以用
    平均值
    中值
    +
    std
    或其他东西代替

    正如@septi所指出的,这并不是什么稀奇古怪的事情,离群点检测有很多理论,没有简单的方法可以解决所有问题。有关更多信息,您可以查看,我认为这适合您的问题


    这没什么特别的,但你可以试试。使用正向和反向差异,您可以检测单个异常值。如果多个异常值叠加在一起,则在复杂情况下,该方法将失败,但在简单情况下,该方法可能有效:

    import numpy as np
    x = np.arange(20)    
    # Synthetic data
    sample = np.random.randn(20)
    # Synthetic noise
    sample[np.random.randint(0, 20, 5)] += np.random.randn(5) * 100
    
    plot(x, sample, 'o')
    

    获得向前和向后的导数(它们的绝对值,因为我们关心的是差值的大小而不是方向):

    使用阈值遮罩入口(它们至少有另一个关闭的节点):

    本例中硬编码的
    5
    可以用
    平均值
    中值
    +
    std
    或其他东西代替

    正如@septi所指出的,这并不是什么稀奇古怪的事情,离群点检测有很多理论,没有简单的方法可以解决所有问题。有关更多信息,您可以查看,我认为这适合您的问题


    你能举一些你考虑FP/FN的例子吗?有些情节可能有助于我们理解你的数据。你能举一些你考虑FP/FN的例子吗?一些图可能有助于我们理解您的数据。我已经可视化了数据,每个数据块都遵循不同的配置文件,除了数据本身有重复的模式,您必须看到)好的,那么您现在走在正确的道路上了。你必须明白解决这个问题是你的工作。这需要努力,但如果你听从我的建议,我相信你最终会找到答案的。你不能指望别人为你做这项工作……还要注意,你的问题没有确切的解决办法。您必须找出正确的策略和参数范围,这些都高度依赖于您的数据集。没有一个志愿者会坐下来,花费数小时/数天的时间免费为你做这件事……我已经将数据可视化了,每个数据块都遵循不同的pr
    plot(x[mask], samples[mask], 'o')