过滤信号中的异常值

问题描述 投票:0回答:2

输入数据

我有一个随时间变化的信号值数组,但它由许多异常值和 0 值组成。

[0, 0, 0, 0, 0, 0, 0, 1085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 301, 303, 301, 301, 301, 301, 301, 0, 0, 300, 300, 300, 298, 298, 298, 296, 300, 300, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 255, 0, 0, 0, 0, 236, 238, 0, 234, 0, 0, 0, 228, 0, 0, 1078, 0, 0, 0, 1078, 1076, 1078, 1076, 1076, 1076, 1074, 1074, 1072, 1072, 1074, 1074, 1074, 1074, 1076, 1076, 1074, 1074, 1074, 1072, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 0, 0, 0, 0, 1886, 1880, 1880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1074, 1074, 1074, 1076, 1076, 1076, 1074, 1074, 1074, 1072, 1072, 1074, 1076, 1076, 1076, 1076, 1074, 1074, 1074, 1078, 1074, 1066, 1061, 1061, 1057, 1053, 1059, 1046, 0, 1042, 1035, 1033, 1029, 1027, 1021, 1018, 1014, 1008, 1005, 1003, 993, 990, 673, 673, 673, 673, 673, 956, 950, 946, 935, 931, 924, 920, 911, 903, 896, 890, 885, 879, 871, 864, 853, 847, 841, 832, 823, 963, 808, 802, 787, 967, 969, 759, 748, 735, 725, 710, 697, 682, 667, 652, 635, 622, 603, 583, 560, 540, 517, 493, 468, 438, 412, 380, 0, 450, 500, 549, 592, 628, 661, 690, 720, 742, 1096, 150, 800, 819, 832, 845, 862, 1181, 885, 892, 901, 909, 920, 930, 935, 941, 1190, 1188, 1186, 967, 975, 978, 1173, 1173, 991, 997, 1003, 1005, 1006, 1008, 1012, 1014, 1020, 1021, 1021, 1023, 1029, 1031, 1031, 1033, 1035, 1038, 1040, 1044, 1044, 1042, 1048, 1048, 1048, 1053, 1053, 1053, 1053, 1053, 0, 0, 0, 0, 0, 0, 0, 0, 1080, 0, 0, 0, 1074, 1074, 1076, 1074, 1074, 1070, 1076, 1078, 1078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1083, 0, 0, 0, 1072, 1070, 1066, 1065, 1065, 1063, 1061, 1053, 0, 0, 1040, 1273, 1035, 1275, 1031, 1027, 1020, 1018, 1012, 1008, 999, 995, 991, 986, 982, 978, 971, 965, 961, 958, 1121, 1117, 935, 423, 446, 915, 903, 900, 894, 892, 873, 866, 858, 853, 845, 1447, 826, 811, 804, 729, 20, 18, 757, 828, 738, 806, 712, 701, 24, 678, 945, 654, 643, 633, 622, 609, 1081, 1091, 1108, 1125, 536, 1155, 1183, 1215, 1224, 1239, 1254, 420, 399, 378, 0, 0, 0, 515, 553, 585, 616, 645, 669, 693, 710, 0, 0, 774, 789, 804, 815, 826, 845, 853, 866, 873, 1065, 894, 901, 905, 916, 924, 933, 939, 950, 952, 960, 960, 965, 973, 978, 982, 986, 991, 999, 1005, 1008, 1010, 1012, 1014, 1020, 1025, 1027, 1031, 836, 836, 836, 1042, 1040, 796, 1046, 1040, 753, 1040, 0, 0, 0, 1061, 0, 0, 1897, 1886, 1873, 1863, 1850, 0, 1828, 0, 1811, 1074, 1788, 1076, 0, 0, 1749, 1081, 1085, 1087, 1083, 1081, 1083, 1083, 0, 0, 1070, 1078, 1070, 1070, 1072, 1072, 1070, 1070, 1070, 1070, 0, 0, 1078, 1078, 1076, 1076, 1074, 1076, 0, 0, 1089, 1087, 1087, 1083, 1083, 1085, 1083, 1068, 1059, 0, 1053, 1055, 1053, 1048, 1837, 1320, 1044, 1316, 1312, 1036, 1051, 1027, 1025, 1044, 1291, 1282, 1042, 1018, 1036, 1035, 1005, 1228, 1029, 1027, 1190, 999, 1023, 1020, 1020, 1016, 1012, 1012, 1010, 1012, 1005, 997, 995, 993, 990, 986, 984, 980, 971, 1121, 969, 963, 960, 954, 950, 945, 1100, 939, 933, 926, 1121, 931, 946, 958, 969, 978, 986, 997, 1005, 1012, 1016, 1025, 1029, 1036, 1042, 1046, 1053, 1055, 1063, 1066, 1068, 1072, 1076, 1076, 1080, 1081, 1087, 1091, 1091, 1096, 1096, 1096, 1100, 1104, 1618, 1108, 1597, 1591, 1582, 1115, 1434, 1441, 1451, 1550, 1543, 1477, 1125, 1524, 1126, 1128, 1128, 1128, 1128, 1132, 1132, 1132, 1134, 1134, 1136, 1136, 1138, 1138, 1140, 1141, 1143, 1141, 1143, 1143, 1145, 1143, 1145, 1145, 1147, 1147, 1147, 1149, 1149, 1151, 1151, 1151, 1151, 1151, 1151, 1153, 1151, 1151, 1155, 1155, 1156, 1155, 1156, 1156, 1158, 1158, 1158, 1156, 1158, 1158, 1158, 1158, 1158, 1156, 1156, 1158, 1158, 1156, 1158, 1158, 1156, 1363, 1361, 1361, 1359, 1158, 1156, 1156, 1158, 1158, 1158, 1158, 1158, 1156, 1158, 1156, 1158, 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1160, 1160, 1158, 1158, 1158, 1158, 1158, 1158, 1156, 1156, 1158, 1158, 1158, 1158, 1156, 1156, 1155, 1156, 1151, 1151, 1149, 1149, 1145, 1143, 1143, 1140, 1128, 1128, 1125, 1119, 0, 0, 1111, 1113, 1111, 1108, 1104, 1102, 1102, 1100, 1091, 1087, 1085, 1081, 1078, 1074, 1070, 1063, 1059, 1057, 1046, 1042, 1036, 1031, 1025, 1018, 1010, 1005, 997, 995, 984, 978, 969, 958, 948, 945, 931, 924, 915, 905, 894, 881, 871, 860, 851, 841, 830, 825, 0, 0, 885, 885, 888, 1089, 890, 886, 885, 712, 701, 684, 0, 0, 652, 673, 699, 913, 965, 1008, 1021, 1006, 813, 828, 840, 1057, 860, 1065, 1074, 886, 894, 898, 911, 915, 920, 1087, 931, 1087, 939, 948, 948, 956, 963, 965, 969, 971, 973, 976, 980, 982, 984, 986, 991, 993, 993, 997, 997, 1001, 1005, 1006, 1006, 1029, 1010, 1014, 1012, 1014, 1014, 1016, 1018, 1016, 1018, 1018, 1065, 1065, 1063, 1063, 1063, 1059, 1059, 1059, 1059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1053, 0, 1046, 1046, 1050, 1048, 1048, 1057, 1061, 1065, 1070, 1072, 1074, 1078, 1081, 1083, 1087, 1091, 1093, 1095, 1102, 1104, 1111, 1111, 1113, 1119, 1125, 1128, 1130, 1134, 1141, 1147, 1153, 1156, 1276, 1170, 1175, 1183, 1188, 1192, 1201, 1303, 1303, 1220, 1231, 1239, 1248, 1256, 1303, 1275, 0, 0, 0, 0, 1391, 0, 1413, 1408, 0, 0, 1520, 1501, 0, 1398, 1576, 1421, 1438, 1447, 1460, 1471, 0, 0, 0, 0, 1552, 1565, 1588, 1610, 1627, 1650, 0, 1651, 0, 1888, 1554, 0, 1458, 1438, 1413, 1404, 1385, 1372, 1363, 1348, 1335, 1323, 1314, 1305, 1297, 1291, 1280, 1275, 1271, 1258, 1256, 1250, 1243, 1239, 1233, 1230, 1222, 1218, 1216, 1215, 1211, 1205, 1201, 1200, 1196, 1192, 1185, 1183, 1181, 1179, 1175, 1175, 1170, 1170, 1170, 1166, 1158, 1158, 1155, 1155, 1151, 1151, 1149, 1147, 1147, 1143, 1138, 1138, 1138, 1134, 1136, 1136, 1130, 1130, 0, 1128, 1128, 1128, 1128, 1128, 1125, 1125, 1125, 1123, 1121, 1121, 1117, 1119, 1117, 1117, 1117, 1113, 1115, 1115, 1115, 1113, 1093, 1091, 1087, 1085, 1083, 1080, 1087, 1059, 1053, 1053, 1042, 1038, 1029, 1025, 1021, 1014, 1008, 1001, 993, 990, 976, 973, 965, 958, 941, 939, 931, 922, 913, 909, 896, 881, 873, 866, 855, 843, 834, 826, 0, 796, 778, 770, 751, 738, 729, 718, 706, 697, 686, 675, 661, 646, 635, 620, 607, 592, 579, 562, 547, 532, 513, 495, 478, 457, 442, 420, 401, 378, 354, 333, 307, 285, 258, 232, 202, 174, 144, 112, 80, 45, 0, 0, 0, 0, 0, 0, 0, 0, 1083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 611, 609, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

目标

目标是获取主要底层信号,如下所示:

作为提取主信号的第一个改进,我通过计算中间非零点之间的斜率并插值值来用数据趋势替换每个 0:

但是,如何删除异常值?

我尝试过以下方法:

  1. 与替换每个 0 值的方法相同,但然后检查最后一个点之间的差异 > 100 时。当存在多个连续异常值时,此方法不起作用,如 [450-480] 区间所示
  2. 移动平均滤波器:它不会消除异常值,只会减少异常值。即使在测试了不同的窗口大小之后,那些不是异常值而是主要信号一部分的点也会受到太大影响。
  3. 对于每个数据点,检查它是否偏离整个信号的标准差和方差太多。然而,由于某个区间的当前趋势随着时间的推移有很大不同,这种方法行不通。

我最好不要对用于消除异常值的任何值进行硬编码,因为其他信号可能与此信号不在同一范围内。我使用了Python,但也欢迎使用其他语言的解决方案。谢谢你帮助我!

filter signal-processing data-processing
2个回答
0
投票

我建议尝试傅里叶变换,尝试看看这个信号在频域中的样子,是否有任何频率可以删除并变换回来,看看信号是否成立。如果异常值与信号的频率不同,则此方法有效(查找降噪)。

我一开始以为你可以通过检查与“真实”信号的差异来丢弃异常值,但很难分辨什么是真实信号,特别是与你的示例相比(信号本身有一些大的跳跃)。如果您有某种信号模型,也许您可以权衡一个点是否可能是信号的一部分(例如,如果它是正弦曲线)。

如果您丢弃信号的第一部分,则可以通过强制信号连续(又叫什么)来捕获另一部分,这就是不允许信号有任何跳跃(什么是跳跃?好吧)你必须将它与之前点的斜率进行比较,并且它不能比这多 X)。但它并不完美,例如我认为它会一路下跌至 200 点。在这种情况下,这可以通过删除零来补偿。


