많은 새로운 기능 중에서 JMP 13 JSL의 Minimize() 및 Maximize() 함수가 개선되었습니다. 이러한 JSL 함수는 시작 값이 주어지면 함수의 극값을 찾는 반복 최적화 프로그램입니다. 아래의 GIF는 간단한 1차원 설정에서 알고리즘이 어떻게 작동하는지에 대한 직관을 제공하는 시각적 데모입니다.

대부분의 JMP 사용자는 사전 구축된 플랫폼(예: Fit Y by X 및 Nonlinear)이 최적화 문제에 충분하다는 것을 알게 될 것입니다. 항상 그런 것은 아니며 이러한 JSL 함수는 뛰어난 유연성과 일반성을 제공합니다. 이러한 기능을 통해 사용자는 JMP 개발자가 JMP 플랫폼을 만들 때 활용하는 것과 동일한 최적화 도구에 액세스할 수 있습니다.
일반적으로 말하면, 가능성이 보고된 곳은 어디든 됩니다. JMP , 모델은 Maximium Likelihood라는 최적화 기술로 적합되었습니다. 마찬가지로, 최소 제곱이라는 이름 자체가 선형 모델을 맞추는 데 사용되는 최적화 방법을 설명합니다. JMP에는 다양한 모델이 있지만, JMP에 미리 구축되지 않은 맞춤형 모델을 적용하고 싶을 때가 있습니다. 또한 교육학적 이유로 학생들이 통계 모델링 프로그램을 최적화 문제로 전환하여 모델 작동 방식을 이해하는 것이 유용할 수 있습니다.
다음 몇 섹션에서는 일반 최적화 프로그램 사용의 기본 사항을 보여줍니다. 반복 최적화 프로그램에 이미 익숙한 사용자는 마지막 섹션으로 건너뛰어 Minimize() 및 Maximize()의 일부 고급 기능에 대한 예제 구문을 볼 수 있습니다.
이 기사의 나머지 부분에서는 Minimize()의 관점에서 모든 내용을 작성하겠습니다. 함수 f(x)를 최소화하는 것은 -1 * f(x)를 최대화하는 것과 동일하므로 "f(x)"를 "-f(x)"로, "최소화"를 "최대화", "오목형"으로 교환합니다. "를 "convex" 등으로 사용하면 결과가 Maximize()로 일반화됩니다.
간단한 예
가장 기본적인 최적화 문제에는 두 가지 함수 인수, 즉 표현식과 최적화할 변수가 필요합니다. 과거와 마찬가지로 Minimize( 특급 , { 엑스, 와이 }) 얻은 최소값을 반환합니다. 작동 방식을 보여주기 위해 첫 번째 예에서는 사소한 이차 표현식을 최소화합니다.
x = 2; /*starting value for x */
y = 2; /*starting value for y */
expr1 = expr((x ^ 2 + (y - 1) ^ 2));
minFun = Minimize( expr1, {x, y});
Show(minFun, x, y);
산출:
minFun = 0;
x = 0;
y = 1;
몇 가지 생각을 한 후에 우리는 이 함수의 최소값이 0이어야 하고 x = 0 및 y = 1에서 발생해야 한다고 스스로 확신할 수 있습니다. 이 스크립트를 실행한 후에는 실제로 그런 경우임을 알 수 있습니다.
최소 함수 값을 달성한 인수 값을 반영하기 위해 Minimize() 함수에 의해 x와 y가 변경되었습니다. 이 함수에 대한 등고선 플롯은 다음과 같습니다.
시작 값 선택
최적화 프로그램은 시작 값이라고 하는 특정 매개변수 값 세트로 시작한 다음 반복적으로 이를 개선하려고 시도해야 합니다. 최적화의 성공과 실패는 시작 값의 품질에 크게 좌우됩니다. 통계 소프트웨어 개발 기술의 일부는 효과적인 시작 값을 찾는 것입니다. 그것들을 생각해내는 방법에는 여러 가지가 있습니다. 함수는 시작 값에서 평가될 수 있어야 합니다(즉, 누락된 값을 반환하지 않습니다).때때로 당신이 할 수 있는 최선의 방법은 회귀 매개변수를 0으로 설정하는 것과 같이 잘 작동하는 합리적인 '기본값' 값을 찾는 것입니다. 선형 최소 제곱 추정치를 로지스틱 회귀 분석의 시작 값으로 사용하는 등 더 간단한 모델을 데이터에 맞추고 해당 결과를 사용하여 가장 좋은 시작 값을 얻는 경우가 많습니다.
글로벌 대 로컬 임계점
알아야 할 중요한 주의 사항은 최소화가 전역 최소값일 수도 있고 아닐 수도 있는 로컬 임계점을 찾는다는 것입니다. 다음 예는 이를 설명하는 간단한 다항식입니다. x = 0, y = 0의 시작 값을 사용하면 x = 0.25 및 y = -0.0833에서 국소 최소값이 발견됩니다. 그러나 x=-1이고 y = -1인 경우 답은 –무한대가 됩니다.
x = 0; /*starting value for x */
y = 0; /*starting value for y */
expr2 = expr((y * 3 - 2 * x ^ 2 - 12 * x * y));
minFun = Minimize(expr2, {x, y});
Show( x, y, minFun);
산출:
x = 0.25;
y = -0.0833333333333333;
minFun = -0.125;
x = -1; /*starting value for x */
y = -1; /*starting value for y */
minFun = Minimize(expr2, {x, y});
Show( x, y, minFun);
산출:
Optimization failed: Failed: Maximum Iterations Exceeded
x = -6.55731043158825e+85;
y = -1.31136919553771e+89;
minFun = -1.03197258530774e+176;
Minimize()는 로컬 또는 전역 최소값에 도달했는지 모르기 때문에 이에 대한 경고를 제공하지 않습니다. 실제로 이 예에서 첫 번째 시작 값 세트는 다음과 같이 수렴됩니다. 안장 포인트 , 이 경우 한 방향에서는 최소값이고 다른 방향에서는 최대값입니다. 전역 최소값을 원하지만 문제가 발생하지 않는 경우 볼록한 (또는 확실하지 않은 경우) 한 가지 옵션은 여러 시작 값을 시도하여 모두 동일한 위치에 수렴되는지 확인하는 것입니다. 또는 매개변수가 2개 이하인 경우 함수를 플롯할 수 있으므로 로컬 최소값인지 쉽게 알 수 있습니다. 예를 들어 다음은 두 개의 서로 다른 시작 값이 있는 마지막 함수의 카운터 플롯입니다.
현실적인 예 1: 손실 함수 최소화
통계에서 모수 추정치는 종종 오차항 제곱의 합, 합계(관찰 – 예측) ^2를 최소화하는 모수 값을 찾아서 결정됩니다. 예를 들어 다음을 고려하십시오. 비선형 NIST Dan Wood 테스트 사례 (“ ” ).
여기서는 모델에 대한 제곱 오차의 합을 최소화하려고 합니다. 즉, 다음 인수를 찾습니다.
그리고
최소화하는 것
.
다음 JSL 코드는 이를 구현합니다.
x = [1.309, 1.471, 1.49, 1.565, 1.611, 1.68];
y = [2.138, 3.421, 3.597, 4.34, 4.882, 5.66];
b1 = 1; /*starting value for b1 */
b2 = 5; /*starting value for b2 */
sseExpr = Expr(
Summation( i = 1, 6, (y[i] - b1 * x[i] ^ b2) ^ 2 )
);
minFun = Minimize( sseExpr, {b1, b2} );
Show( b1, b2, minFun );
산출:
b1 = 0.768858626467797;
b2 = 3.86041439611906;
minFun = 0.00431730849313329;
등고선도:
현실적인 예 2: 단순 선형 로지스틱 회귀
언급한 대로 최적화 루틴의 또 다른 일반적인 용도는 최대 가능성 추정치를 찾는 것입니다. 예를 들어, 100개의 이진 반응 값 y와 연관된 연속 예측 변수 x를 관찰했으며 로지스틱 회귀 모델을 적합시키려고 한다고 가정합니다. 단순 선형 로지스틱 회귀 분석의 경우 각 i에 대해 다음과 같이 가정합니다.
, 어디
. 연관된 로그 우도는 다음과 같습니다.
. 간결함을 위해 파생어는 건너뛰었지만 자세한 내용은 찾을 수 있습니다. 여기 .다음 JSL 코드는 이러한 가능성을 최대화합니다.
b0 = 0;
b1 = 0;
logLik = Expr(
Summation( i = 1, 100, y[i] * log( logist(b0 + b1 * x[i]) ) + (1 - y[i]) * log(1- logist(b0 + b1 * x[i]) ) )
);
minFun = Maximize( logLik, {b0, b1} );
Show( b0, b1);
산출:
b0 = 0.169912186525928;
b1 = 2.37904556815702;
따라서 이 모델은 새로운 x 값에 대해 추정된 확률이 다음과 같다고 예측합니다.

