2015-08-14 4 views
1

Предположим, что f (k) = exp (k/200) - 1 и мы хотим минимизировать (f (a) + f (b) + f (c) + f (d) - pi)^2. Решение должно быть a = 6, b = 75, c = 89, d = 226. Сумма квадратов для этого решения составляет ~ 8e-17.Оптимизация в R - недостаточно точно

sumsq <- function(theta, n=200) { 
    f <- function(k) exp(k/n) - 1 
    (f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2 
} 
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq) 
# theta$par = 62.97 106.89, 78.64, 189.82 
# theta$value = 6.32e-10 
# sumsq(c(6,75,89,226)) = 8.20e-17 

Итак, ясно, решение а = 6, б = 75, С = 89, D = 226 лучше, чем того, который дал Optim функции путем сравнения суммы квадратов. Я хотел бы знать, как сделать R более точным с его методикой оптимизации. Я также пробовал функцию nlm() без успеха.

Значения пи используемого +3,1415926535897931 - Я думаю, что точность пи не является причиной, почему Optim функция не производит оптимальное решения

+0

Я не очень беспокоюсь об этой конкретной проблеме, но о том, как повысить точность методов оптимизации R в целом – nathanesau

+2

R считает, что эти числа не отличаются: 'all.equal (theta $ value, sumsq (c (6) , 75,89,226))) 'и равны нулю' all.equal (theta $ value, 0) '. Можете ли вы масштабировать функцию, чтобы сделать различия более очевидными для численного решения? – MrFlick

+6

Я бы предположил, что проблема имеет несколько решений. Я подозреваю, что если вы возьмете разные стартовые условия, вы найдете другой минимум. Это было бы характерно для задач численной оптимизации и не связано с R. – RHertel

ответ

2

Как говорят комментаторы, это не проблема точность optim, а скорее то, что алгоритм, используемый optim, может не подходить для вашей конкретной проблемы. Есть very many пакеты оптимизации и интерфейсы, доступные в R; У меня были хорошие результаты, используя пакет rgenoud, чтобы улучшить оценки параметров на основе правдоподобия с помощью пакетов fitdist (по моему мнению, по умолчанию используется optim).

Другой вопрос, конечно же, в том, действительно ли проблема, которую вы создаете, имеет глобальный минимум, который отличается от других локальных минимумов в пределах численного допуска, который вы можете указать/R может обнаружить. 6.32e-10 и 8.20e-17 являются довольно маленькими и далеко за пределами числовых допусков, которые я считаю приемлемыми в своей работе ... но я не знаю о вашей области.

+0

OK thanks - я постараюсь решить проблему как решение. Я понял, что оптимизационная функция, использующая метод BFGS, может дать лучшую оптимизацию, чем то, что я использовал раньше. Поэтому я считаю, что вы правы - возможно, оптимизм не подходит для моей конкретной проблемы. – nathanesau

1

я использовал метод "BFGS":

sumsq <- function(theta, n=200) { 
    f <- function(k) exp(k/n) - 1 
    (f(theta[1]) + f(theta[2]) + f(theta[3]) + f(theta[4]) - pi)^2 
} 
theta <- optim(par=c(10, 90, 70, 300), fn=sumsq, method="BFGS") 

Посмотрите на результат:

> theta 
$par 
[1] -2.629695 71.159586 52.952260 246.174513 

$value 
[1] 4.009243e-22 

$counts 
function gradient 
     19  8 

$convergence 
[1] 0 
+0

ОК спасибо. Полезно знать, что оптимист действительно дает более точные решения, когда используются другие методы. Фактически, мое решение было только самым точным над целыми числами. – nathanesau

2

Это не корректная задача минимизации. Существует бесконечное количество возможных решений. Одним из них является

a=b=c=d=200*log(1+pi/4) 

численно примерно

115.92829021682383 

Остаточный sumsq в этом случае равна нулю (в пределах численной точности), если вы вставляете число.

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

+0

Да, я согласен, теперь я понимаю, что этот вопрос следовало бы задать в другом месте. – nathanesau

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