Tranvick

pd_ipm

May 18th, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.18 KB | None | 0 0
  1. def pd_ipm(X, t, reg_coef, max_iter=100, tol_feas=1e-10, tol_gap=1e-6, tau_param=10, bt_params=np.array([1e-4,0.8]), display=False):
  2.     def backtrack(lambdas, mu, v1, v2, r_dual, r_primal, r_center1, r_center2):
  3.         alpha = 1.
  4.         if np.any(d_lambda > 0):
  5.             alpha = min(alpha, min((C - lambdas[d_lambda > 0]) / d_lambda[d_lambda > 0]))
  6.         if np.any(d_lambda < 0):
  7.             alpha = min(alpha, min(-lambdas[d_lambda < 0] / d_lambda[d_lambda < 0]))
  8.         if np.any(d_v1 < 0):
  9.             alpha = min(alpha, min(-v1[d_v1 < 0] / d_v1[d_v1 < 0]))
  10.         if np.any(d_v2 < 0):
  11.             alpha = min(alpha, min(-v2[d_v2 < 0] / d_v2[d_v2 < 0]))
  12.         alpha *= 0.95
  13.         r_norm = max(norm(r_dual, np.inf), abs(r_primal), norm(r_center1, np.inf), norm(r_center2, np.inf))
  14.         i = 0
  15.         while i < 10:
  16.             i += 1
  17.             lambdas_ = lambdas + alpha * d_lambda
  18.             mu_ = mu + alpha * d_mu
  19.             v1_ = v1 + alpha * d_v1
  20.             v2_ = v2 + alpha * d_v2
  21.            
  22.             r_dual_ = TXXT.dot(lambdas_) - 1. + mu_ * t - v1_ + v2_
  23.             r_primal_ = lambdas_.dot(t)
  24.             r_center1_ = -1. / tau + v1_ * lambdas_
  25.             r_center2_ = 1. / tau + v2_ * (lambdas_ - C)
  26.            
  27.             r_norm_ = max(norm(r_dual_, np.inf), abs(r_primal_), norm(r_center1_, np.inf), norm(r_center2_, np.inf))
  28.             print('%d %f %.15f %.15f' % (i, alpha, r_norm, r_norm_))
  29.             if r_norm_ < (1. - alpha * c1) * r_norm:
  30.                 return alpha
  31.             alpha *= beta
  32.                
  33.     C = reg_coef
  34.     n, d = X.shape
  35.     c1, beta = bt_params
  36.  
  37.     TXXT = t * t.reshape((-1, 1)) * X.dot(X.T)
  38.    
  39.     lambdas = np.zeros(n)
  40.     lambdas[t < 0] = C / 2. / sum(t < 0)
  41.     lambdas[t > 0] = C / 2. / sum(t > 0)
  42.     v1 = 1. / lambdas
  43.     v2 = 1. / (C - lambdas)
  44.     mu = 0.
  45.    
  46.     iteration = 0
  47.     tau = 1.
  48.     while iteration < max_iter:
  49.         iteration += 1
  50.         tau = 2. * n * min(1. / tol_gap, tau_param / (v1.dot(lambdas) + v2.dot(C - lambdas)))
  51.        
  52.         r_dual = TXXT.dot(lambdas) - 1. + mu * t - v1 + v2
  53.         r_primal = lambdas.dot(t)
  54.         r_center1 = -1. / tau + v1 * lambdas
  55.         r_center2 = 1. / tau + v2 * (lambdas - C)
  56.         if norm(r_dual, np.inf) <= tol_feas and abs(r_primal) <= tol_feas and v1.dot(lambdas) + v2.dot(C - lambdas) <= tol_gap:
  57.             break
  58.         A = np.bmat([
  59.             [TXXT, t.reshape((-1, 1)), -np.identity(n), np.identity(n)],
  60.             [t.reshape((1, -1)), np.zeros((1, 1)), np.zeros((1, n)), np.zeros((1, n))],
  61.             [np.diag(v1), np.zeros((n, 1)), np.diag(lambdas), np.zeros((n, n))],
  62.             [np.diag(v2), np.zeros((n, 1)), np.zeros((n, n)), np.diag(lambdas - C)]
  63.         ])
  64.         B = -np.bmat([r_dual, [r_primal], r_center1, r_center2]).T
  65.         D = np.array(solve(A, B)).reshape(-1)
  66.         d_lambda = D[:n]
  67.         d_mu = D[n]
  68.         print(d_mu)
  69.         d_v1 = D[n + 1: 2 * n + 1]
  70.         d_v2 = D[2 * n + 1: ]
  71.         alpha = backtrack(lambdas, mu, v1, v2, r_dual, r_primal, r_center1, r_center2)
  72.         lambdas += alpha * d_lambda
  73.         mu += alpha * d_mu
  74.         v1 += alpha * d_v1
  75.         v2 += alpha * d_v2
Advertisement
Add Comment
Please, Sign In to add comment