版本发布历史

版本 1.1.1

亮点

  • 修复了在GPU上使用分类分布的问题

版本 1.0.4

亮点

  • DenseHMM添加了功能完整的.viterbi实现

SparseHMM。遗憾的是,由于torch中缺乏高效的scatter_argmax实现,SparseHMM函数的运行速度比预期慢很多。希望这个问题能在未来得到解决。 - 修复了创建BayesianNetwork时未将max_itertol参数传递给底层FactorGraph的bug - 将BayesianNetwork.sample改为运行self.d+1次以覆盖可能出现的边界情况 - 修复了StudentT分布的.name属性 - 修复了没有固定结束概率的HMM采样问题 - 合并了@reachusama对贝叶斯网络的链接修复

版本 1.0.4

亮点

  • 修复了马尔可夫链和ConditionalCategorical分布的问题

  • 为ConditionalCategorical分布添加了更多文档

版本 1.0.3

亮点

  • 针对1.0.2版本的修复补丁进行了修正(感谢@savyajha)

  • 文档API修复(感谢@FBruzzesi)

  • GMM初始化根据权重设置先验(感谢@gerwang)

  • 修复了当covariance_type == 'sphere'时的正态分布问题(感谢 @gerwang)

  • 修复了将MaskedTensor传入分类分布时出现的问题

版本 1.0.2

亮点

  • 贝叶斯网络结构学习中的一个次要问题已通过补丁修复

@savyajha (感谢!) 之前当存在多条最短路径时,返回的结果会依赖于操作系统。现在,所有最短路径都会被找到并排序后再返回。

版本 1.0.0

亮点

  • 修复了一些小错误。

版本 1.0.0

亮点

  • 此版本标志着pomegranate发展历程中的一个重要里程碑。

  • Cython后端已被PyTorch后端取代。再见了,奇怪的安装问题和段错误。

  • API的改动导致无法向后兼容,因此主版本号进行了升级。这些变更修复了阻碍开发的问题,改善了用户体验,或修正了原有不良设计。

  • 该代码库由一套全面的超过800个单元测试守护,调用了数千次断言语句。

功能特性

  • 所有模型和方法均已添加GPU支持

  • 所有模型和方法均已添加混合/半精度支持(尽管效果似乎微乎其微甚至没有...)

  • 序列化现在由PyTorch处理,可实现更紧凑高效的I/O操作

  • 现在通过torch.masked.MaskedTensor对象支持缺失值

  • 现在所有相关模型和方法都支持先验概率,相比之前能够实现更全面/灵活的半监督学习

模型

  • 默认情况下,所有分布现在都是多元的,支持通过批量操作实现加速

  • 因子图现在作为一等公民得到支持

  • 隐马尔可夫模型已分为DenseHMM和SparseHMM两种模型,两者的区别在于转移矩阵的编码方式,其中DenseHMM对象的运行速度明显更快

  • NaiveBayes模型已被移除

  • MarkovNetworks 模型已暂时移除

  • 约束图功能已暂时移除

版本 0.14.8

亮点

  • 修复了BayesModels保存和加载的问题

版本 0.14.6

亮点

  • 为同时具有离散和连续分布的特征添加ICD支持。感谢@lmcinnes!

版本 0.14.6

亮点

  • 通过random_state参数为k-means初始化添加确定性

  • 通过将random_state参数传递给k-means算法,为HiddenMarkovModel.from_samples添加了确定性

  • 修复了HMM的JSON在调用fit后会被更新,但在调用from_summaries后不会更新的问题

  • 修复了在同时传入标签时,HMM状态的独立组件分布无法正确创建的问题

  • HiddenMarkovModel.from_samples中的分布初始化与未标记样本的提取或标注过程分离

  • 将NetworkX的最低要求版本更新至2.4或更高。

  • 强制GMM模型在from_summaries方法中遵守其frozen属性。

版本 0.14.0

亮点

  • 各种小错误修复和功能增强

  • 由于从TravisCI/appveyor迁移到GitHub Actions,安装过程应该会更简洁。

贝叶斯模型

  • 这些模型现在应该能够适配IndependentComponentDistributions。

版本 0.13.1

