Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어로 구현하는 다항 회귀(Polynomial Regression) 알고리즘 완벽 가이드

회귀 분석이란?

회귀(Regression)는 종속 변수(dependent variable)와 독립 변수(independent variable) 사이의 관계를 규명하여 미래 값을 예측하는 데 사용되는 대표적인 예측 모델링(predictive modelling) 기법입니다. 데이터 속에 숨겨진 패턴을 수학적 함수로 표현함으로써, 새로운 입력 값에 대한 출력 값을 추정할 수 있습니다.

다항 회귀(Polynomial Regression)란?

다항 회귀는 독립 변수 x와 종속 변수 y 사이의 관계를 x에 대한 n차 다항식 형태로 모델링하는 회귀 분석 기법입니다. 데이터가 단순한 직선이 아닌 곡선 형태의 패턴을 보일 때 특히 유용합니다.

다항 회귀 모델의 일반적인 형태는 다음과 같습니다.

y = a₁ + a₂x + a₃x² + ... + a₍ₘ₊₁₎xᵐ

여기서 계수 a₁, a₂, ..., a₍ₘ₊₁₎을 구하기 위해 최소제곱법(least squares method)을 적용하면 정규방정식(normal equations)이라 불리는 연립 방정식이 만들어집니다. 이 연립 방정식을 가우스 소거법(Gauss elimination)으로 풀면 원하는 다항식의 계수들을 얻을 수 있습니다.

C 프로그램 예제

다음은 다항 회귀 알고리즘을 계산하는 C 프로그램입니다.

#include<math.h>
#include<stdio.h>
#include<conio.h>
main(){
    int i,j,k,m,n;
    float x[20],y[20],u,a[10],c[20][20],power,r;
    printf("enter m,n:");
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;i++){
        printf("enter values of x and y");
        scanf("%f%f",&x[i],&y[i]);
    }
    for(j=1;j<=m+1;j++)
    for(k=1;k<=m+1;k++){
        c[j][k]=0;
        for(i=1;i<=n;i++){
            power=pow(x[i],j+k-2);
            c[j][k]=c[j][k]+power;
        }
    }
    for(j=1;j<=m+1;j++){
        c[j][m+2]=0;
        for(i=1;i<=n;i++){
            r=pow(x[i],j-1);
            c[j][m+2]=c[j][m+2]+y[i]*r;
        }
    }
    for(i=1;i<=m+1;i++){
        for(j=1;j<=m+2;j++){
            printf("%.2f\t",c[i][j]);
        }
        printf("\n");
    }
    for(k=1;k<=m+1;k++)
        for(i=1;i<=m+1;i++){
            if(i!=k){
                u=c[i][k]/c[k][k];
                for(j=k;j<=m+2;j++){
                    c[i][j]=c[i][j]-u*c[k][j];
            }
        }
    }
    for(i=1;i<=m+1;i++){
        a[i]=c[i][m+2]/c[i][i];
        printf("a[%d]=%f\n",i,a[i]);
    }
    getch();
}

프로그램 동작 원리

이 프로그램은 크게 네 단계로 동작합니다.

1단계 – 입력: 다항식의 차수 m과 데이터 개수 n을 입력받은 뒤, 각 데이터 쌍 (x, y)을 배열에 저장합니다.

2단계 – 정규방정식 구성: 2차원 배열 c에 Σx⁽ʲ⁺ᵏ⁻²⁾ 값을 계산해 저장하여 계수 행렬을 만들고, 우변 벡터인 Σy·x⁽ʲ⁻¹⁾ 값을 마지막 열에 추가합니다.

3단계 – 가우스 소거법: 전진 소거(forward elimination) 과정을 통해 연립 방정식을 삼각 형태로 변환합니다.

4단계 – 계수 계산: 후진 대입을 통해 각 계수 a[i] = c[i][m+2] / c[i][i]를 구하여 화면에 출력합니다.

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.

enter m,n:4 5
enter values of x and y1 1
enter values of x and y2 3
enter values of x and y1 2
enter values of x and y1 2
enter values of x and y1 1
5.00  6.00  8.00  12.00  20.00  9.00
6.00  8.00  12.00 20.00  36.00  12.00
8.00  12.00 20.00 36.00  68.00  18.00
12.00 20.00 36.00 68.00  132.00 30.00
20.00 36.00 68.00 132.00 260.00 54.00
a[1]=1.750000
a[2]=-2.375000
a[3]=2.000000
a[4]=0.500000
a[5]=-0.375000

실행 결과에서 중간에 출력된 5×6 행렬은 정규방정식의 증강 행렬(augmented matrix)이며, 마지막에 출력된 a[1]부터 a[5]까지의 값이 곧 4차 다항식의 각 항별 계수입니다. 따라서 이 예제에서 구해진 회귀 다항식은 다음과 같습니다.

y = 1.75 − 2.375x + 2x² + 0.5x³ − 0.375x⁴

이처럼 다항 회귀를 C언어로 직접 구현해 보면 선형대수학의 정규방정식과 가우스 소거법이 실제 데이터 분석에서 어떻게 활용되는지 명확하게 이해할 수 있습니다.