ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NuPIC 异常检测算法 API 深度解析:从原始异常分数到异常似然概率

NuPIC 异常检测算法 API 深度解析:从原始异常分数到异常似然概率 机器学习人工智能【免费下载链接】nupic-legacyNumenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.项目地址https://gitcode.com/gh_mirrors/nu/nupic-legacy点击查看免费下载异常检测是 Numenta 平台智能计算NuPIC的核心应用之一它基于 HTM层次时序记忆中的空间池化器与时序记忆为每条输入记录输出一个 01 的可预测性度量。本文以 docs/source/api/algorithms/anomaly-detection.rst 所定义的 API 为主体结合 src/nupic/algorithms/anomaly.py、src/nupic/algorithms/anomaly_likelihood.py 的完整源码实现系统讲解「原始异常分数」与「异常似然概率」两级 API 的原理、参数、底层函数与网络 Region 集成方式。读完本文你将能够直接用Anomaly、AnomalyLikelihood及estimateAnomalyLikelihoods/updateAnomalyLikelihoods搭建一套可运行的在线异常检测流程并复现仓库中的 hotgym 端到端示例。以上三个公式摘自仓库的技术说明文档 docs/source/guides/anomaly-detection.md其含义是异常分数等于「没有被时序记忆正确预测到的活动列active column占比」。一个值为 1 的异常分数表示没有任何预测列在本步被激活完全异常的记录值为 0 表示所有预测列都被激活完全可预测的记录。一、模块概览两级 API 的设计定位API 参考文档 docs/source/api/algorithms/anomaly-detection.rst 将异常检测能力划分为两个模块恰好对应两级抽象模块核心成员职责nupic.algorithms.anomalyAnomaly类、computeRawAnomalyScore函数计算原始异常分数活动列中未被预测列的比例并支持多种后处理模式选择、滑动平均、二值化nupic.algorithms.anomaly_likelihoodAnomalyLikelihood类、estimateAnomalyLikelihoods、updateAnomalyLikelihoods把原始分数转化为异常似然概率估计历史异常分数分布计算P(score s)用于滤除噪声、识别真正的异常根据 docs/source/guides/anomaly-detection.md异常分数特性是叠加在核心空间池化器与时序记忆之上实现的不需要对 SP/TM 算法本身做任何改动。它利用时序记忆检测序列中的新颖点既能检测从未见过的全新输入模式也能检测「在陌生上下文中出现的老模式」。用户只需在模型配置中把推断类型指定为TemporalAnomaly模型即可在推断结果中上报异常分数详见第六节实战示例。二、原始异常分数computeRawAnomalyScore 与 Anomaly 工具类2.1 computeRawAnomalyScore一行的核心算法computeRawAnomalyScore是整个异常检测体系的最底层函数实现在 src/nupic/algorithms/anomaly.pydef computeRawAnomalyScore(activeColumns, prevPredictedColumns): Computes the raw anomaly score. The raw anomaly score is the fraction of active columns not predicted. :param activeColumns: array of active column indices :param prevPredictedColumns: array of columns indices predicted in prev step :returns: anomaly score 0..1 (float) nActiveColumns len(activeColumns) if nActiveColumns 0: # Test whether each element of a 1-D array is also present in a second # array. Sum to get the total # of columns that are active and were # predicted. score numpy.in1d(activeColumns, prevPredictedColumns).sum() # Get the percent of active columns that were NOT predicted, that is # our anomaly score. score (nActiveColumns - score) / float(nActiveColumns) else: # There are no active columns. score 0.0 return score其语义与边界行为非常明确输入activeColumns为当前时刻活动列的索引数组prevPredictedColumns为上一时刻被预测列的索引数组算法用numpy.in1d判断每个活动列是否命中预测列命中数除以活动列总数得到「预测命中比例」用 1 减去该比例即得「未被预测的活动列占比」返回值恒在[0, 1]区间。0 表示全部命中完全可预测1 表示无一命中完全异常边界当没有活动列时直接返回 0.0避免除零。src/nupic/regions/anomaly_region.py 中的AnomalyRegion.compute正是调用此函数它读取activeColumns与predictedColumns两个输入内部保存上一时刻的预测列prevPredictedColumns把计算结果写入rawAnomalyScore输出详见第五节。2.2 Anomaly 类三种计算模式与参数校验Anomaly是面向应用的封装工具类构造参数如下源码见 src/nupic/algorithms/anomaly.py参数类型默认值说明slidingWindowSizeintNone若设置≥0对最终异常分数做滑动窗口平均moving averagemodestringMODE_PURE计算模式仅支持下面三种常量binaryAnomalyThresholdfloatNone若设置在(0, 1)开区间分数按阈值离散化为 1/0变换在滑动平均之后应用三种模式常量定义在 src/nupic/algorithms/anomaly.pyMODE_PURE pure默认模式直接返回computeRawAnomalyScore的原始分数MODE_LIKELIHOOD likelihood使用AnomalyLikelihood类建模「得到当前值与当前异常分数」的概率输出1 - probability低似然即高异常MODE_WEIGHTED weighted用原始异常分数乘以似然结果即anomaly * (1 - probability)保留幅度信息。构造时的参数校验有两处模式不在_supportedModes中会抛出ValueErrorbinaryAnomalyThreshold非None时必须是(0, 1)开区间的 float否则同样抛ValueError。2.3 compute()一次完整的异常分数计算Anomaly.compute的调用签名与内部流程src/nupic/algorithms/anomaly.pydef compute(self, activeColumns, predictedColumns, inputValueNone, timestampNone):activeColumns当前活动列索引数组predictedColumns本步预测的列索引数组用于下一步 T1 的异常计算inputValue当前输入值如类别编码器的cat、温度值21.2仅在 likelihood/weighted 模式使用timestamp样本发生的时间戳仅在 likelihood/weighted 模式使用。内部执行顺序为① 先算原始分数 → ② 按模式计算MODE_LIKELIHOOD若未传inputValue会直接抛ValueError→ ③ 若设置了slidingWindowSize则做滑动平均 → ④ 若设置了binaryAnomalyThreshold则按score threshold二值化为 1.0/0.0。其中移动平均由 src/nupic/utils.py 中的MovingAverage完成。使用示例from nupic.algorithms.anomaly import Anomaly # 纯原始分数模式 detector Anomaly() # 概率模式需要输入值与时间戳 detector Anomaly(modeAnomaly.MODE_LIKELIHOOD, slidingWindowSize10, binaryAnomalyThreshold0.9) score detector.compute(activeColumns, predictedColumns, inputValueconsumption, timestampnow)Anomaly还实现了__str__打印 mode 与 windowSize、__eq__按 mode、阈值、滑动平均、似然估计器判等以及__setstate__反序列化时为缺失字段补默认值支持 pickle 序列化。这些行为在单元测试tests/unit/nupic/algorithms/anomaly_test.py中均有覆盖。三、异常似然AnomalyLikelihood 类与概率建模3.1 为什么要引入似然概率原始异常分数是逐点噪声较大的信号偶尔的高分可能来自模型尚未收敛或正常波动。anomaly_likelihood模块src/nupic/algorithms/anomaly_likelihood.py的定位是对给定模型的历史异常分数分布建模输入一个新分数s输出P(score s)即当前可预测性的似然程度。模块文档给出了非常直观的解读似然 0.011%意味着约每 100 条记录出现一次这样的可预测性对每分钟一条的记录流约等于每 1 小时 40 分钟一次。似然 0.00010.01%意味着每 10,000 条记录出现一次约等于每 7 天一次。把概率化的度量作为告警依据能显著降低误报率。3.2 AnomalyLikelihood 构造参数详解AnomalyLikelihood类的构造参数src/nupic/algorithms/anomaly_likelihood.py参数类型默认值说明claLearningPeriodintNone已废弃的旧名称传入时会打印弃用提示并覆盖learningPeriodlearningPeriodint288算法学习数据基本模式、异常分数「稳定下来」所需的迭代数默认值基于经验观察复杂场景可能需要调大但过大会让真实异常被忽略estimationSamplesint100初始估计高斯分布所需的合理异常分数样本数100 条通常足够且高斯每reestimationPeriod默认 100次迭代会重新估计historicWindowSizeint8640为周期性重估高斯而维护的历史数据点滑动窗口大小8640 对应 5 分钟间隔下约一个月的历史reestimationPeriodint100重估高斯分布的频率理想是每次迭代都重估但这是性能开销实际对该值不敏感只要它相对总记录数足够小即可构造时有一个硬性校验若historicWindowSize estimationSamples则抛ValueError(estimationSamples exceeds historicWindowSize)。类内部维护_iteration、_historicalScorescollections.deque容量为historicWindowSize与_distribution并定义_probationaryPeriod learningPeriod estimationSamples——在试运行期内probationary period异常似然被固定上报为 0.5。3.3 anomalyProbability()逐点在线计算流程anomalyProbability(value, anomalyScore, timestampNone)src/nupic/algorithms/anomaly_likelihood.py是类的主入口返回「该记录是异常」的概率越接近 1 越可能是异常。其流程为timestamp缺省时使用内部迭代计数_iteration组成三元组(timestamp, value, anomalyScore)若_iteration _probationaryPeriod直接返回0.5跳过试运行期数据否则当分布尚不存在或_iteration % _reestimationPeriod 0时调用批处理函数estimateAnomalyLikelihoods基于_historicalScores重估分布skipRecords由静态方法_calcSkipRecords计算考虑窗口溢出与学习期的取舍再用在线函数updateAnomalyLikelihoods计算当前点似然likelihood 1.0 - likelihoods[0]退出前把该数据点追加进历史滑动窗口并递增_iteration。类还提供静态方法computeLogLikelihood(likelihood)src/nupic/algorithms/anomaly_likelihood.py由于似然经常低到「四个 9」「五个 9」用对数尺度便于可视化与阈值化公式为math.log(1.0000000001 - likelihood) / -23.02585084720009。3.4 序列化支持AnomalyLikelihood继承Serializable通过 Capn Proto 实现读写getSchema()返回AnomalyLikelihoodProtoschema 定义见 src/nupic/algorithms/anomaly_likelihood.capnpread(proto)/write(proto)负责把迭代计数、历史分数、分布参数name/mean/variance/stdev、移动平均状态与历史似然序列化。这意味着在检查点checkpoint与长期运行场景下估计器的状态可以被完整保存和恢复。四、底层函数批处理与在线更新模块同时提供两个可直接调用的底层函数对应两种使用节奏源码中的 USAGE 文档块给出了完整调用范式。4.1 estimateAnomalyLikelihoods批处理初始化/重估签名src/nupic/algorithms/anomaly_likelihood.pydef estimateAnomalyLikelihoods(anomalyScores, averagingWindow10, skipRecords0, verbosity0):anomalyScores记录列表每条为[timestamp, value, score]三元组例如[datetime.datetime(2013, 8, 10, 23, 0), 6.0, 1.0]最佳效果建议提供 100010000 条记录averagingWindow滑动平均窗口大小默认 10skipRecords估计分布时跳过的记录数若skipRecords len(anomalyScores)返回一个非常宽泛的分布nullDistribution使所有分数都显得「很可能」verbosity调试打印级别0 无1 少量信息2 每条记录都打印。返回值是一个三元组likelihoods每个聚合点的似然 numpy 数组、avgRecordList聚合后的记录列表、params包含估计器状态的小型 JSON 字典。空输入会抛ValueError(Must have at least one anomalyScore)。批处理内部还会做两个工程化处理源码内注释为 HACK ALERT一是显式检测完全平坦的数值型指标——当指标值分布方差 1.5e-5时返回nullDistribution把恒定指标报告为「非异常」规避 HTM 模型对恒定指标处理不稳的历史问题二是对似然做滤波见 4.4。典型调用likelihoods, avgRecordList, estimatorParams \ estimateAnomalyLikelihoods(metric_data)4.2 updateAnomalyLikelihoods在线逐点更新签名src/nupic/algorithms/anomaly_likelihood.pydef updateAnomalyLikelihoods(anomalyScores, params, verbosity0):anomalyScores同上格式的待处理记录列表params由estimateAnomalyLikelihoods返回的估计器状态字典会先经isValidEstimatorParams校验非法即抛ValueError返回三元组(likelihoods, aggRecordList, newParams)其中newParams必须回传给下一次调用。在线更新的核心逻辑是复用params中的移动平均历史与分布用MovingAverage.compute推进滑动窗口对每个新点计算tailProbability为保证「只保留尖锐的似然跃升」会把历史似然与新似然拼接后统一滤波见 4.4。源码还包含一个向后兼容处理旧版params若无historicalLikelihoods键则补为[1.0]。连续使用示例务必使用每次返回的新estimatorParams# 第一次批量初始化 likelihoods, avgRecordList, estimatorParams \ estimateAnomalyLikelihoods(metric_data) # 之后每条新数据在线更新 likelihoods, avgRecordList, estimatorParams \ updateAnomalyLikelihoods(data2, estimatorParams) likelihoods, avgRecordList, estimatorParams \ updateAnomalyLikelihoods(data3, estimatorParams) # 每隔一段时间用大量近期数据重新批量估计 likelihoods, avgRecordList, estimatorParams \ estimateAnomalyLikelihoods(lots_of_metric_data)4.3 estimatorParams 的结构两个函数返回/接收的params字典结构如下调用方通常无需关心细节但理解它有助于调试与持久化{ distribution: { # 描述异常分数分布 name: STRING, # 分布名称如 normal mean: SCALAR, # 分布均值 variance: SCALAR, # 分布方差 # 还可能有分布特有的其他键如 stdev }, historicalLikelihoods: [] # 最近 windowSize 个似然值 movingAverage: # 异常分数滚动平均所需状态 { windowSize: SCALAR, # 平均窗口大小 historicalValues: [], # 最近 windowSize 个异常分数 total: SCALAR, # historicalValues 中数值的总和 }, }合法性检查函数isValidEstimatorParams(p)src/nupic/algorithms/anomaly_likelihood.py要求p为字典、包含distribution与movingAverage键且distribution中同时具备mean、name、variance、stdev四个键。4.4 内部辅助机制estimateNormal基于 numpy 对样本估计正态分布参数含两个下限保护——均值 0.03时钳位到 0.03、方差 0.0003时钳位到 0.0003防止极低均值/方差导致微小波动被放大成红色告警并计算stdev sqrt(variance)nullDistribution返回{name: normal, mean: 0.5, variance: 1e6, stdev: 1e3}即一个极宽泛的分布使[0, 1]内所有分数都相当可能从而不产生异常告警tailProbabilityQ 函数正态分布尾部概率。若x mean则利用对称性翻转后递归计算实现用互补误差函数0.5 * math.erfc(z / 1.4142)_filterLikelihoods似然滤波。redThreshold0.99999、yellowThreshold0.999分别对应告警红区/黄区边界逻辑是只保留似然的尖锐上升——第一个值原样保留后续值若进入红区且前值不在红区则保留原值否则压到黄区阈值从而把持续高似然收敛为平稳的「黄区」而非反复触发。五、网络 Region 集成AnomalyRegion 与 AnomalyLikelihoodRegion除直接调用算法类外NuPIC 网络框架还提供两个开箱即用的 Region可在 YAML 网络描述中把异常检测拼进整个网络。5.1 AnomalyRegion计算原始异常分数定义在 src/nupic/regions/anomaly_region.pygetSpec()描述其接口输入activeColumns当前活动列Real32、predictedColumns当前预测列Real32两者均为必需输入输出rawAnomalyScoreReal32count1默认输出标记singleNodeOnly: Truecompute内部取输入的非零索引调用computeRawAnomalyScore(activeColumns, prevPredictedColumns)并把当前predictedColumns的非零索引保存为下一时刻的prevPredictedColumns。5.2 AnomalyLikelihoodRegion计算异常似然定义在 src/nupic/regions/anomaly_likelihood_region.pygetSpec()描述其接口输入rawAnomalyScore待计算似然的异常分数、metricValue输入指标值均为必需输出anomalyLikelihoodReal32count1默认输出可读写参数UInt32与AnomalyLikelihood构造参数一一对应参数默认值learningPeriod288estimationSamples100historicWindowSize8640reestimationPeriod100其compute内部即调用self.anomalyLikelihood.anomalyProbability(value, anomalyScore)并把结果写入anomalyLikelihood输出。Region 的序列化直接委托给内部的AnomalyLikelihood实例。这两个 Region 可以与 SP、TM Region 级联activeColumns/predictedColumns来自 TM 的输出rawAnomalyScore作为AnomalyLikelihoodRegion的输入最终输出可直接接仪表盘或告警逻辑。六、端到端实战hotgym 异常检测示例仓库自带的 examples/opf/clients/hotgym/anomaly/hotgym_anomaly.py 是官方文档 docs/source/guides/anomaly-detection.md 推荐的入门起点展示了完整的 OPF 异常检测客户端写法def createModel(): return ModelFactory.create(model_params.MODEL_PARAMS) def runHotgymAnomaly(): model createModel() model.enableInference({predictedField: consumption}) with open (_INPUT_DATA_FILE) as fin: reader csv.reader(fin) csvWriter csv.writer(open(_OUTPUT_PATH,wb)) csvWriter.writerow([timestamp, consumption, anomaly_score]) ... for i, record in enumerate(reader, start1): modelInput dict(zip(headers, record)) modelInput[consumption] float(modelInput[consumption]) modelInput[timestamp] datetime.datetime.strptime( modelInput[timestamp], %m/%d/%y %H:%M) result model.run(modelInput) anomalyScore result.inferences[anomalyScore] csvWriter.writerow([modelInput[timestamp], modelInput[consumption], anomalyScore]) if anomalyScore _ANOMALY_THRESHOLD: _LOGGER.info(Anomaly detected at [%s]. Anomaly score: %f., result.rawInput[timestamp], anomalyScore)关键点数据源为 NuPIC 内置的nupic.datafiles包中的extra/hotgym/rec-center-hourly.csv健身房每小时能耗数据model.enableInference({predictedField: consumption})启用对consumption字段的推断每条记录经model.run(modelInput)后从result.inferences[anomalyScore]取出异常分数写入anomaly_scores.csv_ANOMALY_THRESHOLD 0.9分数超过 0.9 的记录被判定为异常并在日志中输出时间与分数。模型参数文件 examples/opf/clients/hotgym/anomaly/model_params.py 中的核心配置modelParams: { # The type of inference that this model will perform inferenceType: TemporalAnomaly, ... anomalyParams: { uanomalyCacheRecords: None, ... }, }inferenceType: TemporalAnomaly是让模型上报异常分数的开关TemporalAnomaly 模型即第六节所述的时序异常模型。同一配置文件还定义了按小时聚合的aggregationInfo、DateEncodertimestamp_timeOfDay参数timeOfDay: (21, 9.5)与ScalarEncoderconsumptionminval: 0.0、maxval: 100.0、n: 50、w: 21展示了异常检测与编码器配置的完整组合方式。七、测试验证算法行为的可复现依据仓库单元测试完整覆盖了上述两级 API可作为行为契约参考tests/unit/nupic/algorithms/anomaly_test.py验证computeRawAnomalyScore的边界——空活动列/空预测列返回 0.0完全命中返回 0.0完全未命中返回 1.0部分命中返回2/3之类的精确比例。同时验证Anomaly类三种模式、slidingWindowSize3下的滑动平均累加分数序列、pickle 序列化往返一致性与__eq__判等逻辑tests/unit/nupic/algorithms/anomaly_likelihood_test.py覆盖_calcSkipRecords的窗口/学习期边界、estimateAnomalyLikelihoods与updateAnomalyLikelihoods的往返调用、isValidEstimatorParams校验、分布估计与似然滤波行为并给出 1440 条模拟分钟级数据的生成范式_generateSampleData。八、设计要点小结两级抽象各司其职anomaly模块回答「这条记录有多不可预测」原始分数anomaly_likelihood模块回答「这种程度的不可预测有多罕见」概率化似然两者可独立使用也可组合Anomaly.MODE_LIKELIHOOD/MODE_WEIGHTED即组合形态时序异常是核心仓库技术文档明确指出非时序异常检测基于空间池化器匹配分数的方案见 docs/source/guides/anomaly-detection.md 后半部分实验效果不佳且已被放弃——静态模式本身若新颖时序记忆必然预测不佳、时序异常分数自然偏高因此时序方案是超集历史细节保留原样关于「列置信度 vs 预测细胞」的差异非零置信度列一定是含预测细胞列的超集因为置信度用软匹配计数、预测状态用硬匹配计数文档记载了 2013 年前后曾试验基于预测细胞计算异常分数但因假阳性更多而维持现状——当前实现仍基于列置信度状态可持久化Anomaly支持 pickleAnomalyLikelihood支持 Capn Proto 序列化且 Region 层透传该序列化能力为长时运行与模型检查点恢复提供了保障。对想要进一步深入源码的读者建议按以下路径阅读先读 src/nupic/algorithms/anomaly.py 与 src/nupic/algorithms/anomaly_likelihood.py 的完整实现再对照 src/nupic/regions/anomaly_region.py 与 src/nupic/regions/anomaly_likelihood_region.py 看网络集成方式最后用 tests/unit/nupic/algorithms/anomaly_test.py 与 tests/unit/nupic/algorithms/anomaly_likelihood_test.py 验证理解并运行 examples/opf/clients/hotgym/anomaly/hotgym_anomaly.py 复现端到端流程。赞分享机器学习人工智能【免费下载链接】nupic-legacyNumenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.项目地址https://gitcode.com/gh_mirrors/nu/nupic-legacy点击查看免费下载相关推荐Respimage终极响应式图片Polyfill指南 - 如何快速提升网站图片加载性能Respimage终极响应式图片Polyfill指南 如何快速提升网站图片加载性能 respimage是一款快速、轻量级且功能强大的响应式图片Polyfill前端概率机器学习中的异常检测从统计方法到深度学习完整指南概率机器学习中的异常检测从统计方法到深度学习完整指南 异常检测是概率机器学习中至关重要的技术能够识别与正常模式显著不同的数据点。Kevin Murphy的《文档教程机器学习Magika 压缩包识别一条命令到全目录扫描Magika 压缩包识别一条命令到全目录扫描 当同事发来一个没扩展名的导出文件或者你要批量核对几百个压缩文件的类型时靠猜不现实 file 的输出又不够稳人工智能机器学习深度学习CLI上一篇如何用Santa在10分钟内构建企业级macOS应用白名单系统下一篇如何使用.htaccess提升网站性能与安全2023年完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表