Tranvick

228

May 19th, 2015
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.31 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.9
  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.         print('%.15f' % r_norm)
  16.         while i < 100:
  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_dual_ = X.dot(X.T.dot(t * t * lambdas_)) - 1. + mu_ * t - v1_ + v2_
  25.             r_primal_ = lambdas_.dot(t)
  26.             r_center1_ = -1. / tau + v1_ * lambdas_
  27.             r_center2_ = 1. / tau + v2_ * (lambdas_ - C)
  28.            
  29.             r_norm_ = max(norm(r_dual_, np.inf), abs(r_primal_), norm(r_center1_, np.inf), norm(r_center2_, np.inf))
  30.             if r_norm_ < (1. - alpha * c1) * r_norm:
  31.                 return alpha
  32.             alpha *= beta
  33.         return alpha
  34.                
  35.     C = reg_coef
  36.     n, d = X.shape
  37.     c1, beta = bt_params
  38.  
  39.     #TXXT = t * t.reshape((-1, 1)) * X.dot(X.T)
  40.    
  41.     lambdas = np.zeros(n)
  42.     lambdas[t < 0] = C / 2. / sum(t < 0)
  43.     lambdas[t > 0] = C / 2. / sum(t > 0)
  44.     v1 = 1. / lambdas
  45.     v2 = 1. / (C - lambdas)
  46.     mu = 0.
  47.    
  48.     iteration = 0
  49.     tau = 1.
  50.     while iteration < max_iter:
  51.         iteration += 1
  52.         tau = 2. * n * min(1. / tol_gap, tau_param / (v1.dot(lambdas) + v2.dot(C - lambdas)))
  53.        
  54.         #r_dual = TXXT.dot(lambdas) - 1. + mu * t - v1 + v2
  55.         r_dual = X.dot(X.T.dot(t * t * lambdas)) - 1. + mu * t - v1 + v2
  56.         r_primal = lambdas.dot(t)
  57.         r_center1 = -1. / tau + v1 * lambdas
  58.         r_center2 = 1. / tau + v2 * (lambdas - C)
  59.         if norm(r_dual, np.inf) <= tol_feas and abs(r_primal) <= tol_feas and v1.dot(lambdas) + v2.dot(C - lambdas) <= tol_gap:
  60.             break
  61.         #A = np.bmat([
  62.         #    [TXXT + np.diag(v1 * 1. / lambdas - v2 * 1. / (lambdas - C)), t.reshape((-1, 1))],
  63.         #    [t.reshape((1, -1)), np.zeros((1, 1))],
  64.         #])
  65.         #B = -np.bmat([r_dual + np.diag(1. / lambdas).dot(r_center1) - np.diag(1. / (lambdas - C)).dot(r_center2), [r_primal]]).T
  66.         # D = np.array(solve(A, B)).reshape(-1)
  67.         #d_lambda = D[:n]
  68.         #d_mu = D[n]
  69.         #print(d_mu)
  70.        
  71.         #AA = np.diag(v1 * 1. / lambdas - v2 * 1. / (lambdas - C))
  72.         aainv = 1. / (v1 * 1. / lambdas - v2 * 1. / (lambdas - C))
  73.         #AAinv = np.diag(1. / (v1 * 1. / lambdas - v2 * 1. / (lambdas - C)))
  74.         #P = TXXT + AA
  75.         y = -(r_dual + r_center1 * 1. / lambdas - r_center2 * 1. / (lambdas - C))
  76.         y0 = r_primal
  77.        
  78.         #T = np.diag(t)
  79.         taat = lil_matrix((n,n))
  80.         taat.setdiag(t * aainv * t)
  81.        
  82.         y1 = (X.T).dot(t * aainv * y)
  83.         Ay2 = (X.T.dot(taat)).dot(X) + np.identity(d)
  84.         y2 = np.array(solve(Ay2, y1.T)).reshape(-1)
  85.         Pinvy = aainv * (y - t * X.dot(y2))
  86.        
  87.         t1 = (X.T).dot(t * aainv * t)
  88.         At2 = (X.T.dot(taat)).dot(X) + np.identity(d)
  89.         t2 = np.array(solve(At2, t1.T)).reshape(-1)
  90.         Pinvt = aainv * (t - t * X.dot(t2))
  91.        
  92.         d_lambda = Pinvy - Pinvt * (t.dot(Pinvy) - y0) / t.dot(Pinvt)
  93.         d_mu = (t.dot(Pinvy) - y0) / t.dot(Pinvt)
  94.        
  95.         d_v1 = -v1 * d_lambda * 1. / lambdas + (-v1 * lambdas + 1. / tau) / lambdas
  96.         d_v2 = -v2 * d_lambda * 1. / (lambdas - C) - (v2 * (lambdas - C) + 1. / tau) / (lambdas - C)
  97.         alpha = backtrack(lambdas, mu, v1, v2, r_dual, r_primal, r_center1, r_center2)
  98.         lambdas += alpha * d_lambda
  99.         mu += alpha * d_mu
  100.         v1 += alpha * d_v1
  101.         v2 += alpha * d_v2
Advertisement
Add Comment
Please, Sign In to add comment