문제

나는 Java 라이브러리를 찾고 있거나 내 자신의 보간 기능을 작성하는 데 도움이됩니다. 즉, 두 배의 더블 배열이있어 잠재적으로 크기가 다르지만 주문됩니다. 중간 값을 추정하고 두 배열이 동일한 크기가되도록 삽입 할 수 있어야합니다. 실제로 보간에 나타나는 총점 수는 2 배열 크기 마이너스 1의 합입니다. 각 배열의 범위는 동일하게 유지되어야하므로 외삽 할 필요가 없습니다.

예를 들어. A1 = [1, 4, 9, 16, 25, 36] 및 A2 = [6, 9, 14, 30

결과는 예를 들어 될 수 있습니다.

A1 = [1, 2.25, 4, 6.25, 9, 12.25, 16, 25, 36] 및 A2 = [6, 6.5625, 7.25, 9, 10.0625, 11.25, 14, 25.25, 30

이 예는 있습니다 f(x) = x^2 and g(x) = x^2 + 5, 그러나 쉽게 다항식 일 수 있습니다. 요점은 충분한 보간을 제공 할 수있을 정도로 데이터 세트의 함수를 충분히 추정/근사화 할 수있는 것입니다. 여기서 x 값은 입력 배열의 인덱스 일뿐입니다. 출력에서 y 값 만 중요합니다.

도움이 되었습니까?

해결책

다른 답변은 당신에게 선형 보간을 제공합니다. 이것은 복잡한 비선형 데이터에 실제로 효과가 없습니다. 당신은 원합니다 스플라인 적합, (스플라인 보간) 나는 믿는다.

Spline은 데이터의 일련의 제어점을 사용하여 데이터 영역을 설명한 다음 제어점 사이에 다항식 보간을 적용합니다. 더 많은 제어 포인트는 더 정확한 착용감을 제공하고 더 일반적인 적합성을 제공합니다. 스플라인은 선형 맞춤보다 훨씬 정확하며 일반 회귀 적합보다 사용하는 것이 더 빠르며, 제어점 사이에 미친 일을하지 않기 때문에 고차 다항식보다 낫습니다.

나는 내 머리 꼭대기에서 이름을 기억할 수 없지만 Java에는 훌륭한 피팅 라이브러리가 있습니다. 자신의 기능을 작성하지 않고 하나를 찾는 것이 좋습니다.


** 편집 : 유용한 라이브러리 : **

** 유용 할 수있는 이론/코드 : **

  • 코드가있는 스플라인 애플릿 : 링크
  • 아칸 폴리 라인에 베 지어 스플라인에 대한 스플라인 피팅
  • 이론 스플라인과 피팅을위한 수학. 더 많은 수학, 더 적은 코드는 라이브러리가 그렇지 않으면 도움이 될 수 있습니다.

다른 팁

1 차원 데이터 배열 용으로 설계되었습니다

import java.util.ArrayList;

public class Interpolator {

public static Float CosineInterpolate(Float y1,Float y2,Float mu)
{
    double mu2;

    mu2 = (1.0f-Math.cos(mu*Math.PI))/2.0f;
    Float f_mu2 = new Float(mu2);
    return(y1*(1.0f-f_mu2)+y2*f_mu2);
}

public static Float LinearInterpolate(Float y1,Float y2,Float mu)
{
    return(y1*(1-mu)+y2*mu);
}


public static Float[] Interpolate(Float[] a, String mode) {

    // Check that have at least the very first and very last values non-null
    if (!(a[0] != null && a[a.length-1] != null)) return null;

    ArrayList<Integer> non_null_idx = new ArrayList<Integer>();
    ArrayList<Integer> steps = new ArrayList<Integer>();

    int step_cnt = 0;
    for (int i=0; i<a.length; i++)
    {
        if (a[i] != null)
        {
            non_null_idx.add(i);
            if (step_cnt != 0) {
                steps.add(step_cnt);
                System.err.println("aDDed step >> " + step_cnt);
            }
            step_cnt = 0;
        }
        else
        {
            step_cnt++;
        }
    }

    Float f_start = null;
    Float f_end = null;
    Float f_step = null;
    Float f_mu = null;

    int i = 0;
    while (i < a.length - 1) // Don't do anything for the very last element (which should never be null)
    {
        if (a[i] != null && non_null_idx.size() > 1 && steps.size() > 0)
        {
            f_start = a[non_null_idx.get(0)];
            f_end = a[non_null_idx.get(1)];
            f_step = new Float(1.0) / new Float(steps.get(0) + 1);
            f_mu = f_step;
            non_null_idx.remove(0);
            steps.remove(0);
        }
        else if (a[i] == null)
        {
            if (mode.equalsIgnoreCase("cosine"))
                a[i] = CosineInterpolate(f_start, f_end, f_mu);
            else
                a[i] = LinearInterpolate(f_start, f_end, f_mu);
            f_mu += f_step;
        }
        i++;
    }

    return a;
}
}

그것이 도움이되는지 모르겠습니다 ... 매우 빠르게 코딩되어 있으므로, 누군가가 더 잘 수행 할 수있는 방법을 가지고 있다면, 기여해 주셔서 감사합니다.

용법:

input : Float[] a = {1.0f, null, null, 2.0f, null, null, null, 15.0f};

call : Interpolator.Interpolate(a, "Linear");

output : 1.0|1.3333333|1.6666667|2.0|5.25|8.5|11.75|15.0

나는 이것이 오래된 답변이라는 것을 알고 있지만 Java 보간을 검색 할 때 처음으로 Google 히트입니다. 허용 된 답변은 몇 가지 유용한 링크를 제공하지만 JMSL을 구입해야하며 JSPline+ 웹 사이트는 스케치처럼 보입니다.

Apache Commons Math에는 단순하고 기능적이며 신뢰할 수있는 선형 및 스플라인 보간을 구현했습니다.

http://commons.apache.org/proper/commons-math/

간단한 선형 보간은 다음과 같은 것을 사용하여 계산할 수 있습니다.

Point2D interp1_lin(Point2D p1, Point2D p2, double x) {
 //Pre conditions
assert p1.x<x;
assert x<p2.x;
//Calculate slope from p1 to p2
double m = (p2.x-p1.x)/(p2.y-p1.y);
//Calculate y position of x
double y = (x-p1.x)*m+p1.y;
//create new point
return new Point2D.Double(x,y);
}

이것이 도움이됩니까?

y- 값에 해당하는 x- 값을 가져와야합니다. 그렇지 않으면 [1, 16, 81]가 [1, 4, 9]의 경우 x^2인지 [1, 2, 3]의 경우 알고리즘이 [1, 2, 3]에 대해 결정할 수 없습니다. 6 값을 보간 하시겠습니까?

그런 다음 X- 값이 주어지면 일종의 보간 (선형, 쿠키 스플라인, 이름)을 사용하여 결 측값을 근사화 할 수 있습니다.

1 차원 배열 선형 보간기의 가벼운 버전 :

public static float[] interpolate(float[] data) {
    int startIdx = -1;
    float startValue = 0f;
    float element;
    for (int i = 0; i < data.length - 1; i++) {
        element = data[i];
        if (element != 0f) {
            if (startIdx != -1) {
                doInterpolate(startValue, element, startIdx + 1, i - startIdx - 1, data);
            }
            startValue = element;
            startIdx = i;
        }
    }
    return data;
}

private static void doInterpolate(float start, float end, int startIdx, int count, float[] data) {
    float delta = (end - start) / (count + 1);
    for (int i = startIdx; i < startIdx + count; i++) {
        data[i] = start + delta * (i - startIdx + 1);
    }
}

스플라인에 맞는 다항식에 매우주의하십시오. 이 두 사람은 데이터를 표현한 것으로 여겨지는 많은 용도를 탈선시킬 수있는 무의미한 행동을 줄 수 있습니다.

데이터의 파생 상품 (슬로프)을 사용하는 것은 완전히 탈선 할 수 있습니다.

당신이 할 수있는 가장 좋은 방법은 데이터를 플로팅하고, 무엇을하고 있는지 이해하고, 그 다음에 맞는 (선형, 다항식, 로그 로그) 회귀; 완료 한 후에는 원래 데이터를 통해 적합을 플로팅하고 합리적인 계약을 확인해야합니다. 이 비교 단계를 건너 뛰는 것은 매우 나쁜 생각입니다.

특정 데이터 세트는 다항식, 로그 로그 등의 피팅에 도움이되지 않습니다.; 데이터 포인트가 데이터 범위에 따라 적절하게 분산되면 조각 간 중단 (선형 또는 다항식 등)에는 아무런 문제가 없습니다. 죽은 말을이기려면, 조각 면간 보간을 사용하는 경우, 불연속이없고 사물이 나쁘게 행동하게하기 때문에 조각상 보간의 파생 상품/경사를 사용하는 것은 피하십시오.

당신이 사용할 수있는 아파치 커먼 스 보간 기능, 와 같은 Splineinterpolator

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