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

C++에서 가능한 최상의 직선으로 주어진 점 집합을 나타냅니다.

<시간/>

가능한 한 최상의 직선으로 점 집합을 나타내는 방법에 대해 토론합니다. 점 집합의 값(x,y)이 주어지고 최상의 직선 y =mx + c를 찾아야 합니다. 따라서 필요한 것은 예를 들어 m과 c의 값을 찾는 것뿐입니다.

Input: no_of_points = 4
x1 = 2, y1 = 3,
x2 = 5, y2 = 6,
x3 = 1, y3 = 3,
x4 = 4, y4 = 5.

Output: m = 0.8, c = 1.85
Explanation: If we apply the value of m and c in the equation y = mx + c for any point (xi, yi) it would give the best straight line covering all the points.
Putting value of m and c in (x2,y2),
L.H.S : mx + c = 0.8 * 5 + 1.85 = 5.85
R.H.S : y = 6 which is nearly equal to L.H.S.

Input: no_of_points = 3
x1 = 3, y1 = 6,
x2 = 2, y2 = 4,
x3 = 1, y3 = 3,

Output: m = 1.5,c = 1.33

해결책을 찾기 위한 접근 방식

이 문제를 해결하려면 m과 c의 값을 찾아야 합니다. 포인트 수가 2일 때 고유 솔루션이 있지만 2보다 큰 포인트가 없을 때 솔루션이 존재할 수도 있고 없을 수도 있습니다.

점의 수를 n이라고 합시다.

따라서 우리는 n개의 방정식을 갖게 됩니다. fn =mxn + c

이 방정식이 가장 적합하려면 yi와 같거나 가까운 fi 값을 찾아야 합니다.

Z =( fi - yi )2 를 취합시다. 이제 모든 점에 대해 이 값을 최소로 만들어야 합니다. 음수 항을 제거하기 위해 항( fi - yi )을 제곱했습니다.

Z가 최소가 되려면 다음을 충족해야 합니다.

𝜹(Z) / 𝜹(m) =0 및 𝜹(Z) / 𝜹(c) =0.

이 방정식을 풀 때,

시그마(y) =m * 시그마(x) + no_of_points * c 및

시그마(xy) =m * 시그마(x2) + c * 시그마(x).

즉,

m =(no_of_points * sigma(xy) - sigma(x) 8 sigma(y) ) / (n * sigma(x2) - sigma(x2) ) 및

c =( sigma(y) - m * sigma(x) ) / no_of_points.

이제 최종 방정식의 m과 c를 찾는 직접적인 공식이 생겼습니다.

위 접근 방식에 대한 C++ 코드

#include <cmath>
#include <iostream>
using namespace std;
int main(){
   int X[] = { 3, 2, 1 };
   int Y[] = { 6, 4, 3};
   int no_of_points = sizeof(X) / sizeof(X[0]);
   float m, c;
   int sum_of_X = 0, sum_of_X2 = 0, sum_of_Y = 0, sum_of_XY = 0;
   // calculating all the terms of the equation.
   for (int i = 0; i < no_of_points; i++) {
      sum_of_X = sum_of_X + X[i];
      sum_of_X2 = sum_of_X2 + pow(X[i],2);
      sum_of_Y = sum_of_Y + Y[i];
      sum_of_XY = sum_of_XY + (X[i] * Y[i]);
   }
   // calculating value of m and c using formula.
   m = (no_of_points * sum_of_XY - sum_of_X * sum_of_Y) / (no_of_points * sum_of_X2 - pow(sum_of_X,2));
   c = (sum_of_Y - m * sum_of_X) / no_of_points;
   cout << "m = " << m;
   cout << "\nc = " << c;
   return 0;
}

출력

m = 1.5
c = 1.33333

결론

이 튜토리얼에서 우리는 주어진 점 세트를 나타내는 가장 적합한 직선을 찾는 것에 대해 논의했습니다. 우리는 먼저 m과 c에 대한 공식을 도출한 다음 간단히 적용하여 간단한 접근 방식에 대해 논의했습니다. 우리는 또한 C, Java, Python 등과 같은 프로그래밍 언어로 할 수 있는 이 문제에 대한 C++ 프로그램에 대해 논의했습니다. 이 튜토리얼이 도움이 되기를 바랍니다.