안녕하세요 여러분,
대형 모델의 평균 제곱 오차를 최소화하는 두 개 이상의 변수 값을 얻기 위해 JSL의 최소화 기능을 사용하려고 합니다. 어떤 값으로 수렴해야 하는지 알더라도(시행 착오를 통해) 수렴할 수 없습니다.
내가 사용한 기본 구문은 다음과 같습니다.
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>다른 메시지를 시도했지만 아무 것도 변경되지 않습니다.
여기서 목표는 다음과 같이 평가된 표현식의 시퀀스인 min_test 표현식을 최소화하는 kD 및 wshc의 값을 찾는 것입니다.
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
변경된 kD 및 wshc 값은 "light" 및 "parafile" 표현식을 수정한 다음 프로그램 실행 파일(runprg 표현식에서)을 실행합니다. 그 결과는 조작되고 평균 제곱 오류(MSE)는 마지막 항목입니다. SSE2 표현식에서 평가됩니다. 맥락에 따라 "runprg" 표현식은 호수의 열 변화를 시뮬레이션하는 독립 실행형 실행 파일에 생성된 여러 파일을 제출합니다. "runprg" 표현식의 각 패스에는 약 10~20초의 컴퓨팅이 필요하며 그 결과는 JSL에서 다시 수집되어 MSE를 계산합니다.
프로세스 자체는 각 단계에서 목적함수 값을 정확하게 읽고, 매개변수의 값을 표현식에 올바르게 전달한다는 점에서 제대로 작동하는 것 같습니다. 문제는 알고리즘이 kD 및 wshc 매개변수를 내가 제공한 초기 값에 비해 너무 약간(소수점 다섯 번째 자리에서만) "이동"하여 수렴하지 못한다는 것입니다. 예를 들어, 각각 0.8과 0.5의 초기 값으로 시작하면 일반적으로 다음과 같은 결과를 얻게 됩니다.
0.8
0.49999945654133
다음 반복에서는 결과 MSE에 큰 영향을 미치지 않습니다. 최소화 함수에 지정한 매개변수 범위를 사용하면 매개변수가 이동할 수 있는 공간이 충분합니다. 나는 내 사례가 일반적인 단순 미분 함수와는 거리가 멀다는 것을 이해합니다. 그러나 다른 매개변수 값을 사용하여 프로그램을 "수동으로" 실행함으로써 목적 함수가 매개변수와 관련하여 상당히 볼록하다는 것을 알고 있으므로 특히 <
이 상황에서 도움이 될 수 있는 해결 방법을 제안해 주시겠습니까?
미리 감사드립니다. 이브
이것은 실제로 내 영역은 아니지만 작동해야 할 것 같습니다. 여기 내 테스트 JSL이 있습니다.
aa = expr(
Show( "evaluating", Char( a, 19, 16 ), Char( b, 19, 16 ) ); // peek inside
(a - 10) ^ 2 + (b - 11) ^ 2 // the function, roots at 10 and 11
);
min_test = Expr( Eval( aa ) );
a = 33; // initial guesses
b = -55; // (not very good)
minfun = Minimize(
min_test,
{a( -100, 100 ), b( -100, 100 )},
<<DETAILS></DETAILS>
여기 로그가 있습니다. 첫 번째 *실제* 추측에서는 거의 완벽한 답을 얻은 것처럼 보이지만 정확히 동일한 초기 잘못된 추측으로 여러 호출이 이루어진 것은 이상해 보입니다.
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000005066394806";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "32.9999994933605194";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-54.999999165534973";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000000834465027";
"evaluating";
Char(a, 19, 16) = "33.0002058854513791";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "32.9997941145486209";
Char(b, 19, 16) = "-55.000000000000000";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-54.999660894550665";
"evaluating";
Char(a, 19, 16) = "33.0000000000000000";
Char(b, 19, 16) = "-55.000339105449335";
"evaluating";
Char(a, 19, 16) = "33.0003391054493349";
Char(b, 19, 16) = "-54.999660894550665";
"evaluating";
Char(a, 19, 16) = "32.9996608945506651";
Char(b, 19, 16) = "-54.999660894550665";
"evaluating";
Char(a, 19, 16) = "33.0003391054493349";
Char(b, 19, 16) = "-55.000339105449335";
"evaluating";
Char(a, 19, 16) = "32.9996608945506651";
Char(b, 19, 16) = "-55.000339105449335";
nParm=2 SR1 ******************************************************
Iter nFree Objective RelGrad NormGrad2 Ridge nObj nGrad nHess Parm0 Parm1
0 2 4885 9770 9770 0 1 1 1 33 -55
"evaluating";
Char(a, 19, 16) = "9.9999350076876112";
Char(b, 19, 16) = "11.0000734771922168";
"evaluating";
Char(a, 19, 16) = "9.9999351715994163";
Char(b, 19, 16) = "11.0000734771922168";
"evaluating";
Char(a, 19, 16) = "9.9999348437758062";
Char(b, 19, 16) = "11.0000734771922168";
"evaluating";
Char(a, 19, 16) = "9.9999350076876112";
Char(b, 19, 16) = "11.0000736560072454";
"evaluating";
Char(a, 19, 16) = "9.9999350076876112";
Char(b, 19, 16) = "11.0000732983771883";
1 2 9.623e-9 0.006344 1.925e-8 0 1 1 0 9.999935 11.00007
"evaluating";
Char(a, 19, 16) = "9.9999999999733351";
Char(b, 19, 16) = "10.9999999999907079";
"evaluating";
Char(a, 19, 16) = "10.0000001638861082";
Char(b, 19, 16) = "10.9999999999907079";
"evaluating";
Char(a, 19, 16) = "9.9999998360605620";
Char(b, 19, 16) = "10.9999999999907079";
"evaluating";
Char(a, 19, 16) = "9.9999999999733351";
Char(b, 19, 16) = "11.0000001788046422";
"evaluating";
Char(a, 19, 16) = "9.9999999999733351";
Char(b, 19, 16) = "10.9999998211767736";
2 2 7.97e-22 2.42e-15 1.59e-21 0 1 1 0 10 11
Convergence SUCCESS: Gradient
Time: 0
"evaluating";
Char(a, 19, 16) = "9.9999999999733351";
Char(b, 19, 16) = "10.9999999999907079";
minfun = 7.97360035815878e-22;
a = 9.99999999997334;
b = 10.9999999999907;
10~20초 함수에 대해 27번의 호출이 예상되는 것 같습니다.
알고리즘이 동일한 입력에 대해 동일한 답변을 생성합니까, 아니면 무작위 구성 요소가 있습니까? 그러면 차이가 생길 수 있습니다.
매우 흥미로운 크레이지. 나는 귀하의 접근 방식을 취하고 그것이 실행되는 동안 값을 최고점에 도달했습니다. 이 예에서 초기 값은 각각 0.8 과 0.5 입니다.
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>두 번째 반복은 이것을 산출합니다
/*:2 2 44.86266 210.178 0.080004 128 12 1 0 0.799999 0.50001
그리고 3번째
/*:3 2 45.33956 0 0.080004 4096 16 0 0 0.799999 0.50001
그리고 그것은 반복 2보다 더 나은 결과를 얻을 수 없으므로 거기서 멈춥니다. 여기서 가장 좋은 목적 함수 값은 44.86 입니다.
그러나 알고리즘에 "수동으로" 매개변수 값 0.52와 1.13을 각각 제공하면 목적 함수(MSE)는 약 6.8이 되어 위의 결과보다 훨씬 좋습니다. 내가 생각할 수 있는 유일한 것은 초기 값에 매우 지역적인 최소값이 있다는 것입니다. 그러나 초기 값이 무엇이든 상관없이 동일한 종류의 결과를 얻기 때문에 그럴 가능성은 거의 없습니다...
예제를 직접 실행할 수 없으면 무슨 일이 일어나고 있는지 정확히 말하기는 어렵지만 시도해 볼 수 있는 두 가지 다른 접근 방식이 있습니다.첫 번째는 제한된 최소화 선형 제약 없이 함수를 작동합니다.과는 다른 방식을 사용합니다. 최소화하다 기능을 수행하므로 도움이 될 수 있습니다. 따라서 Craige의 예에서 다음과 같은 작업을 수행할 수 있습니다.
aa = expr(
Show( "evaluating", Char( a, 19, 16 ), Char( b, 19, 16 ) ); // peek inside
(a - 10) ^ 2 + (b - 11) ^ 2 // the function, roots at 10 and 11
);
min_test = Expr( Eval( aa ) );
minFun =
Constrained Minimize(
min_test,
{a( -100, 100 ), b( -100, 100 )},
<<StartingValues( [0, 0] ), <<show details(true)
);
Eval List( {a, b, minFun} );
또는 시도해 볼 수 있는 또 다른 접근 방식은 작은 데이터 테이블을 만들고 프로파일러를 사용하여 최적화를 수행하는 것입니다.이것이 귀하의 공식에 얼마나 잘 적용되는지 잘 모르겠지만 Craige의 예와 어떻게 적용되는지에 대한 예를 첨부하겠습니다. 프로파일러에서 기능을 최적화하면 얻을 수 있는 솔루션의 그림은 다음과 같습니다.

데이터 테이블에 연결된 첫 번째 스크립트를 실행하면 최적화 전에 프로파일러가 시작됩니다.두 번째 스크립트는 최적의 솔루션으로 프로파일러를 시작합니다. 프로파일러는 여러 번의 무작위 시작을 사용하므로 전역 최적 솔루션을 찾는 데 더욱 강력합니다.
안녕하세요 로라,
귀하의 제안에 감사드립니다. 지금까지 나는 첫 번째 방법(제한된 최소화)만 시도했는데 확실히 최소화 기능과 다르게 동작합니다! 그러나 이제는 정반대의 문제가 생겼습니다. 즉, 매개변수가 겉으로는 안정적인 값에 도달하지 못한 채 허용된 매개변수 공간 내에서 여기저기로 이동합니다!! 내가 명확하지 않은 한 가지는 "반복"과 목적 함수가 평가되는 횟수의 차이입니다. 분명히 그들은 동일하지 않습니다. 최대 iter(5)를 설정했지만 수렴하지 않고 함수가 여러 번 평가되었습니다. 몇 분 후에 JMP를 강제로 종료해야 했습니다.
내가 최적화하려는 모델 유형이 다소 성가신 것이라고 생각하기 시작했습니다!
두 번째 제안에 도전하겠습니다! 감사합니다, 이브