算法来自于Abdallah, T. , & Vulcano, G. . (2020). Demand estimation under the multinomial logit model from sales transaction data. Manufacturing & Service Operations Management.
在python环境下,仿真得到了一些trsaction data,尝试实现算法,但不知道是否正确,求助如何正确实现以得到β和λ的估计
import pandas as pd
import numpy as np
import random
random.seed(42)
## initialize transaction data
# input data
n = 20
T = 100
delta = 0.9
la = 50
def get_trans(n=20,T=100,delta=0.9,la=50):
'''
n: number of items
T: number of time period
delta: probability that any item is available in any given period
la: arrival rates of a homogenous poisson process
'''
## simulate exp(beta)~Unif[0.05,1]
exp_beta = [0]+[random.uniform(0.05,1) for i in range(n)]
s = np.sum(exp_beta)/(1+np.sum(exp_beta)) # market share
s_tilde = s/(1-s)
arrival = np.random.poisson(lam=la, size=T)
trans = np.zeros((n,T))
for t in range(T):
for i in range(n):
if random.random() > delta:
trans[i,t] = 0
else:
trans[i,t] = arrival[t]*exp_beta[i+1]*s
return trans,s_tilde
def MM(trans,s_tilde):
## get n,T
n = trans.shape[0]
T = trans.shape[1]
## initialize beta
lst = [0]+[np.log(1/n) for i in range(n)]
Beta = np.array(lst)
dist=100 # stopping criteria: beta间距离<0.1
num = 0 # 统计迭代次数
while dist >= 0.1 and num <= 10000:
### 计算q_it(Beta)
q_beta = np.zeros((n,T))
for t in range(T):
sum_beta = np.sum(np.exp(Beta[np.where(trans[:,t]!=0)]))
for i in range(n):
if trans[i,t] == 0:
q_beta[i,t] = 0
else:
q_beta[i,t] = np.exp(Beta[i+1])/sum_beta
### 计算beta
for i in range(n):
K_i = np.sum(trans[i,:])
m_t = trans.sum(0)
q_it = q_beta[i,:]
mq_it = np.sum(m_t*q_it)
Beta[i+1] = Beta[i+1] + np.log(K_i/mq_it)
s_tilde1 = np.sum(np.exp(Beta))
Beta_new = np.zeros(n+1)
Beta_new[1:] = Beta[1:] + np.log(s_tilde/s_tilde1)
dist = np.sum(np.abs(Beta_new - Beta))
Beta = Beta_new
num += 1
return Beta
trans = get_trans()[0]
s_tilde = get_trans()[1]
Beta = MM(trans,s_tilde)
Beta
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。