Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

การถดถอยเชิงเส้น (Linear Regression)

บทนำ

จากชุดจุดข้อมูลที่กำหนด การถดถอยเชิงเส้นจะหาสมการของเส้นตรง จุดที่กำหนดจะอยู่บนเส้นตรงนี้ โดยใช้สูตรนี้ เราสามารถทำนายค่าสำหรับจุดเฉพาะที่ไม่ได้อยู่ในชุดข้อมูลปัจจุบันได้

สูตรสำหรับแก้ปัญหาการถดถอยเชิงเส้นด้วยจุดข้อมูลมีดังนี้:

การถดถอยเชิงเส้น (Linear Regression)

โดยที่ m และ c คือความชันและจุดตัดแกน y ตามลำดับ ด้วยนิพจน์เหล่านี้ เราสามารถได้สมการเส้นตรงในรูป: y = mx + c

อินพุตและเอาต์พุต

Input: พิกัด (x, y) ของจุดบางจุด {(1,3), (2,4), (3,5), (4,6), (5,8)}
Output: ความชัน: 1.2, จุดตัด: 1.6, สมการ: y = 1.2x + 1.6

อัลกอริทึม

linReg(coord)
Input: ชุดจุดพิกัดที่กำหนด
Output: ความชัน 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

ตัวอย่างโค้ด (C++)

#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];      // ผลรวมของ x
        sy += coord[i][1];      // ผลรวมของ y
        sx2 += coord[i][0]*coord[i][0];  // ผลรวมของ x^2
        sxy += coord[i][0]*coord[i][1];  // ผลรวมของ x*y
    }
    // หาความชันและจุดตัด
    m = (N*sxy - (sx*sy)) / (N*sx2 - (sx*sx));
    c = (sy/N) - (m*sx)/N;
}

main() {
    // อาเรย์ 2D นี้เก็บจุดพิกัด
    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