我有一个购买一对物品的四种可能性的模型(同时购买,不购买或只购买一个),并且需要优化(伪)对数似然函数。当然,其中一部分是伪对数似然函数的计算/定义。
以下是我的代码,其中 Beta 是每个客户的二维向量(有 U 个客户和 U 个不同的 beta 向量),X 是每个项目的二维向量(N 个项目中的每一个都不同)和 Gamma是一个对称矩阵,每对项目都有一个标量值 gamma(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
添加/澄清 - 我正在使用此计算来优化和查找生成此伪似然函数数据的 beta 和 gamma 参数。
我正在使用 scipy optimize.minimize 和 'Powell' 方法。