อภิปรายวิธีการแสดงชุดจุดด้วยเส้นตรงที่ดีที่สุด เราได้รับค่า (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 คำอธิบาย: ถ้าเรานำค่า m และ c ไปแทนในสมการ y = mx + c สำหรับจุดใดๆ (xi, yi) จะได้เส้นตรงที่ดีที่สุดครอบคลุมจุดทั้งหมด นำค่า m และ c ไปแทนใน (x2,y2), 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 จะมีคำตอบที่ไม่ซ้ำกันเมื่อจำนวนจุดคือ 2 แต่เมื่อจำนวนจุดมากกว่าสอง คำตอบอาจมีหรืออาจไม่มี
สมมติจำนวนจุดเป็น n
เราจะมี n สมการ fn = mxn + c
สำหรับสมการนี้จะเป็น best fit เราต้องหาค่า fi ให้เท่ากับหรือใกล้เคียง yi มากที่สุด
ให้ Z = (fi - yi)² ตอนนี้ เราต้องทำให้ค่านี้เป็นค่าต่ำสุดสำหรับทุกจุด เรายกกำลังสองของพจน์ (fi - yi) เพื่อกำจัดพจน์ลบ
สำหรับ Z ที่จะเป็นค่าต่ำสุด ต้องเป็นไปตาม:
𝛿(Z)/𝛿(m) = 0 และ 𝛿(Z)/𝛿(c) = 0
เมื่อแก้สมการเหล่านี้:
sigma(y) = m × sigma(x) + no_of_points × c และ
sigma(xy) = m × sigma(x²) + c × sigma(x)
ซึ่งคือ:
m = (no_of_points × sigma(xy) - sigma(x) × sigma(y)) / (n × sigma(x²) - sigma(x)²) และ
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
สรุป
ในบทช่วยสอนนี้ เราอภิปรายการหาเส้นตรง best fit เพื่อแสดงชุดจุดที่กำหนด เราอภิปรายวิธีง่ายๆ โดยการหาสูตร m และ c ก่อน แล้วนำไปใช้ เรายังอภิปรายโปรแกรม C++ สำหรับปัญหานี้ซึ่งเราสามารถทำได้กับภาษาโปรแกรมมิ่งอย่าง C, Java, Python ฯลฯ เราหวังว่าบทช่วยสอนนี้จะเป็นประโยชน์