You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让htm-core支持多维输入以实现异常检测?

多维度输入下的HTM异常检测实现方案

先澄清一个误解

htm-core不是仅支持一维输入,它的核心组件(空间池化SP、时间记忆TM)可以处理任意长度的一维二进制编码向量——多维度数据只需要先编码再拼接成一维向量即可,不需要局限在单维度输入。

多维度异常检测的两种实现思路

思路1:单HTM层+多维度编码拼接(推荐)

这是最直接高效的方式,把所有维度的编码结果拼接成一个大的一维二进制向量,作为SP的输入,不需要多个独立HTM层。具体结合你的代码修改如下:

  1. 为每个额外维度添加编码器
    给records[2]、records[3]这类数值维度各自创建独立的RDSE编码器,参数根据对应维度的数据特征调整:

    # 为第二个数值维度创建编码器
    scalarEncoderParams2 = RDSE_Parameters()
    scalarEncoderParams2.size = parameters["enc"]["value2"]["size"]
    scalarEncoderParams2.sparsity = parameters["enc"]["value2"]["sparsity"]
    scalarEncoderParams2.resolution = parameters["enc"]["value2"]["resolution"]
    scalarEncoder2 = RDSE(scalarEncoderParams2)
    
    # 为第三个数值维度创建编码器(按需添加更多)
    scalarEncoderParams3 = RDSE_Parameters()
    scalarEncoderParams3.size = parameters["enc"]["value3"]["size"]
    scalarEncoderParams3.sparsity = parameters["enc"]["value3"]["sparsity"]
    scalarEncoderParams3.resolution = parameters["enc"]["value3"]["resolution"]
    scalarEncoder3 = RDSE(scalarEncoderParams3)
    
  2. 更新总编码宽度
    把所有编码器的尺寸相加,得到拼接后的总输入长度:

    encodingWidth = dateEncoder.size + scalarEncoder.size + scalarEncoder2.size + scalarEncoder3.size
    
  3. 保持SP的输入维度配置
    SP的inputDimensions依然设为一维,长度等于总编码宽度即可,其他参数无需大幅调整:

    sp = SpatialPooler(
        inputDimensions=(encodingWidth,),  # 仅更新数值,结构不变
        columnDimensions=(spParams["columnCount"],),
        potentialPct=spParams["potentialPct"],
        potentialRadius=encodingWidth,
        globalInhibition=True,
        localAreaDensity=spParams["localAreaDensity"],
        synPermInactiveDec=spParams["synPermInactiveDec"],
        synPermActiveInc=spParams["synPermActiveInc"],
        synPermConnected=spParams["synPermConnected"],
        boostStrength=spParams["boostStrength"],
        wrapAround=True
    )
    
  4. 编码阶段拼接所有维度的二进制向量
    处理每条记录时,分别编码各个维度,再拼接成一个完整的输入向量:

    for record in records:
        # 编码各维度
        date_bits = dateEncoder.encode(record[0])
        val1_bits = scalarEncoder.encode(record[1])
        val2_bits = scalarEncoder2.encode(record[2])
        val3_bits = scalarEncoder3.encode(record[3])
        # 拼接成总输入
        combined_bits = np.concatenate([date_bits, val1_bits, val2_bits, val3_bits])
        # 后续SP、TM、异常检测的逻辑和原来一致,用combined_bits作为输入即可
    

思路2:多独立HTM层+异常分数融合

如果需要单独监控每个维度的异常情况,再得到整体异常结果,可以为每个数值维度(搭配时间维度)单独创建一套HTM组件(SP+TM+AnomalyLikelihood),最后对各维度的异常概率进行融合(比如加权求和、取最大值)。

举个简单逻辑:

  • 为record[1]单独部署一套HTM,输出异常分数anomaly_score1
  • 为record[2]单独部署一套HTM,输出异常分数anomaly_score2
  • 整体异常分数 = (anomaly_score1 + anomaly_score2) / 2 (或其他自定义融合规则)

这种方式的缺点是计算成本更高,且无法捕捉维度间的关联关系,只适合需要单独分析各维度异常的场景。

关键注意事项

  • 每个维度的编码器参数(size、sparsity、resolution)要根据对应维度的数据范围、精度单独调整,避免某一维度的编码占据过多权重。
  • 空间池化层的columnCount可以适当增大,以适应更高维度的输入,保证SP能有效提取多维度联合特征。
  • 异常检测器(AnomalyLikelihood):单HTM层用一套即可;多HTM层则每个层对应一个独立的检测器,最后再融合结果。

内容的提问来源于stack exchange,提问作者Joy Bose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:55:57