exponenta event banner

lsqnonneg

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

Описание

Решение неотрицательных задач подгонки кривой наименьших квадратов формы

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

Примечание

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 вектор для задачи min | | Cx-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 вектор для задачи min | | Cx-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 вектор для задачи min | | Cx-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 вектор для задачи min | | Cx-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‖Cx−d‖22.

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

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

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

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

minx‖Cx−d‖22.

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

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

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

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

Display

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

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

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

  • 'final' отображает только окончательный результат.

TolX

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

Пример: options = optimset('Display','final')

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

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

Имя поляВход

C

Реальная матрица

d

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

solver

'lsqnonneg'

options

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

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

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

свернуть все

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

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

Остаточный, возвращенный как реальный вектор. Остаток равен d - C*x.

Причина lsqnonneg остановлено, возвращено как целое число.

1

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

0

Превышено число итераций options.MaxIter.

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

iterations

Количество выполненных итераций

algorithm

'active-set'

message

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

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

Совет

  • Для проблем, где d имеет длину более 20, lsqlin может быть быстрее, чем lsqnonneg. Когда d имеет длину менее 20, lsqnonneg как правило, является более эффективным.

    Преобразование между решателями при C имеет больше строк, чем столбцов (что означает, что система переопределена),

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

    эквивалентно

    [m,n] = size(C);
    [x,resnorm,residual,exitflag,output,lambda_lsqlin] = ...
       lsqlin(C,d,-eye(n,n),zeros(n,1));

    Единственное отличие состоит в том, что соответствующие множители Лагранжа имеют противоположные знаки: lambda = -lambda_lsqlin.ineqlin.

Алгоритмы

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

Альтернативная функциональность

Приложение

Задача «Оптимизировать интерактивный редактор» обеспечивает визуальный интерфейс для lsqnonneg.

Ссылки

[1] Лоусон, C. L. и Р. Дж. Хэнсон. Решение задач наименьших квадратов. Река Верхнее Седло, Нью-Джерси: Прентис Холл. 1974. Глава 23, стр. 161.

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

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