亮点

  • 各种小错误修复和速度优化

  • 贝叶斯网络现在支持使用吉布斯采样器或拒绝采样进行采样。感谢@pascal-schetelat

  • HMMs现在可以选择在每次迭代时禁用重新检查输入,这可以显著加快小型模型的训练速度。

概述

  • pomegranate 现在将使用 numpy.asarray 而非 numpy.array 以避免重复复制数组。

贝叶斯网络

  • 当传入约束条件并选择Chow-Liu算法时,现在会正确抛出错误。

  • 贝叶斯网络现在将内部使用32位浮点数而非64位浮点数,从而降低模型内存占用。感谢@alexhenrie

版本 0.13.0

亮点

  • 各种小错误修复和速度优化

  • 现在可以为每个模型传入键集来定义分布,即使该符号未出现在训练集中

  • from_sample 返回的结果使用类分布而非预定义的分布,从而支持分布的继承

  • 添加检查以确保输入数组为C顺序而非转置

分布

  • JSON数据类型会被检查是否为numpy类型,而非直接假设为

  • 针对 DiscreteDistributions 的 __eq__ 和 __mul__ 方法进行了加速优化

贝叶斯网络

  • 修复了当节点同时具有自循环和父约束时约束图的bug

马尔可夫链

  • 修复了采样长度的问题。

版本 0.12.1

亮点

  • 修复了各种小问题。

版本 0.12.0

亮点

  • 已添加MarkovNetwork模型,包含推理和结构学习功能。

  • 已弃用对 Python 2 的支持。

  • 马尔可夫网络、数据生成器和回调教程已添加

  • 在__init__.py中添加了一个强大的from_json方法,可以反序列化来自任何pomegranate模型的JSON数据。

马尔可夫网络

  • 马尔可夫网络模型已作为一种新的概率模型加入。

  • 已通过FactorGraph后端添加了循环置信传播推理功能

  • 结构学习已通过使用Chow-Liu树实现

贝叶斯网络

  • Chow-Liu树的构建速度略有提升,感谢@alexhenrie的贡献

  • Chow-Liu树的构建速度进一步提升了近一个数量级

  • 在传入带有自循环的图时,约束图不再失败,感谢@alexhenrie的贡献

贝叶斯分类器

  • 更新了from_samples方法,使其能够接受BayesianNetwork作为发射模型。这将为每个类别构建一个贝叶斯网络,并将它们用作发射模型。

分布

  • 当用户传入空字典时,DiscreteDistribution会显示警告信息。

  • 修复了JointProbabilityTables的采样过程。

  • GammaDistributions的形状问题应该已经解决

  • BetaDistributions的文档已更新,明确指出它是一种Beta-Bernoulli分布。

输入输出

  • 新增了文件io.py,其中包含可操作的数据生成器

  • 新增了DataGenerator、DataFrameGenerator以及可继承的BaseGenerator基类

隐马尔可夫模型

  • from_samples方法中新增了RandomState参数,用于控制构建离散模型时的随机性。

杂项

  • 感谢 @alexhenrie 移除了不必要的 memset 调用

  • 检查缺失值的功能已稍作重构,使其更加简洁,感谢@mareksmid-lucid的贡献

  • 在MANIFEST.in中包含LICENSE文件并进行了一些简化,感谢@toddrme2178的贡献

  • 新增了一个强大的from_json方法,可用于反序列化任何pomegranate模型的JSON数据。

文档

  • 新增了io.rst文件,简要描述数据生成器

  • 添加了MarkovNetwork.rst文件用于描述马尔可夫网络

  • 为没有教程链接的教程添加了链接。

教程

  • 新增了马尔可夫网络的教程笔记本

  • 新增了数据生成器的教程笔记本

  • 新增了一个关于回调函数的教程笔记本

持续集成

  • 从AppVeyor和Travis中移除了针对Py2.7的单元测试

  • 为AppVeyor和Travis添加了Py3.8的单元测试

版本 0.11.2

亮点

  • BSNL速度更快,尤其是在数据缺失的情况下,感谢@alexhenrie的贡献

  • GPU加速问题应该修复

