如何让htm-core支持多维输入以实现异常检测?
多维度输入下的HTM异常检测实现方案
先澄清一个误解
htm-core不是仅支持一维输入,它的核心组件(空间池化SP、时间记忆TM)可以处理任意长度的一维二进制编码向量——多维度数据只需要先编码再拼接成一维向量即可,不需要局限在单维度输入。
多维度异常检测的两种实现思路
思路1:单HTM层+多维度编码拼接(推荐)
这是最直接高效的方式,把所有维度的编码结果拼接成一个大的一维二进制向量,作为SP的输入,不需要多个独立HTM层。具体结合你的代码修改如下:
为每个额外维度添加编码器
给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)更新总编码宽度
把所有编码器的尺寸相加,得到拼接后的总输入长度:encodingWidth = dateEncoder.size + scalarEncoder.size + scalarEncoder2.size + scalarEncoder3.size保持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 )编码阶段拼接所有维度的二进制向量
处理每条记录时,分别编码各个维度,再拼接成一个完整的输入向量: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
相关产品推荐
相关产品推荐

