1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
def MLE_Robins_Monro(self, theta, a_scaling, configuration):
edges_changes, reciprocity_changes, in_star_changes, out_star_changes, two_path_changes = np.array([]), np.array([]),np.array([]), np.array([]), np.array([])
triangle_t_change, triangle_c_change, triangle_u_change, triangle_d_change = np.array([]), np.array([]),np.array([]), np.array([])
sector_changes, geographic_changes, profit_changes = np.array([]) ,np.array([]), np.array([])
for k in range(1,self.initial_iteration):
sampling = self.Metropolis_Sampling(theta, Change_Statistics.StatisticMeasure.Network, configuration)
edges_changes = np.append(edges_changes,sampling[0])
reciprocity_changes = np.append(reciprocity_changes,sampling[1])
in_star_changes = np.append(in_star_changes,sampling[2])
out_star_changes = np.append(out_star_changes,sampling[3])
two_path_changes = np.append(two_path_changes,sampling[4])
triangle_t_change = np.append(triangle_t_change,sampling[5])
triangle_c_change = np.append(triangle_c_change,sampling[6])
triangle_u_change = np.append(triangle_u_change,sampling[7])
triangle_d_change = np.append(triangle_d_change,sampling[8])
sector_changes = np.append(sector_changes,sampling[9])
geographic_changes = np.append(geographic_changes,sampling[10])
profit_changes = np.append(profit_changes,sampling[11])
M = np.matrix([edges_changes,reciprocity_changes,in_star_changes, out_star_changes, two_path_changes,triangle_t_change, triangle_c_change, triangle_u_change, triangle_d_change,
sector_changes,geographic_changes,profit_changes])
D = np.cov(M)
invD = np.linalg.inv(D)
E = np.array([np.mean(edges_changes),np.mean(reciprocity_changes),np.mean(in_star_changes),np.mean(out_star_changes),np.mean(two_path_changes),np.mean(triangle_t_change),
np.mean(triangle_c_change),np.mean(triangle_u_change),np.mean(triangle_d_change),np.mean(sector_changes),np.mean(geographic_changes),np.mean(profit_changes)])
theta = theta - a_scaling*np.matmul(invD,E - configuration)
#burn-in loop
for m in range(1,self.burn_in):
sampling = self.Metropolis_Sampling(theta, Change_Statistics.StatisticMeasure.Network, configuration)
edges_changes, reciprocity_changes, in_star_changes, out_star_changes, two_path_changes = sampling[0], sampling[1],sampling[2], sampling[3], sampling[4]
triangle_t_change, triangle_c_change, triangle_u_change, triangle_d_change = sampling[5], sampling[6],sampling[7], sampling[8]
sector_changes, geographic_changes, profit_changes = sampling[9] ,sampling[10], sampling[11]
final_configuration = np.array([edges_changes,reciprocity_changes,in_star_changes, out_star_changes, two_path_changes,triangle_t_change, triangle_c_change, triangle_u_change,
triangle_d_change,sector_changes,geographic_changes,profit_changes])
theta = theta - a_scaling*np.matmul(invD,final_configuration - configuration)
r = 1
convergence_test = False
while convergence_test == False:
while r <= self.NR_subphases:
NR_max_iteration = (7+ self.number_variable)*2^(4*r/3) + 200
NR_min_iteration = (7+ self.number_variable)*2^(4*r/3)
past_configuration = configuration
for m in range(1,NR_max_iteration):
sampling = self.Metropolis_Sampling(theta, Change_Statistics.StatisticMeasure.Network, configuration)
edges_changes, reciprocity_changes, in_star_changes, out_star_changes, two_path_changes = sampling[0], sampling[1],sampling[2], sampling[3], sampling[4]
triangle_t_change, triangle_c_change, triangle_u_change, triangle_d_change = sampling[5], sampling[6],sampling[7], sampling[8]
sector_changes, geographic_changes, profit_changes = sampling[9] ,sampling[10], sampling[11]
final_configuration = np.array([edges_changes,reciprocity_changes,in_star_changes, out_star_changes, two_path_changes,triangle_t_change, triangle_c_change, triangle_u_change,
triangle_d_change,sector_changes,geographic_changes,profit_changes])
theta = theta - a_scaling*np.matmul(invD,final_configuration - configuration)
#print(theta)
if (np.mean(configuration)>np.mean(final_configuration)) and (np.mean(configuration)<np.mean(past_configuration)) and (m>NR_min_iteration):
break
past_configuration = final_configuration
r = r+1
a_scaling = a_scaling/2
edges_changes_test, reciprocity_changes_test, in_star_changes_test, out_star_changes_test, two_path_changes_test = np.array([]), np.array([]),np.array([]), np.array([]), np.array([])
triangle_t_change_test, triangle_c_change_test, triangle_u_change_test, triangle_d_change_test = np.array([]), np.array([]),np.array([]), np.array([])
sector_changes_test, geographic_changes_test, profit_changes_test = np.array([]) ,np.array([]), np.array([])
for k in range(1,self.convergence_iteration):
sampling = self.Metropolis_Sampling(theta, Change_Statistics.StatisticMeasure.Network, configuration)
edges_changes_test = np.append(edges_changes_test,sampling[0])
reciprocity_changes_test = np.append(reciprocity_changes_test,sampling[1])
in_star_changes_test = np.append(in_star_changes_test,sampling[2])
out_star_changes_test = np.append(out_star_changes_test,sampling[3])
two_path_changes_test = np.append(two_path_changes_test,sampling[4])
triangle_t_change_test = np.append(triangle_t_change_test,sampling[5])
triangle_c_change_test = np.append(triangle_c_change_test,sampling[6])
triangle_u_change_test = np.append(triangle_u_change_test,sampling[7])
triangle_d_change_test = np.append(triangle_d_change_test,sampling[8])
sector_changes_test = np.append(sector_changes_test,sampling[9])
geographic_changes_test = np.append(geographic_changes_test,sampling[10])
profit_changes_test = np.append(profit_changes_test,sampling[11])
M = np.matrix([edges_changes_test,reciprocity_changes_test,in_star_changes_test,out_star_changes_test,two_path_changes_test,triangle_t_change_test,
triangle_c_change_test,triangle_u_change_test,triangle_d_change_test,sector_changes_test,geographic_changes_test,profit_changes_test])
SD = np.sqrt(M.var())
E = np.mean(M)
convergence = (E-np.mean(configuration))/SD
if np.abs(convergence) < 0.11:
convergence_test = True
else:
r = r-1
a_scaling = 0.005
ntasks = 4
chunk_size = int(self.convergence_iteration/ntasks)
pool = multiprocessing.Pool()
results_async = []
for i in range(ntasks):
results_async.append(pool.apply_async(self.Metropolis_Sampling(theta, Change_Statistics.StatisticMeasure.Network, configuration), (chunk_size,)))
hits = np.array(r.get() for r in results_async)
print(hits)
return (theta,convergence) |