কিভাবে একটি পয়েন্ট সেটকে সেরা সম্ভব স্ট্রেট লাইন দিয়ে প্রকাশ করা যায় তা আলোচনা করব। আমাদের একটি পয়েন্ট সেটের (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: m এবং c-এর মান y = mx + c সমীকরণে যেকোনো পয়েন্ট (xi, yi) এর জন্য প্রয়োগ করলে সেটি সব পয়েন্ট কভার করে সেরা স্ট্রেট লাইন দেবে। (x2,y2)-এ m এবং c প্রয়োগ করলে, L.H.S : mx + c = 0.8 * 5 + 1.85 = 5.85 R.H.S : y = 6 যা 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-এর মান বের করতে হবে। পয়েন্ট সংখ্যা ২ হলে একটি ইউনিক সমাধান থাকবে, কিন্তু পয়েন্ট সংখ্যা ২-এর চেয়ে বেশি হলে সমাধান থাকতে পারে বা নাও থাকতে পারে।
পয়েন্ট সংখ্যা n ধরি,
তাহলে আমাদের nটি সমীকরণ থাকবে, fn = mxn + c
এই সমীকরণটি সেরা ফিট (best fit) হওয়ার জন্য, fi-এর মান yi-এর সমান বা কাছাকাছি হতে হবে।
Z = ( fi - yi )2 নিই; এখন, আমাদের সব পয়েন্টের জন্য এই মান ন্যূনতম করতে হবে। ( fi - yi ) টার্মটি স্কোয়ার করা হয়েছে নেগেটিভ টার্ম খালাস করার জন্য।
Z ন্যূনতম হওয়ার জন্য এটিকে সেটিসফাই করতে হবে,
𝜹(Z) / 𝜹(m) = 0 এবং 𝜹(Z) / 𝜹(c) = 0।
এই সমীকরণগুলো সমাধান করলে,
sigma(y) = m * sigma(x) + no_of_points * c, এবং
sigma(xy) = m * sigma(x2) + c * sigma(x)।
যা হচ্ছে,
m = (no_of_points * sigma(xy) - sigma(x) * sigma(y) ) / (n * sigma(x2) - sigma(x)^2 ) , এবং
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; // সমীকরণের সব টার্ম ক্যালকুলেট করুন। 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]); } // সূত্র ব্যবহার করে m এবং c-এর মান ক্যালকুলেট করুন। 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++ প্রোগ্রামও আলোচনা করেছি যা আমরা C, Java, Python ইত্যাদি প্রোগ্রামিং ভাষায়ও করতে পারি। আশা করি আপনি এই টিউটোরিয়ালটিকে উপকারী পাবেন।