Неотрицательная линейная задача для метода наименьших квадратов, основанная на решателе

Этот пример показов, как использовать несколько алгоритмов, чтобы решить линейный метод наименьших квадратов задачу с ограниченным ограничением, что решение неотрицательно. Линейный метод наименьших квадратов имеет вид

minxCx-d2.

В этом случае ограничьте решение неотрицательным, x0.

Чтобы начать, загрузите массивы C и d в рабочую область.

load particle

Просмотрите размер каждого массива.

sizec = size(C)
sizec = 1×2

        2000         400

sized = size(d)
sized = 1×2

        2000           1

The C матрица имеет 2000 строк и 400 столбцов. Поэтому, чтобы иметь правильный размер для матричного умножения, x вектор имеет 400 строк. Чтобы представлять ограничение неотрицательности, установите более низкие границы нуля для всех переменных.

lb = zeros(size(C,2),1);

Решите задачу, используя lsqlin.

[x,resnorm,residual,exitflag,output] = ...
    lsqlin(C,d,[],[],[],[],lb);
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.

Чтобы увидеть детали процесса оптимизации, исследуйте структуру output.

disp(output)
            message: '...'
          algorithm: 'interior-point'
      firstorderopt: 3.6717e-06
    constrviolation: 0
         iterations: 8
       linearsolver: 'sparse'
       cgiterations: []

Структура output показывает, что lsqlin использует разреженный внутренний линейный решатель для алгоритма внутренней точки и принимает 8 итераций, чтобы достичь меры оптимальности первого порядка около 3.7e-6.

Алгоритм Изменения

Алгоритм, отражающий доверительную область, обрабатывает связанные с ограничениями задачи. Посмотрите, насколько хорошо он работает над этой проблемой.

options = optimoptions('lsqlin','Algorithm','trust-region-reflective');
[x2,resnorm2,residual2,exitflag2,output2] = ...
    lsqlin(C,d,[],[],[],[],lb,[],[],options);
Local minimum possible.

lsqlin stopped because the relative change in function value is less than the square root of the function tolerance and the rate of change in the function value is slow.
disp(output2)
         iterations: 10
          algorithm: 'trust-region-reflective'
      firstorderopt: 2.7870e-05
       cgiterations: 42
    constrviolation: []
       linearsolver: []
            message: 'Local minimum possible....'

На этот раз решатель принимает больше итераций и достигает решения с более высокой (худшей) мерой оптимальности первого порядка.

Чтобы улучшить меру оптимальности первого порядка, попробуйте задать SubproblemAlgorithm опция для 'factorization'.

options.SubproblemAlgorithm = 'factorization';
[x3,resnorm3,residual3,exitflag3,output3] = ...
    lsqlin(C,d,[],[],[],[],lb,[],[],options);
Optimal solution found.
disp(output3)
         iterations: 12
          algorithm: 'trust-region-reflective'
      firstorderopt: 5.5907e-15
       cgiterations: 0
    constrviolation: []
       linearsolver: []
            message: 'Optimal solution found.'

Использование этой опции приводит меру оптимальности первого порядка почти к нулю, что является наилучшим возможным результатом.

Решатель изменений

Попробуйте решить задачу t с помощью lsqnonneg решатель, который предназначен для обработки неотрицательной линейной методом наименьших квадратов.

[x4,resnorm4,residual4,exitflag4,output4] = lsqnonneg(C,d);
disp(output4)
    iterations: 184
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lsqnonneg не сообщает меру оптимальности первого порядка. Вместо этого исследуйте нормы невязки. Чтобы увидеть цифры более низкой значимости, вычитайте 22.5794 из каждой нормы невязки.

t = table(resnorm - 22.5794, resnorm2 - 22.5794, resnorm3 - 22.5794, resnorm4 - 22.5794,...
    'VariableNames',{'default','trust-region-reflective','factorization','lsqnonneg'})
t=1×4 table
     default      trust-region-reflective    factorization    lsqnonneg 
    __________    _______________________    _____________    __________

    7.5411e-05          4.9186e-05            4.9179e-05      4.9179e-05

Значение по умолчанию lsqlin алгоритм имеет более высокую норму невязки, чем trust-region-reflective алгоритм. The factorization и lsqnonneg нормы невязки еще ниже и одинаковы на этом уровне точности отображения. Посмотрите, какая из них ниже.

disp(resnorm3 - resnorm4)
   6.7857e-13

The lsqnonneg норма невязки самая низкая на незначительную величину. Однако lsqnonneg принимает большинство итераций, чтобы сходиться.

См. также

|

Похожие темы