实时统计分析
我需要进行一些实时数据分析,以监测操作错误。具体来说,我正在控制一个浮标上的绞车,它正在把一个仪器包放入水中。我需要检测它是否已经触底,如果触底了就要停止。我有以下数据:传感器的深度和绞车放线的速度。我每秒更新一次数据,整个过程大约持续5分钟。如果传感器碰到底部,深度值通常会急剧减慢,最终停止。
可以假设在理想情况下,下降的速度是线性的,但由于波浪的影响,数据可能会有很多噪音。
我想出了这个方法:
'''
The variables sensor_depth, winch_velocity and sample_time are assumed to be updated in the background
by another thread.
'''
import numpy as np
from time import sleep
x_data = []
y_data = []
running_size = 10
while winch_is_running():
if new_sample():
x_data.append(sample_time)
y_data.append(sensor_depth)
# Get the slope for the entire procedure
A = np.vstack([x_data,np.ones(len(x_data))])
overall_slope,offset = np.linalg.lstsq(A,y_data)[0]
# Get the slope for a recent set of samples
A = np.vstack([x_data[-1*running_size],np.ones(running_size)])
recent_slope,offset = np.linalg.lstsq(A,y_data[-1*running_size])[0]
if overall_slope - recent_slope > allowed_slope_error:
stop_winch()
else: time.sleep(.2)
这个方法合理吗,还是有更好的办法?
这是当前系统的一些示例数据。那天的情况不是特别恶劣,也没有触底。当前系统使用的是基于摩托罗拉68k的TattleTale控制器,运行他们版本的Basic语言。触底算法只是比较每x个样本,如果差异不够大,就会停止。虽然这个方法有效,但在波浪较大的时候容易出现误报,而在平静的情况下反应又不够灵敏:
Temp Cond Sal DO DEPTH Turb Chlor
11/11/10 15:00:19 14.24 18.44 10.97 2.53 0.092 0.5 13.5
11/11/10 15:00:20 14.24 18.44 10.97 2.53 0.126 0.7 9.5
11/11/10 15:00:21 14.24 18.45 10.97 2.53 0.132 0.6 13.0
11/11/10 15:00:22 14.24 18.44 10.96 2.53 0.152 0.6 8.6
11/11/10 15:00:23 14.24 18.44 10.96 2.53 0.139 0.7 13.6
11/11/10 15:00:24 14.24 18.44 10.97 2.52 0.120 0.7 13.5
11/11/10 15:00:25 14.24 18.44 10.97 2.52 0.128 1.4 7.1
11/11/10 15:00:26 14.24 18.44 10.96 2.52 0.128 0.6 7.9
11/11/10 15:00:27 14.24 18.44 10.97 2.52 0.141 0.9 12.4
11/11/10 15:00:28 14.24 18.44 10.97 2.51 0.135 1.3 12.7
11/11/10 15:00:29 14.24 18.44 10.96 2.51 0.145 1.3 12.8
11/11/10 15:00:30 14.24 18.44 10.96 2.51 0.163 0.6 4.8
11/11/10 15:00:31 14.24 18.44 10.96 2.51 0.213 0.9 3.9
11/11/10 15:00:32 14.24 18.44 10.97 2.51 0.211 0.6 7.1
11/11/10 15:00:33 14.24 18.44 10.96 2.51 0.241 0.7 6.9
11/11/10 15:00:34 14.24 18.44 10.96 2.51 0.286 0.5 9.8
11/11/10 15:00:35 14.24 18.44 10.96 2.51 0.326 0.6 9.0
11/11/10 15:00:36 14.24 18.44 10.96 2.51 0.358 0.7 3.3
11/11/10 15:00:37 14.24 18.44 10.96 2.51 0.425 0.7 13.1
11/11/10 15:00:38 14.24 18.43 10.96 2.51 0.419 0.8 5.3
11/11/10 15:00:39 14.24 18.44 10.96 2.51 0.495 1.2 7.4
11/11/10 15:00:40 14.24 18.44 10.96 2.50 0.504 0.7 16.1
11/11/10 15:00:41 14.24 18.44 10.96 2.50 0.558 0.5 11.9
11/11/10 15:00:42 14.24 18.44 10.96 2.50 0.585 0.8 8.8
11/11/10 15:00:43 14.24 18.44 10.96 2.50 0.645 0.8 9.7
11/11/10 15:00:44 14.24 18.44 10.96 2.50 0.654 0.6 5.2
11/11/10 15:00:45 14.24 18.44 10.96 2.50 0.694 0.5 9.5
11/11/10 15:00:46 14.24 18.44 10.96 2.50 0.719 0.7 5.9
11/11/10 15:00:47 14.24 18.44 10.96 2.50 0.762 0.9 7.2
11/11/10 15:00:48 14.24 18.44 10.96 2.50 0.815 1.0 11.1
11/11/10 15:00:49 14.24 18.44 10.96 2.50 0.807 0.6 8.7
11/11/10 15:00:50 14.24 18.44 10.96 2.50 0.884 0.4 0.4
11/11/10 15:00:51 14.24 18.44 10.96 2.50 0.865 0.7 13.3
11/11/10 15:00:52 14.25 18.45 10.97 2.49 0.917 1.2 7.3
11/11/10 15:00:53 14.24 18.45 10.97 2.49 0.964 0.5 4.8
11/11/10 15:00:54 14.25 18.44 10.97 2.49 0.967 0.6 9.7
11/11/10 15:00:55 14.25 18.44 10.97 2.49 1.024 0.5 8.1
11/11/10 15:00:56 14.25 18.45 10.97 2.49 1.042 1.0 14.3
11/11/10 15:00:57 14.25 18.45 10.97 2.49 1.074 0.7 6.0
11/11/10 15:00:58 14.26 18.46 10.97 2.49 1.093 0.9 9.0
11/11/10 15:00:59 14.26 18.46 10.98 2.49 1.145 0.7 9.1
11/11/10 15:01:00 14.26 18.46 10.98 2.49 1.155 1.7 8.6
11/11/10 15:01:01 14.25 18.47 10.98 2.49 1.205 0.7 8.8
11/11/10 15:01:02 14.25 18.48 10.99 2.49 1.237 0.8 12.9
11/11/10 15:01:03 14.26 18.48 10.99 2.49 1.248 0.7 7.2
11/11/10 15:01:04 14.27 18.50 11.00 2.48 1.305 1.2 9.8
11/11/10 15:01:05 14.28 18.50 11.00 2.48 1.328 0.7 10.6
11/11/10 15:01:06 14.29 18.49 11.00 2.48 1.367 0.6 5.4
11/11/10 15:01:07 14.29 18.51 11.01 2.48 1.387 0.8 9.2
11/11/10 15:01:08 14.30 18.51 11.01 2.48 1.425 0.6 14.1
11/11/10 15:01:09 14.31 18.52 11.01 2.48 1.456 4.0 11.3
11/11/10 15:01:10 14.31 18.52 11.01 2.47 1.485 2.5 5.3
11/11/10 15:01:11 14.31 18.51 11.01 2.47 1.490 0.7 5.2
11/11/10 15:01:12 14.32 18.52 11.01 2.47 1.576 0.6 6.6
11/11/10 15:01:13 14.32 18.51 11.01 2.47 1.551 0.7 7.7
11/11/10 15:01:14 14.31 18.49 10.99 2.47 1.627 0.6 7.3
11/11/10 15:01:15 14.29 18.47 10.98 2.47 1.620 0.7 11.5
11/11/10 15:01:16 14.28 18.48 10.99 2.48 1.659 0.8 7.0
11/11/10 15:01:17 14.27 18.49 10.99 2.48 1.682 1.4 14.4
11/11/10 15:01:18 14.26 18.49 11.00 2.48 1.724 1.0 2.9
11/11/10 15:01:19 14.27 18.52 11.01 2.48 1.756 0.8 13.5
11/11/10 15:01:20 14.28 18.52 11.01 2.47 1.752 5.3 11.7
11/11/10 15:01:21 14.29 18.52 11.02 2.47 1.841 0.8 5.8
11/11/10 15:01:22 14.30 18.52 11.01 2.47 1.789 1.0 5.5
11/11/10 15:01:23 14.31 18.52 11.01 2.47 1.868 0.7 6.8
11/11/10 15:01:24 14.31 18.52 11.02 2.47 1.848 0.8 7.8
11/11/10 15:01:25 14.32 18.52 11.01 2.47 1.896 0.3 8.3
11/11/10 15:01:26 14.32 18.52 11.01 2.47 1.923 0.9 4.8
11/11/10 15:01:27 14.32 18.51 11.01 2.47 1.936 0.5 6.4
11/11/10 15:01:28 14.32 18.52 11.01 2.46 1.960 0.9 10.0
11/11/10 15:01:29 14.31 18.52 11.01 2.46 1.996 0.6 10.7
11/11/10 15:01:30 14.31 18.52 11.01 2.47 2.024 1.7 11.8
11/11/10 15:01:31 14.31 18.52 11.01 2.47 2.031 1.0 11.7
11/11/10 15:01:32 14.31 18.53 11.02 2.46 2.110 1.3 5.4
11/11/10 15:01:33 14.32 18.52 11.01 2.46 2.067 0.6 12.2
11/11/10 15:01:34 14.32 18.52 11.01 2.46 2.144 0.4 6.4
11/11/10 15:01:35 14.32 18.51 11.01 2.46 2.148 1.0 4.6
11/11/10 15:01:36 14.33 18.51 11.01 2.46 2.172 0.9 9.6
11/11/10 15:01:37 14.33 18.52 11.01 2.46 2.221 1.0 6.5
11/11/10 15:01:38 14.33 18.51 11.01 2.46 2.219 0.3 7.6
11/11/10 15:01:39 14.33 18.51 11.01 2.46 2.278 1.2 8.1
11/11/10 15:01:40 14.32 18.51 11.01 2.46 2.258 0.5 0.6
11/11/10 15:01:41 14.32 18.52 11.01 2.46 2.329 1.2 8.2
11/11/10 15:01:42 14.31 18.51 11.01 2.46 2.321 1.1 9.6
11/11/10 15:01:43 14.31 18.51 11.01 2.46 2.382 1.0 5.3
11/11/10 15:01:44 14.31 18.51 11.01 2.46 2.357 0.7 8.5
11/11/10 15:01:45 14.31 18.52 11.01 2.46 2.449 0.4 10.3
11/11/10 15:01:46 14.31 18.52 11.01 2.46 2.430 0.6 10.0
11/11/10 15:01:47 14.31 18.52 11.01 2.46 2.472 0.6 11.3
11/11/10 15:01:48 14.31 18.52 11.01 2.45 2.510 1.2 8.5
11/11/10 15:01:49 14.31 18.51 11.01 2.45 2.516 0.7 9.5
11/11/10 15:01:50 14.31 18.52 11.01 2.45 2.529 0.5 9.6
11/11/10 15:01:51 14.31 18.52 11.01 2.45 2.575 0.7 8.2
11/11/10 15:01:52 14.31 18.51 11.01 2.46 2.578 0.5 9.4
11/11/10 15:01:53 14.31 18.51 11.01 2.46 2.592 0.8 5.5
11/11/10 15:01:54 14.30 18.51 11.01 2.46 2.666 0.6 7.1
11/11/10 15:01:55 14.30 18.51 11.01 2.46 2.603 0.7 11.5
11/11/10 15:01:56 14.29 18.52 11.01 2.45 2.707 0.9 7.2
11/11/10 15:01:57 14.29 18.52 11.01 2.45 2.673 0.7 9.2
11/11/10 15:01:58 14.28 18.52 11.01 2.45 2.705 0.7 6.4
11/11/10 15:01:59 14.28 18.52 11.01 2.45 2.720 1.3 6.8
11/11/10 15:02:00 14.28 18.52 11.02 2.45 2.778 0.7 7.5
11/11/10 15:02:01 14.27 18.52 11.02 2.45 2.724 0.5 8.0
11/11/10 15:02:02 14.27 18.51 11.01 2.45 2.840 0.9 10.0
11/11/10 15:02:03 14.26 18.52 11.02 2.45 2.758 0.8 6.4
11/11/10 15:02:04 14.26 18.52 11.01 2.46 2.874 0.4 9.7
11/11/10 15:02:05 14.24 18.53 11.02 2.46 2.824 1.1 10.8
11/11/10 15:02:06 14.24 18.53 11.02 2.46 2.896 1.0 8.8
11/11/10 15:02:07 14.22 18.53 11.02 2.47 2.903 0.6 16.3
11/11/10 15:02:08 14.22 18.54 11.03 2.45 2.912 0.9 9.6
11/11/10 15:02:09 14.21 18.54 11.02 2.45 2.949 0.8 6.6
11/11/10 15:02:10 14.20 18.54 11.03 2.45 2.964 1.4 8.4
11/11/10 15:02:11 14.19 18.55 11.03 2.46 2.966 3.0 12.9
11/11/10 15:02:12 14.17 18.55 11.03 2.45 3.020 1.0 7.5
11/11/10 15:02:13 14.15 18.56 11.04 2.45 3.000 1.1 9.5
11/11/10 15:02:14 14.14 18.56 11.04 2.45 3.064 0.9 6.5
11/11/10 15:02:15 14.13 18.56 11.04 2.45 3.037 1.3 8.2
11/11/10 15:02:16 14.13 18.57 11.04 2.45 3.097 1.3 7.7
11/11/10 15:02:17 14.12 18.57 11.05 2.45 3.128 1.5 8.4
11/11/10 15:02:18 14.11 18.58 11.05 2.45 3.104 1.7 7.0
11/11/10 15:02:19 14.10 18.58 11.05 2.45 3.190 1.2 10.2
11/11/10 15:02:20 14.10 18.58 11.05 2.44 3.141 5.8 9.9
11/11/10 15:02:21 14.09 18.60 11.06 2.44 3.199 1.4 4.7
11/11/10 15:02:22 14.07 18.60 11.07 2.44 3.208 1.6 9.4
11/11/10 15:02:23 14.06 18.60 11.07 2.44 3.199 2.1 6.2
11/11/10 15:02:24 14.06 18.62 11.08 2.43 3.259 3.0 9.3
11/11/10 15:02:25 14.05 18.63 11.08 2.43 3.228 1.6 8.9
11/11/10 15:02:26 14.06 18.63 11.08 2.43 3.289 1.6 3.5
11/11/10 15:02:27 14.05 18.64 11.09 2.43 3.278 1.8 2.2
11/11/10 15:02:28 14.05 18.64 11.09 2.43 3.307 2.2 9.7
11/11/10 15:02:29 14.04 18.64 11.09 2.43 3.315 2.3 5.5
11/11/10 15:02:30 14.04 18.65 11.10 2.43 3.367 2.1 5.1
11/11/10 15:02:31 14.03 18.65 11.10 2.43 3.297 2.5 8.5
11/11/10 15:02:32 14.03 18.65 11.10 2.41 3.419 1.9 6.8
11/11/10 15:02:33 14.03 18.65 11.10 2.41 3.347 2.1 4.0
11/11/10 15:02:34 14.03 18.66 11.10 2.41 3.405 2.0 11.8
11/11/10 15:02:35 14.03 18.67 11.11 2.41 3.420 2.4 10.6
11/11/10 15:02:36 14.03 18.67 11.11 2.39 3.369 2.7 10.5
11/11/10 15:02:37 14.02 18.67 11.11 2.39 3.402 1.6 9.1
11/11/10 15:02:38 14.02 18.66 11.11 2.39 3.408 1.9 8.5
11/11/10 15:02:39 14.02 18.67 11.11 2.39 3.362 4.2 7.0
11/11/10 15:02:40 14.02 18.67 11.11 2.38 3.421 2.3 12.1
11/11/10 15:02:41 14.02 18.67 11.11 2.38 3.371 2.6 14.7
11/11/10 15:02:42 14.02 18.67 11.11 2.38 3.409 3.0 6.5
11/11/10 15:02:43 14.02 18.67 11.11 2.38 3.368 2.3 2.5
11/11/10 15:02:44 14.02 18.67 11.11 2.37 3.434 2.5 10.2
11/11/10 15:02:45 14.02 18.67 11.11 2.37 3.346 1.6 4.5
从数据的角度来看,那天也不是特别有趣。
3 个回答
我猜想你不想让很多电缆堆在你正在放下的设备上,也不想让它落得太重。如果你对这个问题的物理原理有一定了解,那么根据噪音的情况,你可能可以用一个简单的反馈控制器来解决。如果你能控制卷扬机的速度,那么一个简单的PID控制器可能就能解决问题。
如果你只能开关卷扬机,那就会更复杂一些(也就是说需要更多的数学知识),因为你需要通过开关卷扬机来控制下降的速度,才能实现完美着陆。
根据我的个人经验,控制理论(基础)比机器学习(基础)更容易掌握,所以我觉得在你的控制问题上尝试一下控制理论是值得的。
如果你真的需要尽快关闭它,你可以考虑用机器学习的方法。通过分析你多次运行的样本,你可以找到一个最小的允许坡度误差值。
或者,你也可以多试几次,看看哪个值能给你带来最好的平均结果 :)
你的方法(把当前的变化率和平均变化率进行比较)不错,但还有改进的空间。最重要的是,在决定如何分析数据之前,你真的需要先看看你的数据:
这些图展示了: A) 你的原始数据。注意:下降的速度并不是恒定的,因为卷轴的直径在变化,所以线性回归可能不是最佳选择。此外,卷轴停止时开始的额外数据可能会影响你的斜率测量。 B) 你的数据的导数。这是你用来进行检测的数据。告诉我:你能轻松看到平均斜率变为零的区域吗? C) 你的数据的快速傅里叶变换(FFT),显示在频率范围的上半部分有很多噪声——这就是你的噪声所在。由于噪声只占据频率范围的上半部分,所以过滤掉它应该相对简单。 D) 经过高斯低通滤波器处理后的数据,sigma=1.0(scipy.ndimage.gaussian_filter(data, 1.0))。 E) D的导数(在这个数据中更容易看到底部)。 F) E的功率谱,显示噪声大部分被去除。
所以通过稍微过滤一下,视觉上就能很容易地检测到底部。那么问题是1) 如何将“视觉检测”转化为一个可靠的算法,2) 如何确定sigma的最佳值。如果值太小,噪声会干扰你;如果值太大,卷轴可能会运行得太久。回答这两个问题的唯一方法是通过实验——尽可能多地提取这些数据集,尝试新的想法,直到找到一个适合大部分(如果不是全部)数据集的方案。
我最初的想法是这样的: - 在数据到达时进行低通处理,使用经验上预先确定的参数。如果这个参数选择得当,那么只需要考虑最后到达的数据点。 - 当你找到一个接近零的点时触发,设定一个(经验确定的)阈值。
你可以做很多事情让这个过程更“聪明”,比如根据之前的噪声自动选择阈值。然而,这种技巧可能很难正确实现,因为它们可能会被意外的输入所欺骗。通常来说,利用你已经知道的数据会比让计算机来猜测要好得多。