พิสูจน์ สูตร Linear Regression
Linear Regression ภาษาไทยเรียกว่า “การวิเคราะห์การถดถอยเชิงเส้น” (บางทีก็เรียกว่า Least square method ภาษาไทย “กำลังสองถดถอยน้อยสุด”) หัวข้อนี้เริ่มเรียนกันในระดับ ม.ปลาย เป็นเทคนิคหนึ่งในหลาย ๆ เทคนิค ที่ถูกนำไปประยุกต์ใช้ในงาน Machine Learning , AI สำหรับการพยากรณ์สิ่งที่จะเกิดจากข้อมูลที่มีอยู่
หากเรามีข้อมูล ตัวอย่างเช่น เราเปิดร้านขายสินค้าแล้วเราเก็บข้อมูลรายได้ ทุกวันเป็นดังนี้
แล้วเราต้องการทำนายว่าวันที่ 5 จะมีรายได้เท่าไร
หากประมาณด้วยสายตาก็จะเห็นว่า รายได้ นั้นจะมีค่าเพิ่มขึ้นวันละ 100 บาท ดังนั้นเราจะประมาณได้ว่าวันที่ 5 จะมีรายได้ประมาณ 500 บาท
แต่การประมาณด้วยสายตาแบบนี้จะมีความแม่นยำที่ต่ำ และหากข้อมูลมีความซับซ้อนก็ไม่สามารถทำได้ ดังนั้นเราจะใช้วิธีทางคณิตศาสตร์เพื่อทำนายค่าที่ต้องการ
สิ่งที่เราต้องการ คือ หาฟังก์ชันความสัมพันธ์ของข้อมูล จากข้อมูลที่เรามี โดยจะมีอยู่ 2 วิธีหลัก ๆ ดังนี้
1. Interpolation คือ การหาฟังก์ชันความสัมพันธ์ที่ผ่านทุกข้อมูล
2. Regression คือ การหาฟังก์ชันความสัมพันธ์ที่เป็นตัวแทนของข้อมูล
ในที่บทความนี้ จะกล่าวถึงวิธี Linear Regression ซึ่งหมายความว่าจะหาฟังก์ชันความสัมพันธ์ของข้อมูลที่เป็นเส้นตรง
ในตอนที่เรียนในระดับ ม.ปลาย จะต้องจำสูตร
สมการเส้นตรง
เมื่อ m คือ ค่าความชัน และ c คือ จุดตัดแกน y
และ สูตรที่ใช้หา m , c
ตัวอย่างการใช้สูตร จากข้อมูลการขายสินค้าของตัวอย่างด้านบน จะได้ว่าตัวแปรอิสระ(independent variable) : x คือ วันที่ และ ตัวแปรตาม(dependent variable) : y คือ รายได้ จากนั้นทำการเพิ่ม column xy และ x²
แทนค่าในสมการที่ 1 จะได้ 1000 = 10m + 4c
แทนค่าในสมการที่ 2 จะได้ 2997 = 30m + 10c
แก้สมการจะได้ m = 99.4, c = 1.5จะได้สมการเส้นตรง y = 99.4x + 1.5
ดังนั้น วันที่ 5(แทนค่า x=5) y = 498.5 #
สำหรับที่มาของ 2 สูตรนี้ ต้องใช้ความรู้ calculus ในหัวข้อ กฏลูกโซ่(Chain Rule) , ค่าสูงสุด ต่ำสุด(Max/Min value) , อนุพันธ์ย่อย(Partial differential)
หากมีข้อมูลดังรูป สมมุติว่าเส้นตรงที่ต้องการเป็น y = mx + c จะเห็นว่าที่ตำแหน่งข้อมูล x ใด ๆ มีค่าที่คลาดเคลื่อนจากข้อมูลจริงอยู่(เส้นสีชมพู) เช่น ที่ x1 ข้อมูลจริง คือ y1 แต่ค่า y ที่ได้จากสมการเส้นตรง คือ mx1 + c ดังนั้นเราต้องพยายามทำให้ค่าคลาดเคลื่อนนี้น้อยที่สุด
ค่าคลาดเคลื่อนที่ตำแหน่งต่าง ๆ สามารถหาได้ดังนี้
ค่าคลาดเคลื่อนนี้จะมีทั้งกรณีที่เป็น บวก และ ลบ ดังนั้นเราสามารถทำให้เป็นบวกทั้งหมดได้โดยการยกกำลังสอง จะได้
ทำการรวมค่าคลาดเคลื่อนกำลังสองทั้งหมด จะได้
ตั้งชื่อค่านี้เป็น E เพื่อจะได้ง่ายในการเรียก
ทำการหาค่า E ที่น้อยที่สุด เทียบตัวแปร c
ให้มีค่า เท่ากับ 0 จะได้
ทำการหาค่า E ที่น้อยที่สุด เทียบตัวแปร m
ให้มีค่า เท่ากับ 0 จะได้
ก็จะได้ 2 สูตรดังข้างต้น
เราสามารถเขียนโปรแกรมคำนวณค่า Linear Regression ได้ดังนี้
จาก code ด้านบนจะเห็นว่าต้องมีการคำนวณค่าต่าง ๆ เองตามสูตร และมีการจัดรูปสมการสำหรับหาค่า m , c (วิธีการจัดรูปสมการขอละไว้) ทั้งนี้ในภาษา python จะมี module scipy ซึ่งถูกสร้างขึ้นมาเพื่อคำนวณด้านคณิตศาสตร์/วิทยาศาสตร์ ซึ่งจะมี function stats.linregress() ในการหาค่าต่าง ๆ ของ Linear Regression ได้ดังนี้
จาก code ทั้งสองจะหาค่าได้ว่า วันที่ 5 (x=5) จะมีรายได้ (y) เท่ากับ 498.5 ซึ่งเท่ากับที่เราคำนวณไว้ตามสูตร และสามารถ plot กราฟออกมาได้ดังรูป
ในส่วน module numpy จะใช้ function polyfit() ดังนี้
import numpy as np
x = np.array([1,2,3,4])
y = np.array([101,199,302,398])
# Fit a polynomial
m , c = np.polyfit(x,y,1) # linear : degree = 1
def regress_func(x) :
return m*x + c
print(“slope :”,m) # 99.39999999999998
print(“intercept :”,c) # 1.5000000000000693
print(regress_func(5)) # 498.49999999999994
จากตัวอย่างที่ยกมานั้น ค่าที่ได้จากการพยากรณ์นั้นอ้างอิงมาจากข้อมูลที่มีอยู่ แต่หากมองในโลกความเป็นจริงหากจำนวนวัน(x)มากขึ้น รายได้อาจจะไม่ได้เป็นสัดส่วนแบบเส้นตรงแล้วก็ได้ นอกจาก Linear Regression แล้วยังมีเทคนิคอื่น ๆ อีก เช่น Polynomial Regerssion , Multiple Regression เป็นต้น ซึ่งจะยังไม่กล่าวถึงในที่นี้