def main(lamb, R): #read in file tmp = [] with open("../session.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() data = np.asarray(tmp) tmp = [] with open("../user_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() user = np.asarray(tmp) tmp = [] with open("../app_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() app = np.asarray(tmp) #initialization pool_size = app.shape[0] user_row_n = user.shape[1] app_row_n = app.shape[1] d = int((user_row_n - 1) * (app_row_n - 1)) session_n = int(max(data[:, 0])) train_ratio = 0.7 gamma = 1 # lamb = 0.1 theta = np.zeros(d) beta = 1 delta = 0.9 V = lamb * np.eye(d) X = np.zeros((1, d), dtype=np.float) Y = np.zeros(1) x_feature = np.zeros((pool_size, d), dtype=np.float) UCB = np.zeros(pool_size, dtype=np.float) session = np.zeros(session_n, dtype=np.float) K = 5 click_n = 0 idex = np.random.permutation(session_n) tr_idx = idex[:int(round(session_n * train_ratio))] ts_idx = idex[int(round(session_n * train_ratio)):] # open file for storing log info cur_time = strftime("%Y%m%d_", localtime()) logFileName = '../LogFile/main_' + cur_time + '.txt' logFile = open(logFileName, 'a+') print >> logFile, '\n\n' print >> logFile, '=' * 50 print >> logFile, 'experiment parameters: lambda=%f, R=%f' % (lamb, R) print >> logFile, '\n\n' #train app = app[:, 1:] expl = np.zeros(pool_size) for i in range(tr_idx.shape[0]): record = np.zeros(1) u = np.zeros(1) try: record = data[np.where(data[:, 0] == tr_idx[i])] u = user[np.where(user[:, 0] == record[0, 0])][0, 1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = np.outer(u, app[a, :]).reshape(1, d) x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) # print "this is app "+str(a)+" UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] for ii in range(K): if expl[action[ii]] == 0: expl[action[ii]] = 1 #print expl reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) # print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) else: continue #test cnt = 0 result = [0] for i in range(ts_idx.shape[0]): record = np.zeros(1) u = np.zeros(1) try: record = data[np.where(data[:, 0] == ts_idx[i])] u = user[np.where(user[:, 0] == record[0, 0])][0, 1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = np.outer(u, app[a, :]).reshape(1, d) x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) # print "this is app "+str(a)+" UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] for ii in range(K): if expl[action[ii]] == 0: expl[action[ii]] = 1 # print expl reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: cnt = cnt + 1 idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) # print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) click_n = click_n + utils.get_reward(w) result.append((float(click_n) / cnt)) else: continue print >> logFile, "the reward is: %s" % result print >> logFile, "cnt is: %s" % cnt expl_n = sum(expl) expl_n_rate = float(expl_n) / pool_size print >> logFile, "expl_n is %s" % str(expl_n) print >> logFile, "expl_rate is %s" % str(expl_n_rate) logFile.close()
def main(lamb, R): tmp = [] with open("../user_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() user = np.asarray(tmp) tmp = [] with open("../app_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() app = np.asarray(tmp) #initialization B = 3 reward_acc = 0 cnt_acc = 0 cur_time = strftime("%Y%m%d_", localtime()) logFileName = '../LogFile/main_BT_nouser_' + cur_time + '.txt' logFile = open(logFileName, 'a+') print >> logFile, '\n\n' print >> logFile, '=' * 3 print >> logFile, 'experiment parameters: lambda=%f, R=%f' % (lamb, R) print >> logFile, '\n\n' for t in range(0, B): print "Round " + str(t + 1) + " starts!" data = readSess(t) sids = readDict(t) start = time.clock() pool_size = app.shape[0] user_row_n = user.shape[1] app_row_n = app.shape[1] d = app_row_n - 1 session_n = sids.shape[0] train_ratio = 0.7 gamma = 1 #lamb = 0.5 theta = np.zeros(d) beta = 1 delta = 0.9 V = lamb * np.eye(d) X = np.zeros((1, d), dtype=np.float) Y = np.zeros(1) x_feature = np.zeros((pool_size, d), dtype=np.float) UCB = np.zeros(pool_size, dtype=np.float) K = 5 click_n = 0 sids = np.random.permutation(sids) tr_idx = sids[:int(round(session_n * train_ratio))] ts_idx = sids[int(round(session_n * train_ratio)):] #train app = app[:, 1:] expl = np.zeros(pool_size) for i in range(tr_idx.shape[0]): record = np.zeros(1) #u = np.zeros(1) try: record = data[np.where(data[:, 0] == float(tr_idx[i]))] #u = user[np.where(user[:, 0] == record[0, 0])][0,1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = app[a, :] x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) #print "this is app "+str(a)+" UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] for ii in range(K): if expl[action[ii]] == 0: expl[action[ii]] = 1 # print expl reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) else: continue #test cnt = 0 result = [0] for i in range(ts_idx.shape[0]): record = np.zeros(1) #u = np.zeros(1) try: record = data[np.where(data[:, 0] == float(ts_idx[i]))] #u = user[np.where(user[:, 0] == record[0, 0])][0,1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = app[a, :] x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) #print "this is app "+str(a)+" UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] for ii in range(K): if expl[action[ii]] == 0: expl[action[ii]] = 1 print expl reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: cnt = cnt + 1 idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) click_n = click_n + utils.get_reward(w) result.append((float(click_n) / cnt)) else: continue print >> logFile, "the reward is: %s" % result[-1] print >> logFile, "cnt is: %s" % cnt expl_n = sum(expl) expl_n_rate = float(expl_n / pool_size) print >> logFile, "expl_n is %s" % str(expl_n) print >> logFile, "expl_rate is %s" % str(expl_n_rate) reward_acc += result[-1] cnt_acc += cnt reward_avg = reward_acc / B cnt_avg = cnt_acc / B print >> logFile, "the average cnt is: %s" % cnt_avg print >> logFile, "the average reward is: %s" % reward_avg logFile.close()
def main(lamb, R): #read in file tmp = [] with open("../session.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() data = np.asarray(tmp) tmp = [] with open("../user_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() user = np.asarray(tmp) tmp = [] with open("../app_feature.txt", "r") as f: for line in f: line = line.strip().rstrip(',').split(',') line = list(map(float, line)) tmp.append(line) f.close() app = np.asarray(tmp) #initialization pool_size = app.shape[0] #user_row_n = user.shape[1] #feature length app_row_n = app.shape[1] d = app_row_n - 1 session_n = int(max(data[:, 0])) train_ratio = 0.5 gamma = 1 # lamb = 0.1 theta = np.zeros(d) beta = 1 delta = 0.9 V = lamb * np.eye(d) X = np.zeros((1, d), dtype=np.float) Y = np.zeros(1) x_feature = np.zeros((pool_size, d), dtype=np.float) UCB = np.zeros(pool_size, dtype=np.float) session = np.zeros(session_n, dtype=np.float) K = 5 click_n = 0 idex = np.random.permutation(session_n) tr_idx = idex[:int(round(session_n * train_ratio))] ts_idx = idex[int(round(session_n * train_ratio)):] # open file for storing log info cur_time = strftime("%Y%m%d_", localtime()) logFileName = '../LogFile/main_newtr_nouser' + cur_time + '.txt' logFile = open(logFileName, 'a+') print >> logFile, '\n\n' print >> logFile, '=' * 50 print >> logFile, 'experiment parameters: lambda=%f, R=%f' % (lamb, R) print >> logFile, '\n\n' #app = app[:,1:] expl = np.zeros(pool_size) #train for i in range(tr_idx.shape[0]): record = np.zeros(1) #user_feature = np.zeros(1) try: record = data[np.where(data[:, 0] == tr_idx[i])] #user_feature = user[np.where(user[:, 0] == record[0, 0])][0,1:] except IndexError: continue else: # app_dict = {} # val = [] # for r in range(record.shape[0]): # if record[r,1] not in app_dict: # app_dict[record[r,1]] = record[r,2] # else if record[r,1] == 11 or record[r,1] == 10: # app_dict[record[r,1]] = record[r,2] # for a in app_dict: # app_feature = app[np.where(app[:,0] == a)][0,1:] # x_feature[record[r,1]] = np.outer(user_feature, app_feature).reshape(1, d) # x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) # if app_dict[a]==61: # val.append(0) # else: # val.append(1) # val.np.asarray(val) # x_t = x_feature # w =np.array(val.reshape(val.shape[1],1)) # [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) val = [] idx = [] for a in range(pool_size): #get all apps from the session data of one user if app[a, 0] in record[:, 1]: idx.append(a) x_feature[a] = app[a, 1:] x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) #get the user's feedback to one app feedback = record[np.where(record[:, 1] == app[a, 0])][:, 2] if 10 in feedback or 11 in feedback: val.append(1) else: val.append(0) val = np.asarray(val) print val idx = np.asarray(idx) x_t = x_feature[idx, :] w = np.array(val.reshape(val.shape[1], 1)) # print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) #test cnt = 0 result = [0] while cnt < 4000: i = random.randint(0, ts_idx.shape[0]) #for i in range(ts_idx.shape[0]): record = np.zeros(1) #u = np.zeros(1) try: record = data[np.where(data[:, 0] == ts_idx[i])] #u = user[np.where(user[:, 0] == record[0, 0])][0,1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = app[a, 1:] x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) # print "this is app "+str(a)+" UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] for ii in range(K): if expl[action[ii]] == 0: expl[action[ii]] = 1 # print expl reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: cnt = cnt + 1 idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) # print w [V, X, Y, theta, beta] = utils.update_stat(V, x_t, X, Y, w, lamb, delta, R) click_n = click_n + utils.get_reward(w) result.append((float(click_n) / cnt)) else: continue print >> logFile, "the reward is: %s" % result print >> logFile, "cnt is: %s" % cnt expl_n = sum(expl) expl_n_rate = float(expl_n) / pool_size print >> logFile, "expl_n is %s" % str(expl_n) print >> logFile, "expl_rate is %s" % str(expl_n_rate) logFile.close()
#train app = app[:, 1:] for i in range(tr_idx.shape[0]): record = np.zeros(1) u = np.zeros(1) try: record = data[np.where(data[:, 0] == tr_idx[i])] u = user[np.where(user[:, 0] == record[0, 0])][0, 1:] except IndexError: continue else: for a in range(pool_size): x_feature[a] = np.outer(u, app[a, :]).reshape(1, d) x_feature[a] = np.divide(x_feature[a], np.linalg.norm(x_feature[a])) UCB[a] = utils.getUCB(theta, x_feature[a], beta, V) print "this is app " + str(a) + " UCB is " + str(UCB[a]) action = UCB.argsort()[-K:][::-1] reward = match_app.match(record, action) idx = [] val = [] if reward is not None: for j in reward: if reward[j] == 1 or reward[j] == 0: idx.append(j) val.append(reward[j]) idx = np.asarray(idx) val = np.asarray(val) x_t = x_feature[idx, :] w = np.array(val.reshape(x_t.shape[0], 1)) print "this is w %s" % str(w)