贝叶斯网络

  • 通过将isnan设为内联函数来提高速度,感谢@alexhenrie的贡献

  • 通过改变父集迭代方式实现速度提升,感谢@alexhenrie的贡献

实用工具

  • enable_gpu调用已移至GPU检查代码的底部,因此不应再崩溃。

版本 0.11.1

亮点

  • 在存在缺失数据的情况下,改进了贝叶斯网络结构学习的速度。

贝叶斯网络

  • 默认情况下,数据集中的重复项会被合并以减少行数并增加权重,从而显著提高速度。然而,由于np.nan != np.nan,含有缺失值的行不会被合并。此修复将np.nan改为None,使这些行能够被正确合并。

  • 一些杂项改动,有时能提升速度。

  • 修改了在单行数据下节点评分时的概率计算方式。原先会返回0,这意味着有时会错误地返回可能的最密集图结构。在极端情况下这可能会改变您的网络结构,但会降低其复杂度。

版本 0.11.0

亮点

  • 允许用户通过实现Python回退选项来指定自定义分布,前提是分布对象未继承自基础分布类。

  • 修复了GammaDistribution更新中的一个问题

  • 移除了在hmm.bake中设置的确定性种子

  • 使pomegranate兼容NetworkX v2.0及以上版本

  • 通过自定义分布,现在可以实现神经隐马尔可夫模型和神经混合模型

  • 新增多个教程

分布

  • 修复了GammaDistribution在cython级别更新步骤中的一个错误,该错误导致从数据集中收集的充分统计信息不正确。此问题仅影响作为组合模型一部分而非独立使用的GammaDistributions。

  • 新增了对自定义分布的支持。这是通过检查一个分布是否继承自pomegranate基础分布对象来实现的。如果不是,它将使用python方法。

  • 新增了在pomegranate模型中使用自定义分布(包括神经网络)的示例。

  • 修改了NormalDistribution.blank和LogNormalDistribution.blank方法,使其返回标准差为1的分布,以避免出现除零错误。

  • 新增了一个NeuralNetworkWrapper分布,用于正确封装神经网络以便在pomegranate中使用。该封装假设采用类似keras的API。

隐马尔可夫模型

  • 移除了在hmm.bake中设置的确定性种子。这些代码行的设置是因为认为在拓扑排序的内部状态生成中存在某种随机性。然而,事实证明这是不必要的,因此已被移除。

  • 修复了一个因未定义变量导致半监督学习无法工作的错误。

  • 增加了对networkx v2.0及以上版本的支持,使用了它们的新API。

教程

  • 全面改进了教程文件夹中的教程内容,大幅扩展了其涵盖范围

  • 新增了关于自定义分布和神经概率模型的教程

版本 0.10.0

亮点

  • 将分布拆分为单独的文件并放入各自的文件夹中

  • 修复了贝叶斯网络在处理字符数据拟合时调用np.isnan失败的问题

  • 为所有模型添加了类似keras风格的回调功能,内置的回调包括History、ModelCheckpoint和CVLogger。每个模型都会计算历史记录。使用return_history=True可获取模型及包含训练过程的历史对象。

  • 为方便开发,添加了顶层Makefile,支持在多个conda环境中进行构建/测试/清理/安装/卸载操作。

  • 为方便开发,新增了顶层rebuildconda命令,用于为指定Python版本(默认为2.7)创建或重新创建conda开发环境。

更新日志

回调函数

  • 新增了一个回调模块,并在所有迭代训练过程中使用回调。回调函数分别在训练开始时、每个周期结束时以及训练过程结束时通过相应的函数进行调用。更多详情请参阅文档页面。

分布

  • 将distributions.pyx拆分为一个文件夹,每个分布都有独立的文件。这样在修改代码时可以加快编译速度。

  • 在DiscreteDistribution、ConditionalProbabilityTable和JointProbabilityTable中添加了dtype属性,以防止在json转换过程中自动将键转换为浮点数

  • 对于MultivariateGaussianDistributions,在对非正半定矩阵执行岭调整时添加了一个epsilon值,希望能彻底解决这个问题。

  • NormalDistribution的更新现在会检查权重是否低于一个极小值(epsilon),而不仅仅是等于0,这解决了一些稳定性问题。

  • 修复了BernoulliDistribution中的一个问题,当调用from_summaries时如果没有观测数据会引发ZeroDivisionError错误。

  • 修复了IndependentComponentsDistribution在调用log_probability时会打印输出的问题

