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