API接口
pomegranate拥有一个极简的核心API,这得益于所有模型无论复杂度如何都被视为概率分布。这一点在文档中反复强调,因为它对包的设计方式以及如何思考设计概率模型具有重要影响。尽管每个模型文档页面都有一个API参考,展示了每个模型的完整方法和参数集,但每个模型都具备以下方法:
>>> model.probability(X)
该方法接收一组示例(根据模型不同可能是2D或3D)并返回一个概率向量。
>>> model.log_probability(X)
该方法接收一组示例(根据模型不同可能是2D或3D)并返回对数概率向量。对数概率在数值上更稳定,实际上,调用model.probability只是对本次调用返回的值进行指数运算。
>>> model.fit(X, sample_weight=None)
该方法会将模型拟合到给定的数据上,数据可选择是否加权。如果模型是简单概率分布、贝叶斯分类器或具有完全观测特征的贝叶斯网络,该方法将使用最大似然估计。对于其他模型和设置,该方法将使用期望最大化算法来拟合模型参数。当隐马尔可夫模型或贝叶斯网络未提供结构时,该方法将联合学习模型的结构和参数。数据的形状应为(n, d)或(n, l, d),具体取决于是否存在长度维度,其中n是样本数量,l是数据长度,d是维度。样本权重应为大小为(n,)的非负数向量或大小为(n, d)的矩阵。
>>> model.summarize(X, sample_weight=None)
该方法是两步式外存学习API的第一步。该方法接收数据和可选权重,提取出允许精确更新的充分统计量,并将其添加到缓存值中。由于这些充分统计量具有可加性,因此可以通过多次调用此方法获得精确更新,而无需将整个数据集存储在内存中。
>>> model.from_summaries()
此方法是离线学习API中的第二步。该方法利用提取和聚合的充分统计量来推导模型参数的精确更新。参数更新后,存储的充分统计量将被清零。
组合方法
对于由其他模型/分布组成的模型,例如混合模型、隐马尔可夫模型和贝叶斯网络,还有一些额外的方法涉及推断数据与这些分布之间的关系。例如,除了计算整个混合模型下示例的对数概率外,可能还需要计算数据由每个分布生成的后验概率。这些后验概率通过应用贝叶斯规则得出,该规则将先验概率和似然函数与后验概率联系起来。
>>> model.predict(X)
该方法将返回数据中每个示例最可能的推断值。对于处理不完整数据的贝叶斯网络而言,该推断值是在给定模型结构和观测数据的情况下,每个变量最可能取的值。对于所有其他方法,这是解释数据的最可能成分,即P(M|D)。
>>> model.predict_proba(X)
这将直接返回后验概率矩阵P(M|D)。predict方法仅对该矩阵执行argmax操作。
>>> model.predict_log_proba(X)
出于数值稳定性考虑,该方法返回对数后验概率矩阵。
API参考
分布
- class pomegranate.distributions.Bernoulli(probs=None, inertia=0.0, frozen=False, check_data=True)
一个伯努利分布对象。
伯努利分布用于建模二元变量发生的概率。它描述离散事件的发生率,并有一个表示该值的概率参数。该分布假设每个特征相互独立。
初始化该对象有两种方法。第一种是传入概率参数张量,此时可以立即使用。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- probs: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
每个特征的概率参数。默认为None。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值, 必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算在给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于伯努利分布,数据中的每个条目必须是0或1。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中进行采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回值
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.Categorical(probs=None, n_categories=None, pseudocount=0.0, inertia=0.0, frozen=False, check_data=True)
一个分类分布对象。
分类分布用于建模一组离散值发生的概率。它是伯努利分布向多值情况的扩展。有时也被称为离散分布,但该分布并不强制要求用于键的数值之间存在任何基于其身份的关联。键的排列顺序不会影响计算结果。该分布假设各特征之间相互独立。
键必须是连续的非负整数,且从零开始。 由于概率表示为单个张量,每个特征 必须为所有键提供值,直到任一分布的最大键。 具体来说,如果一个特征有10个键而第二个特征只有4个, 张量必须为每个特征扩展到10,但对第二个特征 编码为零概率。
参数
- probs: list, numpy.ndarray, torch.tensor or None, shape=(k, d), optional
每个特征对应每个键的概率,其中k是所有特征中键的最大数量。默认为None
- n_categories: list, numpy.ndarray, torch.tensor or None, optional
数据中每个特征的类别数量。仅当需要直接从数据中学习参数,并且您希望确保每个维度包含正确数量的键时才需要提供。默认值为None。
- pseudocount: float, optional
在训练时为每个特征的观测计数添加的值。设置为正值可确保没有概率真正为零。默认值为0。
- inertia: float, (0, 1), optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于分类分布,数据中的每个条目必须是[0, n_keys)范围内的整数。
注意:这与某些其他对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回值
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.ConditionalCategorical(probs=None, n_categories=None, pseudocount=0, inertia=0.0, frozen=False, check_data=True)
一个条件分类分布。
这是一个基于先前发射条件分类的分布,意味着每个字符的概率取决于序列中较早观察到的字符。每个特征都像Categorical分布一样独立地被条件化。
这种条件作用使得分布的形状比JointCategorical分布稍微复杂一些。具体来说,JointCategorical分布根据定义是多变量的,但ConditionalCategorical不一定是。尽管两者看起来相似,都是接收一个字符向量并返回概率,但输入JointCategorical的向量是在没有时间概念的情况下一起观察到的,而ConditionalCategorical明确要求时间概念,其中后续字符的概率取决于之前看到的字符组成。
参数
- probs: list of numpy.ndarray, torch.tensor or None, shape=(k, k), optional
一个条件概率列表,其中每个张量对应被建模数据中的一个特征。每个张量应具有k+1个维度,其中k是条件依赖的时间步数。每个维度的长度应覆盖该维度中的键数量。例如,在指定k=2的单变量条件分类分布时,有效的张量形状可以是[(2, 3, 4)]。默认值为None。
- n_categories: list, numpy.ndarray, torch.tensor or None, optional
数据中每个特征对应的类别数量。仅当需要直接从数据中学习参数,并且希望确保每个维度包含正确数量的键时才需提供。与Categorical分布不同,这里需要提供一个形状列表,其中每个特征对应一个形状,且该形状需与probs中指定的形状匹配。默认值为None。
- pseudocount: float, optional
在训练时为每个特征的观测计数添加的值。设置为正值可确保没有概率真正为零。默认值为0。
- inertia: float, (0, 1), optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值, 必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- class pomegranate.distributions.DiracDelta(alphas=None, inertia=0.0, frozen=False, check_data=True)
一个狄拉克δ分布对象。
狄拉克δ分布是一种概率分布,其全部密度集中在零点。该分布假设每个特征相互独立。这意味着在实际应用中,如果样本中任何值为非零,该分布将赋予其零概率。
初始化该对象有两种方法。第一种是传入表示给定零值时返回概率的alpha值张量,此时可以立即使用。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- alphas: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
每个特征的概率参数。默认为None。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
对于狄拉克δ分布,没有更新。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回值
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
对于狄拉克δ分布,没有可提取的统计量。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.Exponential(scales=None, inertia=0.0, frozen=False, check_data=True)
一个指数分布对象。
指数分布用于建模离散事件的时间间隔,其速率参数描述了事件发生的平均间隔时间。该分布假设每个特征相互独立。尽管该对象主要用于处理离散计数,但也可用于任何非负连续数据。
初始化该对象有两种方法。第一种是传入速率参数张量,此时可以立即使用它们。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习速率参数。
参数
- scales: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
每个特征的速率参数。默认为None。
- inertia: float, (0, 1), optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。如果您想冻结单个参数或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
此方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于指数分布,数据必须为非负数。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回值
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中进行采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回值
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.Gamma(shapes=None, rates=None, inertia=0.0, tol=0.0001, max_iter=20, frozen=False, check_data=True)
一个伽马分布对象。
伽马分布是指数分布的和,具有形状和速率参数。该分布假设每个特征与其他特征相互独立。
初始化该对象有两种方法。第一种是传入速率和形状参数的张量,此时可以立即使用它们。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习速率和形状参数。
参数
- shapes: torch.tensor or None, shape=(d,), optional
每个特征的形状参数。默认为None
- rates: torch.tensor or None, shape=(d,), optional
每个特征的速率参数。默认为None。
- inertia: float, (0, 1), optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- tol: float, [0, inf), optional
停止拟合分布参数的阈值。默认值为1e-4。
- max_iter: int, [0, inf), optional
拟合分布参数时运行EM算法的最大迭代次数。默认值为20。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于伽马分布,数据必须为非负数。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回值
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回值
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.JointCategorical(probs=None, n_categories=None, pseudocount=0, inertia=0.0, frozen=False, check_data=True)
联合分类分布。
联合分类分布模型用于建模一组分类值向量出现的概率,而不假设各维度之间相互独立。本质上,这是一个不假设各维度相互独立的分类分布。
初始化该对象有两种方法。第一种是传入概率参数张量,此时可以立即使用这些参数。第二种是不传入概率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- probs: list, numpy.ndarray, torch.tensor, or None, shape=*n_categories
一个张量,其中每个维度对应数据集中的一列,每个维度的大小是该列中的类别数量。例如,如果建模的数据是二元的且形状为(5,4),这将是一个形状为(2,2,2,2)的张量。默认为None。
- n_categories: list, numpy.ndarray, torch.tensor, or None, shape=(d,)
一个向量,表示每列可以拥有的最大类别数量。如果未提供,将从数据中推断。默认为None。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- pseudocount: float, optional
在训练期间添加到概率分布中每个条目的观察值数量。数值越大,分布越平滑。默认值为0。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于联合分类分布,每个值必须是一个整数类别,且小于每个特征的最大类别数。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将从基础概率分布中返回n个生成的样本。对于混合模型,这涉及首先使用先验概率对组件进行采样,然后从所选分布中进行采样。
参数
- n: int
要生成的样本数量。
返回
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.Normal(means=None, covs=None, covariance_type='full', min_cov=None, inertia=0.0, frozen=False, check_data=True)
一个正态分布对象。
正态分布通过钟形曲线来建模变量出现的概率。它由均值向量和协方差值描述,协方差可以是零维、一维或二维的。如果协方差类型是'diag'或'sphere',该分布可以假设特征相互独立;但如果类型是'full',则特征不独立。
初始化该对象有两种方法。第一种是传入概率参数张量,此时可以立即使用。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- means: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
分布的平均值。默认为None。
- covs: list, numpy.ndarray, torch.Tensor, or None, optional
分布的方差和协方差。如果covariance_type为'full',则形状应为(self.d, self.d);如果为'diag',则形状应为(self.d,);如果为'sphere',则应为(1,)。请注意,在所有设置中这都是方差或协方差,而不是标准差(对于对角协方差矩阵来说标准差可能更常见)。默认值为None。
- covariance_type: str, optional
协方差矩阵的类型。必须是'full'、'diag'或'sphere'之一。默认为'full'。
- min_cov: float or None, optional
最小方差或协方差。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.Poisson(lambdas=None, inertia=0.0, frozen=False, check_data=True)
一个泊松分布对象。
泊松分布用于建模在固定时间范围内发生的事件次数,假设每个事件的发生是独立的。该分布还假设每个特征与其他特征相互独立。
初始化该对象有两种方法。第一种是传入lambda参数张量,此时可以立即使用它们。第二种是不传入lambda参数,然后调用fit或summary + from_summaries,此时将从数据中学习lambda参数。
参数
- lambdas: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
每个特征的lambda参数。默认为None。
- inertia: float, (0, 1), optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于泊松分布,数据中的每个条目必须为非负数。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.StudentT(dofs, means=None, covs=None, covariance_type='diag', min_cov=None, inertia=0.0, frozen=False, check_data=True)
一个学生T分布。
学生T分布用于建模变量在具有厚尾的钟形曲线下出现的概率。基本上,这是正态分布的一个版本,对异常值的抵抗力较弱。它由均值向量和方差向量描述。如果协方差类型为'diag'或'sphere',则该分布可以假设特征相互独立;但如果类型为'full',则特征不独立。
初始化该对象有两种方法。第一种是传入概率参数张量,此时可以立即使用。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- means: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
分布的平均值。默认为None。
- covs: list, numpy.ndarray, torch.Tensor, or None, optional
分布的方差和协方差。如果covariance_type为'full',则形状应为(self.d, self.d);如果为'diag',则形状应为(self.d,);如果为'sphere',则应为(1,)。请注意,在所有设置中这都是方差或协方差,而不是标准差(对角协方差矩阵可能更常见标准差的情况)。默认为None。
- covariance_type: str, optional
协方差矩阵的类型。必须是'full'、'diag'或'sphere'之一。默认为'full'。
- min_cov: float or None, optional
最小方差或协方差。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- class pomegranate.distributions.Uniform(mins=None, maxs=None, inertia=0.0, frozen=False, check_data=True)
均匀分布。
均匀分布用于建模变量在给定范围内的概率,该范围内各点概率相同,范围外概率为零。它由该范围的最小值和最大值构成的向量来描述。此分布假设各特征之间相互独立。
初始化该对象有两种方法。第一种是传入概率参数张量,此时可以立即使用。第二种是不传入速率参数,然后调用fit或summary + from_summaries,此时将从数据中学习概率参数。
参数
- mins: list, numpy.ndarray, torch.Tensor or None, shape=(d,), optional
范围的最小值。
- maxs: list, numpy.ndarray, torch.Tensor, or None, optional
范围的最大值。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- log_probability(X)
计算每个示例的对数概率。
该方法计算在给定分布参数下每个示例的对数概率。示例必须以二维格式提供。对于伯努利分布,数据中的每个条目必须是0或1。
注意:这与其他一些对数概率计算函数(如torch.distributions中的函数)不同,因为它不是独立返回每个特征的对数概率,而是返回整个样本的总对数概率。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
返回
- logp: torch.Tensor, shape=(-1,)
每个示例的对数概率。
- sample(n)
从概率分布中采样。
该方法将返回从基础概率分布生成的n个样本。
参数
- n: int
要生成的样本数量。
返回
- X: torch.tensor, shape=(n, self.d)
随机生成的样本。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
- class pomegranate.distributions.ZeroInflated(distribution, priors=None, max_iter=10, tol=0.1, inertia=0.0, frozen=False, check_data=False, verbose=False)
针对零膨胀分布的封装器。
某些离散分布(如泊松分布或负二项分布)常用于建模数据中存在远超真实信号本身预期的零值的情况。这可能是由于数据采集设备故障或数据中存在其他空白所致。零膨胀分布本质上是这些零值与真实底层分布的混合。
因此,这个类作为一个包装器,可以替代其他概率分布,使它们"零膨胀"。它类似于传入的分布与狄拉克δ分布之间的混合模型,不同之处在于混合是独立发生在每个分布以及每个样本上的。
参数
- distribution: pomegranate.distributions.Distribution
一个pomegranate分布对象。它很可能是一个离散分布,但从技术上讲并不必须是。
- priors: tuple, numpy.ndarray, torch.Tensor, or None. shape=(2,), optional
给定分布和狄拉克δ分量上的先验概率。默认为None。
- max_iter: int, optional
在拟合分布的EM步骤中需要进行的迭代次数。默认值为10。
- tol: float, optional
拟合过程中当改进低于此阈值时停止。默认值为0.1。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- verbose: bool, optional
是否在训练过程中打印改进信息和计时数据。
- fit(X, sample_weight=None)
将模型拟合到可选加权的示例。
该方法实现了学习过程的核心。对于零膨胀分布,这涉及执行EM算法,直到拟合的分布收敛。
该方法主要是对summarize和from_summaries方法的封装。其主要作用是作为这些函数的循环包装器并监控收敛情况。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于评估的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
返回
自身
- from_summaries()
根据提取的统计信息更新模型参数。
该方法利用调用summarize方法计算得出的统计量来更新分布参数。更新所需的超参数在初始化时传入。
注意:在内部,调用fit实际上就是依次调用summarize方法,然后再调用from_summaries方法。
- summarize(X, sample_weight=None)
从一批数据中提取充分统计量。
该方法从可选加权数据中计算充分统计量,并将其添加到存储的缓存中。样本必须以二维格式提供。样本权重可以作为每个样本的一个值提供,也可以作为每个样本中每个特征的二维权重矩阵提供。
参数
- X: list, tuple, numpy.ndarray, torch.Tensor, shape=(-1, self.d)
一组用于总结的示例。
- sample_weight: list, tuple, numpy.ndarray, torch.Tensor, optional
示例的权重集合。可以是形状为 (-1, self.d) 的数组,也可以是形状为 (-1,) 的向量。默认为全1数组。
模型
- class pomegranate.bayes_classifier.BayesClassifier(distributions, priors=None, inertia=0.0, frozen=False, check_data=True)
一个贝叶斯分类器对象。
使用概率模型生成分类器的一种简单方法是将其代入贝叶斯规则。本质上,推断过程与混合模型中EM算法的'E'步骤相同。然而,由于无需迭代推断标签和学习参数,只需根据已知标签学习参数,拟合速度可以显著加快。由于大多数模型的学习步骤都是简单的最大似然估计,这一过程可以极其迅速地完成。
虽然最常用的分布是对角协方差矩阵的高斯分布(称为高斯朴素贝叶斯模型),但实际上可以使用任何概率分布。只要实现了log_probability、summarize和from_samples方法,您就可以直接使用任何分布或概率模型。
此外,概率模型甚至不需要是简单的分布。这些分布可以是混合模型、隐马尔可夫模型或贝叶斯网络。
参数
- distributions: tuple or list
一组分布对象。这些对象无需初始化,例如可以直接使用"Normal()"。
- priors: tuple, numpy.ndarray, torch.Tensor, or None. shape=(k,), optional
给定分布上的先验概率。默认为None。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时必须将此设置为False。默认值为True。
- class pomegranate.gmm.GeneralMixtureModel(distributions, priors=None, init='random', max_iter=1000, tol=0.1, inertia=0.0, frozen=False, random_state=None, check_data=True, verbose=False)
一个通用的混合模型。
通常,数据由多个组件生成。混合模型是一种概率模型,它明确地将数据建模为来自一组概率分布而非单一分布。通常,缩写“GMM”指高斯混合模型,但任何概率分布或异构分布集合都可以包含在混合中,使其成为“通用”混合模型。
然而,混合模型本身具有与概率分布相同的理论特性,因为它本质上就是一种概率分布。因此,它可以用于任何简单分布适用的场景,例如作为隐马尔可夫模型(HMM)的发射分布或贝叶斯分类器的组成部分。
相反,许多通常被认为由概率分布组成但与之不同的模型,例如隐马尔可夫模型、马尔可夫链和贝叶斯网络,理论上都可以传入此对象并融入混合模型中。
如果混合模型中包含的分布未初始化,拟合步骤将首先通过运行少量迭代的k-means算法来初始化这些分布,并将分布拟合到发现的聚类上。
参数
- distributions: tuple or list
一组分布对象。这些对象无需初始化,例如可以直接使用“Normal()”。
- priors: tuple, numpy.ndarray, torch.Tensor, or None. shape=(k,), optional
给定分布上的先验概率。默认为None。
- max_iter: int, optional
在拟合分布的EM步骤中需要进行的迭代次数。默认值为10。
- tol: float, optional
拟合过程中当改进低于此阈值时停止。默认值为0.1。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时,可以略微加快计算速度。在编译时也需要将此设置为False。默认值为True。
- verbose: bool, optional
是否在训练过程中打印改进信息和计时。
- class pomegranate.hmm.DenseHMM(distributions=None, edges=None, starts=None, ends=None, init='random', max_iter=1000, tol=0.1, sample_length=None, return_sample_paths=False, inertia=0.0, frozen=False, check_data=True, random_state=None, verbose=False)
一个具有密集转移矩阵的隐马尔可夫模型。
隐马尔可夫模型是混合模型对序列的扩展,通过在混合元素之间引入转移矩阵来实现。隐马尔可夫模型的每种算法本质上都是对这些算法的修订,以纳入这个转移矩阵。
该对象是对具有密集转移矩阵的隐马尔可夫模型的封装。
该对象是对两种实现的封装,可通过kind参数指定具体实现。选择不同实现不会影响结果准确性,但会改变计算速度。
另外,有两种方法可以实例化隐马尔可夫模型。第一种是通过传入一组分布、一个密集的转移矩阵,以及可选的起始/结束概率。第二种是初始化对象时不传入这些参数,然后使用add_edge方法添加边,并使用add_distributions方法添加分布。重要的是,你选择初始化隐马尔可夫模型的方式与你最终选择的实现方式无关。如果你传入一个密集的转移矩阵,当你选择kind='sparse'时,这将被转换为一个稀疏矩阵,所有零值将被丢弃。
参数
- distributions: tuple or list
一组分布对象。这些对象无需初始化,例如可以直接使用“Normal()”。
- edges: numpy.ndarray, torch.Tensor, or None. shape=(k,k), optional
一个密集的概率转移矩阵,表示每个传入节点或分布如何相互连接。该矩阵可能包含许多零值,当与kind='sparse'配对使用时,将从矩阵中移除这些零值元素。
- starts: list, numpy.ndarray, torch.Tensor, or None. shape=(k,), optional
每个节点的起始概率。如果未提供,则假定这些概率是均匀分布的。
- ends: list, numpy.ndarray, torch.Tensor, or None. shape=(k,), optional
到达每个节点的终止概率。如果未提供,则假定这些概率是均匀分布的。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止对参数的检查,但当您确定输入有效时,可以略微加快计算速度。在编译时必须将此设置为False。默认值为True。
- class pomegranate.hmm.SparseHMM(distributions=None, edges=None, starts=None, ends=None, init='random', max_iter=1000, tol=0.1, sample_length=None, return_sample_paths=False, inertia=0.0, frozen=False, check_data=True, random_state=None, verbose=False)
一个具有稀疏转移矩阵的隐马尔可夫模型。
隐马尔可夫模型是混合模型对序列的扩展,通过在混合元素之间引入转移矩阵来实现。隐马尔可夫模型的每种算法本质上都是对这些算法的修改,以纳入这个转移矩阵。
该对象是对具有稀疏转移矩阵的隐马尔可夫模型的封装。
另外,有两种方法可以实例化隐马尔可夫模型。第一种是通过传入一组分布、一个密集的转移矩阵,以及可选的起始/结束概率。第二种是初始化对象时不传入这些参数,然后使用add_edge方法添加边,并使用add_distributions方法添加分布。重要的是,你选择初始化隐马尔可夫模型的方式与你最终选择的实现方式无关。如果你传入一个密集的转移矩阵,当你选择kind='sparse'时,它将被转换为一个稀疏矩阵,所有零值都会被丢弃。
参数
- distributions: tuple or list
一组分布对象。这些对象无需初始化,例如可以直接使用“Normal()”。
- edges: numpy.ndarray, torch.Tensor, or None. shape=(k,k)
一个密集的概率转移矩阵,表示每个传入节点或分布如何相互连接。该矩阵可能包含许多零值,当与kind='sparse'配对使用时,将从矩阵中移除这些零值元素。
- starts: list, numpy.ndarray, torch.Tensor, or None. shape=(k,)
每个节点的起始概率。如果未提供,则假定这些概率是均匀分布的。
- ends: list, numpy.ndarray, torch.Tensor, or None. shape=(k,)
到达每个节点的终止概率。如果未提供,则假定这些概率是均匀分布的。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- class pomegranate.markov_chain.MarkovChain(distributions=None, k=None, n_categories=None, inertia=0.0, frozen=False, check_data=True)
马尔可夫链。
马尔可夫链是最简单的序列模型,它将联合概率分布P(X_{0} ... X_{t})沿链分解为边际分布P(X_{0}) P(X_{1} | X_{0}) ...的乘积,对于k阶马尔可夫链则包含k个条件概率分布。
尽管有时被认为是一种独立模型,马尔可夫链实际上与隐马尔可夫模型一样,都是针对序列的概率分布。由于马尔可夫链具有与概率分布相同的理论特性,它可以应用于任何简单分布适用的场景,例如作为隐马尔可夫模型的发射分布或贝叶斯分类器的组成部分。
参数
- distributions: tuple or list or None
一组分布对象。这些对象无需初始化,例如可以是“Categorical()”。
- k: int or None
链中包含的条件分布数量,同时也是序列中建模的回溯步数。如果未传入分布参数,则必须传入此参数。
- n_categories: list, tuple, or None
一个包含每个特征类别数量的列表或元组。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- class pomegranate.bayesian_network.BayesianNetwork(distributions=None, edges=None, structure=None, algorithm=None, include_parents=None, exclude_parents=None, max_parents=None, pseudocount=0.0, max_iter=20, tol=1e-06, inertia=0.0, frozen=False, check_data=True, verbose=False)
一个贝叶斯网络对象。
贝叶斯网络是一种概率分布,其中变量之间的依赖关系通过图结构显式编码,而缺少边则表示条件独立性。这些图是有向的,通常必须是无环的,但本实现允许网络存在环,只要在推理过程中不假设收敛即可。
推理是通过因子图表示法使用循环置信传播进行的。这种方法有时被称为sum-product算法。如果图具有树状结构,它将产生精确结果。否则,如果图是无环的,它保证收敛但不一定达到最优结果。如果图是循环的,则无法保证收敛性,但一般认为循环越长,获得良好结果的可能性越大。
结构学习可以通过多种方法实现。
参数
- distributions: tuple or list or None
一组分布对象。这些对象不需要初始化,例如可以是“Categorical()”。目前,它们必须是Categorical或ConditionalCategorical分布。如果提供,它们必须与提供的边保持一致,即每个条件分布在提供的结构中必须至少有一个父节点。默认为None。
- edges: tuple or list or None, optional
一个由2元组组成的列表或元组,其中2元组的第一个元素是父分布对象,第二个元素是子分布对象。如果为None,则表示没有边。默认为None。
- structure: tuple or list or None, optional
一个列表或元组,包含每个分布的父节点,其中空元组表示根节点。例如, ((), (0,), (), (0, 2)) 表示一个有四个节点的图, 其中第二个分布以第一个分布为父节点, 第四个分布以第一个和第三个分布为父节点。 仅在希望使用fit方法时创建并拟合新的分布对象时使用此参数。默认值为None。
- max_iter: int, optional
推理步骤中要进行的迭代次数。默认为10。
- tol: float, optional
拟合过程中当改进低于此阈值时停止。默认值为1e-6。
- inertia: float, [0, 1], optional
表示在拟合过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时,可以略微加快计算速度。在编译时也需要将此设置为False。默认值为True。
- verbose: bool, optional
是否在训练过程中打印改进信息和计时。
- class pomegranate.factor_graph.FactorGraph(factors=None, marginals=None, edges=None, max_iter=20, tol=1e-06, inertia=0.0, frozen=False, check_data=True, verbose=False)
一个因子图对象。
因子图将概率分布表示为二分图,其中分布中每个维度的边缘分布在图的一侧,而因子在另一侧。因子侧的分布编码来自模型的概率估计,而边缘侧的分布编码来自数据的概率估计。
在因子图上使用循环置信传播算法进行推断。这是一种迭代算法,其中"消息"会在边缘节点和因子节点之间的每条边上传递,直到边缘节点的估计值收敛。简而言之:每条消息代表生成节点认为其相对于子节点的边缘分布。计算每条消息需要将父节点相对于所有其他节点进行边缘化。当父节点已经是单变量分布时——无论是作为边缘节点还是单变量因子节点——都不需要边缘化,它会将自己作为消息发送。基本上,联合概率表会接收来自构成其维度的所有边缘节点的消息,并向每个边缘节点发送一条消息,说明它(联合概率表)认为其相对于来自其他边缘节点的消息的边缘分布是什么。更具体地说,如果一个联合概率表有两个维度,其父节点是边缘节点A和B,它将向A发送一条消息,该消息是自身在边缘化B后的结果,并向B发送一条消息,该消息是自身在边缘化A后的结果。
..note:: 值得注意的是,当结构为树形时,该算法是精确的。如果因子中存在任何环路(即可以从一个因子出发,在边缘分布和因子之间跳跃画出一个圆圈,最终回到起始因子且不重复经过任何边两次),则返回的概率是近似值。
参数
- factors: tuple or list or None
一组分布对象。这些对象不需要初始化,例如可以是“Categorical()”。目前,它们必须是Categorical或JointCategorical分布。默认值为None。
- marginals: tuple or list or None
一组分布对象。这些对象必须被初始化并且是分类分布。
- edges: list or tuple or None
一组边。关键点在于,此列表中的项必须是分布对象本身,且边的顺序必须与多元分布中的分布顺序相匹配。具体来说,如果您有一个多元分布,包含它的第一条边必须对应第一个维度,第二条边必须对应第二个维度,依此类推,且边的总数不能超过维度数。默认为None。
- max_iter: int, optional
在分布收敛时推理步骤中需要进行的迭代次数。默认值为10。
- tol: float, optional
拟合过程中当改进低于此阈值时停止。默认值为1e-6。
- inertia: float, [0, 1], optional
表示在训练过程中应用于参数更新的比例。当惯性为0.0时,更新会完整应用且忽略先前的参数。当惯性为1.0时,更新会被完全忽略并保留先前的参数,相当于参数被冻结的情况。
- frozen: bool, optional
与此分布关联的所有参数是否被冻结。 如果您想冻结单个参数,或这些参数中的单个值,必须直接修改张量或参数的frozen属性。默认为False。
- check_data: bool, optional
是否检查数据的属性并可能将其重新转换为torch.tensors。这不会阻止参数检查,但当您确定输入有效时可以略微加快计算速度。在编译时也需要将此设置为False。
- verbose: bool, optional
是否在训练过程中打印改进信息和计时。