- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个函数可以计算狄利克雷分布的条件(第 k 个 alpha)对数似然。我用 Cython 编写并编译了它,但我的代码调用了大约 12M 次,这似乎是瓶颈,所以我希望加快速度。
cimport numpy as np
import numpy as np
import math
DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
def logFullConAlphaK(np.ndarray p,np.ndarray alpha, np.int k):
assert p.dtype == np.float64 and alpha.dtype == np.float64
cdef double t1=sum(np.log(p))
cdef DTYPE_t y=((alpha[k-1]-1)*t1)-np.log(alpha[k-1])+(p.shape[0]*
(math.lgamma(sum(alpha))- math.lgamma(alpha[k-1])))
return y
我将 Cython 编译成我在代码中使用的 .pyd 文件。关于如何加快速度的任何想法?
谢谢
最佳答案
1) 通过声明输入数组的数据类型和维度,对于 p.shape[0]
:
def logFullConAlphaK(np.ndarray[DTYPE_t, ndim=1] p,
np.ndarray[DTYPE_t, ndim=1] alpha, int k):
...
cdef int tmp
tmp = p.shape[0]
2) 通过使用 C 函数而不是 math
模块中的 Python 函数:
cdef extern from "math.h":
double log(double x) nogil
3) 使用 NumPy 的 np.ndarray.sum()
方法
4) 使用 Cython 指令来避免一些开销
总计:
#cython: wraparound=False
#cython: boundscheck=False
#cython: cdivision=True
#cython: nonecheck=False
import math
cimport numpy as np
import numpy as np
cdef extern from "math.h":
double log(double x) nogil
DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
def logFullConAlphaK(np.ndarray[DTYPE_t, ndim=1] p,
np.ndarray[DTYPE_t, ndim=1] alpha, int k):
assert p.dtype == np.float64 and alpha.dtype == np.float64
cdef double t1
cdef int tmp
t1 = np.log(p).sum()
tmp = p.shape[0]
cdef DTYPE_t y=((alpha[k-1]-1)*t1)-log(alpha[k-1])+(tmp*
(math.lgamma(alpha.sum()) - math.lgamma(alpha[k-1])))
return y
OP 的原始解决方案、@cel 的解决方案和我的解决方案之间的一些性能比较:
In [2]: timeit solOP(a, b, 10)
1000 loops, best of 3: 273 µs per loop
In [3]: timeit solcel(a, b, 10)
10000 loops, best of 3: 30.5 µs per loop
In [4]: timeit solS(a, b, 10)
100000 loops, best of 3: 15.8 µs per loop
关于python - 如何加速 Cython 代码来计算 dirichlet 的条件对数似然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30247301/
我需要一个 Dirichlet 分布并且我正在使用 numpy.random.dirichlet。当我根据 Dirichlet PDF 公式给出 alpha=[1,1,1,1] 时,它应该产生一个统一
我想知道是否有人知道一个Python包,它实现了MLE来估计狄利克雷分布的参数。 最佳答案 Eric Suh 有一个包裹 here 。 $ pip install git+https://github
我想设置 fipy 来求解具有正弦边界的一维扩散平流方程。 我最终得到了以下代码: from fipy import * import numpy as np import matplotlib.py
首先,为了以防万一,我将解释如何表示要运行 LDA 模型的文档。首先,我进行一些预处理,以获得每个人所有文档中最重要的术语,然后获得所有最重要单词的并集。 val text = groupedByP
我想用tensorflow实现LDA作为实践,我认为tensorflow版本可能有以下优点: 快。如果我可以使用内置的操作来表达采样过程。 易于并行化。许多操作已经通过并行化优化实现,因此这个 lda
我正在使用 LDA 算法将许多文档聚类到不同的主题中。 LDA算法需要一个输入参数:主题数量。我如何确定这一点? 我正在使用路透社语料库来对我的解决方案进行基准测试。路透社语料库已准备好主题编号。对路
我正在尝试计算积分 sin(x)/x , x = [0,inf] 我做了以下事情: import math from scipy.integrate import quad t = float("in
我有一个函数可以计算狄利克雷分布的条件(第 k 个 alpha)对数似然。我用 Cython 编写并编译了它,但我的代码调用了大约 12M 次,这似乎是瓶颈,所以我希望加快速度。 cimport nu
我在文档语料库上使用了 LDA,并找到了一些主题。我的代码的输出是两个包含概率的矩阵。一个文档主题概率和另一个词主题概率。但我实际上不知道如何使用这些结果来预测新文档的主题。我正在使用吉布斯采样。有谁
我正在努力实现 Dirichlet 变量的集中因子依赖于另一个变量的模型。 情况如下: 系统因组件故障而失败(共有三个组件,每次测试/观察只有一个组件失败)。 组件发生故障的概率取决于温度。 这是该情
关于 numpy page他们给出了例子 s = np.random.dirichlet((10, 5, 3), 20) 一切都很好,很棒;但是,如果您想从 alpha 的二维数组中生成随机样本怎么办
我在一组文档上使用 Gensim HDP 模块。 >>> hdp = models.HdpModel(corpusB, id2word=dictionaryB) >>> topics = hdp.pr
我正在使用 sklearn 的 NMF 和 LDA 子模块来分析未标记的文本。我阅读了文档,但不确定这些模块(NMF 和 LDA)中的变换函数是否与 R 的主题模型中的后验函数相同(请参阅 Predi
是否可以使用 LDA 在 gensim 中对给定的一组输入进行聚类?我该怎么做? 最佳答案 LDA 生成语料库中文档的低维表示。对于这种低 d 表示,您可以应用聚类算法,例如k-均值。由于每个轴对应一
我正在使用 gensim 训练我的 ldamodel,并使用像这样的测试语料库进行预测 ldamodel[doc_term_matrix_test],它工作得很好但是我不明白预测实际上是如何使用经过训
在 being unsuccessful in using decorators 之后为了定义“指数随机变量的对数”的随机对象,我决定使用 pymc.stochastic_from_dist 为这个新
我正在尝试为计算域的四个边求解具有 Dirichlet 边界条件的 Poison 方程。众所周知,我应该使用 FFTW_RODFT00 来满足条件。但是,结果不正确。你能帮帮我吗? #include
我现在正在通过 LDA(Latent Dirichlet Allocation)主题建模方法来帮助从一组文档中提取主题。据我从下面的链接中了解到,这是一种无监督学习方法,可以使用提取的主题对每个文档进
我正在寻找一个多变量 GMM 的 C++ 实现,它使用基于 Gibbs 采样的方法来拟合/分类(而不是通常的基于 EM),以便能够充分利用先验信息并添加在限制条件下。通常称为狄利克雷过程高斯混合模型或
我对“使用 Dirichlet 过程作为集群数量的先验分布的无限混合模型”的理解是,集群的数量由数据决定,因为它们会收敛到一定数量的集群。 此R 实现 https://github.com/jacob
我是一名优秀的程序员,十分优秀!