Nonlinear Regression แบบ "ทำมือ" ใน spreadsheet ตอน 3


ขอให้ดึงแฟ้มต่อไปนี้ขึ้นมาเก็บไว้ในเครื่องก่อน

http://gotoknow.org/file/wwibul/randomoptimization.xls

เข้าไปในแฟ้ม จะเป็นตัวอย่างการทำ nonlinear regression แบบบ้าน ๆ ทำมือ ที่เร็วใช้ได้

ข้อสำคัญ เขียนง่าย

ทำอย่างไร ?

จริง ๆ แล้ว ทำไว้ให้ดูแล้ว แต่ผมจะเล่าให้ฟังเพื่อให้เข้าใจระบบคิด

หากมีข้อมูลดิบ X, Y ใส่ไว้เป็น 2 คอลัมน์

หากเราต้องการ regression กับสมการ Y = 1 - exp( -a * (t ^ b))

ก็ให้สร้างช่องสำหรับกรอกพารามิเตอร์ a และ b

ครั้งแรก ให้สมมติ a และ b ใส่ตั้งไว้ก่อน

ถัดมา ให้สร้าง Ypred ซึ่งก็คือ ค่า Y ที่ทำนายจากสมการดังกล่าว

(ตอนนี้ เรารู้ค่า a และ b แล้ว เราจึงสามารถสร้างคอลัมน์นี้ได้)

ถัดมา ให้คำนวณอีกคอลัมน์ คือ error ยกกำลังสอง คือ (Y-Ypred)^2

แล้วหาผลรวมคอลัมน์ error ยกกำลังสองนี้ ไปใส่ไว้ในช่องที่เขียนว่า SSE

คราวนี้ ทำกราฟ แกนนอนคือ X แกนยืนคือ Y (ใช้ symbol) และ Ypred (ใช้ line)

ตัว SSE เอง ก็ทำเป็นกราฟแท่งด้วย

แค่นี้เอง ก็เริ่มใช้งานได้แล้ว

หากเราลองแก้ a และ b เราจะเห็นเลยว่า การ fit ข้อมูล เปลี่ยนไปทันตาเห็น และเราก็จะเห็นตลอดเวลา ว่า SSE มากน้อยแค่ไหน

ลองแก้ a และ b ดูสักพัก เราจะเหนื่อยมาก

ทำอย่างไร ไม่ให้เหนื่อย

วิธีคือ บังคับให้ a และ b เกิด random walk รอบค่า mean และ sd ที่กำหนดให้

อ้าว แล้ว mean กับ sd ที่กำหนดให้ของ a และ b จะมาจากไหน

ก็เอาที่เคยลอง ๆ แล้วกราฟหน้าตาดี มาใช้ไงครับ

มาใส่ไว้ในโซนข้างนอก เก็บสถิติเก่า สัก 3-4 ครั้งก็พอ

ก็จะหา mean และ sd ของ a และ b ได้

แล้วสั่งให้ a และ b เกิด random walk รอบค่า mean และ sd ที่ดีที่สุดในอดีต โดยใช้คำสั่งที่มีรูปแบบว่า

norminv(rand(), mean, sd)

การที่วิธีนี้ เหนือกว่าการสุ่มขนานแท้ เพราะเป็นการสุ่มใกล้ ๆ สิ่งที่เคยทำได้ดีมาก่อน จึงเป็นเหมือนการปรับปรุงแก้ไขตัวเองอย่างต่อเนื่อง โดยเรียนรู้จากอดีต 

คราวนี้ a และ b จะเปลี่ยนอัตโนมัติทุกครั้งที่เรา click save

เราดูว่า กราฟไหน ออกมาดี ก็ใช้ค่า a และ b ที่เข้าท่าชุดนั้น ไปใส่ในช่องสถิติเก่า ซึ่งจะทำให้ mean และ sd เปลี่ยนไป โดย mean จะนิ่งใกล้คำตอบที่แท้จริง และ sd ก็จะน้อยลงเรื่อย ๆ เข้าใกล้ศูนย์ในที่สุด

แค่นี้ ก็เสร็จแล้วครับ

อย่างเช่น ผมลอง click สักพัก ก็พอใจกับกรณีนี้

อันที่จริง ถ้าใจเย็นหน่อย ทำต่อ จะได้ดีกว่านี้ แต่ผมทำพอให้เห็นตัวอย่าง

วิธีนี้ ตาม wikipedia มีผู้เสนอแนวคิดมาหลายสิบปีแล้ว

แต่ผมเคยไปเจอในวารสารของวิศวเคมีที่ตีพิมพ์เมื่อสิปปีก่อน และเคยนำไปใช้ในงานวิจัย ได้ผลดี แต่เขียนเป็นโปรแกรม ไม่ได้้ทำในกระดาษทดอิเล็กทรอนิกส์เช่นนี้ เพิ่งมาฉุกใจคิดว่า วิธีนี้ ลงตัวกรณีนี้

ข้อเสียของวิธีนี้คือ อาจต้องทำซ้ำกันมากพอสมควร ซึ่งก็เป็นโทษสมบัติของวิธีเชิงสุ่มอยู่แล้ว แต่ก็พอใช้ได้ ดีกว่าการสุ่มสะเปะสะปะวิธีอื่น

ข้อดีคือ เขียนโปรแกรมง่ายมาก ๆ

วิธี genetic algorithm ง่ายแบบไม่ต้องใช้คอมพิวเตอร์

แต่วิธีนี้ เป็นวิธีในคอมพิวเตอร์ ที่เขียนโปรแกรมง่าย

และยังสามารถรับมือกับกรณีที่มี parameters หลาย ๆ ตัวได้โดยไม่ต้องปรับกรรมวิธี จึงใช้สะดวกมาก

สำหรับการทำ approximation ทั่วไป วิธีนี้ ใช้ดีมากครับ

หมายเลขบันทึก: 159089เขียนเมื่อ 13 มกราคม 2008 23:09 น. ()แก้ไขเมื่อ 6 กันยายน 2013 18:42 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท