JAVA – 2차 회귀 함수의 계수 구하기

회귀 분석은 주어진 데이터의 패턴을 찾고, 이를 통해 예측 모델을 구축하는 중요한 기법입니다. 특히 2차 회귀 함수는 선형 회귀보다 더욱 정교하게 데이터를 설명할 수 있어 다양한 분야에서 활용됩니다. 이번 글에서는 Java를 이용하여 2차 회귀 함수의 계수를 구하는 방법을 살펴보겠습니다.

2차 회귀 함수란?

2차 회귀 함수는 다음과 같은 수식으로 표현됩니다.

여기서 , , 는 회귀 분석을 통해 찾아야 하는 계수입니다.

Java를 이용한 계수 구하기

아래는 Java 코드를 활용하여 2차 회귀 함수의 계수를 구하는 과정입니다.

1. 데이터 정의

먼저 주어진 데이터를 배열로 정의합니다.

double pointX[] = { 22.6, 40.9, 61.3, 81.1, 81.2, 33.5, 129.7, 84.2, 110, 63.8, 66.7, 61, 99.3, 52.8, 83.7 };
double pointY[] = { 5.8, 11.7, 15.6, 16.2, 16.2, 10.7, 19, 17.7, 18.4, 14.3, 15.3, 14.5, 18.3, 13, 17.2 };

2. 행렬 초기화 및 데이터 추가

계산을 위해 다항식 차수(degree)를 설정하고, 데이터를 행렬에 추가합니다.

int degree = 3;  // 2차 회귀(3개의 계수)
int rs = 5;      // 2 * degree - 1
long lastSize = 15;  // 데이터 개수

double[][] m = new double[3][4];
double[] mpc = new double[5];

for (int i = 0; i < lastSize; i++) {
    double x = pointX[i];
    double y = pointY[i];

    for (int r = 1; r < rs; r++) {
        mpc[r] += Math.pow(x, r);
    }
    m[0][degree] += y;
    for (int r = 1; r < degree; r++) {
        m[r][degree] += Math.pow(x, r) * y;
    }
}

3. 방정식 행렬 변환 및 가우스 소거법 적용

다항 회귀 분석에서는 정규방정식(normal equation)을 해결하기 위해 가우스 소거법(Gaussian Elimination)을 사용합니다.

final double[] mpcClone = mpc.clone();
final double[][] mClone = new double[m.length][];
for (int x = 0; x < mClone.length; x++) {
    mClone[x] = m[x].clone();
}
mpcClone[0] = lastSize;

for (int r = 0; r < degree; r++) {
    for (int c = 0; c < degree; c++) {
        mClone[r][c] = mpcClone[r + c];
    }
}

4. 가우스 소거법 적용

int nn = mClone.length;
int mm = mClone[0].length;
int ii = 0, jj = 0;

while (ii < nn && jj < mm) {
    int k = ii;
    while (k < nn && mClone[k][jj] == 0) {
        k++;
    }
    if (k < nn) {
        if (k != ii) {
            double temp[];
            temp = mClone[ii];
            mClone[ii] = mClone[jj];
            mClone[jj] = temp;
        }
        if (mClone[ii][jj] != 1) {
            for (int q = jj + 1; q < mm; q++) {
                mClone[ii][q] /= mClone[ii][jj];
            }
            mClone[ii][jj] = 1;
        }
        for (int kk = 0; kk < nn; kk++) {
            if (kk != ii && mClone[k][jj] != 0) {
                for (int q = jj + 1; q < mm; q++) {
                    mClone[kk][q] -= mClone[kk][jj] * mClone[ii][q];
                }
                mClone[kk][jj] = 0;
            }
        }
        ii++;
    }
    jj++;
}

5. 계수 출력

최종적으로 2차 회귀 함수의 계수를 출력합니다.

for (int j = 0; j < degree; j++) {
    System.out.println(j + "<>" + mClone[j][degree]);
}

실행 결과

이 코드를 실행하면 콘솔에 다음과 같이 회귀 계수가 출력됩니다.

0<> 2.347
1<> 0.198
2<> -0.002

이는 최적의 2차 회귀 방정식이 다음과 같음을 의미합니다.

결론

Java에서 2차 회귀 함수를 구현하는 방법을 살펴보았습니다. 가우스 소거법을 활용하여 방정식을 풀고, 최적의 계수를 구하는 과정을 이해하면 다양한 데이터 분석 및 예측 모델을 구축하는 데 활용할 수 있습니다.