隐马尔可夫模型

  • 将输出改为拟合模型,类似于scikit-learn中的做法,而不是总改进量,以支持链式操作

    • fitfrom_samples方法中新增了回调功能

    • fitfrom_samples方法中新增了return_history参数,该参数将同时返回历史回调函数和训练好的模型

    • 修复了summary方法中的一个问题:当未传入权重参数时,默认权重被错误地分配给了其他变量。

    • 修复了打印空模型时导致错误的问题。

通用混合模型

  • 将输出改为拟合模型,类似于scikit-learn中的做法,而不是总改进量,以支持链式调用

    • fitfrom_samples方法中新增了回调功能

    • fitfrom_samples方法中新增了return_history参数,该参数将返回历史回调函数以及训练好的模型

朴素贝叶斯

  • fitfrom_samples方法中新增了回调功能,该功能仅在半监督学习中使用

  • fitfrom_samples方法中新增了return_history参数,该参数将返回历史回调函数以及仅在半监督学习中使用的拟合模型

贝叶斯分类器

  • fitfrom_samples方法中新增了回调功能,该功能仅在半监督学习中使用

  • fitfrom_samples方法中新增了return_history参数,该参数将返回历史回调函数以及仅在半监督学习中使用的拟合模型

贝叶斯网络

  • 将内置键映射修改为对象类型的numpy数组,以防止将所有键强制转换为第一列的数据类型。

Makefile

  • There is a new top-level “convenience” Makefile for development to make it easy to develop with two conda environments. The default is for two conda environments, py2.7 and py3.6, but those could be overridden at run time with, for example, make PY3_ENV=py3.6.2 biginstall. Targets exist for install, test, bigclean, and nbtest along with variations of each that first activate either one or both conda environments. For example, make biginstall will install for both py2.7 and py3.6 environments. When developing pomegranate, one frequently wants to do a fully clean build, wipe out all installed targets, and replace them. This can be done with make bigclean biguninstall biginstall. In addition, there is a target nbtest for testing all of the jupyter notebooks to ensure that the cells run. See the Makefile for a list of additional conda packages to install for this to work. The default is to stop on first error but you can run make ALLOW_ERRORS=–allow-errors nbtest to run all cells and then inspect the html output manually for errors.

  • 新增了一个顶层的“便捷”脚本rebuildconda,用于删除并创建一个conda开发环境。使用时请谨慎确认要重建的环境是否正确。您可以通过conda info –envs命令列出所有环境。默认会重建名为py2.72.7环境。通过该脚本,您可以创建替代环境进行测试,然后像这样删除它:./rebuildconda 2.7.9 ; make PY2_ENV=py2.7.9 bigclean py2build py2test py2install nbtest ; source deactivate ; conda env remove –name py2.7.9

版本 0.9.0

亮点

  • 除了因子图模型外,所有模型都已添加缺失值支持功能。具体实现方式为:在字符串数据集中包含nan字符串,或在数值数据集中包含numpy.nan。所有模型都支持对此类数据进行模型拟合和推断。该技术的原理是不从缺失数据中收集充分统计量,而非对缺失值进行插补。

  • 单元测试套件已大幅扩展,从约140个测试增加到约370个测试。

更新日志

隐马尔可夫模型

  • 文档已修正,现在状态被定义为State(NormalDistribution(0, 1)),而不是之前错误的定义方式State(Distribution(NormalDistribution(0, 1)))

  • 修复了from_samples中的一个错误,该错误在使用带有自定义标签的DiscreteDistribution时,如果未指定name会导致TypeError。

  • 扩展了单元测试的数量,以包含缺失值支持并更加全面