적합도 플롯을 사용하면 다음과 같습니다.

관심이 있으시면 첨부된 JSL 스크립트에서 제가 이 예제에 사용한 특정 x 및 y 값과 해당 값을 생성한 방법을 확인하시기 바랍니다.
새로운 선택 기능 <
내가 가장 좋아하는 새로운 기능을 사용하면 사용자가 선택적 인수 <
x = [1.309, 1.471, 1.49, 1.565, 1.611, 1.68];
y = [2.138, 3.421, 3.597, 4.34, 4.882, 5.66];
b1 = 1; /*starting value for b1 */
b2 = 5; /*starting value for b2 */
sseExpr = Expr(
Summation( i = 1, 6, (y[i] - b1 * x[i] ^ b2) ^ 2 )
);
{objVal, iters, gradient, hessian} = Minimize( sseExpr, {b1, b2} , <<SHOWDETAILS></SHOWDETAILS>
산출:
nParm=2 Newton ******************************************************
Iter nFree Objective RelGrad NormGrad2 Ridge nObj nGrad nHess Parm0 Parm1
0 2 149.7192 332.8046 182170.1 0 1 1 1 1 5
1 2 31.87877 101.5969 19003.84 0 1 1 1 1.010662 4.225573
2 2 4.215765 28.12531 1448.206 0 1 1 1 1.024865 3.630484
3 2 0.378951 7.636836 51.97781 0 1 1 1 1.058064 3.252922
4 2 0.153712 0.003012 0.615041 0.125 2 1 1 1.008287 3.272327
5 2 0.08553 0.100794 0.100071 0.031 1 1 1 0.937871 3.42031
6 2 0.035115 0.074061 0.132669 0.016 1 1 1 0.868411 3.588806
7 2 0.00829 0.164555 1.452852 0 1 1 1 0.772783 3.836035
8 2 0.00432 1.62e-5 0.00021 0 1 1 1 0.769751 3.858031
9 2 0.004317 2.313e-9 2.057e-8 0 1 1 1 0.768859 3.860414
Convergence SUCCESS: Gradient
Time: 0.033333333209157
b1 = 0.768858626467797;
b2 = 3.86041439611906;
objVal = 0.00431730849313329;
iters = 9;
gradient = [-0.000193577585687388, -0.000060622489899298];
hessian = [351.567213300015 123.108731500088, 123.108731500088 43.9222933905666];
Minimize() 및 Maximize()에 대한 모든 선택적 기능 목록
- 상한 및 하한 설정 : 변수의 하한 및/또는 상한을 설정합니다. 예를 들어, 최소화( x^2, x(1,5) )는 x를 1과 5 사이에 유지하도록 제한하고 최소화( x^2, x(. , 5) )는 x가 하한 없이 5보다 작은지 확인합니다. .
- 최대 반복 횟수 설정 : 최대 반복 횟수의 기본값은 250이지만 < 새로운MaxIter ). 기본값은 250입니다.
- 수렴에 대한 허용오차 설정 : 수렴 기준은 < 새로운공차 ). 기본값은 10^-8입니다.
- 자세한 내용 표시 : <
- 파생 상품에 대한 수치 근사 사용 : 기본적으로 Minimize()는 분석적 도함수를 찾으려고 시도하지만 어떤 경우에는 수치 근사가 더 잘 작동할 수 있습니다. 함수 호출에 "<
- 사용자 정의 그라디언트 입력 : 대부분의 경우 Minimize()는 기본적으로 분석적 기울기를 계산할 수 있습니다. 드물지만 원할 경우 사용자는 자신만의 그라데이션을 입력할 수 있습니다. 이를 수행하려면 <
- 사용자 정의 헤세 행렬 입력 : 사용자가 정의한 헤센을 입력하는 것은 더욱 번거롭습니다. 구문은 매우 빠르게 복잡해지기 때문에 최후의 수단으로만 사용하는 것이 좋습니다. 분석적 헤세 행렬을 입력하려면 행 우선 순서로 헤세 행렬의 상부 삼각 부분만 사용하여 <
모든 선택적 인수를 사용한 간단한 예
다음은 모든 선택적 인수가 선택된 Minimize()의 유용한 템플릿입니다. JMP 13.2에서는 JMP를 사용한 스크립팅 인덱스의 최소화 아래에서도 이 예를 찾을 수 있습니다. 이는 예제 3입니다(예제 1 옆에 있는 드롭다운 메뉴를 선택하여 선택).
x = 0;
y = 0;
{objVal, iters, gradient, hessian} =
Minimize(
((2 * x ^ 2 + 12 * x * y - y * 3)),
{x( -1, 1 ), y( -1, 1 )},
<<MAXITER></MAXITER>
비선형 목적 함수 및 선형 제약 조건과 관련된 문제를 최적화하는 새로운 JSL 함수인 Constrained Minimize() 및 Constrained Maximize()에 대한 향후 블로그 게시물을 계속 게시해 주세요.
안녕하세요, 호크스웬더 님,
블로그 게시물이 도움이 되셨다니 기쁘네요!
좋은 지적! Minimize()는 제가 GIF용으로 선택한 (다소 끔찍한) 기능에 대한 기본 허용오차에 실제로 수렴하지 않습니다. 나는 순전히 그것이 어떻게 보이는지에 따라 그 기능을 선택했습니다. Minimize()는 그라디언트 기반 최적화 방법이 도함수가 항상 존재하지 않는 함수에 어려움을 겪기 때문에 어려움을 겪습니다. 이 경우 절대값 함수가 문제를 일으키고 있습니다.
때로는 다음과 같이 a를 음수가 아닌 값으로 제한하는 것과 같은 몇 가지 쉬운 해결책이 있습니다.
a = 2
xpr = expr(3^abs(a));
minimize(xpr, {a(0,.)}, <<SHOWDETAILS></SHOWDETAILS>
함수가 포물선 형태로 보이는 것이 더 좋아 보인다고 생각했기 때문에 GIF 코드에서는 그렇게 하지 않았습니다. 그러나 끝 부분에서 화살표가 실제 최소값 주위로 앞뒤로 점프하는 GIF에서도 알고리즘이 수렴하는 데 어려움을 겪고 있음을 알 수 있습니다.