문제

저는 x, y 데이터를 가져와 곡선을 맞추는 비선형 곡선 피팅 루틴(아마도 R이나 Python에서 발견될 가능성이 가장 높지만 다른 언어에도 열려 있음)을 찾고 있습니다.

내가 맞추고 싶은 표현 유형을 문자열로 지정할 수 있어야 합니다.

예:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

내가 여기서 얻을 수 있는 것은 최소한 상수(A, B, C 등) 값과 경기 적합성에 대한 통계입니다.

이를 위한 상용 프로그램도 있지만, 요즘은 언어 도서관에서 원하는 표현에 맞는 흔한 것을 찾을 수 있을 거라 기대했습니다.나는 SciPy의 최적화 기능이 이것을 할 수 있을 것이라고 생각하지만, 방정식을 정의할 수 있다는 것을 알 수 없습니다.마찬가지로, R에서 내가 원하는 것을 정확하게 찾을 수 없는 것 같습니다.

내가 찾고 있는 것이 저 바깥에 있는 걸까요, 아니면 제가 직접 찾아야 하는 걸까요?나는 그것이 거기에 있다면 그것을하는 것을 싫어하고 그것을 찾는 데 어려움을 겪고 있습니다.


편집하다:LAB Fit에서 얻는 것보다 프로세스를 좀 더 효과적으로 제어하기 위해 이 작업을 수행하고 싶습니다.LAB Fit UI는 끔찍합니다.또한 범위를 여러 조각으로 나누고 다른 곡선이 범위의 다른 조각을 나타내도록 할 수 있기를 원합니다.결국 결과는 선형 보간을 사용하여 LUT를 (속도 측면에서) 이길 수 있어야 합니다. 그렇지 않으면 관심이 없습니다.

현재 문제 세트에는 삼각 함수 또는 exp()가 있으며 실시간으로 초당 352,800회 실행해야 합니다(그리고 CPU의 일부만 사용).그래서 저는 곡선을 그리고 데이터를 사용하여 곡선 피팅을 구동하여 보다 저렴한 근사값을 얻습니다.예전에는 LUT가 거의 항상 솔루션이었지만 요즘에는 메모리 조회를 건너뛰고 근사치를 수행하는 것이 때로는 더 빠릅니다.

도움이 되었습니까?

해결책

지적하신 방정식의 구체적인 내용을 고려하지 않고 일반적인 의미(R의 매개변수 추정과 관련하여)에서 귀하의 질문에 대답하려면 nls() 또는 optim()을 찾고 계신 것 같습니다.'nls'는 각 추정 매개변수에 대한 오류 추정치를 제공하고 실패할 경우 'optim'을 사용하므로 첫 번째 선택입니다.x,y 변수가 있는 경우:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

계수를 얻으려면 다음과 같습니다.

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

'nls'의 경우 표준 오류를 원하면

summary(out)$parameters

도움말 파일과 r-help 메일링 목록 게시물에는 각각 구현된 특정 최소화 알고리즘(위의 각 예제 사례에 사용된 기본값)과 현재 방정식의 특정 형식에 대한 적합성에 관한 많은 토론이 포함되어 있습니다.특정 알고리즘은 상자 제약 조건을 처리할 수 있으며 constrOptim()이라는 다른 함수는 일련의 선형 제약 조건을 처리합니다.이 웹사이트는 다음과 같은 경우에도 도움이 될 수 있습니다.

http://cran.r-project.org/web/views/Optimization.html

다른 팁

첫 번째 모델은 실제로입니다 선의 세 가지 매개 변수에서 R을 사용하여 R에 맞을 수 있습니다.

 fit <- lm(y ~ x + I(x^2), data=X)

세 가지 매개 변수를 얻을 수 있습니다.

두 번째 모델도 사용하여 적합 할 수 있습니다 nls() 시작 값 등을 제공해야한다는 일반적인 경고와 함께 R에서 통계 최적화 문제가 반드시 동일하지는 않습니다. 수치 문제 - 어떤 언어를 선택하든 기능 양식을 최적화 할 수는 없습니다.