分布

  • 多元高斯分布的参数更新已简化。这不会显著提升速度,只是减少了代码量。

  • 修复了泊松分布在计算大阶乘时因将对数移至乘积内部而导致的溢出问题。

  • 修复了泊松分布未能正确计算零计数概率的问题。

  • 修复了当输入整数0模式数据时,指数分布会失败的问题。

  • 修复了IndependentComponentDistribution在序列化后各维度权重不正确的问题。

  • 新增了对所有单变量分布、ICD、MGD和CPT在拟合和计算对数概率时的缺失值支持,方法是通过仅基于存在的数据计算充分统计量。目前唯一不支持缺失值的分布是联合概率表和狄利克雷分布。

  • 修复了多元高斯分布中当缺失数据足够多时协方差矩阵不可逆的问题,方法是从对角线减去最小特征值

K-Means

  • 为k-means聚类添加了缺失值支持,通过忽略数据中缺失的维度。现在可以在缺失数据上进行拟合和预测。

  • 为所有初始化策略添加了缺失值支持

  • 新增了一套单元测试

  • distance方法中添加了返回每个点与每个质心之间距离的功能

通用混合模型

  • 通过对分布的更新,为混合模型添加了缺失值支持

  • 修复了当向from_samples传入一个分布列表和组件数量时,未能生成IndependentComponentsDistribution对象混合的问题

  • 扩展了单元测试套件并添加了对缺失值支持的测试

贝叶斯网络

  • 向量化了predict_proba方法,使其可以接收单个样本或样本列表

  • predict_proba的输出改为单独符号,而不是当输入作为已知先验知识时一个符号概率为1的分布。

  • 新增了一个n_jobs参数,用于并行化样本预测。这不会加速单个样本的预测,仅对批量样本有效。

  • _check_input提取为一个可独立使用的函数

  • 添加了单元测试以全面检查上述各项功能

  • log_probabilityfitfrom_samples方法添加了缺失值支持。Chow-Liu树不支持缺失值,但使用约束图仍然有效。

版本 0.8.1

亮点

本日志记录为发布版本0.8.1所做的变更。

  • 已添加单变量偏移量功能,允许将分布拟合到数据列而非数字向量。这避免了之前必须进行的数据复制操作。

更新日志

基础

  • 参数 column_idxd 已被添加到所有模型公开的 _summarize 方法中。这仅对单变量分布和拟合单变量分布的模型有用,其他模型可以忽略。参数 column_idx 指定数据矩阵中分布应拟合的列,本质上充当偏移量。d 表示数据矩阵的维度数。这意味着单变量分布将拟合指针数组中满足 i*d + column_idx 的所有样本 i。使用多变量分布的模型可以忽略此参数。

  • StateModel类添加了一个便捷函数to_yamlYAMLJSON的超集,其体积可以缩小4到5倍。使用前需要安装yaml包。

分布

  • summarize方法已从大多数独立分布移至Distribution基类对象,fit方法也同样如此。

  • min_std 参数已从 NormalDistributionLogNormalDistribution 对象的 from_summaries 方法及 fit 方法移至 __init__ 方法中。

朴素贝叶斯

  • 由于fitsummarize方法与BayesClassifier的相似性,已将它们移至BayesModel

贝叶斯分类器

  • 由于fitsummarize方法与NaiveBayes的相似性,已将它们移至BayesModel

通用混合模型

  • 修复了一个bug,该bug导致在from_samples方法中n_jobs参数被忽略,因为k-means初始化时batch_size被重置了

隐马尔可夫模型

  • HiddenMarkovModel的默认名称已从“None”更改为“HiddenMarkovModel”

版本 0.8.0

亮点

本日志记录为发布版本0.8.0所做的变更。

更新日志

k-means

  • k-means算法已从使用迭代计算改为采用欧氏距离的替代公式,从||a - b||^{2}改为使用||a||^{2} + ||b||^{2} - 2||a cdot b||。这样可以对质心范数进行缓存,显著加快计算速度,并允许使用dgemm来解决矩阵乘法问题。初步尝试添加GPU支持似乎未成功,但理论上这应该是可以添加的功能。

  • k-means算法已重构,通过允许数据初始化为numpy内存映射格式且不强制在过程中转换为数组,更原生地支持核外学习目标。