0
投票

您可以尝试使用基于动态规划的近似优化算法。优化问题是在信号中找到 k 个样本,在其中复制先前的值,目标是最小化已处理信号的相邻样本之间的绝对值差之和。 k 值越高,平滑越重。

假设信号是n个值,k称为点数——它可以跳过的样本数。从两个 n*k 数组 opt 和 last 开始,其中 opt[i, j] 是到信号的第 i 个样本为止可实现的最小平方差和,还剩下 j 个点;而last[i, j]是最后一个非跳过的样本点。对于所有 j,last[0, j] = 0。

那么近似最优 opt[i, j] 是两种可能性中的最小值:

  • 要么花费一个点来复制最后一个样本:opt[i, j] = opt[i-1, j+1],并且last[i, j] = last[i-1, j+1]。
  • 或否: opt[i, j] = opt[i-1, j] + |x[i] - x[last[i-1, j]|, last[i, j] = i。

如果 j = k,则不可能花费任何积分(因为所有积分仍然完好无损),因此不允许第一个选项。也不可能在第一个样本上花费一点,因为你无法复制样本 -1。

我认为最优值是近似的,因为两个分支可能具有相同的值,但最后的点不同,并且未来的决策可能取决于最后的值是什么。您也可以通过对最后一个进行参数化来获得精确的最佳值,但这会给出一个 3D 数组,我想它很快就会变得不切实际。

整个信号的近似最佳值是 opt[n] 行的最小元素,回溯最后一个数组应该可以让您找出点花在哪里。

你也可以做一个贪婪的版本:

  1. 对于除第一个之外的每个样本 x[i],将元组 (|x[i]-x[i-1]|, i) 插入到最大优先级队列中。
  2. 从优先级队列中弹出最高值。假设索引是 j。
  3. 从优先级队列中删除元组 (|x[j+1]-x[j]|, j+1),因为距离很快就会改变。
  4. 将 x[j-1] 复制到 x[j],用第 j-1 个样本的值覆盖第 j 个样本。
  5. 将元组 (|x[j+1]-x[j]|, j+1)(即样本 j+1 的新距离)插入优先级队列。
  6. 从 2 开始重复,直到修改的不同样本的数量等于 k。
© www.soinside.com 2019 - 2024. All rights reserved.