跳变马尔可夫系统下的多模型Vo-Vo滤波器

0 下载量 57 浏览量 更新于2024-08-26 收藏 336KB PDF 举报
"这篇研究论文探讨了一种基于跳变马尔可夫系统(Jump Markov System, JMS)的多模型Vo-Vo滤波器,用于跟踪高度动态的目标。Vo-Vo滤波器,也称为广义标记多伯努利(Generalized Labeled Multi-Bernoulli, GLMB)滤波器,提供了一个闭式解法,适用于高斯混合实现的多模型版本。在涉及大量目标随机出现和消失的复杂场景中,论文检验并比较了所提出方法的性能,结果表明该方法在跟踪精度上优于其他技术,并且对应用和滤波器参数的变化(如杂波率和模型转换概率)具有高度鲁棒性。" 文章首先介绍了贝叶斯滤波器在多目标跟踪问题中的普遍应用,如联合概率数据关联(JPDA)、多假设跟踪(MHT)、概率历史密度(PHD)、条件概率历史密度(CPHD)以及标记多伯努利滤波器等。这些滤波器虽然广泛使用,但在处理高度动态的目标时可能面临挑战。 论文的核心是提出了一种新的多模型Vo-Vo滤波器解决方案,它利用了JMS的概念来适应目标动态性的突然变化。Vo-Vo滤波器,特别是其GLMB形式,允许对每个目标进行独立的、带有标签的概率表示,从而能更精确地跟踪多个相互干扰的目标。通过引入JMS,滤波器可以更好地处理目标的出现和消失,以及动态特性的随机变化。 论文中,作者们推导出了多模型Vo-Vo滤波器的闭式解法,这对于高斯混合实现尤其重要,因为这种实现方式能够处理非高斯噪声和复杂的观测情况。此外,通过对比实验,论文展示了在具有挑战性的场景下,新方法相比于现有技术在跟踪准确性上的优势。实验涉及了多种目标动态变化的情况,包括目标的随机出现和消失,这模拟了实际环境中的复杂性。 在评估中,新方法表现出了对各种参数变化的鲁棒性,例如杂波率(clutter rate)和模型转换概率。杂波率是指在雷达或传感器观测到的虚假目标数量,而模型转换概率则反映了目标状态变化的不确定性。即使在这些参数大幅度变动的情况下,多模型Vo-Vo滤波器仍能保持稳定的跟踪性能。 这项工作为多目标跟踪提供了强大的工具,特别是在动态环境和高杂波环境下,其性能提升和鲁棒性使得该方法有潜力在实际的监控、安全和自动驾驶等应用场景中发挥重要作用。通过创新的多模型处理和闭式解法,论文提出的Vo-Vo滤波器为未来的研究和工程实践开辟了新的可能性。

优化这段代码:List<CompletableFuture<CallIntersectionVo>> futureList = Lists.newArrayList(); for (Map.Entry<String, List<String>> entry : intersectionResult.entrySet()) { CompletableFuture<CallIntersectionVo> future = CompletableFuture.supplyAsync(() -> { String account = entry.getKey(); List<String> personNoList = entry.getValue().stream().distinct().collect(Collectors.toList()); CallIntersectionVo vo = new CallIntersectionVo(); if (personNoList.size() >= 2) { List<PersonBasicVo> personVoList = Lists.newArrayList(); int count = 0; for (String personNo : personNoList) { Map<String, Object> callMap = callMapList.stream().filter(map -> personNo.equals(map.get("personNo"))).findAny().get(); List<CallRecord> callList = (List<CallRecord>) callMap.get("callList"); // 统计通话频率 count += callList.stream().filter(x -> account.equals(x.getRelationshipAccount())).count(); // 获取涉案人 personVoList.add(personList.stream().filter(person -> personNo.equals(person.getPersonNo())).findAny().get()); } // 共同号码是否属于涉案人 String commonPersonName = getCommonPersonName(personList, account); if (frequency != null && frequency > 0) { if (count >= frequency) { vo.setPersons(personVoList); vo.setCommonAccount(account); vo.setFrequency(count); vo.setCommonPersonName(commonPersonName); } return vo; } else { vo.setPersons(personVoList); vo.setCommonAccount(account); vo.setFrequency(count); vo.setCommonPersonName(commonPersonName); return vo; } } else { return vo; } }, executor); futureList.add(future); } voList.addAll(futureList.stream().map(CompletableFuture::join) .distinct().sorted(Comparator.comparing(vo -> vo.getPersons().size())) .collect(Collectors.toList()));

2023-07-13 上传