emnenmf.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. function [ T , RMSE , MERs ] = emnenmf( X, X_theo, W, F_theo, Omega_G, Omega_F, Phi_G, Phi_F, G, F, config)
  2. disp(['RMSE 2ème colonne de Ginit : ',num2str(norm(G(:,2) - X_theo(:,end),2)/sqrt(config.sceneWidth*config.sceneLength))])
  3. %% loading the config parameters
  4. Tmax = config.Tmax;
  5. delta_measure = config.delta_measure;
  6. InnerMinIter = config.InnerMinIter;
  7. InnerMaxIter = config.InnerMaxIter;
  8. M_loop = config.M_loop;
  9. %%
  10. X0 =X;
  11. Omega_G = (Omega_G == 1); % Logical mask is faster than indexing in matlab.
  12. Omega_F = (Omega_F == 1); % Logical mask is faster than indexing in matlab.
  13. nOmega_G = ~Omega_G; % Logical mask is faster than indexing in matlab.
  14. nOmega_F = ~Omega_F; % Logical mask is faster than indexing in matlab.
  15. num_sensor = config.numSensor;
  16. em_iter_max = round(Tmax / delta_measure) ;
  17. T = nan(1,em_iter_max);
  18. RMSE = nan(1+config.numSubSensor,em_iter_max);
  19. MERs = nan(1+config.numSubSensor,em_iter_max);
  20. X = G*F+W.*(X0-G*F);
  21. GG = G'*G;
  22. GX = G'*X;
  23. GradF = GG*F-GX;
  24. FF = F*F';
  25. XF = X*F';
  26. GradG = G*FF-XF;
  27. d = Grad_P([GradG',GradF],[G',F]);
  28. StoppingCritF = 1.e-3*d;
  29. StoppingCritG = StoppingCritF;
  30. tic
  31. i = 1;
  32. T(i) = toc;
  33. RMSE(:,i) = vecnorm(F(:,1:num_sensor)- F_theo(:,1:num_sensor),2,2)/sqrt(num_sensor);
  34. niter = 0;
  35. T_E = [];
  36. T_M = [];
  37. while toc<Tmax
  38. t_e = toc;
  39. X = G*F+W.*(X0-G*F);
  40. T_E = cat(1,T_E,toc - t_e);
  41. for j =1:M_loop
  42. t_m = toc;
  43. GG = G'*G;
  44. GX = G'*X-GG*Phi_F;
  45. F(Omega_F) = 0; % Convert F to \Delta F
  46. [ F , iterF ] = MaJ_F_EM_NeNMF( GG , GX , F , InnerMinIter , InnerMaxIter , StoppingCritF , nOmega_F); % Update \Delta F
  47. F(Omega_F) = Phi_F(Omega_F); % Convert \Delta F to F
  48. niter = niter + iterF;
  49. if(iterF<=InnerMinIter)
  50. StoppingCritF = 1.e-1*StoppingCritF;
  51. end
  52. FF = F*F';
  53. XF = X*F' - Phi_G*FF;
  54. G(Omega_G) = 0; % Convert G to \Delta G
  55. [ G , iterG ] = MaJ_G_EM_NeNMF( FF , XF , G , InnerMinIter , InnerMaxIter , StoppingCritG , nOmega_G); % Update \Delta G
  56. G(Omega_G) = Phi_G(Omega_G); % Convert \Delta G to G
  57. niter = niter + iterG;
  58. if(iterG<=InnerMinIter)
  59. StoppingCritG = 1.e-1*StoppingCritG;
  60. end
  61. if toc - i*delta_measure >= delta_measure
  62. i = i+1;
  63. if i > em_iter_max
  64. break
  65. end
  66. [MER,~]=bss_eval_mix(F_theo',F');
  67. MERs(:,i) = MER;
  68. T(i) = toc;
  69. RMSE(:,i) = vecnorm(F(:,1:num_sensor)- F_theo(:,1:num_sensor),2,2)/sqrt(num_sensor);
  70. end
  71. T_M = cat(1,T_M,toc - t_m);
  72. end
  73. end
  74. niter
  75. disp(['em E step : ',num2str(mean(T_E))])
  76. disp(['em M step : ',num2str(mean(T_M))])
  77. disp(['RMSE 2ème colonne de G : ',num2str(norm(G(:,2) - X_theo(:,end),2)/sqrt(config.sceneWidth*config.sceneLength))])
  78. end