我想在Python中編寫一個簡單的變化點查找器。下面,函數loglike(xs)返回iid正常樣本xs的最大化對數似然。函數most_probable_cp(xs)循環遍歷xs中的每個點〜75%,並使用似然比來找出xs中最可能的變化點。優化循環變點測試
我正在使用二進制分割,並且我正在引導以獲得似然比的臨界值,所以我需要調用most_probable_cp()數千次。有什麼方法可以加速嗎? Cython會幫忙嗎?我從來沒有用過它。
import numpy as np
def loglike(xs):
n = len(xs)
mean = np.sum(xs)/n
sigSq = np.sum((xs - mean)**2)/n
return -0.5*n*np.log(2*np.pi*sigSq) - 0.5*n
def most_probable_cp(xs, left=None, right=None):
"""
Finds the most probable changepoint location and corresponding likelihood for xs[left:right]
"""
if left is None:
left = 0
if right is None:
right = len(xs)
OFFSETPCT = 0.125
MINNOBS = 12
ys = xs[left:right]
offset = min(int(len(ys)*OFFSETPCT), MINNOBS)
tLeft, tRight = left + offset, right - offset
if tRight <= tLeft:
raise ValueError("left and right are too close together.")
maxLike = -1e9
cp = None
dataLike = loglike(ys)
# Bottleneck is below.
for t in xrange(tLeft, tRight):
profLike = loglike(xs[left:t]) + loglike(xs[t:right])
lr = 2*(profLike - dataLike)
if lr > maxLike:
cp = t
maxLike = lr
return cp, maxLike
謝謝。我嘗試更換功能,並沒有多大幫助。我希望至少有10倍的速度。 – hahdawg
你的時間在哪裏?我們可以盯着你的代碼尋找可能的瓶頸,直到我們的眼睛受傷並仍然想念它們。你知道如何做剖析嗎? – Davidmh
對不起。應該已經更清楚了:90%的時間在線ProfLike = loglike(xs [left:t])+ loglike(xs [t:right]) – hahdawg