forum.alglib.net http://forum.alglib.net/ |
|
High-dimensional QP problem yields unreliable results http://forum.alglib.net/viewtopic.php?f=2&t=3843 |
Page 1 of 1 |
Author: | zovnat [ Wed Mar 07, 2018 9:46 am ] |
Post subject: | High-dimensional QP problem yields unreliable results |
Hi, Numeric instability of problem? Double precision insufficient? Does AlgLib have a quadruple precision version? An SVM problem with 770 training points yields a 770-dimensional QP problem. Using DenseAU, with a variety of scaling factors - the problem converges - yet the solution to the QP problem doesn't provide a good solution to the SVM one. In addition, when reformulating the problem only with the training points for which the Lagarangian multipliers were non-zero (a great deal of them are, as expected, zero - the non-zero ones are points on the boundaries of two hyper-planes that separate the "1"s from the "-1" ones) - the solution comes out completely different... On the other hand, when taking a subset of the training points (every other point from a continuum of points - 385 points) - the QP problem converges and the sub-problem (with the points for which the Lagrangian multipliers were non-zero) provides nearly the exact same solution, and the sub-SVM problem is solved exactly - and the sub-solution nearly resolves the full SVM problem. Numeric instability of problem? Double precision insufficient? Does AlgLib have a quadruple precision version? Any suggestions would be appreciated... Thanks, Zev |
Author: | Sergey.Bochkanov [ Wed Mar 07, 2018 10:29 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Can you send your code to sergey.bochkanov at alglib dot net ? I will try to find out, whether it is problem of the solver - or something else. |
Author: | zovnat [ Tue Mar 13, 2018 11:33 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi, Providing the data is impossible with the 60K limit and no attachments... The AlgLib part of my application does nothing different than the demo code - see below. 'ir_svm' just creates the (symmetric) N-D Hessian and (N+1)-D constraints matrices etc. The constraints are: all Xi > 0 and sigma(Xi * Yi, i=1..N) = 0, where N, the number of training points, was at most 770 - but might need to be larger, Xi, i=1..N, are the LaGarange multipliers - and the QP unknowns, where Yi, i=1..N, are either 1 or -1 according to Ti being a 'true' or 'false' training point. Scales were set uniformly for all N - as 0.1, 1, 10, 100, 1000 - with no appreciable effect. No initial guess for Xi is available - so initialized with ones. The QP having converged successfully, W, defining the the M-dimensional (58) hyperplane separating the 'true' training points from the 'false' ones can be calculated - and a scalar b such that (1) <w . Ti> - b should be >= 1 for 'true' M-dimensional Training points and <w . Ti> - b should be <= -1 for 'false' Training points; <w . Ti> here is the inner product between the two M-dimensional vectors. The distance between the two sets of training points is 2 / ||W||. The result of the QP yields small but non-zero distance between the two sets - but the conditions (1) don't hold correctly - the training points for which the Lagrange multiplies came out identically zero full fill - not (1) - rather, in most cases, a weaker version (2) <w . Ti> - b should be >= f1 for 'true' Training points and <w . Ti> - b should be <= -f2 for 'false' Training points; where 0< f1 & f2 < 1 - and in isolated cases not even (2) holds... int _tmain(int argc, _TCHAR* argv[]) { try { double *pa, *pb, *pc, *ps, *px; int *pct; int N = ir_svm(&pa, &pb, &pc, &pct, &ps, &px); real_2d_array a; a.setcontent(N, N, pa); real_1d_array b; b.setcontent(N, pb); real_1d_array s; s.setcontent(N, ps); real_2d_array c; c.setcontent(N + 1, N + 1, pc); integer_1d_array ct; ct.setcontent(N + 1, pct); real_1d_array x; x.setcontent(N, px); minqpstate state; minqpreport rep; // create solver, set quadratic/linear terms minqpcreate(N, state); minqpsetquadraticterm(state, a); minqpsetlinearterm(state, b); minqpsetlc(state, c, ct); // NOTE: for convex problems you may try using minqpsetscaleautodiag() // which automatically determines variable scales. minqpsetscale(state, s); // // Solve problem with BLEIC-based QP solver. // // This solver is intended for problems with moderate (up to 50) number // of general linear constraints and unlimited number of box constraints. // // Default stopping criteria are used. // //minqpsetalgobleic(state, 0.0, 0.0, 0.0, 0); minqpsetalgodenseaul(state, 1.0e-15, 5.0e+4, 10); minqpoptimize(state); minqpresults(state, x, rep); printf("inneriterationscount %u\n" "ncholesky %u, nmv %u\n" "outeriterationscount %u\n" "terminationtype %d\n" , rep.inneriterationscount, rep.ncholesky, rep.nmv, rep.outeriterationscount, rep.terminationtype); } catch(ap_error) { printf("Exception!\n"); getchar(); } return 0; } |
Author: | zovnat [ Wed Mar 14, 2018 10:32 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi, Here is an SVM problem with 8 training points - 4 'true' and 4 'false' that gets formulated as the following QP problem: Hessian (A) 0 1 2 3 4 5 6 7 0 9008.04 8692.77 6441.76 5085.08 -6532.93 -6773.31 -7054.06 -7549.81 1 8692.77 8406.34 6238.24 4929.02 -6087.81 -6389.49 -6718.46 -7243.83 2 6441.76 6238.24 4639.70 3671.38 -4409.45 -4668.51 -4938.08 -5348.06 3 5085.08 4929.02 3671.38 2918.12 -3363.90 -3608.07 -3826.17 -4142.27 4 -6532.93 -6087.81 -4409.45 -3363.90 8897.43 7848.32 7156.12 6844.05 5 -6773.31 -6389.49 -4668.51 -3608.07 7848.32 7433.34 7016.67 6873.04 6 -7054.06 -6718.46 -4938.08 -3826.17 7156.12 7016.67 6897.34 7022.35 7 -7549.81 -7243.83 -5348.06 -4142.27 6844.05 6873.04 7022.35 7418.02 Constraints (C) + (CT) alpha0 alpha1 alpha2 alpha3 alpha4 alpha5 alpha6 alpha7 right side type 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 2 0 0 1 0 0 0 0 0 0 1 3 0 0 0 1 0 0 0 0 0 1 4 0 0 0 0 1 0 0 0 0 1 5 0 0 0 0 0 1 0 0 0 1 6 0 0 0 0 0 0 1 0 0 1 7 0 0 0 0 0 0 0 1 0 1 8 1 1 1 1 -1 -1 -1 -1 0 0 For such a small problem one might expect to get a more exact SVM solution than: <Yi> <W . Ti> - b SVM Decision 0 1 1.123992 1 1 1 1.200366 1 2 1 1.123993 1 3 1 1.183616 1 4 -1 -1.579777 -1 5 -1 -1.197507 -1 6 -1 -0.978675 -1 7 -1 -0.876008 -1 where, as described in the previous post, W & b define the separating hyperplane. It is expected that <W.Ti> - b should have exact 1 and -1 results for some of the training points (those defining the region boundaries - those for which the LaGrange multipliers came out non zero). Not only does this not occur with reasonable accuracy - but for the 'false' points we have values greater than -1... This result persists even with hundreds of iterations and various scalings - here globally 1.e4 . Does this QP problem look so inherently unstable as to yield such disappointing results? Increasing the number of training points and things get much worse - complete rubbish for 685 points (although the QP problem converges)... Zev PS. your patience and interest in this issue is greatly appreciated - thanks! |
Author: | Sergey.Bochkanov [ Thu Mar 15, 2018 10:41 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi! Thank you for providing such short and easy to debug example! I've started investigating the problem, will report as soon as first results are available! |
Author: | Sergey.Bochkanov [ Thu Mar 15, 2018 10:48 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
BTW, can you report also exact values of dataset points? There are only 8 ones, it should be easy to post. If dimension count is too large, you can send data file to sergey.bochkanov at alglib dot net |
Author: | zovnat [ Thu Mar 15, 2018 11:38 am ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi, I found a mathematical bug in my implementation. Now, I get exact 1/-1 <W.Ti> - b values for the support vectors for the 8-D problem... But for a 600-D+ problem - not... I will increase dimensionality and see for which N things go wrong. Thanks for your help & patience. Zev |
Author: | Sergey.Bochkanov [ Thu Mar 15, 2018 12:23 pm ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi! I noticed that you specified non-negativity constraints as general linear ones, with minqpsetlc() call. Thus, you have N+1 general linear constraint. However, it is suboptimal from both performance and precision points of view. Box constraints are handled in a special way, much faster and precisely than general linear ones. I recommend you to split your constraint into box constrained part, set by minqpsetbc() call, and general linear one - just one linear constraint set with minqpsetlc() function. You will get much better performance and precision. Another suggestion is to set non-zero lambda coefficient for the SVM problem. |
Author: | zovnat [ Thu Mar 15, 2018 1:03 pm ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
Hi, Thanks for the suggestions. - How can I use box constraints for the N "Xi >= 0"? I'll have to guess what upper boundaries to specify... - I'm not familiar with the "non-zero lambda coefficient" - I'll look into it... BTW, with my current formulation, the <W.Ti> - b holds with great precision for the support vectors up to N=150; for N=186 I get the expected +1/-1 only with a precision of 2 decimal places - and thereafter things diverge... Zev |
Author: | Sergey.Bochkanov [ Fri Mar 16, 2018 2:37 pm ] |
Post subject: | Re: High-dimensional QP problem yields unreliable results |
You can specify +INF as upper bound, ALGLIB will correctly handle signed infinities in the boundary values. Or just 1.0e20, if you want so. |
Page 1 of 1 | All times are UTC |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |