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
คำอธิบาย: ถ้าเรานำค่า 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 ฯลฯ เราหวังว่าบทช่วยสอนนี้จะเป็นประโยชน์