[TH] Calculate Regression with NumPy.

บทความนี้เป็นการแปลงการใช้งานโมเดลรีเกรสชันจากบทความของ ESP32-C3 มาเป็น NumPy บน Raspberry Pi และ PC พร้อมทั้งใช้การแสดงผลเป็น Matplotlib ดังภาพที่ 1 ซึ่งจะพบว่า จากบทความก่อนหน้านี้ได้นำค่าอุณหภูมิและความชื้นจากข้อมูล 1 วันมาหาพารามิเตอร์ a และ b ของสมการถดถอยหรือรีเกรสชัน (regression) และนำสมการหรือโมเดลที่ได้นี้มาหาค่าของอุณหภูมิที่เป็นไปได้ในช่วงเวลา 1 วัน

ภาพที่ 1 ผลลัพธ์ของตัวอย่างโปรแกรม

โค้ดโปรแกรม

โค้ดโปรแกรมที่ดัดแปลงจากบทความก่อนหน้านี้เป็นดังต่อไปนี้

import numpy as np
import matplotlib.pyplot as plt

n = 24
x = np.arange(n)
y = np.array([29.5, 29.2, 29.0, 28.9, 28.6, 28.8, 28.5, 28.3, 29.0, 29.6, 30.8, 31.8, 31.7, 32.1, 32.5, 31.6, 30.5, 30.5, 30.2, 29.6, 29.5, 29.2, 28.1, 28.9])

sumX = np.sum(x)
sumY = np.sum(y)
sumXY = np.sum(x*y)
sumX2= np.sum(x*x)
sumY2 = np.sum(y*y)

print("SumX={}".format(sumX))
print("SumY={}".format(sumY))
print("SumXY={}".format(sumXY))
print("SumX2={}".format(sumX2))
print("SumY2={}".format(sumY2))

a = ((sumY*sumX2)-(sumX*sumXY))/((n*sumX2)-(sumX*sumX))
b = ((n*sumXY)-(sumX*sumY))/((n*sumX2)-(sumX*sumX))
print("Y = ({})+({}*x)+c".format(a,b))

z = a+(b*x)
print(z)

plt.suptitle('regression')
plt.ylabel('Temperature')
plt.xlabel('Hour')
plt.subplot(111)
plt.plot(y)
plt.subplot(111)
plt.plot(z)
plt.show()

จากโปรแกรมแบ่งการทำงานได้ 4 ขั้นตอนคือ

  • สร้างตัวแปร x และ y เพื่อเก็บค่าชั่วโมงและอุณหภูมิของแต่ละชั่วโมง
  • คำนวณหาผลรวมของ x, y, x*y, x*x และ y*y
  • หาค่า a และ b
  • แสดงผลด้วย matplotlib

สร้างตัวแปร

จากบทความ ulab เรื่อง array และ numpy เราสามารถสร้างตัวแปรเก็บข้อมูลด้วย numpy.array() และ numpy.arange() สำหรับสร้างแถวลำดับ เมื่อสร้างตัวแปร x เก็บค่า 0 ถึง 23 จคงใช้คำสั่ง arange() เพื่อสร้างแถวลพดับของข้อมูลในช่วงค่าที่กำหนด และสร้างตัวแปร y ด้วย array() โดยระบุค่าของแต่สมาชิก ดังนี้


x = np.arange(n)
y = np.array([29.5, 29.2, 29.0, 28.9, 28.6, 28.8, 28.5, 28.3, 29.0, 29.6, 30.8, 31.8, 31.7, 32.1, 32.5, 31.6, 30.5, 30.5, 30.2, 29.6, 29.5, 29.2, 28.1, 28.9])

คำนวณ

ด้วยหลักการทำงานของ numpy ใช้การคำนวณกับทั้งก้อนข้อมูล ดังนั้น เมื่อนำค่าตัวเลข (scalar) เข้าไปดำเนินการทางคณิตศาสตร์กับตัวแปรที่สร้างจาก numpy จะเป็นการกระทำกับทุกสมาชิกภายในตัวแปรนั้น และการกระทำกันระหว่างตัวแปรด้วยกันจะดำเนินการนั้นกับสมาชิกที่ลำดับเดียวกัน ส่วนการหาผลรวมสามารถใช้คำสั่ง numpy.sum() เพื่อหาผลรวมของสมาชิกทั้งหมดในตัวแปร ดังนั้น โค้ดของการหาผลรวมของ x, y, x*y, x*x และ y*y สามารถเขียนได้ดังนี้


sumX = np.sum(x)
sumY = np.sum(y)
sumXY = np.sum(x*y)
sumX2= np.sum(x*x)
sumY2 = np.sum(y*y)

หาค่า a และ b

การคำนวณหา a และ b สำหรับสมการเส้นตรงดังต่อไปนี้

Y = a + bX + c

ซึ่ง

a=( (Σy)(Σx2) – (Σx)(Σxy) ) / ( n(Σx2) – (Σx)2)

b= (n (Σxy) – (Σx)(Σy) ) / (n(Σx2) – (Σx)2)

เขียนเป็นโค้ดได้ดังนี้


a = ((sumY*sumX2)-(sumX*sumXY))/((n*sumX2)-(sumX*sumX))
b = ((n*sumXY)-(sumX*sumY))/((n*sumX2)-(sumX*sumX))

แสดงผล

เมื่อนำมาแสดงผลด้วยกราฟผ่านทาง matplotlib สามารถเขียนได้ดังนี้ โดยผลลัพธ์ของการแสดงผลเป็นดังภาพที่ 1


plt.suptitle('regression')
plt.ylabel('Temperature')
plt.xlabel('Hour')
plt.subplot(111)
plt.plot(y)
plt.subplot(111)
plt.plot(z)
plt.show()

สรุป

จากบทความนี้จะพบว่า การเขียนโปรแกรมด้วยภาษาไพธอนมีจุดเด่นในเรื่องของการข้ามแพลตฟอร์มทำให้สามารถโอนโค้ดจาก esp32 มาใช้กับ Raspberry Pi หรือ PC ได้ และด้วยไลบรารีที่ทำหน้าที่แสดงผลกราฟอย่าง matplotlib จึงทำให้ผู้เขียนโปรแกรมแสดงผลได้หลากหลายและสวยงาม ดังนั้น การได้เรียนรู้ไลบรารี และการเลือกใช้งานไลบรารีทำให้ประหยัดเวลาในการพัฒนา และเหมาะกับการสร้างเป็นต้นแบบเพื่อปรับปรุงการทำงานต่อไป สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ

(C) 2020-2022, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-12-19, 2022-02-01