Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

선형 회귀


주어진 데이터 포인트 세트에서 선형 회귀는 직선 방정식을 찾습니다. 주어진 점은 직선을 따를 것입니다. 이 공식을 사용하여 현재 집합에 없는 다른 특정 지점의 값이 무엇인지 예측할 수 있습니다.

일부 데이터 포인트를 사용하여 선형 회귀 문제를 해결하려면 다음 공식을 따라야 합니다.

선형 회귀

여기서 m과 c는 각각 기울기와 y절편입니다. 이 식을 사용하여 다음 형식의 직선 방정식을 얻을 수 있습니다. 𝑦 =𝑚𝑥 + 𝑐.

입력 및 출력

Input:
The (x, y) coordinates of some points. {(1,3), (2,4), (3,5), (4,6), (5,8)}
Output:
The slope: 1.2 The Intercept: 1.6
The equation: y = 1.2x + 1.6

알고리즘

linReg(coord)

입력: 주어진 좌표점 집합입니다.

출력: 기울기 m과 y절편 c.

Begin
   for i := 1 to n, do
      sumX := sumX + coord[i,0]
      sumY := sumY + coord[i,1]
      sumXsq := sumXsq + (coord[i,0]*coord[i,0])
      sumXY := sumXY + (coord[i,0] * coord[i,1])
   done

   m := (n * sumXY – (sumX*sumY)) / (n * sumXsq – (sumX * sumX))
   c := (sumY / n) – (m * sumX)/n
End

예시

#include<iostream>
#include<cmath>
#define N 5
using namespace std;

void linReg(int coord[N][2], float &m, float &c) {
   float sx2 = 0, sx = 0, sxy = 0, sy = 0;
   for(int i = 0; i<N; i++) {
      sx += coord[i][0];    //sum of x
      sy += coord[i][1];   //sum of y

      sx2 += coord[i][0]*coord[i][0];      //sum of x^2
      sxy += coord[i][0]*coord[i][1];     //sum of x*y
   }

   // finding slope and intercept
   m = (N*sxy-(sx*sy))/(N*sx2-(sx*sx));
   c = (sy/N)-(m*sx)/N;
}

main() {
   // this 2d array holds coordinate points
   int point[N][2] = {{1,3},{2,4},{3,5},{4,6},{5,8}};
   float m, c;
   linReg(point, m, c);
   cout << "The slope: " << m << " The Intercept: " << c << endl;
   cout << "The equation: " << "y = "<< m <<"x + "<< c;
}

출력

The slope: 1.2 The Intercept: 1.6
The equation: y = 1.2x + 1.6