2014-02-27 5 views
2

나는 nloptr을 R로 사용하고 있지만, 최상의 솔루션을 사용한 이후로 모델을 더 자유롭게하고 과잉 피하기를 원합니다. 나는 내 문제 이전 in this question 설명했다 : nloptr을 사용하여 최상의 솔루션 찾기

nloptr(x0, eval_f, eval_grad_f = NULL, lb = NULL, ub = NULL, 
     eval_g_ineq = NULL, eval_jac_g_ineq = NULL, eval_g_eq = NULL, 
     eval_jac_g_eq = NULL, opts = list(), ...) 

은 기본적으로 내가 해결하기 위해 비선형 문제가 있습니다. 나는 최소화 할 함수와 비선형 제약을 가지고있다. 하지만 샘플 데이터에 적합하고 극단적 인 가치를 제공하기 때문에 가장 잘 찾아낸 솔루션을 사용하고 싶지 않습니다. 그러므로 나는 최고의 솔루션을 찾고 원하는 것을 선택하고 싶다.

그래서 이제 최상의 솔루션을 찾는 방법이 궁금합니다. nloptr은 반복하는 동안 찾습니다. nloptr을 제외하고 다른 방법이 있습니까?

+0

"두 번째 최적의 솔루션"의 정의는 무엇입니까? 최소 최저 로컬 최소값은 아닌가? 또는 지구 전체에 가까운 점이 있지만 지역 최소 점에 가깝지는 않습니까? 다른 건 없니? 여기에는 엄격한 정의가 필요합니다. 나는 당신의 의도를 이해합니다. – tonytonov

+0

@tonytonov 제 경우에는별로 중요하지 않습니다. 시작 값보다 더 최적의 솔루션을 제공하는 솔루션 집합이 될 수 있습니다.내가'nloptr'가 최적의 것을 찾는 많은 반복을 거친다는 것을 알기 때문에, 나는 N 개의 가장 좋은 것들 (최종 솔루션에 가장 가까운 것들)을 취할 수 있는지 궁금해하고 있었다. 덕분에 – mm441

+1

그냥 옵션 : 임의의 시작 걸릴하고'opts' 조정 : 반복 횟수 또는 수렴 허용 오차를 제한, 당신은 가까운 (하지만) 바라건대 다른 솔루션을 얻을 것이다. – tonytonov

답변

2

이건 정말 답이 아니라 내가 도움이 될 것입니다 희망 긴 주석 아니다.

난 당신이 더 나은 "차선"당신의 일반적인 요구 사항을 정의해야 @tonytonov에 동의합니다. 관계없이 N 개의 서로 다른 솔루션을 얻으려면 서로 가깝지 않고 반복적으로 nloptr을 실행할 것입니다. 매번 약간 다른 목표 함수를 사용할 때마다 매번 이전 솔루션 근처에 페널티가 추가됩니다. 당신이 (당신이 그것에서 상대적으로 멀리 일단

sols = list() 
evalf= list(eval_f) 
for (i in 1:N) { 
    sols[i] = nloptr(x0,evalf[[i]],...) 
    # now creating a new evaluation function which adds a log(distance) penalty to the 
    # last solution 
    evalf[[i+1]] = function(x) {evalf[[i]](x)-log(sum((x-sols[i]$solution)^2))} 
} 

는 물론 다른 처벌 생각할 수

이 아이디어는 기존 솔루션에 가까운 것에 대해 큰 큰 벌금을 추가하는 것입니다 만, 예를 들면 다음과 같습니다 알아야 할 것, 이것은 충분히 구체적이라는 것입니다 - 문맥에 따라 다름) 페널티는 비교적 평평하므로 원래의 최소 점수에는 영향을 미치지 않습니다. 물론 마지막 솔루션이 존재하는지 확인하고 아마 한 반복에서 다른 반복으로 시작점 (x0)을 변경해야합니다.하지만 그 점을 알았습니다. 당신이 overfitting을 피하기 위해 시도로

더 일반적으로, 나는 처음에 당신의 eval 함수에 벌금을 추가하는 생각. 예를 들어, 회귀 분석에서 초과 적합하다는 신호는 계수의 크기이므로 회귀 추정을 결정할 때 오류의 제곱근 (일반적인 OLS 방법)이 아니라 오류의 제곱근을 최소화하는 것이 일반적입니다. 계수의 합계 (어떤 방식으로 정규화), 작은 계수에 대한 선호도를 생성하여 초과 피팅의 가능성을 줄입니다.

나는 당신의 특정 문제에 거의 알고 있지만 어쩌면 당신은 최소화 할 때 overfitting을 감소 일부 "처벌"기능을 가지고 올 수 있습니다. 당신의 eval_f 데이터에 의존하는 경우

또 다른 방법은, 동일한 평가 기능을하지만, 데이터의 부트 스트랩 부 표본에를 사용하는 것입니다. 다른 샘플 때문에 다른 최소값을 얻을 때마다 당신은 N 개의 그런 해를 얻고 평균을 구할 수 있습니다. 그렇지 않으면 overfitting되지 않는 해법을 생성하기를 원할 것입니다. (솔루션은 데이터의 다른 부분을 기반으로하기 때문에 데이터가 지나치게 적합하지 않습니다.)

도움이되기를 바랍니다.

+0

좋은 생각, 나는 말해야 해! – tonytonov

관련 문제