2016-04-28 2 views
1

Я использую fminsearch Метод Matlab для минимизации функции:Как разрешить fminsearch искать только целые числа?

c = cvpartition(200,'KFold',10); 
minfn = @(z)kfoldLoss(fitcsvm(cdata,grp,'CVPartition',c,... 
    'KernelFunction','rbf','BoxConstraint',exp(z(2)),... 
    'KernelScale',exp(z(1)))); 
opts = optimset('TolX',5e-4,'TolFun',5e-4); 
[searchmin fval] = fminsearch(minfn,randn(2,1),opts) 

Минимизация по двум параметрам.

Теперь я хотел бы, чтобы минимизировать третий параметр, но этот параметр может принимать только целые положительные значения, то есть 1,2,3, ...

Как я могу сказать, fminsearch рассматривать только целые положительные числа?

Во-вторых, если мой третий параметр инициализируется до 10, но его фактическое лучшее значение равно 100, fminsearch быстро сходится в таких случаях?

ответ

2

Вы не можете сообщить fminsearch, чтобы рассмотреть только целые числа. Используемый алгоритм не подходит для дискретной оптимизации, что в целом намного сложнее, чем непрерывная оптимизация.

Если для вашего целочисленного параметра (-ов) имеется относительно мало правдоподобных значений, вы можете просто перекрыть их все, но это может быть слишком дорого. Или вы можете подготовить свою собственную 1-мерную функцию дискретной оптимизации и вызвать ее для вызова значения fminsearch для каждого значения целочисленного параметра. (Например, вы могли бы подражать стандартным одномерным алгоритмом непрерывной оптимизации и просто вернуться, как только вы найдете значение параметра, которое, скажем, лучше, чем оба его соседа.) Вы вполне можете адаптировать эту функцию к конкретной проблеме вы пытаетесь решить.

+0

Отделить целое число от непрерывной задачи оптимизации кажется большим. Знаете ли вы другие процедуры дискретной оптимизации 1D или nD? – machinery

+0

Есть много. Независимо от того, будут ли они соответствовать вашим конкретным потребностям, я не знаю. Вы можете начать с, скажем, страницы [Wikipedia] (https://en.wikipedia.org/wiki/Discrete_optimization) по дискретной оптимизации. –

1

Как сказал @Gareth McCaughan, вы не можете сказать fminsearch, чтобы ограничить пространство поиска целыми числами. Если вы хотите найти решатели, которые могут справиться с этой проблемой, вы хотите найти «смешанное целочисленное программирование». Смешанное целое число для частичного непрерывного целочисленного программирования. И «программирование» - это жаргон для оптимизации (ужасно запутанное имя, но, как и клавиатура QWERTY, мы застряли с ним).

Помните, что это целочисленное программирование вообще NP-hard! Большие проблемы могут быть совершенно неразрешимыми.

0

В стороне, в которой я работал, я искал векторный индекс, который удовлетворяет условию . Вектор-индекс - это целое число. Обходной путь для fminsearch, который я сделал, был интерполяцией функции ошибки. Предположим, что fminsearch предлагает 5.1267 в качестве нового индекса. Затем я вычислил функцию ошибки для индексов 5 и 6 и дал интерполяцию обратно. Это привело к стабильным и удовлетворительным результатам.

[email protected]

 Смежные вопросы

  • Нет связанных вопросов^_^