提问人:Abdul Muqeet 提问时间:11/13/2023 最后编辑:desertnautAbdul Muqeet 更新时间:11/13/2023 访问量:58
检测差异列表中的更改
Detect changes in a list of variances
问:
我正在计算物体和超声波传感器之间的平均距离。超声波传感器与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)
我尝试了多种方法,例如计算方差的平均值,但都是徒劳的。我想计算方差立即上升时开始的平均差值。
答:
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')
下面是一个笔记本,其中包含其他很好的示例:Kaggle:变化点检测。希望这本笔记本能帮你调试,找到最合适的技术。
评论
0赞
Abdul Muqeet
11/13/2023
这很有帮助!谢谢
0赞
Daniel Perez Efremova
11/15/2023
如果它解决了问题,请标记为已接受:)
评论