Tranvick

Untitled

May 19th, 2015
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.17 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.         print('%.15f' % r_norm)
  15.         i = 0
  16.         while i < 1000:
  17.             i += 1
  18.             lambdas_ = lambdas + alpha * d_lambda
  19.             mu_ = mu + alpha * d_mu
  20.             v1_ = v1 + alpha * d_v1
  21.             v2_ = v2 + alpha * d_v2
  22.            
  23.             r_dual_ = TXXT.dot(lambdas_) - 1. + mu_ * t - v1_ + v2_
  24.             r_primal_ = lambdas_.dot(t)
  25.             r_center1_ = -1. / tau + v1_ * lambdas_
  26.             r_center2_ = 1. / tau + v2_ * (lambdas_ - C)
  27.            
  28.             r_norm_ = max(norm(r_dual_, np.inf), abs(r_primal_), norm(r_center1_, np.inf), norm(r_center2_, np.inf))
  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 + np.diag(v1 * 1. / lambdas - v2 * 1. / (lambdas - C)), t.reshape((-1, 1))],
  60.             [t.reshape((1, -1)), np.zeros((1, 1))],
  61.         ])
  62.         B = -np.bmat([r_dual + np.diag(1. / lambdas).dot(r_center1) - np.diag(1. / (lambdas - C)).dot(r_center2), [r_primal]]).T
  63.         D = np.array(solve(A, B)).reshape(-1)
  64.         d_lambda = D[:n]
  65.         d_mu = D[n]
  66.         d_v1 = -v1 * d_lambda * 1. / lambdas + (-v1 * lambdas + 1. / tau) / lambdas
  67.         d_v2 = -v2 * d_lambda * 1. / (lambdas - C) - (v2 * (lambdas - C) + 1. / tau) / (lambdas - C)
  68.         alpha = backtrack(lambdas, mu, v1, v2, r_dual, r_primal, r_center1, r_center2)
  69.         if alpha is None:
  70.             print
  71.         lambdas += alpha * d_lambda
  72.         mu += alpha * d_mu
  73.         v1 += alpha * d_v1
  74.         v2 += alpha * d_v2
Advertisement
Add Comment
Please, Sign In to add comment