R² 값 출력
이 마지막 단계에서는 파일에서 데이터를 읽고, 회귀 매개변수를 계산하며, 자세한 해석과 함께 R² 값을 출력하는 종합적인 프로그램을 작성합니다.
먼저, 샘플 데이터 파일을 생성합니다.
cd ~/project
nano regression_data.txt
샘플 회귀 데이터를 추가합니다.
1.0 2.0
2.0 4.0
3.0 5.0
4.0 4.0
5.0 5.0
이제 최종 R² 계산 프로그램을 생성합니다.
nano r_squared_print.c
다음 코드를 입력합니다.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 선형 회귀 매개변수를 계산하는 함수
void calculateRegressionParameters(double *x, double *y, int n,
double *slope, double *intercept) {
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x_squared = 0;
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x_squared += x[i] * x[i];
}
// 최소 제곱법을 사용하여 기울기와 절편 계산
*slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x * sum_x);
*intercept = (sum_y - *slope * sum_x) / n;
}
// R-제곱을 계산하는 함수
double computeRSquared(double *x, double *y, int n, double slope, double intercept) {
double total_variation = 0.0;
double explained_variation = 0.0;
double y_mean = 0.0;
// y 의 평균 계산
for (int i = 0; i < n; i++) {
y_mean += y[i];
}
y_mean /= n;
// 변동 계산
for (int i = 0; i < n; i++) {
total_variation += pow(y[i] - y_mean, 2);
double predicted_y = slope * x[i] + intercept;
explained_variation += pow(y[i] - predicted_y, 2);
}
// R-제곱 계산
return 1 - (explained_variation / total_variation);
}
// R-제곱 값 해석 함수
void interpretRSquared(double r_squared) {
printf("\nR² 해석:\n");
if (r_squared < 0.3) {
printf("모델 적합도가 약함: 모델이 분산의 30% 미만을 설명합니다.\n");
} else if (r_squared < 0.5) {
printf("모델 적합도가 보통: 모델이 분산의 30-50% 를 설명합니다.\n");
} else if (r_squared < 0.7) {
printf("모델 적합도가 좋음: 모델이 분산의 50-70% 를 설명합니다.\n");
} else {
printf("모델 적합도가 우수: 모델이 분산의 70% 이상을 설명합니다.\n");
}
}
int main() {
FILE *file;
int n = 0, max_lines = 100;
double x[100], y[100];
double slope, intercept, r_squared;
// 데이터 파일 열기
file = fopen("regression_data.txt", "r");
if (file == NULL) {
printf("파일 열기에 실패했습니다!\n");
return 1;
}
// 파일에서 데이터 읽기
while (fscanf(file, "%lf %lf", &x[n], &y[n]) == 2) {
n++;
if (n >= max_lines) break;
}
fclose(file);
// 회귀 매개변수 계산
calculateRegressionParameters(x, y, n, &slope, &intercept);
// R-제곱 계산
r_squared = computeRSquared(x, y, n, slope, intercept);
// 결과 출력
printf("회귀 분석 결과:\n");
printf("데이터 포인트 수: %d\n", n);
printf("기울기: %.4f\n", slope);
printf("절편: %.4f\n", intercept);
printf("R-제곱 (R²): %.4f\n", r_squared);
// R-제곱 해석
interpretRSquared(r_squared);
return 0;
}
프로그램을 컴파일합니다.
gcc -o r_squared_print r_squared_print.c -lm
프로그램을 실행합니다.
./r_squared_print
예시 출력:
회귀 분석 결과:
데이터 포인트 수: 5
기울기: 0.6000
절편: 1.5000
R-제곱 (R²): 0.5600
R² 해석:
모델 적합도가 좋음: 모델이 분산의 50-70%를 설명합니다.
주요 내용:
- 외부 파일에서 데이터를 읽습니다.
- 최소 제곱법을 사용하여 회귀 매개변수를 계산합니다.
- R² 값을 계산합니다.
- R² 값을 해석합니다.
- 모델의 예측력을 이해하는 데 도움이 됩니다.