ขอให้ดึงแฟ้มต่อไปนี้ขึ้นมาเก็บไว้ในเครื่องก่อน
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 ทั่วไป วิธีนี้ ใช้ดีมากครับ
ไม่มีความเห็น