Байесовский приступ косинусоидальной волны занимает больше времени, чем ожидалось - PullRequest
0 голосов
/ 30 сентября 2018

В недавнем домашнем задании меня попросили выполнить байесовскую подборку для набора данных a и b , используя алгоритм Метрополиса.Дано соотношение между a и b :

e (t) = e_0 * cos (w * t)

w= 2 * pi

Алгоритм Метрополиса (он отлично работает с другими подгонками):

def metropolis(logP, args, v0, Nsteps, stepSize):

    vCur = v0
    logPcur = logP(vCur, *args)
    v = []
    Nattempts = 0

    for i in range(Nsteps):
        while(True):
            #Propose step:
            vNext = vCur + stepSize*np.random.randn(*vCur.shape)
            logPnext = logP(vNext, *args)
            Nattempts += 1

            #Accept/reject step:
            Pratio = (1. if logPnext>logPcur else np.exp(logPnext-logPcur))

            if np.random.rand() < Pratio: 
                vCur = vNext
                logPcur = logPnext
                v.append(vCur)
                break

    acceptRatio = Nsteps*(1./Nattempts)
    return np.array(v), acceptRatio

Я попытался использовать байесовскую волну косинуса и использовал вышеописанный алгоритм Метрополиса.:

e_0 = -0.00155 

def strain_t(e_0,t):
    return e_0*np.cos(2*np.pi*t)

data = pd.read_csv('stressStrain.csv')
t = np.array(data['t'])
e = strain_t(e_0,t)

def logfitstrain_t(params,t,e):
    e_0 = params[0]
    sigmaR = params[1]
    strainModel = strain_t(e_0,t)
    return np.sum(-0.5*((e-strainModel)/sigmaR)**2 - np.log(sigmaR))


params0 = np.array([-0.00155,np.std(t)]) 
params, accRatio = metropolis(logfitstrain_t, (t,e), params0, 1000, 0.042)
print('Acceptance ratio:', accRatio)

e0 = np.mean(params[0])
print('e0=',e0)

e_t = e0*np.cos(2*np.pi*t)
sns.jointplot(t, e_t, kind='hex',color='purple')

Данные в .csv выглядят так:

table with columns

После нажатия кнопки Run не появляется никаких сообщений об ошибках, но это занимает вечноPython, чтобы дать мне вывод. Что я тут не так сделал?

1 Ответ

0 голосов
/ 02 октября 2018

Почему это может "взять навсегда"

Ваш алгоритм предназначен для работы до тех пор, пока не примет заданное количество предложений (в примере 1000).Таким образом, если он работает долго, вы, скорее всего, отклоните кучу предложений.Это может произойти, когда размер шага слишком велик, что приводит к тому, что новые предложения попадают в отдаленные, маловероятные области вероятностного пространства. Попробуйте уменьшить размер шага. Для этого также может потребоваться увеличить количество образцов, чтобы обеспечить адекватное исследование заднего пространства.

Более серьезная проблема

Поскольку вытолько добавив принятых предложений к цепочке v, вы фактически не реализовали алгоритм Метрополиса, а вместо этого получили смещенный набор выборок, который будет иметь тенденцию перепредставлять менее вероятные области заднего пространства.Реальная реализация Metropolis повторно добавляет предыдущее предложение всякий раз, когда новое предложение отклоняется.Вы по-прежнему можете применять минимальное количество принятых предложений, но вам действительно нужно каждый раз что-то добавлять.

...