У меня есть модель для четырех возможностей покупки пары предметов (покупка обоих, ни одного или только одного), и мне нужно оптимизировать (псевдо) функцию логарифмического правдоподобия.Частично это, конечно, является вычислением / определением функции правдоподобия псевдо-лога.
Ниже приведен мой код, где бета представляет собой двумерный вектор для каждого клиента (есть U клиентов иU различных бета-векторов), X - это двумерный вектор для каждого элемента (различный для каждого из N элементов), а гамма - симметричная матрица со скалярным значением гамма (i, j) для каждой пары элементов.А df - это кадр данных покупок - одна строка для каждого клиента и N столбцов для товаров.
Мне кажется, что все эти циклы неэффективны и занимают слишком много времени, но я неуверен, как ускорить этот расчет и был бы признателен за любую помощь, улучшая его.Заранее спасибо!
def pseudo_likelihood(Args):
Beta = np.reshape(Args[0:2*U], (U, 2))
Gamma = np.reshape(Args[2*U:], (N,N))
L = 0
for u in range(0,U,1):
print datetime.datetime.today(), " for user {}".format(u)
y = df.loc[u][1:]
beta_u = Beta[u,:]
for l in range(N):
print datetime.datetime.today(), " for item {}".format(l)
for i in range(N-1):
if i == l:
continue
for j in range(i+1,N):
if (y[i] == y[j]):
if (y[i] == 1):
L += np.dot(beta_u,(x_vals.iloc[i,1:]+x_vals.iloc[j,1:])) + Gamma[i,j] #Log of the exponent of this expression
else:
L += np.log(
1 - np.exp(np.dot(beta_u, (x_vals.iloc[i, 1:] + x_vals.iloc[j, 1:])) + Gamma[i, j])
- np.exp(np.dot(beta_u, x_vals.iloc[i, 1:])) * (
1 - np.exp(np.dot(beta_u, x_vals.iloc[j, 1:])))
- np.exp(np.dot(beta_u, x_vals.iloc[j, 1:])) * (
1 - np.exp(np.dot(beta_u, x_vals.iloc[i, 1:]))))
else:
if (y[i] == 1):
L += np.dot(beta_u,x_vals.iloc[i,1:]) + np.log(1 - np.exp(np.dot(beta_u,x_vals.iloc[j,1:])))
else:
L += (np.dot(beta_u, x_vals.iloc[j,1:])) + np.log(1 - np.exp(np.dot(beta_u, x_vals.iloc[i,1:])))
L -= (N-2)*np.dot(beta_u,x_vals.iloc[l,1:])
for k in range(N):
if k != l:
L -= np.dot(beta_u, x_vals.iloc[k,1:])
return -L
Для добавления / уточнения - я использую этот расчет, чтобы оптимизировать и найти параметры бета и гаммы, которые сгенерировали данные для этой функции псевдослучайного вероятности.
Я используюscipy optimize.minimize с помощью метода «Пауэлл».