def lcmnl_simulate(cmdata,numclasses,csdata,numalts,betas): cmfnames = ['cm%d'%i for i in range(cmdata.shape[1])] cmdata,newcmfnames = prep_cm_data(cmdata,numclasses,cmfnames) cmchoices = mnl.mnl_simulate(cmdata,betas['cm'],numclasses,GPU=GPU,returnprobs=0) cspdf = {} for cls in range(numclasses): cspdf['cs%d'%cls] = mnl.mnl_simulate(csdata,betas['cs%d'%cls],numalts,GPU=GPU,returnprobs=1).flatten() cschoices = None return cmchoices, cschoices, cspdf
def lcmnl_estimate(cmdata,numclasses,csdata,numalts,chosen,maxiter=MAXITER,emtol=EMTOL,\ skipprep=False,csbeta=None,cmbeta=None): loglik = -999999 if csbeta is None: csbeta = [np.random.rand(csdata.shape[1]) for i in range(numclasses)] if not skipprep: cmdata = prep_cm_data(cmdata,numclasses) if cmbeta is None: cmbeta = np.zeros(cmdata.shape[1]) for i in range(maxiter): print "Running iteration %d" % (i+1) print time.ctime() # EXPECTATION print "Running class membership model" cmprobs = mnl.mnl_simulate(cmdata,cmbeta,numclasses,GPU=GPU,returnprobs=1) csprobs = [] for cno in range(numclasses): tmp = mnl.mnl_simulate(csdata,csbeta[cno],numalts,GPU=GPU,returnprobs=1) tmp = np.sum(tmp*chosen,axis=1) # keep only chosen probs csprobs.append(np.reshape(tmp,(-1,1))) csprobs = np.concatenate(csprobs,axis=1) h = csprobs * cmprobs oldloglik = loglik loglik = np.sum(np.log(np.sum(h,axis=1))) print "current csbeta", csbeta print "current cmbeta", cmbeta print "current loglik", loglik, i+1, "\n\n" if abs(loglik-oldloglik) < emtol: break wts = h / np.reshape(np.sum(h,axis=1),(-1,1)) # MAXIMIZATION for cno in range(numclasses): print "Estimating class specific model for class %d" % (cno+1) t1 = time.time() weights=np.reshape(wts[:,cno],(-1,1)) print weights.shape fit, results = mnl.mnl_estimate(csdata,chosen,numalts,GPU=GPU,weights=weights,beta=csbeta[cno]) print "Finished in %fs" % (time.time()-t1) csbeta[cno] = zip(*results)[0] print "Estimating class membership model" t1 = time.time() fit, results = mnl.mnl_estimate(cmdata,None,numclasses,GPU=GPU,weights=wts,lcgrad=True, \ beta=cmbeta,coeffrange=(-1000,1000)) print "Finished in %fs" % (time.time()-t1) cmbeta = zip(*results)[0]
def expectation(cmbeta,csbeta): print "Running class membership model" cmprobs = mnl.mnl_simulate(cmdata,cmbeta,numclasses,GPU=GPU,returnprobs=1) csprobs = [] for cno in range(numclasses): tmp = mnl.mnl_simulate(csdata,csbeta[cno],numalts,GPU=GPU,returnprobs=1) tmp = np.sum(tmp*chosen,axis=1) # keep only chosen probs csprobs.append(np.reshape(tmp,(-1,1))) csprobs = np.concatenate(csprobs,axis=1) h = csprobs * cmprobs loglik = np.sum(np.log(np.sum(h,axis=1))) wts = h / np.reshape(np.sum(h,axis=1),(-1,1)) return loglik, wts
def lcmnl_simulate(cmdata, numclasses, csdata, numalts, betas): cmfnames = ['cm%d' % i for i in range(cmdata.shape[1])] cmdata, newcmfnames = prep_cm_data(cmdata, numclasses, cmfnames) cmchoices = mnl.mnl_simulate(cmdata, betas['cm'], numclasses, GPU=GPU, returnprobs=0) cspdf = {} for cls in range(numclasses): cspdf['cs%d' % cls] = mnl.mnl_simulate(csdata, betas['cs%d' % cls], numalts, GPU=GPU, returnprobs=1).flatten() cschoices = None return cmchoices, cschoices, cspdf
def lcmnl_estimate(cmdata,numclasses,csdata,numalts,chosen,maxiter=MAXITER,emtol=EMTOL): loglik = -999999 beta = [np.ones(csdata.shape[1]) for i in range(numclasses)] #cmbeta = np.ones((cmdata.shape[1]+1)*(numclasses-1)) # +1 if for asc, -1 is base alt cmbeta = np.ones(cmdata.shape[1]) for i in range(maxiter): print "Running iteration %d" % (i+1) # EXPECTATION print "Running class membership model" print "cmbeta", cmbeta cmprobs = mnl.mnl_simulate(cmdata,cmbeta,numclasses,GPU=GPU,returnprobs=1) print "cmprobs", cmprobs csprobs = [] for cno in range(numclasses): print "Running class specific model for class %d" % (cno+1) print "csbeta", beta[cno] tmp = mnl.mnl_simulate(csdata,beta[cno],numalts,GPU=GPU,returnprobs=1) print "csprobs", tmp tmp = np.sum(tmp*chosen,axis=1) # keep only chosen probs csprobs.append(np.reshape(tmp,(-1,1))) csprobs = np.concatenate(csprobs,axis=1) h = csprobs * cmprobs oldloglik = loglik loglik = np.sum(np.log(np.sum(h,axis=1))) print "current loglik", loglik, i+1 print "current beta", beta if abs(loglik-oldloglik) < emtol: break wts = h / np.reshape(np.sum(h,axis=1),(-1,1)) for i in range(wts.shape[1]): print i, pd.Series(wts[:,i]).describe() # MAXIMIZATION print "Estimating class membership model" fit, results = mnl.mnl_estimate(cmdata,None,numclasses,GPU=GPU,weights=wts,lcgrad=True) cmbeta = zip(*results)[0] for cno in range(numclasses): print "Estimating class specific model for class %d" % (cno+1) fit, results = mnl.mnl_estimate(csdata,chosen,numalts,GPU=GPU,weights=wts[:,cno]) beta[cno] = zip(*results)[0]
def expectation(cmbeta, csbeta): print "Running class membership model" cmprobs = mnl.mnl_simulate(cmdata, cmbeta, numclasses, GPU=GPU, returnprobs=1) csprobs = [] for cno in range(numclasses): tmp = mnl.mnl_simulate(csdata, csbeta[cno], numalts, GPU=GPU, returnprobs=1) tmp = np.sum(tmp * chosen, axis=1) # keep only chosen probs csprobs.append(np.reshape(tmp, (-1, 1))) csprobs = np.concatenate(csprobs, axis=1) h = csprobs * cmprobs loglik = np.sum(np.log(np.sum(h, axis=1))) wts = h / np.reshape(np.sum(h, axis=1), (-1, 1)) return loglik, wts
def lcmnl_estimate(cmdata,numclasses,csdata,numalts,chosen,maxiter=MAXITER,emtol=EMTOL,\ skipprep=False,csbeta=None,cmbeta=None): loglik = -999999 if csbeta is None: csbeta = [np.random.rand(csdata.shape[1]) for i in range(numclasses)] if not skipprep: cmdata = prep_cm_data(cmdata, numclasses) if cmbeta is None: cmbeta = np.zeros(cmdata.shape[1]) for i in range(maxiter): print "Running iteration %d" % (i + 1) print time.ctime() # EXPECTATION print "Running class membership model" cmprobs = mnl.mnl_simulate(cmdata, cmbeta, numclasses, GPU=GPU, returnprobs=1) csprobs = [] for cno in range(numclasses): tmp = mnl.mnl_simulate(csdata, csbeta[cno], numalts, GPU=GPU, returnprobs=1) tmp = np.sum(tmp * chosen, axis=1) # keep only chosen probs csprobs.append(np.reshape(tmp, (-1, 1))) csprobs = np.concatenate(csprobs, axis=1) h = csprobs * cmprobs oldloglik = loglik loglik = np.sum(np.log(np.sum(h, axis=1))) print "current csbeta", csbeta print "current cmbeta", cmbeta print "current loglik", loglik, i + 1, "\n\n" if abs(loglik - oldloglik) < emtol: break wts = h / np.reshape(np.sum(h, axis=1), (-1, 1)) # MAXIMIZATION for cno in range(numclasses): print "Estimating class specific model for class %d" % (cno + 1) t1 = time.time() weights = np.reshape(wts[:, cno], (-1, 1)) print weights.shape fit, results = mnl.mnl_estimate(csdata, chosen, numalts, GPU=GPU, weights=weights, beta=csbeta[cno]) print "Finished in %fs" % (time.time() - t1) csbeta[cno] = zip(*results)[0] print "Estimating class membership model" t1 = time.time() fit, results = mnl.mnl_estimate(cmdata,None,numclasses,GPU=GPU,weights=wts,lcgrad=True, \ beta=cmbeta,coeffrange=(-1000,1000)) print "Finished in %fs" % (time.time() - t1) cmbeta = zip(*results)[0]