如何设计给定允许偏差比例的多输入中间值求解及异常剔除算法
带允许偏差的动态输入场景多产品基准重量求解算法
场景核心需求
这套算法要解决的实际问题是:动态接收不同ID的产品称重值,没有提前攒齐所有测量数据的条件,给定固定允许偏差比例(比如10%),自动剔除混入的异规格异常称重值,最终输出稳定的产品合理基准重量,不会因为偶发的误放产品就把计算结果带偏。
核心算法流程
完全适配无先验的动态输入逻辑,每收到一个新的称重值立刻做处理,不需要等待批量数据到齐:
- 初始基准锚定:连续收集3个以上称重值,若组内任意两个值的相对偏差不超过允许偏差的20%,取这组值的中位数作为初始基准值M。选中位数的原因是初始阶段就算混入1个异常值,也不会把基准拉偏,比均值的抗干扰能力强很多。
- 单值异常判别:每收到新的(产品ID, 称重值)对,立刻计算该值与当前M的相对偏差,若绝对值超过预设的允许偏差比例,直接判定为异规格异常值,不纳入后续基准计算;若在允许范围内,则归入基准计算池。
- 基准动态更新:每当有新的合格值进入计算池,就对池内所有有效称重值重新取中位数作为新的基准值M,同步更新对应的合理重量范围(范围永远基于当前M计算,即
[M*(1-允许偏差比例), M*(1+允许偏差比例)])。 - 批量换批异常兜底:如果连续收到的输入中有超过1/3的值都超出当前的合理范围,说明大概率是换了整批的产品规格,这时候暂停旧基准的计算,等待连续收集到3个互差在允许偏差范围内的稳定值后,重新锚定新的基准,避免系统一直停留在旧规格的判断逻辑上。
边界场景适配规则
- 避免初始锚定被异常值干扰:如果连续收到的前3个值偏差超过允许范围,不强行设置基准,直到出现符合互差要求的稳定值组再启动锚定,防止把整组异常值当成产品基准。
- 控制计算池的容量上限:最多保留最近100个合格称重值参与中位数计算,既不会因为老的工艺漂移数据拉偏当前基准,也不会因为新值太少导致基准出现大幅波动。
- 取消固定偏差区间设计:不提前写死“200g对应180-220g”的硬编码范围,所有合理区间都随当前基准值动态计算,就算产品实际基准是205g,也能自动匹配对应的184.5g-225.5g的合理范围,不会出现合理值被误判为异常的问题。
实际计算示例(允许偏差设为10%)
按顺序收到以下称重值时的处理逻辑:
- 依次收到208g(ID14)、203g(ID27)、201g(ID32):三个值的最大互差为(208-201)/201≈3.4%,远低于20%的初始锚定阈值,取中位数203g作为初始基准M,对应合理范围为182.7g-223.3g。
- 收到504g(ID45):计算与M的偏差为(504-203)/203≈148%,远超10%的允许偏差,直接判定为异常值,不纳入计算池,M保持203g不变。
- 收到205g(ID51):与M的偏差为(205-203)/203≈1%,在允许范围内,纳入计算池;此时池内值为[208,203,201,205],重新计算中位数为(203+205)/2=204g,作为新的基准M,对应合理范围同步更新为183.6g-224.4g。
注:实际落地时不要硬套通用的3σ异常判别法:3σ的使用前提是提前采集到足够多的无干扰样本计算整体标准差,但本场景是动态接输入、还混有一定比例的异规格异常值,根本凑不出合格的无偏样本,硬套反而会频繁出现误判。
内容的提问来源于stack exchange,提问作者Popa Ovidiu-Razvan
相关产品推荐
相关产品推荐

