aboutsummaryrefslogtreecommitdiffstats
path: root/jpa_test/convex_optimization.py
diff options
context:
space:
mode:
authorjeanpouget-abadie <jean.pougetabadie@gmail.com>2014-12-01 21:14:27 -0500
committerjeanpouget-abadie <jean.pougetabadie@gmail.com>2014-12-01 21:14:27 -0500
commitf8678b1b37f9136814be0197aabf32831d0c013e (patch)
treed46e76b4b379ab9a88ad999ec124b1b93e204a79 /jpa_test/convex_optimization.py
parentb1a6d4397bd1dc784a68987fc645eabe2bbcc8ec (diff)
downloadcascades-f8678b1b37f9136814be0197aabf32831d0c013e.tar.gz
rip_condition
Diffstat (limited to 'jpa_test/convex_optimization.py')
-rw-r--r--jpa_test/convex_optimization.py45
1 files changed, 43 insertions, 2 deletions
diff --git a/jpa_test/convex_optimization.py b/jpa_test/convex_optimization.py
index e83c605..dd93b05 100644
--- a/jpa_test/convex_optimization.py
+++ b/jpa_test/convex_optimization.py
@@ -5,7 +5,7 @@ import cvxopt
-def l1regls(M_val, w_val):
+def l1obj_l2constraint(M_val, w_val):
"""
Solves:
min - sum_j theta_j
@@ -46,13 +46,54 @@ def l1regls(M_val, w_val):
return cvxopt.solvers.cpl(c,F, G, h)['x']
+def l1obj_l2regl(M_val, w_val, lbda):
+ """
+ Solves:
+ min - sum_j theta_j + lbda * |e^{M*theta} - (1 - w)|_2
+ s.t theta_j <= 0
+ """
+ #TODO!!!!!!!
+ m, n = M_val.shape
+ c = cvxopt.matrix(-1.0, (n,1))
+
+ theta = tensor.row().T
+ z = tensor.row().T
+ theta_ = theta.flatten()
+ z_ = z.flatten()
+ M = theano.shared(M_val.astype(theano.config.floatX))
+ w = theano.shared(w_val.astype(theano.config.floatX))
+ y = (tensor.exp(M.dot(theta_)) - (1 - w)).norm(2) - 1
+ y_diff = tensor.grad(y, theta_)
+ y_hess = z[0] * theano.gradient.hessian(y, theta_)
+ f_x = theano.function([theta], [y, y_diff], allow_input_downcast=True)
+ f_xz = theano.function([theta, z], [y, y_diff, y_hess], allow_input_downcast=True)
+
+ def F(x=None, z=None):
+ if x is None:
+ return 1, cvxopt.matrix(1.0, (n,1))
+ elif z is None:
+ y, y_diff = f_x(x)
+ return cvxopt.matrix(float(y), (1, 1)),\
+ cvxopt.matrix(y_diff.astype("float64")).T
+ else:
+ y, y_diff, y_hess = f_xz(x, z)
+ return cvxopt.matrix(float(y), (1, 1)), \
+ cvxopt.matrix(y_diff.astype("float64")).T, \
+ cvxopt.matrix(y_hess.astype("float64"))
+
+ G = cvxopt.spdiag([1 for i in xrange(n)])
+ h = cvxopt.matrix(0.0, (n,1))
+
+ return cvxopt.solvers.cpl(c,F, G, h)['x']
+
+
def test():
"""
unit test
"""
M_val = np.random.rand(100, 20)
w_val = np.random.rand(100)
- print l1regls(M_val, w_val)
+ print l1obj_l2regl(M_val, w_val, 1)
if __name__=="__main__":
test()