检测差异列表中的更改

Detect changes in a list of variances

提问人:Abdul Muqeet 提问时间:11/13/2023 最后编辑:desertnautAbdul Muqeet 更新时间:11/13/2023 访问量:58

问:

我正在计算物体和超声波传感器之间的平均距离。超声波传感器与arduino连接,但数据正在传输到python。我的检测是这样的

  • 超声波传感器提供正常数据,波动差异较小
  • 物体在超声波传感器前面
  • 方差飙升并开始向上运动
  • 一段时间后,无论物体是否在超声波传感器前面,方差都开始减小

现在我想了解的是,我怎样才能保存或知道方差在什么时候飙升。因此,我将开始计算从方差激增时开始计算距离的平均值。

我已经附上了它给我的图表和数字。另外,我的代码如下:

import matplotlib.pyplot as plt
from serial import Serial
import numpy as np

try:
    ard = Serial(port='COM6', baudrate=9600)
    print("connect")
except:
    print("Port is not conneced")
    exit(0)


x = []
y = []
variance = []
mean = []
data = 0
no_of_samples = 0


for i in range(300):

    data = float(ard.readline().decode().strip())

    if data > 400:
        data = 400

    x.append(no_of_samples)
    y.append(int(data))
    no_of_samples += 1

    variance.append(round(np.var(y), 3))
    mean.append(round(np.mean(y), 3))

    print(f"Mean: {mean[-1]}\tVariance: {variance[-1]}\tDistance: {y[-1]}\tSample #: {x[-1]}")


plt.xlabel('No of Samples')
plt.ylabel('Variance')
plt.plot(x, variance)


plt.draw()
plt.show(block=True)


数字 Data from the sensor

Variance Graph

我尝试了多种方法,例如计算方差的平均值,但都是徒劳的。我想计算方差立即上升时开始的平均差值。

Python Arduino-uno 方差

评论

0赞 rochard4u 11/13/2023
为什么不将前一点的方差值保留在变量中,并将其与当前点的方差进行比较,看看差值是否高于阈值?

答:

2赞 Daniel Perez Efremova 11/13/2023 #1

我认为您正在解决众所周知的“变化点检测 (CPD)”问题,它包括在一维数据中查找突然变化。(希望具体名称能帮你找到更多资源)

我建议在 Python 中破坏包。在那里,您将找到合适的算法来检测此类更改,具体取决于您的用例。 在这里,我举了一个二进制分割方法的简短示例。第一个蓝色阴影是变化之前,第一个红色阴影是变化之后,依此类推。

import ruptures as rpt

data = np.array([200, 201, 200, 202, 203, 200, 11, 12, 13, 201, 203, 203, 200, 199])
model = rpt.Binseg(model='l2').fit(data)
pred = model.predict(n_bkps=2) # number of change points to detect
rpt.show.display(data, pred, figsize=(10, 6))[0].savefig('fig.png')

enter image description here

下面是一个笔记本,其中包含其他很好的示例:Kaggle:变化点检测。希望这本笔记本能帮你调试,找到最合适的技术。

评论

0赞 Abdul Muqeet 11/13/2023
这很有帮助!谢谢
0赞 Daniel Perez Efremova 11/15/2023
如果它解决了问题,请标记为已接受:)