Hi, I’m new to using CVX and have a question on a problem that I want to solve, but have no idea on how to type down so that CVX understands it. It’s fitting a convex quadratic form to a data set (x_i,y_i),\ i=1,...,N with x_i\in\mathbb{R^n}, y_i\in\mathbb{R}, i.e
where the variables are H\in S^n, \ f\in\mathbb{R}^n, \ r\in\mathbb{R} .
Specifically, I’m having a hard time figuring out how to handle the objective function. Any ideas?
cvx_begin sdp
variables f(n) r
variable H(n,n) symmetric
minimize(norm(sum(X.*(H*X))+X'*f+r-y))
H >= 0
cvx_end
sum(X.*(H*X)) is the same as diag(X'*H*X), but cheaper to compute. And avoiding a for loop on N is always a good thing, but both of these forms should be equivalent to this as well:
cvx_begin sdp
variables z(N) f(n) r
variable H(n,n) symmetric
for k = 1 : N
z(k) == x(:,k)'*H*x(:,k)+f'*x(:,k)+r-y(k)
end
minimize(norm(z))
H >= 0
cvx_end
These models all minimize the square root of the objective you have above, but it gives the same result; that is, the same values of H, f, and r. You can always use sum_square instead of norm, but I recommend against it.
Thanks, the help is much appreciated! And just FYI: the alternative with diag(X’HX) worked out nicely, the norm(sum(X.(HX))+X’*f+r-y), however didn’t work due to dimension mismatches. Just to be clear, in your description I interpret X as
X = [x_1, ..., x_N]
i.e. so that X\in \mathbb{R}^{n \times N}. The “looped” alternative failed (returned infeasible) for some reason.
Ah, it should be sum(X.*(H*X))'. Note the transpose. Sorry about that. Not sure why the equality constraint version would be infeasible, it’s internally going to be the same.