Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Mínimos cuadrados no negativos, basados en problemas

Este ejemplo muestra enfoques basados en problemas para resolver el problema

C*x = d

en el sentido de los mínimos cuadrados. Aquí y se dan matrices y es la matriz desconocida, y está restringido a ser no negativo.Cdxx En otras palabras,

Minimizarsum((C*x - d).^2)

sujeto a.x >= 0

Para empezar, cargue matrices y en el espacio de trabajo.Cd

load particle

Ver los tamaños de los arrays.

sizec = size(C)
sizec = 1×2

        2000         400

sized = size(d)
sized = 1×2

        2000           1

Cree una variable de optimización del tamaño adecuado para la multiplicación.xC Imponer un límite inferior de los elementos de.0x

x = optimvar('x',sizec(2),'LowerBound',0);

Cree la expresión de función objetiva.

residual = C*x - d; obj = sum(residual.^2);

Cree un problema de optimización llamado e incluya la función objetiva en el problema.nonneglsq

nonneglsq = optimproblem('Objective',obj);

Busque el solucionador predeterminado para el problema.

opts = optimoptions(nonneglsq)
opts =    lsqlin options:     Options used by current Algorithm ('interior-point'):    (Other available algorithms: 'trust-region-reflective')     Set properties:      No options set.     Default properties:               Algorithm: 'interior-point'     ConstraintTolerance: 1.0000e-08                 Display: 'final'            LinearSolver: 'auto'           MaxIterations: 200     OptimalityTolerance: 1.0000e-08           StepTolerance: 1.0000e-12     Show options not used by current Algorithm ('interior-point')  

Resuelva el problema con el solucionador predeterminado.

[sol,fval,exitflag] = solve(nonneglsq)
Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. 
sol = struct with fields:
    x: [400x1 double]

fval = 22.5795 
exitflag =      OptimalSolution  

El solucionador predeterminado, funcionó rápidamente.lsqlin Pero hay otros solucionadores que manejan los problemas de esta naturaleza. resuelve problemas de este tipo, como lo hace.lsqnonnegquadprog Prueba cada uno.

[sol2,fval2,exitflag2] = solve(nonneglsq,'Solver','lsqnonneg'); [sol3,fval3,exitflag3] = solve(nonneglsq,'Solver','quadprog');
Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. 

Examine las diez primeras entradas de cada solución.

solutions = table(sol.x(1:10),sol2.x(1:10),sol3.x(1:10),'VariableNames',{'lsqlin','lsqnonneg','quadprog'})
solutions=10×3 table
      lsqlin      lsqnonneg     quadprog 
    __________    _________    __________

      0.049416    0.049416       0.049416
      0.082985    0.082985       0.082985
      0.078469    0.078469       0.078469
       0.11682     0.11682        0.11682
       0.07165     0.07165        0.07165
      0.060525    0.060525       0.060525
    1.2196e-09           0     1.2196e-09
     2.703e-10           0      2.703e-10
    1.5017e-10           0     1.5017e-10
    1.2331e-10           0     1.2331e-10

Varias entradas parecen ser exactamente cero, mientras que las otras soluciones no son exactamente cero.lsqnonneg Por ejemplo, la octava entrada en cada solución es:

fprintf('The entries are %d, %d, and %d.\n',sol.x(8),sol2.x(8),sol3.x(8))
The entries are 2.702960e-10, 0, and 2.702960e-10. 

Tal vez el otro y el algoritmo sería un poco más preciso.quadproglsqlin

options = optimoptions('lsqlin','Algorithm','trust-region-reflective'); [sol,fval,exitflag] = solve(nonneglsq,'Solver','lsqlin','Options',options);
Local minimum possible.  lsqlin stopped because the relative change in function value is less than the function tolerance. 
disp(sol.x(8))
   2.2832e-15 
options = optimoptions('quadprog','Algorithm','trust-region-reflective'); [sol3,fval3,exitflag3] = solve(nonneglsq,'Solver','quadprog','Options',options);
Local minimum possible.  quadprog stopped because the relative change in function value is less than the sqrt of the function tolerance, the rate of change in the function value is slow, and no negative curvature was detected. 
disp(sol3.x(8))
   6.7615e-13 

Las soluciones están ligeramente más cerca de cero utilizando el algoritmo que los algoritmos de punto interior por defecto.'trust-region-reflective'

Temas relacionados