跳转到主要内容

之前作为scipy.maxentropy提供的最大熵建模代码

项目描述

scipy-maxentropy:最大熵模型

这是之前在SciPy(至版本0.10.1)中可用的scipy.maxentropy包。由于维护不足,后来在SciPy 0.11中被移除。现在,为了向后兼容,它作为一个独立的包提供。

对于新项目,请考虑使用maxentropy包,它提供了一个更现代的scikit-learn兼容API。

目的

此包拟合“指数族”模型,包括最大熵模型和对其他模型的最小KL散度模型,同时受任意特征统计预期的线性约束。应用包括自然语言处理和理解的语料库模型、机器翻译、环境物种建模、图像重建等。

快速入门

以下是一个基于Berger等人在1996年《计算语言学》上发表的论文《自然语言处理的最大熵方法》中的简单机器翻译示例的快速使用示例。

考虑将英语单词“in”翻译成法语。假设我们在平行文本语料库中注意到以下事实

(1)    p(dans) + p(en) + p(à) + p(au cours de) + p(pendant) = 1
(2)    p(dans) + p(en) = 3/10
(3)    p(dans) + p(à)  = 1/2

此代码在这些约束下找到最大熵的概率分布。

from scipy_maxentropy import Model    # previously scipy.maxentropy

samplespace = ['dans', 'en', 'à', 'au cours de', 'pendant']

def f0(x):
    return x in samplespace

def f1(x):
    return x=='dans' or x=='en'

def f2(x):
    return x=='dans' or x=='à'

f = [f0, f1, f2]

model = Model(f, samplespace)

# Now set the desired feature expectations
b = [1.0, 0.3, 0.5]

model.verbose = False    # set to True to show optimization progress

# Fit the model
model.fit(b)

# Output the distribution
print()
print("Fitted model parameters are:\n" + str(model.params))
print()
print("Fitted distribution is:")
p = model.probdist()
for j in range(len(model.samplespace)):
    x = model.samplespace[j]
    print(f"    x = {x + ':':15s} p(x) = {p[j]:.3f}")

# Now show how well the constraints are satisfied:
print()
print("Desired constraints:")
print("    sum(p(x))           = 1.0")
print("    p['dans'] + p['en'] = 0.3")
print("    p['dans'] + p['à']  = 0.5")
print()
print("Actual expectations under the fitted model:")
print(f"    sum(p(x))           = {p.sum():.3f}")
print(f"    p['dans'] + p['en'] = {p[0] + p[1]:.3f}")
print(f"    p['dans'] + p['à']  = {p[0] + p[2]:.3f}")

可用的模型

以下模型类可用

  • scipy_maxentropy.Model:用于离散、可枚举的样本空间上的模型
  • scipy_maxentropy.ConditionalModel:用于离散、可枚举的样本空间上的条件模型
  • scipy_maxentropy.BigModel:用于样本空间既可以是连续的(可能高维)也可以是离散但太大而无法枚举的模型,如自然语言中所有可能的句子。此模型使用条件蒙特卡洛方法(主要是重要性抽样)。

背景

本包适用于以下指数形式的概率模型

p(x)=p0(x)exp(θTf(x))Z(θ;p0)

其中 θ 是一个长度为 n 的实参数向量,与特征统计量 f(x)=(f1(x),...,fn(x)) 的长度相同。

这是在以下特征期望的附加约束条件下,与先验模型 p0 “最接近”的模型(从最小化KL散度或“相对熵”的角度来说):

    E f_1(X) = b_1
    ...
    E f_n(X) = b_n

对于某些常数 bi,例如从数据集中估计的统计量。

p0 是均匀分布的特殊情况下,这是在约束条件下“最平坦”的模型,即在具有 最大熵 的意义上。

更多背景信息,请参阅,例如,Cover和Thomas(1991)的《信息论要素》。

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面