qkgia / OLP-RPCA

Online Non-convex ℓp-norm based Robust PCA
MIT License
1 stars 0 forks source link

doesn't converge nicely? #1

Closed ghost closed 6 years ago

ghost commented 7 years ago

I saw your algorithm and tried to implement it for singing voice separation, basing myself on this framework here that uses RPCA: https://github.com/posenhuang/singingvoiceseparationrpca

I managed to make it work, but there seems to be a problem with the convergence.

For example, the above framework converges like so:

svd 1 r(A) 1 |E|_0 3793 stopCriterion 0.60764

svd 2 r(A) 1 |E|_0 11232 stopCriterion 0.38103

svd 3 r(A) 2 |E|_0 18770 stopCriterion 0.3114

svd 4 r(A) 5 |E|_0 34614 stopCriterion 0.2292

svd 5 r(A) 6 |E|_0 59132 stopCriterion 0.17137

svd 6 r(A) 13 |E|_0 93413 stopCriterion 0.12746

svd 7 r(A) 14 |E|_0 137827 stopCriterion 0.096347

svd 8 r(A) 26 |E|_0 199421 stopCriterion 0.071432

svd 9 r(A) 27 |E|_0 279301 stopCriterion 0.05258

svd 10 r(A) 48 |E|_0 386258 stopCriterion 0.037128

svd 11 r(A) 49 |E|_0 510472 stopCriterion 0.025737

svd 12 r(A) 75 |E|_0 652179 stopCriterion 0.017178

svd 13 r(A) 101 |E|_0 792653 stopCriterion 0.011

svd 14 r(A) 127 |E|_0 926794 stopCriterion 0.0069285

svd 15 r(A) 153 |E|_0 1048442 stopCriterion 0.0042441

svd 16 r(A) 179 |E|_0 1150908 stopCriterion 0.0025258

svd 17 r(A) 203 |E|_0 1229675 stopCriterion 0.0014821

svd 18 r(A) 220 |E|_0 1287725 stopCriterion 0.00087056

svd 19 r(A) 233 |E|_0 1329522 stopCriterion 0.00051671

svd 20 r(A) 242 |E|_0 1359715 stopCriterion 0.0003143

svd 21 r(A) 250 |E|_0 1381840 stopCriterion 0.00020072

svd 22 r(A) 255 |E|_0 1399396 stopCriterion 0.00013996

svd 23 r(A) 262 |E|_0 1418600 stopCriterion 0.00010511

svd 24 r(A) 266 |E|_0 1451709 stopCriterion 7.896e-05

svd 25 r(A) 272 |E|_0 1503676 stopCriterion 5.5009e-05

svd 26 r(A) 284 |E|_0 1561965 stopCriterion 3.4305e-05

svd 27 r(A) 293 |E|_0 1612167 stopCriterion 2.0438e-05

svd 28 r(A) 302 |E|_0 1651121 stopCriterion 1.1918e-05

svd 29 r(A) 309 |E|_0 1679130 stopCriterion 6.9242e-06

svd 30 r(A) 312 |E|_0 1698572 stopCriterion 4.04e-06

svd 31 r(A) 317 |E|_0 1711883 stopCriterion 2.365e-06

svd 32 r(A) 319 |E|_0 1720785 stopCriterion 1.3858e-06

svd 33 r(A) 321 |E|_0 1726094 stopCriterion 8.1867e-07

svd 34 r(A) 322 |E|_0 1729221 stopCriterion 4.85e-07

svd 35 r(A) 322 |E|_0 1730822 stopCriterion 2.9231e-07

svd 36 r(A) 322 |E|_0 1731616 stopCriterion 1.8024e-07

svd 37 r(A) 322 |E|_0 1731884 stopCriterion 1.1316e-07

svd 38 r(A) 322 |E|_0 1732006 stopCriterion 7.1357e-08

stops at iteration 38 in this example.

The problem in your framework is the convergence doesn't stop, and it always shows 1:

svd 1 r(A) 1 |E|_0 3437 stopCriterion 0.59698

svd 2 r(A) 1 |E|_0 3402 stopCriterion 0.47427

svd 3 r(A) 1 |E|_0 3402 stopCriterion 0.46594

svd 4 r(A) 1 |E|_0 3402 stopCriterion 0.46579

svd 5 r(A) 1 |E|_0 3402 stopCriterion 0.46574

svd 6 r(A) 1 |E|_0 3402 stopCriterion 0.46573

svd 7 r(A) 1 |E|_0 3402 stopCriterion 0.46573

svd 8 r(A) 1 |E|_0 4113 stopCriterion 0.49547

svd 9 r(A) 1 |E|_0 7524 stopCriterion 0.51422

svd 10 r(A) 1 |E|_0 14601 stopCriterion 0.45775

svd 11 r(A) 1 |E|_0 27366 stopCriterion 0.38711

svd 12 r(A) 1 |E|_0 48116 stopCriterion 0.31185

svd 13 r(A) 1 |E|_0 79464 stopCriterion 0.24355

svd 14 r(A) 1 |E|_0 122918 stopCriterion 0.18293

svd 15 r(A) 1 |E|_0 178534 stopCriterion 0.1334

svd 16 r(A) 1 |E|_0 248066 stopCriterion 0.096221

svd 17 r(A) 1 |E|_0 335173 stopCriterion 0.06919

svd 18 r(A) 1 |E|_0 442585 stopCriterion 0.050089

svd 19 r(A) 1 |E|_0 572411 stopCriterion 0.036618

svd 20 r(A) 1 |E|_0 715577 stopCriterion 0.027437

svd 21 r(A) 1 |E|_0 860662 stopCriterion 0.020809

svd 22 r(A) 1 |E|_0 977219 stopCriterion 0.015702

svd 23 r(A) 1 |E|_0 1072115 stopCriterion 0.010624

svd 24 r(A) 1 |E|_0 1160153 stopCriterion 0.0071855

svd 25 r(A) 1 |E|_0 1239728 stopCriterion 0.0050583

svd 26 r(A) 1 |E|_0 1307063 stopCriterion 0.003512

svd 27 r(A) 1 |E|_0 1362674 stopCriterion 0.0023725

svd 28 r(A) 1 |E|_0 1407706 stopCriterion 0.0015847

svd 29 r(A) 1 |E|_0 1443447 stopCriterion 0.0010511

svd 30 r(A) 1 |E|_0 1471956 stopCriterion 0.00069296

svd 31 r(A) 1 |E|_0 1494359 stopCriterion 0.00046334

svd 32 r(A) 1 |E|_0 1512571 stopCriterion 0.00031531

svd 33 r(A) 1 |E|_0 1528835 stopCriterion 0.0002254

svd 34 r(A) 1 |E|_0 1546749 stopCriterion 0.00017068

svd 35 r(A) 1 |E|_0 1571254 stopCriterion 0.00013673

svd 36 r(A) 1 |E|_0 1606670 stopCriterion 0.00011182

svd 37 r(A) 1 |E|_0 1655765 stopCriterion 8.9459e-05

svd 38 r(A) 1 |E|_0 1714910 stopCriterion 6.8998e-05

I can stop it manually by limiting iterations to for example 40, but the results are not exactly great. So there is a problem somewhere, I am not sure where. If you can maybe help me figure out why it keeps showing 1 instead of incremented values, maybe that is the problem? Thanks a lot!

qkgia commented 6 years ago

Hi, Thanks for your comments. I think you could play around with lambda and p. As I mentioned in my paper the formula in lambda works for images, but I am not sure about audio signal.

ghost commented 6 years ago

OK, thank you! This is solved now with recent update! :)