В недавнем домашнем задании меня попросили выполнить байесовскую подборку для набора данных 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](https://i.stack.imgur.com/48Um6.png)
После нажатия кнопки Run не появляется никаких сообщений об ошибках, но это занимает вечноPython, чтобы дать мне вывод. Что я тут не так сделал?