회귀 분석은 주어진 데이터의 패턴을 찾고, 이를 통해 예측 모델을 구축하는 중요한 기법입니다. 특히 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차 회귀 함수를 구현하는 방법을 살펴보았습니다. 가우스 소거법을 활용하여 방정식을 풀고, 최적의 계수를 구하는 과정을 이해하면 다양한 데이터 분석 및 예측 모델을 구축하는 데 활용할 수 있습니다.