隐马尔可夫模型

  • 允许在带标签训练中使用状态的字符串名称而非状态对象本身作为标签。

  • from_samples方法中添加了state_namesnames参数,以便更好地控制模型的创建。

  • fit步骤中新增了半监督学习功能,可通过传入标签列表来激活,其中未标记的序列对应值为None。这使得训练可以在部分序列完全标记而其他序列完全没有标记的情况下进行,但不支持对部分标记的序列进行训练。

  • 与其他方法类似,from_samples方法中加入了监督初始化后接半监督学习的功能。具体实现方式是为状态名称传入字符串标签,这些标签始终以-start开头(其中model_name是传入from_samples方法的name参数)。对于没有标签的序列,应使用None而非对应的标签列表。虽然使用fit方法进行半监督学习可以支持静默状态之间的任意转移,但from_samples方法不会生成静默状态,因此除开始和结束状态外,所有状态都应是符号发射状态。若使用半监督学习,还需通过新增的state_names参数传入状态名称列表。

  • 修复了监督学习中的一个bug,该bug由于半监督学习实现中的错误导致无法正确初始化。

  • 修复了由于错误调用networkx.draw导致在没有pygraphviz时无法绘制模型的bug。

通用混合模型

  • 将初始化步骤改为在第一批数据上完成,而非整个数据集。如果整个数据集能放入内存,则不会有任何变化。然而,这使得能够自动进行核外更新,而不是立即尝试将整个数据集加载到内存中。这意味着核外更新现在会有不同的初始化方式,但之后会生成精确的更新。

  • 修复了传入一维数组会导致错误的bug,方法是将所有一维数组重新转换为二维数组。

贝叶斯网络

  • from_samples方法中新增了一个reduce_dataset参数,该参数接收数据集并生成一个由唯一样本组成的新数据集,样本权重由其原始数据集中加权出现频率决定。本质上,该方法能将包含重复成员的数据集转换为完全由唯一成员构成的新数据集。这样生成的贝叶斯网络评分与原数据集完全一致,但能显著加速所有结构学习算法。加速效果与数据集冗余度成正比,因此变量数较少(小于12个)的大型数据集将获得巨大速度提升(有时甚至达到2-3个数量级!),而超过该阈值可能收效甚微。数据集冗余度(即加速比)可通过n_samples/n_possibilities估算,其中n_samples是数据集样本总数,n_possibilities是各变量唯一键值的乘积(对于含d个变量的二进制数据则为2**d)。更精确的计算方式是n_samples/n_unique_samples,因为许多数据集存在元素重复的倾向性。

  • 修复了一个过早优化的问题,即在将贝叶斯网络保存为json时,条件概率表中的父节点被剥离,导致序列化错误。这个过早优化的原因是理论上pomegranate被设计为可以处理循环贝叶斯网络,如果在剥离父节点之前序列化会导致文件大小无限增长。不过,未来支持循环贝叶斯网络的PR将会解决这个错误。

朴素贝叶斯

  • 修复了from_samples的文档,使其实际指向朴素贝叶斯模型。

  • 新增了针对标记为-1样本的EM算法半监督学习功能。

贝叶斯分类器

  • 修复了from_samples的文档,使其实际指向贝叶斯分类器模型。

  • 新增了针对标记为-1样本的EM算法半监督学习功能。

分布

  • 多元高斯分布现在可以利用GPU进行对数概率和汇总计算,对于任何使用它们的模型,这两项任务的速度可提升约4倍。这一功能是通过CuPy实现的。

核心外计算

  • 参数“batch_size”已添加到HMMs、GMMs和k-means模型中,用于内置的核外计算。传入numpy内存映射而非数组,并设置批次大小以进行精确更新(初始化除外)。

小批量处理

  • 参数“batches_per_epoch”已添加到HMMs、GMMs和k-means模型中,以支持内置的小批量训练。该参数指定在计算新的参数更新之前需要汇总的批次数量(由“batch_size”定义)。

  • 参数“lr_decay”已添加到HMMs和GMMs中,用于指定学习率随时间衰减的程度。如果不这样做,在进行小批量训练时模型可能无法收敛。

并行化

  • n_jobs 参数已添加到所有模型的拟合和预测步骤中。这使得用户可以通过简单地设置更大的任务数量来实现模型的并行预测,而无需进行更复杂的操作。

教程

  • 移除了PyData 2016芝加哥教程,因其与tutorials_0_pomegranate_overview内容相似。