- 机器学习
- 人工智能
【免费下载链接】nupic-legacy
Numenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.
NuPIC(Numenta Platform for Intelligent Computing)是层级时序记忆(Hierarchical Temporal Memory, HTM)理论的开源实现,本仓库(nupic-legacy)保留了该平台在 0.0.38 至 1.0.5 版本间的完整演进轨迹。本文以仓库根目录的 CHANGELOG.md 为骨架,结合 src/nupic 下的源码、tests 下的测试用例与 ci 下的 CI 配置,系统梳理这一演进过程中的七条核心技术主线:Cap'n Proto 序列化体系、SDR 分类器、Spatial Pooler 与 Temporal Memory 算法、异常检测、编码器家族、API 命名规范化以及工程构建与发布。读完本文,你将能对照 CHANGELOG 条目精准定位仓库内对应的实现文件与测试,理解每个版本节点背后真实的技术决策。
版本地图:一条从算法验证到工程化的演进主线
CHANGELOG 覆盖了从 0.0.38 到 1.0.5 的完整版本区间,而仓库当前 VERSION 文件标注为1.0.6.dev0,说明 CHANGELOG 记录的是开发主线已完成的历史节点。整体演进可以概括为三个阶段:
- 0.0.x~0.1.x(2014-2015):算法原型期,专注于 SWIG 绑定、构建脚本、数据生成器与早期序列化实验,例如 0.0.38 的 SWIG 优化与 wheel 打包、0.1.0 的 README/CHANGELOG 清理、0.1.3 的 capnp 库链接。
- 0.2.x~0.4.x(2015-2016):capnp 序列化大规模铺开、SDR 分类器引入、编码器逐个获得 capnp 实现、命名空间化与 OPF 框架逐步成型。
- 0.5.x~1.0.x(2016-2017):算法收敛与 API 规范化(snake_case 重构、CLAModel 更名 HTMPredictionModel)、SDR 分类器成为默认分类器、异常检测体系完善、1.0.0 完成序列化收官并正式进入 1.0 时代。
主线一:Cap'n Proto 序列化体系的建立与收官(0.2.x → 1.0.0)
序列化是 1.0.0 之前最庞大的工程主线。CHANGELOG 中几乎每个版本都围绕.capnpschema 文件与write/read方法展开:
- 0.2.0实现了 Python 空间池化器的 capnp 序列化,并临时把
.capnp文件放入源码树以配合构建。 - 0.2.2为 Python
Connections、MultiEncoder、SparsePassThroughEncoder、PassThroughEncoder、LogEncoder、GeospatialCoordinateEncoder、DeltaEncoder、CoordinateEncoder、AdaptiveScalarEncoder、SDRCategoryEncoder、CategoryEncoder、DateEncoder、RDSE、ScalarEncoder逐个补齐 capnp 实现(其中 RDSE 还顺带修复了 encoder 基类的 bug)。 - 0.2.6~0.2.7为
Anomaly、MovingAverage、AnomalyLikelihood、TemporalMemory、Connections增加序列化与等值测试,并把__cmp__迁移为__eq__。 - 1.0.0是序列化的收官版本:为
KNNClassifier、KNNClassifierRegion、KNNAnomalyClassifierRegion、SDRClassifierDiff、PreviousValueModel、TwoGramModel、BacktrackingTM、TMRegion、SPRegion、MovingAverage等补齐 capnp 序列化;统一了 OPF 层的ModelProto(HTMPredictionModelProto),并修复了HTMPredictionModel.write不序列化predictedField与inferenceEnabled的缺陷(NUP-2463)。
仓库中 src/nupic/serializable.py 定义了这套体系的基类契约:所有可序列化类必须实现抽象方法getSchema()、read(proto)、write(proto),并继承两个具体方法readFromFile(f, packed=True)与writeToFile(f, packed=True)。readFromFile先通过cls.getSchema()取得 capnp schema,再调用schema.read_packed(f)或schema.read(f)读取消息,最后交给cls.read(proto)还原对象;writeToFile则反向用schema.new_message()构造消息、self.write(proto)填充字段、proto.write_packed(f)写出。仓库里每个.capnp文件(如 spatial_pooler.capnp、sdr_classifier.capnp、temporal_memory_shim.capnp)正是这些类的 schema 定义。
以 SpatialPooler 为例(L1747-L1869):write()会依次写入random、numInputs、numColumns、columnDimensions、inputDimensions、potentialRadius、potentialPct、inhibitionRadius、globalInhibition、numActiveColumnsPerInhArea、localAreaDensity、stimulusThreshold、synPermInactiveDec、synPermActiveInc、synPermBelowStimulusInc、synPermConnected、minPctOverlapDutyCycles、dutyCyclePeriod、boostStrength、wrapAround、spVerbosity、synPermMin、synPermMax、synPermTrimThreshold、updatePeriod、version、iterationNum、iterationLearnNum,以及potentialPools、permanences、tieBreaker、overlapDutyCycles、activeDutyCycles、minOverlapDutyCycles、boostFactors等全部内部状态;read()则反向还原,并在还原时对浮点参数字段执行round(..., EPSILON_ROUND)以兼容不同精度的写入端。CHANGELOG 中 0.6.0 的 "Speed up SpatialPooler read method" 与 "Disable backward compatibility serialization test"、1.0.0 的 "Complete new serialization in SpatialPooler" 均可在此文件的演进中对应。
值得注意的兼容性细节:pycapnp 是可选依赖。CHANGELOG 多次出现 "Put capnp conditionals for Windows"、"Skip test when capnp is not available" 等条目,仓库代码也遵循这一模式,例如 sdr_classifier.py 在import capnp失败时置capnp = None,仅在可用时才导入SdrClassifierProto;CHANGELOG 1.0.5 还记录了将 pycapnp 升级到 0.6.3(NUP-2519)。
主线二:分类器演进——从 CLAClassifier 到 SDRClassifier
CHANGELOG 清晰地记录了分类器体系的两次换代:
- CLAClassifier 时代(0.2.x~0.4.x):0.2.12 为
FastCLAClassifier增加infer方法并统一numCategories为maxCategoryCount;0.4.0 为CLAClassifierRegion添加 capnp 序列化。 - SDRClassifier 时代(0.5.1 起):0.5.1 "Implement SDR classifier in NuPIC" 正式引入 SDR 分类器,并配齐 3 个多步预测测试;0.5.3 新增
SDRClassifierRegion及其 capnp proto、sdr_classifier_factory.py工厂,并在 nupic-default.xml 中为 SDR 分类器实现设置默认值;0.5.4 补上端到端集成测试;0.5.5 全面更新 hotgym 与异常检测示例、调整学习率;0.7.0 移除CLAClassifier(#3665)并支持"每条记录的多分类输出";0.8.0 的sdr_classifier_diff.py获得独立 capnp 序列化(NUP-2341)。
仓库中 SDRClassifier 的实现印证了 CHANGELOG 的 1.0.5 "Fix softmax overflow" 修复:其inferSingleStep方法(L365-L380)先对outputActivation减去numpy.max(outputActivation)再做numpy.exp,即数值稳定的 softmax 规范化,避免大输入下exp溢出——这正是 1.0.5 那条修复的实际代码位置。compute方法返回一个以steps为键的字典,每个键对应一个预测分布;学习阶段通过alpha调整权重矩阵,actValueAlpha用于跟踪桶内实际值,verbosity控制日志级别。0.5.5 记录的patternNZHistory越界修复(NUP-2458)也能在该类的_patternNZHistory(deque(maxlen=max(steps)+1))设计中找到依据。
配套的 sdr_classifier_factory.py 负责按配置选择 Python/C++ 实现,sdr_classifier_region.py 将分类器包装为 Network API 可用的 Region;CHANGELOG 0.7.0 的 "Allow SensorRegion to pass actValue and bucketIdx to SDRClassifierRegion"(NUP-2396)即是对这条数据链路的增强。
主线三:Spatial Pooler 与 Temporal Memory 的算法收敛
空间池化器(SP)的演进重点在 boosting 规则与 API 收敛:
- 0.5.4为
SpatialPooler增加overlaps、boostedOverlaps成员与访问器,补上单元测试。 - 0.6.0是一轮 SP 大改:
maxBoost更名boostStrength,minPctActiveDutyCycle参数被移除,overlap 不再做平局改写,引入局部/全局两种 boosting 因子更新,并逐步消除 Python 与 C++ SP 之间的浮点差异。 - 0.2.4/0.2.2则完成了"移除
FlatSpatialPooler/FDRCSpatial2、统一为SpatialPooler"的替换。
这些在源码中均有对应:getOverlaps()/getBoostedOverlaps()(spatial_pooler.pyL863-L870)正是 0.5.4 引入的访问器;1.0.0 修复的 "SP parameter validation test checking array dimensions"(Issue #1380)对应其构造参数校验逻辑。CHANGELOG 0.6.0 记录的 "update sp_overlap_test to use global inhibition" 与 sp_overlap_test.py 直接呼应。
时序记忆(TM)侧的演进更偏内部数据结构与命名:
- 0.2.x 时代:实现"孤儿突触衰减"(orphan synapse decay)、把
unionMode更名computePredictedActiveCellIndices、TemporalMemory获得完整序列化与getCellIndex修复。 - 0.4.0为
temporal_memory.py添加访问器方法,统一TMShim/FastTemporalMemory的接口。 - 0.5.6是 TM 的重构关键:
SegmentOverlap改为存储numActivePotentialSynapses,引入"learn on predicted segments"行为,compute拆分为activateCells与activateDendrites,删除"destroyed"段/突触概念,静态方法改为类方法以支持子类化。 - 0.6.0的
predictedColumns→predictedActiveColumns更名、0.7.0的tmParams/tmEnable取代tpParams/tpEnable、BacktrackingTM公共 API 清理,以及tm_py_fastshim 与FastTemporalMemory的移除,标志着旧TP*命名体系的终结(NUP-2397)。
仓库现状印证了这些收敛:TemporalMemory(temporal_memory.py)与BacktrackingTM(backtracking_tm.py)、Connections(connections.py)均为Serializable子类;temporal_memory_test.py、tm_segment_learning.py、tm_high_order.py 分别对应 CHANGELOG 中"segment 学习行为""高阶序列示例"等条目。
主线四:异常检测体系的成型(0.2.x → 0.7.0)
异常检测是 NuPIC 最具代表性的应用能力,其演进在 CHANGELOG 中脉络分明:
- 0.2.6引入
Anomaly、AnomalyLikelihood、MovingAverage的等值比较与序列化测试。 - 0.2.12将
AnomalyLikelihood._historicalScores从"无限累积"改为用户可配置的滑动窗口(historicWindowSize),大幅提升性能,并新增forceModelRefresh()方法;同时为 NegLL 指标补齐多步预测与误差测试。 - 0.5.0"Disable flatline hack in anomaly likelihood"。
- 0.5.5将原始异常分计算迁回 anomaly.py,由
KNNAnomalyClassifier计算原始异常分,新增AnomalyLikelihoodRegion。 - 0.7.0修正 anomaly likelihood 文档,并补全异常检测指南(#3521,见 docs/guides/anomaly-detection.md)。
- 0.8.0的
anomaly_likelihood_region命名更正(1.0.3)与 1.0.5 的回归修复使该模块最终稳定。
源码层面,anomaly.py 的computeRawAnomalyScore(activeColumns, prevPredictedColumns)计算"未被预测的活跃列占比"作为原始异常分;Anomaly类提供三种模式:MODE_PURE(纯原始分)、MODE_LIKELIHOOD(用AnomalyLikelihood建模概率)、MODE_WEIGHTED(异常分 × 似然),并支持slidingWindowSize滑动平均与binaryAnomalyThreshold二值化。这些正是 hotgym 异常检测示例(examples/opf/clients/hotgym/anomaly/hotgym_anomaly.py)与纽约出租车示例(examples/opf/clients/nyctaxi/nyctaxi_anomaly.py,0.5.6 引入)背后的算法支撑。
主线五:编码器家族与数据模块
编码器在 0.2.2 完成了一轮大规模 capnp 化(见主线一),此后的演进集中在参数与行为修正:
- 0.2.4修复日期编码器 bug;0.2.6修正 coordinate encoder 重叠测试语义(允许持平,不要求严格递减)。
- 0.5.1通过参数获取 encoder 输出宽度、为自定义 region 示例修复 bug。
- 0.5.2修复
GeospatialCoordinateEncoder(GCE)在海拔缺失时返回错误数量标量的问题;0.0.38 曾记录 GCE 改用 3D 坐标系编码海拔。 - 1.0.0修复 record sensor 阻止
CoordinateEncoder使用的问题(0.1.3 曾修复 coordinate encoder 与DateEncoder联用的ValueError)。 - 1.0.4为日期编码器新增
holidays参数(#3822),允许指定固定日期每年的节假日。
date.py 的构造函数签名(L90)印证了 1.0.4 的改动:holidays为"每年固定日期发生的节假日"元组列表,缺省时默认[(12, 25)](圣诞节)。其余编码器(scalar、category、coordinate、delta、logarithm、multi、pass_through、random_distributed_scalar、sdr_category、sparse_pass_through)在 src/nupic/encoders 下均有实现与配套.capnp文件,对应测试集中在 tests/unit/nupic/encoders。
数据侧,0.2.1 将数据生成器(pattern/sequence machine、anomalyzer)迁入nupic.data.generators模块并改用 pkg_resources 定位数据文件;0.2.7 将记录编码功能从RecordStreamIface拆分为ModelRecordEncoder;0.3.4 将cluster_params.py从 htmengine 并入 OPF common_models。这些在 src/nupic/data、src/nupic/datafiles 中均可查证。
主线六:API 规范化与命名重构(0.5.x → 0.7.0)
0.7.0 是破坏性变更集中的版本(CHANGELOG 明确给出 breaking changes 警告),核心是模块名的 snake_case 规范化,分 7 批完成:nupic.encoders(part 4)、nupic.support(part 5)、swarming 与 region 代码(part 6)、region 文件名(part 7)。同期还完成了:
CLAModel→HTMPredictionModel(#3516)、predictedField从构造函数移除(NUP-2420)。nupic.research撤销、内容迁入nupic.algorithms;nupic.bindings目录删除,C++ 内核依赖统一交由 nupic.core/nupic.bindings 发行版提供。- OPF 系列模块重命名:
opf_helpers→helpers、tm_shim.py→backtracking_tm_shim.py。 - 删除未使用的
nupic.support.features*、nupic.support.exceptions、PredictionElement、SVMClassifierNode(1.0.0)等。
这一轮重构让仓库目录结构最终定型为今天 src/nupic 下的布局:algorithms/、data/、encoders/、frameworks/opf/、regions/、support/、swarming/。同时 0.7.0 起文档建设明显提速:docs/guides/下的 anomaly-detection.md、network.md、opf.md、serialization.md,以及 docs/source/api 下覆盖nupic.algorithms、nupic.encoders、nupic.frameworks.opf、nupic.regions等模块的 RST API 文档,大多是 0.7.0~1.0.0 期间补齐的。
主线七:构建、发布与 CI/CD 工程化
CHANGELOG 中的工程类条目与仓库的构建/CI 配置一一对应:
- 依赖与绑定:0.3.x~0.4.x 将
nupic.bindings从 S3 手工安装逐步迁移到 PyPI 发行版(0.5.5/0.5.6/0.5.7);1.0.5 升级nupic.core版本与 pycapnp 0.6.3;0.5.5 指定 pip/setuptools/wheel 版本并引入平台条件依赖pycapnp==0.5.8(PEP-508)。 - 打包:0.0.38 建立 wheel 打包与 S3 发布;0.1.1 从 CMake 切换到 distutils extensions;0.1.2 为 OSX 设置
ARCHFLAGS;0.2.7 拆分 wheel 构建命令;1.0.5 移除已被废弃的pip install --use-wheel。 - CI 矩阵:0.5.6/0.5.7 更新 Bamboo(Linux)、Travis(OS X)、AppVeyor(Windows)构建配置——对应 ci/bamboo、ci/travis、ci/appveyor 下的脚本;0.6.0 支持按 SHA 命名发布 S3 制品。
- 容器:0.3.1/0.3.4 完善 Dockerfile 以支持 swarming,根目录 Dockerfile 与 coreos-vagrant 即其产物;0.2.1 简化为一根目录单 Dockerfile。
- 发布文档:0.5.6 新增 RELEASE.md 记录 NuPIC 发布流程;0.1.0 完成 README/CHANGELOG 清理,0.7.0 的 NUP-2429 为生成文件添加
.gitignore防误提交。
1.0.5 与 1.0.6.dev0:最新节点解读
1.0.5 是 CHANGELOG 中最新的正式版本,共 5 条变更:升级 nupic.core 版本(NUP-2519)、pycapnp 升级至 0.6.3(NUP-2519)、从自定义 region 示例移除过时的 region 初始化参数(NUP-2518)、移除已废弃的pip install --use-wheel、修复 softmax 溢出。其中 softmax 修复位于 sdr_classifier.py 的inferSingleStep数值稳定实现,而自定义 region 示例即 examples/network/custom_region/identity_region.py 与 custom_region_demo.py。当前仓库 VERSION 为1.0.6.dev0,处于 1.0.5 之后的开发阶段。
查阅与验证:如何按 CHANGELOG 定位代码
对开发者而言,CHANGELOG 是导航仓库的索引。验证任何一条目的通用路径是:
- 在 CHANGELOG 中找到版本号与条目,例如"1.0.4: Added holidays parameter to date encoder"。
- 到 src/nupic/encoders/date.py 确认
holidays参数及其默认值[(12, 25)]。 - 到 tests/unit/nupic/encoders/date_test.py 查看对应的单测覆盖。
同理,"capnp 序列化"类条目以 src/nupic/serializable.py 为契约基类、"算法重构"类条目以 src/nupic/algorithms 下同名实现文件为落点、"示例更新"类条目以 examples 目录为落点、"构建发布"类条目以 setup.py、RELEASE.md、ci 为落点。测试框架方面,仓库根目录的 scripts/run_nupic_tests.py 与 setup.cfg 定义了 pytest 入口与配置,可用于本地复现 CHANGELOG 中提到的各测试(如temporal_memory_test.py、sp_overlap_test.py、hotgym_regression_test.py)。
结语
从 0.0.38 到 1.0.5,NuPIC(nupic-legacy)的 CHANGELOG 记录的不只是版本号,而是一整套 HTM 工程实践的完整样本:以 Cap'n Proto 为基准的序列化契约、以 SDR 为核心的分类/异常检测算法栈、以 snake_case 与HTMPredictionModel为终点的 API 收敛、以及与 nupic.core 拆分后的依赖管理。对于希望理解 HTM 实现细节、或需要参考 Python 数值算法库工程化路径的开发者,这份 CHANGELOG 连同仓库源码,是一份可以逐条对证的事实档案。
- 机器学习
- 人工智能
【免费下载链接】nupic-legacy
Numenta Platform for Intelligent Computing is an implementation of Hierarchical Temporal Memory (HTM), a theory of intelligence based strictly on the neuroscience of the neocortex.
相关推荐
NuPIC(nupic-legacy)发布流程详解:从版本号、CHANGELOG 到 PyPI 与 GitHub Release 的完整操作手册
NuPIC(nupic legacy)发布流程详解:从版本号、CHANGELOG 到 PyPI 与 GitHub Release 的完整操作手册 导读 本文以
机器学习人工智能Parcel 版本演进全解析:从 1.0 到 2.16 的核心架构与技术变迁
Parcel 版本演进全解析:从 1.0 到 2.16 的核心架构与技术变迁 本篇文章以仓库根目录下的 CHANGELOG.md https://link.gi
构建工具前端开发工具Rocket 框架版本演进全览:从 0.0.9 到 0.5.1 的核心技术变迁
Rocket 框架版本演进全览:从 0.0.9 到 0.5.1 的核心技术变迁 本篇技术指南以仓库根目录的 CHANGELOG.md https://link.
后端开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考