lsqnonneg

Решите неотрицательную линейную задачу наименьших квадратов

Решите неотрицательные проблемы аппроксимирования кривыми наименьших квадратов формы

minx‖C⋅x−d‖22, где x≥0.

Синтаксис

x = lsqnonneg(C,d)
x = lsqnonneg(C,d,options)
x = lsqnonneg(problem)
[x,resnorm,residual] = lsqnonneg(___)
[x,resnorm,residual,exitflag,output] = lsqnonneg(___)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___)

Описание

пример

x = lsqnonneg(C,d) возвращает векторный x, который минимизирует norm(C*x-d), подвергающийся   x ≥ 0. Аргументы C и d должны быть действительными.

пример

x = lsqnonneg(C,d,options) минимизирует с опциями оптимизации, заданными в структуре options. Используйте optimset, чтобы установить эти опции.

x = lsqnonneg(problem) находит минимум для problem, где problem является структурой.

пример

[x,resnorm,residual] = lsqnonneg(___), для любого предыдущего синтаксиса, дополнительно возвращает значение в квадрате с 2 нормами из невязки, norm(C*x-d)^2, и возвращает остаточный d-C*x.

[x,resnorm,residual,exitflag,output] = lsqnonneg(___) дополнительно возвращает значение exitflag, который описывает выходное условие lsqnonneg и структуру output с информацией о процессе оптимизации.

пример

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___) дополнительно возвращает Лагранжев вектор множителя lambda.

Примеры

свернуть все

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

Подготовьте матрицу C и вектор d для проблемы.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];
 
d = [0.8587
     0.1781
     0.0747
     0.8405];

Вычислите ограниченные и неограниченные решения.

x = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

xunc = C\d
xunc = 2×1

   -2.5627
    3.1108

Все записи в x являются неотрицательными, но некоторые записи в xunc отрицательны.

Вычислите нормы невязок для этих двух решений.

constrained_norm = norm(C*x - d)
constrained_norm = 0.9118
unconstrained_norm = norm(C*xunc - d)
unconstrained_norm = 0.6674

Неограниченное решение имеет меньшую остаточную норму, потому что ограничения могут только увеличить остаточную норму.

Установите опцию Display на 'final' видеть вывод, когда lsqnonneg закончится.

Создайте опции.

options = optimset('Display','final');

Подготовьте матрицу C и вектор d для проблемы.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Вызовите lsqnonneg со структурой опций.

x = lsqnonneg(C,d,options);
Optimization terminated.

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

Подготовьте матрицу C и вектор d для проблемы.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Получите решение и остаточную информацию.

 [x,resnorm,residual] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

Проверьте, что возвращенная остаточная норма является квадратом нормы возвращенного остаточного вектора.

 norm(residual)^2
ans = 0.8315

Запросите все выходные аргументы исследовать процесс решения и решения после того, как lsqnonneg закончится.

Подготовьте матрицу C и вектор d для проблемы.

C = [0.0372    0.2869
     0.6861    0.7071
     0.6233    0.6245
     0.6344    0.6170];

d = [0.8587
     0.1781
     0.0747
     0.8405];

Решите проблему, запросив все выходные аргументы.

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

exitflag = 1
output = struct with fields:
    iterations: 1
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lambda = 2×1

   -0.1506
   -0.0000

exitflag является 1, указывая на правильное решение.

x(1) = 0 и соответствующий lambda(1) 0, показывая правильную дуальность. Точно так же x(2) > 0 и соответствующий lambda(2) = 0.

Входные параметры

свернуть все

Линейный множитель, заданный как действительная матрица. Представляет переменную C в проблеме

minx‖C⋅x−d‖22, где x≥0.

Для совместимости количество строк C должно равняться длине d.

Пример: C = [1,2; 3,-1;-4,4]

Типы данных: double

Аддитивный термин, заданный как действительный вектор. Представляет переменную d в проблеме

minx‖C⋅x−d‖22, где x≥0.

Для совместимости длина d должна равняться количеству строк C.

Пример: d = [1;-6; 5]

Типы данных: double

Опции оптимизации, заданные как структура, такие как optimset, возвращаются. Можно использовать optimset, чтобы установить или изменить значения этих полей в структуре опций. Дополнительную информацию см. в Опциях Набора.

Отображение

Уровень отображения:

  • 'notify' (значение по умолчанию) отображает вывод, только если функция не сходится.

  • 'off' или 'none' не отображают вывода.

  • 'final' отображает просто окончательный вывод.

TolX

Допуск завершения на x, положительном скаляре. Значением по умолчанию является 10*eps*norm(C,1)*length(C). Смотрите Допуски и Критерий остановки.

Пример: опции = optimset ('Отображение', 'финал')

Типы данных: struct

Проблемная структура, заданная как структура со следующими полями.

Имя поляЗапись

C

Действительная матрица

d

Действительный вектор

solver

lsqnonneg

опции

Структура опций такой, как возвращено optimset

Самым простым способом получить структуру problem является к экспорту проблема из приложения Оптимизации.

Типы данных: struct

Выходные аргументы

свернуть все

Решение, возвращенное как действительный вектор. Длина x совпадает с длиной d.

Норма квадрата остатка, возвращенная как неотрицательный скаляр. Равный norm(C*x-d)^2.

Невязка, возвращенная как действительный вектор. Невязкой является   d - C*x.

Обоснуйте, что остановленный lsqnonneg, возвратился как целое число.

1

Функция сходилась к решению x.

0

Количество итераций превысило options.MaxIter.

Информация о процессе оптимизации, возвращенном как структура с полями:

iterations

Количество итераций взято

algorithm

'active-set'

сообщение

Выйдите из сообщения

Лагранжевы множители, возвращенные как действительный вектор. Записи удовлетворяют условие взаимозависимости x'*lambda = 0. Это означает lambda(i) < 0, когда x(i) является приблизительно 0, и lambda(i) является приблизительно 0 когда x(i) > 0.

Алгоритмы

lsqnonneg использует алгоритм, описанный в [1]. Алгоритм запускается с набора возможных базисных векторов и вычисляет связанный двойной векторный lambda. Это затем выбирает базисный вектор, соответствующий максимальному значению в lambda, чтобы подкачать его из основания в обмен на другого возможного кандидата. Это продолжается до   lambda ≤ 0.

Ссылки

[1] Лоусон, C. L. и Р. J. Хэнсон. Решение задач наименьших квадратов. Верхний Сэддл-Ривер, NJ: Prentice Hall. 1974. Глава 23, p. 161.

Расширенные возможности

Смотрите также

|

Представлено до R2006a

Была ли эта тема полезной?