체크 아웃 GNU 옥타브 -Polyfit ()과 비선형 제약 조건 솔버 사이에서 문제에 적합한 것을 구성 할 수 있어야합니다.

r에서 이것은 매우 쉽습니다.

내장 방법을 Optim ()라고합니다. 인수로서 잠재적 매개 변수의 시작 벡터, 그 다음 함수가 필요합니다. 자신의 오류 기능을 구축해야하지만 정말 간단합니다.

그런 다음 out = intim (1, err_fn)처럼 부릅니다.

err_fn이있는 곳

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

이것은 단지 eckses와 데이터에 x 및 y 값의 벡터가 있다고 가정합니다. 건강에 맞는대로 Model_y 라인을 변경하고 더 많은 매개 변수를 추가하십시오.

그것은 비선형에서 잘 작동하며, 나는 4 차원 E^x 곡선에 사용하며 매우 빠릅니다. 출력 데이터에는 피팅 끝에있는 오차 값이 포함되어 있으며, 이는 제곱 차이의 합으로 주어진 (내 err_FN)이 주어진 방법에 대한 척도입니다.

편집 : 모델을 문자열로 가져 가야하는 경우 사용자 인터페이스 가이 전체 모델 피팅 프로세스를 R 스크립트로 구성하고 실행하도록로드 할 수 있습니다. r은 stdin 또는 파일에서 텍스트를 가져올 수 있으므로이 기능의 문자열을 제작하기가 너무 어렵지 않아야하며 자동으로 최적으로 실행되도록하십시오.

당신은 아마도 당신의 예제 (동일한 루틴을 사용하는 다항식 및 합리적 기능)에서 암시 된 유연성을 가진 단일 루틴을 찾지 못할 것입니다.

최소 제곱 다항식 피터는 첫 번째 예에 적합합니다. (사분면, 입방, 4 중주 등을 사용하는 것은 어느 정도의 다항식을 사용합니다). 두 번째 예제와 같은 합리적인 기능의 경우 적절한 라이브러리를 찾을 수 없다면 "나만의 롤"해야 할 수도 있습니다. 또한, 적합한 데이터 세트의 한계를 넘어 외삽 할 필요가없는 한 충분히 고도의 다항식을 사용하여 "실제"기능을 근사화하는 데 사용될 수 있습니다.

다른 사람들이 지적했듯이, 유용 할 수있는 다른 일반화 된 매개 변수 추정 알고리즘이 있습니다. 그러나 이러한 알고리즘은 "플러그 앤 플레이"가 아닙니다. 일반적으로 일부 도우미 루틴을 작성하고 모델 매개 변수에 대한 초기 값 목록을 제공해야합니다. 이러한 종류의 알고리즘은 초기 매개 변수 추정치의 운이 좋지 않은 선택을 위해 지역 최소 또는 최대 값으로 분기되거나 현지 최소값으로 갇힐 수 있습니다.

계수에 제약이 있고 데이터에 맞추고 싶은 특정 유형의 기능이 있다는 것을 알고 있다면 그 기능은 표준 회귀 방법 또는 기타 곡선 피팅 방법이 작동하지 않는 지저분한 것입니다. 유전자 알고리즘을 고려 했습니까?

그것들은 나의 첫 번째 선택은 아니지만, 당신이 언급 한 두 번째 함수의 계수를 찾으려고한다면, 가스가 작동 할 것입니다. 예를 들어, 기능과 데이터 사이의 제곱 차이의 합이 최소화되도록 "(a+bx+cx^2)/(dx+ex^2)"의 계수를 찾으려면 그리고 결과 함수의 arclenger에 약간의 제약이 있으므로 확률 적 알고리즘이 이에 접근하는 좋은 방법 일 수 있습니다.

일부 경고 : 1) 확률 론적 알고리즘은 베스트 해결책이지만 종종 매우 가깝습니다. 2) 알고리즘의 안정성에주의해야합니다.

더 오래 참고로, 데이터에 가장 잘 맞는 기능 공간에서 함수를 찾으려는 단계에 있다면 (예 : 데이터에 두 번째 모델을 부과하지 않을 것입니다), 유전자. 프로그래밍 기술도 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top