Principal Components Analysis
สมมุติว่าเรามีข้อมูลอัตราแลกเปลี่ยนเงินตราในแต่ละวัน และแต่ละวันนั้นก็มีข้อมูลประกอบต่างๆเช่น อัตราดอกเบี้ย ปริมาณการนำเข้าส่งออก หนี้สาธารณะ ความมั่นคงทางการเมือง ฯลฯ ของแต่ละประเทศ
และสมมุติว่าเราสามารถวัดค่าพวกนั้นออกมาเป็นตัวเลขได้ เราก็จะได้ตารางประมาณนี้
*ตารางที่ยกมานี้เป็นเพียงข้อมูลสมมุติที่ใส่ไว้เพื่อให้พอเห็นภาพ
จากตาราง สมมุติว่าเราพยายามวิเคราะห์ความสัมพันธ์ของข้อมูล ก็จะเห็นความเกี่ยวโยงกันอยู่เช่น ความแข็งอ่อนของค่าเงินมีผลโดยตรงกับเศรษฐกิจ การเมือง การนำเข้าส่งออก แต่บางทีการนำเข้าส่งออกกับการเมืองก็สวนทางกัน ทำให้เรตในแต่ละวันก็ออกมาแตกต่างกัน ฯลฯ
คิดไปคิดมาสักพักก็จะเริ่มงงๆ เริ่มเรียงลำดับความสัมคัญไม่ค่อยถูก นี่ยังแค่ตัวแปร 7 ตัว ถ้าเราต้องการความแม่นยำที่สูงขึ้น ตัวแปรที่เก็บมาก็ควรจะมีมากขึ้นไปด้วย แล้วสมมุติว่าตัวแปรในที่นี้มีประมาณ 50 กว่าตัว แล้วเราจะเรียงลำดับความสำคัญอย่างไรดี? อันไหนมีผลกระทบมาก อันไหนแทบไม่มีความเกี่ยวข้องกันเลย อันไหนไม่จำเป็นต้องเอามาคิด ฯลฯ ปัญหาเหล่านี้ดูเหมือนจะสลับซับซ้อน แต่จริงๆแก้ได้ไม่ยากเลย นักคณิตศาสตร์มีวิธีการแก้ปัญหาทำนองนี้ด้วยเทคนิคที่เรียกว่า Principal Component Analysis ( PCA )
Principal : สิ่งที่สำคัญ
Component : องค์ประกอบ
Analysis : การวิเคราะห์
PCA โดยใจความสำคัญแล้วก็คือการวิเคราะห์โดยเฉพาะส่วนประกอบที่สำคัญๆเท่านัั้น ซึ่งเป็นเทคนิคหนึ่งที่ใช้กระบวนการทางสถิติและเมทริกซ์ (Matrix) เข้ามาอธิบายข้อมูลให้เป็นที่เข้าใจได้ง่ายยิ่งขึ้น. รูปแบบของข้อมูลที่ว่านี้จะอยู่ในรูปของตารางอย่างเช่นข้างบน เพื่อลดความซับซ้อนลง เราก็จะสร้างโมเดลขึ้นมาใหม่ ให้เป็นที่เข้าใจได้ง่ายขึ้น เหมือนการมองชุดข้อมูลด้วยมุมมองใหม่ แต่ไม่ได้ทำการเปลี่ยนแปลงข้อมูลดิบเลยแม้แต่ตัวเดียว
ตัวอย่างที่นำ PCA ไปใช้เช่น การตรวจจับใบหน้า การบีบอัดรูปภาพ และการหารูปแบบโครงสร้างของข้อมูลหลายมิติ
PCA ไม่ใช่สูตรบรรทัดเดียวจบ แต่เกิดจากผสมผสานเทคนิคต่างๆทางคณิตศาสตร์บางเรื่องเข้าด้วยกัน ถ้าเข้าใจความหมายของแต่ละส่วนประกอบแล้ว ก็จะเข้าใจ PCA ไปโดยปริยาย เทคนิคที่ใช้ใน PCA ประกอบด้วย
Standard Deviation
จุดที่น่าสังเกตคือ แกนหลัก (main diagonal) ก็คือ Variance นั่นเอง. นอกจากนี้แล้วcon(a,b) = con(b,a) ดังนั้น เมทริกซ์นี้สมมาตรกันในแกนหลัก. สูตรของ Covariance คือ
ซึ่งC^{n \times n} เป็นเมทริกซ์ n แถวและ n คอลัมน์. และ Dim_x คือมิติที่ x ของข้อมูลนั้นๆ
EigenVectors
เพื่อให้เห็นภาพและเข้าใจ Eigen vector ให้มากขึ้น พิจารณาพฤติกรรมการคูณเมตริกดังต่อไปนี้
จากกราฟ ถ้าเราเอาเวอกเตอร์เขียว กับน้ำเงินเข้ามาเขียนไว้ด้วยกันก็จะได้ A. Column ที่ 1 ของ A คือ เวกเตอร์เขียว (1,0) ส่วน Column ที่ 2 ก็คือเวกเตอร์สีน้ำเงิน (0,1). พอมีเวกเตอร์ v (1,1) เข้ามาคูณกับ A สุดท้ายก็ได้ตัวมันเอง เพราะ A ไม่มีการแปลงตัวใดๆทั้งนั้น
เราสามารถมองว่าv คือเวกเตอร์ใดๆก็ตามเวกเตอร์หนึ่ง พอมีเมทริกซ์อันใดอันหนึ่งเข้ามาคูณ ( A ) อันที่สามารถคูณกันได้ คือมีมิติที่สามารถคูณกันได้ ผลลัพธ์นั้นก็คือการแปลงรูปของ
v นั้นๆให้กลายไปเป็น v ใหม่ ที่อยู่ในโลกของ A นั้นๆ
คราวนี้ถ้าเกิด A มีการ transform ไป ลองนึกดูว่าเราหมุนกราฟนี้ทวนเข็มนาฬิกาไป 90 องศา รูปที่ได้ก็จะเป็นแบบนี้
ถ้าจะอธิบายกราฟข้างบนนี้ด้วยเมทริกซ์ A กราฟสีเขียวจากที่เคยเป็น (1,0) ก็กลายมาเป็น (0,1). ส่วนสีน้ำเงินก็เปลี่ยนจาก ( 0 , 1) ไปเป็น (-1,0). ดังนั้น A จึงสามารถเขียนใหม่ได้ว่า
ตัวอย่างข้างต้น v ก่อนคูณ และ v หลังจาการคูณมีทิศทางที่ต่างกัน ตามนิยามของ Eigen vector แล้ว ถ้า v ก่อนคูณ และ v หลังคูณมีทิศทางเดียวกัน ก็จะเป็นดังตัวอย่างต่อไปนี้
ให้
สำหรับกราฟ2 แล้ว ก็จะได้ว่า
อีกข้อหนึ่งที่น่าสนใจคือ ข้อมูลมีมิติเท่าใด ก็จะมีจำนวน Eigen vector เท่านั้น อย่าง A ในที่นี้มี 2 มิติ ก็จะมี Eigen vector 2 ตัว ซึ่งตัวเราเราได้เห็นแล้ว่วามันคือ ( 3,2) ส่วนอีกตัวก็คือ (1 , -1) วิธีการคำนวณหา Eigen vector สามามารถดูเพิ่มเติมได้ที่ Eigenvalues and eigenvectors Matrix_examples
สำหรับ (1,-1) สามารถทำเป็นกราฟได้ดังนี้
จุดที่น่าสังเกตอีกอย่างคือ Eigen vector ทุกตัว (กราฟ 2 และ 4 ) จะตั้งฉากกัน (orthogonal) และไม่ว่าจะมีกี่ Eigen vector ก็ตาม ทั้งหมดนั้นก็จะตั้งฉากซึ่งกันและกันหมด
คราวนี้ลองมาคิดย้อนกลับ ถ้าสมมุติว่าเราไม่รู้ ว่า A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix} แต่เรามี Eigen vectors กับ \lambda ของแต่ละ Eigen vector เราก็จะสามารถคำนวณหา A ได้ทันที เช่น
ข้อนี้สำคัญ เพราะมันหมายความว่า เราสามารถพรีเซนต์ชุดข้อมูลนี้ในรูปแบบของ Eiegent Vectors ได้ แทนที่จะแสดงในมิติเดิมคือ x,y และเราจะใช้วิธีนี้ใน PCA
EigenValue
คือค่าที่มากับ Evient Vector หรือก็คือ \lambda นั่นเอง คือค่าที่บอกว่าหากมีการ transform Eigent Vector นั้นๆแล้ว แล้วมันจะสเกลเป็นกี่เท่า. และ \lambda ก็จะมาคู่กับ v เสมอ
ว่าด้วยเรื่องของการบีบอัดข้อมูล ยกตัวอย่าง A ที่ประกอบด้วย ( a, b , c ,d ) ในหัวข้อ Eigen Vector ถ้าเราไม่สนใจค่า \lambda = -1 เราก็จะยังได้
ซึ่งก็ใกล้เคียงกับค่าเดิมของ A. ต่อไปเราจะมาดูวิธีการทำ PCA ในแต่ละขั้น. โดยสรุปแล้วจะมีดังนี้
2.) ลบกับค่าเฉลี่ย
3.) คำนวณ Covariance Matrice
จุดที่สำคัญตรงนี้คือ Eigen vectors ต้องเป็น unit eigenvectors หรือก็คือมีความยาวเท่ากับ 1 เช่น
5.) เลือกฟีเจอร์
จากหัวข้อ Eigen Vector เราจะเห็นว่า \lambda ที่มีค่ามากที่สุดคือองค์ประกอบที่สำคัญของข้อมูล (Principal component) ดังนั้น เราจะทำการเรียงลำดับ Eigen Vector จากมากไปหาน้อย ตามค่าของ Eiven values ที่มากับแต่ละตัว เราก็จะได้
จากนั้น เราก็เลือก Feature Vector ที่ต้องการ อย่างในที่นี้เรามีข้อมูลเพียงแค่ 2 มิติ และจะทำการลดให้เหลือแค่มิติเดียว เราก็จะได้
ถ้าหากมีหลายมิติ เราก็จะจัดเรียก FeatureVector ดังต่อไปนี้
แล้วก็ทำการเลือก Features ตามจำนวนที่ต้องการ
สมมุติว่าถ้าเราเลือก FeatureVector จาก EigenVector ทุกตัว เราจะได้แบบนี้
แต่ตามตัวอย่าง เราจะทำการเลือกเพียงแค่ 1 มิติเท่านั้น หากลองเอามาพร็อตเป็นกราฟ ก็จะได้ ตามกราฟข้างล่าง
ข้อสังเกตคือ เราปรับมิติที่ 2 ให้เป็น 0 หมดทุกตัว
6.) สร้างข้อมูลชุดใหม่ในมิติของ EigenVectors
คือขั้นตอนสุดท้ายของกระบวนการ PCA เราจะทำการแมบค่าข้อมูลเดิม กับฟีเจอร์ที่เราเลือกไว้ แล้วเราก็จะได้ข้อมูลใหม่ สังเกตว่าตอนแรกเป็น 10x2 มิติ แต่พอเปลี่ยนด้วยกระบวนการนี้ ก็จะเหลือแค่ 10x1 มิติ เท่านั้น
7.) แสดงข้อมูลชุดใหม่ในมิติที่น้อยลง
และถ้าเราลองพร็อตทั้งข้อมูลเดิม ข้อมูลที่ทำการลดมิติ และ Eigent Vector ทั้งหมดก็จะได้
สำหรับ Python ไฟล์ในโพสต์นี้ตามนี้ครับ
ตัวอย่างการวิเคราะห์กราฟแบบสามิติโดยใช้เทคนิค PCA
ตัวอย่างข้อมูล 3 มิติที่พร็อตโดยใช้ matplotlib.pyplot
References:
และสมมุติว่าเราสามารถวัดค่าพวกนั้นออกมาเป็นตัวเลขได้ เราก็จะได้ตารางประมาณนี้
Date | Country | Buy | Sell | Differentials in Inflation | Differentials in Interest Rates | Current-Account Deficits | Public Debt | Terms of Trade | Political Stability | Economic Performance |
---|---|---|---|---|---|---|---|---|---|---|
230517 | USA | 35 | 34 | 45 | 54 | 12.2 | 96 | 24 | 2 | 9 |
230517 | AUD | 30 | 29 | 52 | 44 | 15.8 | 78.9 | 30 | 4 | 7 |
230517 | X | ? | ? | ? | ? | ? | ? | ? | ? | ? |
250517 | Y | ? | ? | ? | ? | ? | ? | ? | ? | ? |
250517 | Z | ? | ? | ? | ? | ? | ? | ? | ? | ? |
250517 | . | . | . | . | . | . | . | . | . | . |
250517 | . | . | . | . | . | . | . | . | . | . |
*ตารางที่ยกมานี้เป็นเพียงข้อมูลสมมุติที่ใส่ไว้เพื่อให้พอเห็นภาพ
จากตาราง สมมุติว่าเราพยายามวิเคราะห์ความสัมพันธ์ของข้อมูล ก็จะเห็นความเกี่ยวโยงกันอยู่เช่น ความแข็งอ่อนของค่าเงินมีผลโดยตรงกับเศรษฐกิจ การเมือง การนำเข้าส่งออก แต่บางทีการนำเข้าส่งออกกับการเมืองก็สวนทางกัน ทำให้เรตในแต่ละวันก็ออกมาแตกต่างกัน ฯลฯ
คิดไปคิดมาสักพักก็จะเริ่มงงๆ เริ่มเรียงลำดับความสัมคัญไม่ค่อยถูก นี่ยังแค่ตัวแปร 7 ตัว ถ้าเราต้องการความแม่นยำที่สูงขึ้น ตัวแปรที่เก็บมาก็ควรจะมีมากขึ้นไปด้วย แล้วสมมุติว่าตัวแปรในที่นี้มีประมาณ 50 กว่าตัว แล้วเราจะเรียงลำดับความสำคัญอย่างไรดี? อันไหนมีผลกระทบมาก อันไหนแทบไม่มีความเกี่ยวข้องกันเลย อันไหนไม่จำเป็นต้องเอามาคิด ฯลฯ ปัญหาเหล่านี้ดูเหมือนจะสลับซับซ้อน แต่จริงๆแก้ได้ไม่ยากเลย นักคณิตศาสตร์มีวิธีการแก้ปัญหาทำนองนี้ด้วยเทคนิคที่เรียกว่า Principal Component Analysis ( PCA )
Principal : สิ่งที่สำคัญ
Component : องค์ประกอบ
Analysis : การวิเคราะห์
PCA โดยใจความสำคัญแล้วก็คือการวิเคราะห์โดยเฉพาะส่วนประกอบที่สำคัญๆเท่านัั้น ซึ่งเป็นเทคนิคหนึ่งที่ใช้กระบวนการทางสถิติและเมทริกซ์ (Matrix) เข้ามาอธิบายข้อมูลให้เป็นที่เข้าใจได้ง่ายยิ่งขึ้น. รูปแบบของข้อมูลที่ว่านี้จะอยู่ในรูปของตารางอย่างเช่นข้างบน เพื่อลดความซับซ้อนลง เราก็จะสร้างโมเดลขึ้นมาใหม่ ให้เป็นที่เข้าใจได้ง่ายขึ้น เหมือนการมองชุดข้อมูลด้วยมุมมองใหม่ แต่ไม่ได้ทำการเปลี่ยนแปลงข้อมูลดิบเลยแม้แต่ตัวเดียว
ตัวอย่างที่นำ PCA ไปใช้เช่น การตรวจจับใบหน้า การบีบอัดรูปภาพ และการหารูปแบบโครงสร้างของข้อมูลหลายมิติ
PCA ไม่ใช่สูตรบรรทัดเดียวจบ แต่เกิดจากผสมผสานเทคนิคต่างๆทางคณิตศาสตร์บางเรื่องเข้าด้วยกัน ถ้าเข้าใจความหมายของแต่ละส่วนประกอบแล้ว ก็จะเข้าใจ PCA ไปโดยปริยาย เทคนิคที่ใช้ใน PCA ประกอบด้วย
- Standard Deviation
- Variance
- Covariance
- Covariance Matrix
- EigenVectors
- EigenValues
ในที่นี้เราจะมาดูความหมายของแต่ละตัวโดยสังเขป
คือการบอกว่าข้อมูลมีความกระจัดกระจายมากน้อยขนาดไหน พิจารณาจากกราฟข้างล่าง
จากกราฟ ค่าเฉลี่ย (\bar{X} )ของแต่ละ Series มีค่าเท่ากันคือ 10
ประเด็นคือ แล้วทำไมต้องหารด้วยn-1 ทำไมไม่ใช่ n เรื่องนี้มันก็จะยาวไป แต่คำตอบสั้นๆคือเราจะได้ค่าที่ใกล้เคียงกับความเป็นจริงมากกว่า ส่วนรายละเอียดที่ลึกกว่านั้นก็ตามนี้ Harley Weston
จากข้อมูลข้างต้น จะได้ว่า
series1 มี Standard Deviation = 8.3266639978645
series2 มี Standard Deviation = 1.8257418583506
ค่า SD จึงบอกความกระจายของข้อมูล และทำให้เห็นภาพได้ชัดเจนขึ้น
Variance
ก็คล้ายๆกับ Standard Deviation ที่ใช้สำหรับการหาความกระจายตัวของชุดข้อมูล สูตรก็เกือบจะเหมือนกันเลยคือ
Covariance
Standard Deviation กับ Variance ที่กล่าวมาข้างต้นคือการวิเคราะห์ที่ใช้กับข้อมูล 1 มิติ เช่นความสูงของนักเรียนกในห้อง เกรดวิชาเรียน ถ้าหากว่ามีข้อมูลที่มีมากกว่า 1 มิติขึ้นไป เช่นถ้าเราต้องการหาความสัมพันธ์ระหว่างความสูงที่มีผลต่อเกรดวิชา เราก็จะต้องมีการวัดความแตกต่าง การกระจาย ระหว่างข้อมูลสองมิตินี้ว่าเป็นอย่างไร นั่นก็คือการหาค่า Covariance นั่นเอง
Covariance จะทำการวัดความแตกต่างของข้อมูลใน 2 มิติเสมอ ถ้าคุณหา Covariance ในแกนขอมันเอง นั่นก็คือคุณจะได้ Variance กลับมา. ถ้าคุณมีข้อมูล 3 มิติ(x,y,z) ดังนั้นแล้ว คุณก็จะต้องหา Covariance
ระหว่า x, y กับ x, z และ y, z . ถ้าคำนวณหา Covariance ระหว่าง x, x หรือ y, y หรือ z, z เราก็จะได้ Variance ของ x, y และ z ตามลำดับ สำหรับสูตรของ Covariance ระหว่างสองแกนใดๆ สามารถเขียนได้ดังนี้
การคำนวณไม่ใช่เรื่องยาก ว่าแต่ Covariance บ่งบอกถึงอะไร?
ลองพิจารณาจากกราฟง่ายๆดังนี้
ในที่นี่เรามี 4 จุด(2,2) (2,4) (4,2) และ (4,4) . ค่าเฉลี่ยของทั้งแกน X และ Y คือ 3 คำนวณในใจง่ายๆก็จะได้ว่า
จุดแรก(2,2) ก็จะได้ ( 2 - 3)( 2 - 3) = (-1)(-1) = 1
จุดสอง(2,4) ก้จะได้ ( 2 - 3)( 4 - 3) = (-1)(1) = -1
จุดสาม(4,2) ก็จะได้ ( 4 - 3)( 2 - 3) = (1)(-1) = -1
จุดสี่(4,4) ก้จะได้ ( 4 - 3)( 4 - 3) = (1)(1) = 1
เอาทั้งหมดมารวมกันก็จะได้
ถ้าอธิบายกราฟเป็นภาษาพูดก็จะได้ว่า ถ้าค่า x มากกว่าค่าเฉลี่ย และค่า y มากกว่าค่าเฉลี่ย เราก็จะได้ + คูณ + ก็จะได้ +. ในทางตรงข้าม ถ้าทั้ง x และ y ต่ำกว่าค่าเฉลี่ยทั้งคู่ เราก็จะได้ - คูณ - ก็ยังได้ + อยู่ดี หรือพูดอีกอย่างก็คือ ถ้า x เพ่ิ่มขึ้น y ก็จะเพิ่มตาม. กลับกัน ถ้า x ต่ำกว่าค่าเฉลี่ย แต่ y กลับสูงกว่าค่าเฉลี่ย (2,4) ผลลัพธ์เป็น - นี่แสดงว่าเริ่มไม่ไปด้วยกันละ และเคสสุดท้าย (4,4) ก็จะเห็นว่ายิ่ง x เพิ่ม แต่ y กลับลด. หรืออาจคิดได้ง่ายๆว่า ถ้ารูปแบบข้อมูลมี slope เป็น + ก็จะได้ Covariance แบบบวก ถ้ามีslope เป็นลบ ก็จะได้ Covariance เป็นลบ ถ้า Covariance เป็น 0 แสดงว่าข้อมูลข้อมูลในแต่ละมิติไม่มีความเกี่ยวข้องกัน เป็นอิสระจากกัน
จากกราฟข้างบน เราจะเห็นความแตกต่างอย่างชัดเจนระหว่างค่า Covariance ที่เป็นบวกกับลบ.
อีกอย่างหนึ่งที่น่าสังเกตคือcov(X,Y) = cov(Y,X) สังเกตได้จากสูตร เพราะว่าการคูณมีคุณสมบัติการสลับที่ ดังนั้น สมการนี้จึงเท่ากัน
Covariance Matrix
จากกราฟ ค่าเฉลี่ย (
\bar{X} = \dfrac{\displaystyle\sum_{i=1}^n x_i}{n}
แต่ 10 ไม่ได้บอกอะไรมากมายถึงความแตกต่าง อย่างที่เห็นคือ กราฟสีน้ำเงินมีการกระจายตัวมากกว่า ซึ่งกราฟสีส้มมีข้อมูลที่ใกล้เคียงกัน การจะบอกถึงความแตกต่างนี้ ทางสถิติมีตัววัดตัวหนึ่งคือ Standard Deviation วิธีการคำนวณก็ไม่ยาก คือการหาค่าเฉลี่ยของระยะทางระหว่างจุดแต่ละจุด กับจุดกึ่งกลาง (จุดค่าเฉลี่ย) เขียนเป็นสมการได้ว่า
s = \sqrt{\dfrac{\displaystyle\sum_{i=1}^n (x_i - \bar{X})^2}{n-1}}
ประเด็นคือ แล้วทำไมต้องหารด้วย
จากข้อมูลข้างต้น จะได้ว่า
series1 มี Standard Deviation = 8.3266639978645
series2 มี Standard Deviation = 1.8257418583506
ค่า SD จึงบอกความกระจายของข้อมูล และทำให้เห็นภาพได้ชัดเจนขึ้น
Variance
ก็คล้ายๆกับ Standard Deviation ที่ใช้สำหรับการหาความกระจายตัวของชุดข้อมูล สูตรก็เกือบจะเหมือนกันเลยคือ
s^2 = \dfrac{\displaystyle\sum_{i=1}^n (x_i - \bar{X})^2}{n-1}
Covariance
Standard Deviation กับ Variance ที่กล่าวมาข้างต้นคือการวิเคราะห์ที่ใช้กับข้อมูล 1 มิติ เช่นความสูงของนักเรียนกในห้อง เกรดวิชาเรียน ถ้าหากว่ามีข้อมูลที่มีมากกว่า 1 มิติขึ้นไป เช่นถ้าเราต้องการหาความสัมพันธ์ระหว่างความสูงที่มีผลต่อเกรดวิชา เราก็จะต้องมีการวัดความแตกต่าง การกระจาย ระหว่างข้อมูลสองมิตินี้ว่าเป็นอย่างไร นั่นก็คือการหาค่า Covariance นั่นเอง
Covariance จะทำการวัดความแตกต่างของข้อมูลใน 2 มิติเสมอ ถ้าคุณหา Covariance ในแกนขอมันเอง นั่นก็คือคุณจะได้ Variance กลับมา. ถ้าคุณมีข้อมูล 3 มิติ
cov(X,Y) = \dfrac{\displaystyle\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y})}{(n-1)}
การคำนวณไม่ใช่เรื่องยาก ว่าแต่ Covariance บ่งบอกถึงอะไร?
ลองพิจารณาจากกราฟง่ายๆดังนี้
ในที่นี่เรามี 4 จุด
จุดแรก
จุดสอง
จุดสาม
จุดสี่
เอาทั้งหมดมารวมกันก็จะได้
cov(X,Y) = \dfrac{1 -1 -1 + 1}{(n-1)} = 0
ถ้าอธิบายกราฟเป็นภาษาพูดก็จะได้ว่า ถ้าค่า x มากกว่าค่าเฉลี่ย และค่า y มากกว่าค่าเฉลี่ย เราก็จะได้ + คูณ + ก็จะได้ +. ในทางตรงข้าม ถ้าทั้ง x และ y ต่ำกว่าค่าเฉลี่ยทั้งคู่ เราก็จะได้ - คูณ - ก็ยังได้ + อยู่ดี หรือพูดอีกอย่างก็คือ ถ้า x เพ่ิ่มขึ้น y ก็จะเพิ่มตาม. กลับกัน ถ้า x ต่ำกว่าค่าเฉลี่ย แต่ y กลับสูงกว่าค่าเฉลี่ย (2,4) ผลลัพธ์เป็น - นี่แสดงว่าเริ่มไม่ไปด้วยกันละ และเคสสุดท้าย (4,4) ก็จะเห็นว่ายิ่ง x เพิ่ม แต่ y กลับลด. หรืออาจคิดได้ง่ายๆว่า ถ้ารูปแบบข้อมูลมี slope เป็น + ก็จะได้ Covariance แบบบวก ถ้ามีslope เป็นลบ ก็จะได้ Covariance เป็นลบ ถ้า Covariance เป็น 0 แสดงว่าข้อมูลข้อมูลในแต่ละมิติไม่มีความเกี่ยวข้องกัน เป็นอิสระจากกัน
Covariance = 0.85869573 | Covariance = -0.23093475 |
---|---|
จากกราฟข้างบน เราจะเห็นความแตกต่างอย่างชัดเจนระหว่างค่า Covariance ที่เป็นบวกกับลบ.
อีกอย่างหนึ่งที่น่าสังเกตคือ
Covariance Matrix
คือ Matrix ของ Covariance ทุกคู่ระหว่างมิติต่างๆ ยกตัวอย่างเช่น ถ้าข้อมูล 3 มิติ x,y และ z ;
ดังนั้นแล้ว Covariance Matrix ก็จะเขียนได้ว่า
\begin{pmatrix}
cov(x,x)&cov(x,y)&cov(x,z) \\
cov(y,x)&cov(y,y)&cov(y,z) \\
cov(z,x)&cov(z,y)&cov(z,z)
\end{pmatrix}
จุดที่น่าสังเกตคือ แกนหลัก (main diagonal) ก็คือ Variance นั่นเอง. นอกจากนี้แล้ว
C^{n \times n}=(c_{i,j}, c_{i,j}=cov(Dim_i,Dim_j))
ซึ่ง
EigenVectors
คือการคูณกันระหว่าง matrix กับ vector. แต่ที่พิเศษมากไปกว่าการคูณเมทริกซ์ธรรมดาก็คือ ผลคูณระหว่าง matrix กับ vector นี้ ก็คือ vector ที่เอาไปคูณนั่นเอง เพียงแต่อาจมีขนาดสั้นยาวของเวกเตอร์ผลลัพธ์ที่อาจแตกต่างไปจาก vector ตัวตั้งที่เอาไปคูณ
Av = \lambda v
เพื่อให้เห็นภาพและเข้าใจ Eigen vector ให้มากขึ้น พิจารณาพฤติกรรมการคูณเมตริกดังต่อไปนี้
A=\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}, v=\begin{bmatrix}1 \\ 1 \end{bmatrix}, \therefore Av=\begin{bmatrix}1 \\ 1 \end{bmatrix}
จากกราฟ ถ้าเราเอาเวอกเตอร์เขียว กับน้ำเงินเข้ามาเขียนไว้ด้วยกันก็จะได้ A. Column ที่ 1 ของ A คือ เวกเตอร์เขียว (1,0) ส่วน Column ที่ 2 ก็คือเวกเตอร์สีน้ำเงิน (0,1). พอมีเวกเตอร์ v (1,1) เข้ามาคูณกับ A สุดท้ายก็ได้ตัวมันเอง เพราะ A ไม่มีการแปลงตัวใดๆทั้งนั้น
เราสามารถมองว่า
คราวนี้ถ้าเกิด A มีการ transform ไป ลองนึกดูว่าเราหมุนกราฟนี้ทวนเข็มนาฬิกาไป 90 องศา รูปที่ได้ก็จะเป็นแบบนี้
ถ้าจะอธิบายกราฟข้างบนนี้ด้วยเมทริกซ์ A กราฟสีเขียวจากที่เคยเป็น (1,0) ก็กลายมาเป็น (0,1). ส่วนสีน้ำเงินก็เปลี่ยนจาก ( 0 , 1) ไปเป็น (-1,0). ดังนั้น A จึงสามารถเขียนใหม่ได้ว่า
A=\begin{bmatrix}0 & -1 \\ 1 & 0\end{bmatrix}, v=\begin{bmatrix}1 \\ 1 \end{bmatrix}, \therefore Av=\begin{bmatrix}-1 \\ -1 \end{bmatrix}
ตัวอย่างข้างต้น v ก่อนคูณ และ v หลังจาการคูณมีทิศทางที่ต่างกัน ตามนิยามของ Eigen vector แล้ว ถ้า v ก่อนคูณ และ v หลังคูณมีทิศทางเดียวกัน ก็จะเป็นดังตัวอย่างต่อไปนี้
ให้
(Graph 1) : A=\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}, v=\begin{bmatrix}3\\ 2\end{bmatrix}, \therefore Av=\begin{bmatrix}3\\ 2 \end{bmatrix}
(Graph 2) : A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix}, v=\begin{bmatrix}3\\ 2\end{bmatrix}, \therefore Av=\begin{bmatrix}12\\ 8 \end{bmatrix}
Graph 1 | Graph 2 |
---|---|
สำหรับกราฟ2 แล้ว ก็จะได้ว่า
(Graph 2) : A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix}, v=\begin{bmatrix}3\\ 2\end{bmatrix}, \therefore Av=4\begin{bmatrix}3\\ 2\end{bmatrix}, \lambda=4
อีกข้อหนึ่งที่น่าสนใจคือ ข้อมูลมีมิติเท่าใด ก็จะมีจำนวน Eigen vector เท่านั้น อย่าง A ในที่นี้มี 2 มิติ ก็จะมี Eigen vector 2 ตัว ซึ่งตัวเราเราได้เห็นแล้ว่วามันคือ ( 3,2) ส่วนอีกตัวก็คือ (1 , -1) วิธีการคำนวณหา Eigen vector สามามารถดูเพิ่มเติมได้ที่ Eigenvalues and eigenvectors Matrix_examples
สำหรับ (1,-1) สามารถทำเป็นกราฟได้ดังนี้
(Graph 3) : A=\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}, v=\begin{bmatrix}1\\ -1\end{bmatrix}, \therefore Av=\begin{bmatrix}1\\ -1 \end{bmatrix}
(Graph 4) : A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix}, v=\begin{bmatrix}1\\ -1\end{bmatrix}, \therefore Av=\begin{bmatrix}-1\\ 1 \end{bmatrix}
Graph 3 | Graph 4 |
---|---|
(Graph 4) : A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix}, v=\begin{bmatrix}1\\ -1\end{bmatrix}, \therefore Av=-1\begin{bmatrix}1\\ -1\end{bmatrix}, \lambda=-1
จุดที่น่าสังเกตอีกอย่างคือ Eigen vector ทุกตัว (กราฟ 2 และ 4 ) จะตั้งฉากกัน (orthogonal) และไม่ว่าจะมีกี่ Eigen vector ก็ตาม ทั้งหมดนั้นก็จะตั้งฉากซึ่งกันและกันหมด
คราวนี้ลองมาคิดย้อนกลับ ถ้าสมมุติว่าเราไม่รู้ ว่า
\begin{pmatrix}\begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}3 \\ 2\end{bmatrix}=\begin{bmatrix}12 \\ 8\end{bmatrix}\\\\ \begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}1 \\ -1\end{bmatrix}=\begin{bmatrix}-1 \\ 1\end{bmatrix}\end{pmatrix}=\begin{pmatrix}\begin{aligned}3a + 2b &=12 \\ 3c + 2d &=8 \\a - b &=-1 \\c - d &=1\end{aligned}\end{pmatrix}
ข้อนี้สำคัญ เพราะมันหมายความว่า เราสามารถพรีเซนต์ชุดข้อมูลนี้ในรูปแบบของ Eiegent Vectors ได้ แทนที่จะแสดงในมิติเดิมคือ x,y และเราจะใช้วิธีนี้ใน PCA
EigenValue
คือค่าที่มากับ Evient Vector หรือก็คือ
Principal Components Analysis
จากเทคนิคที่กล่าวมาข้างต้น เราสามารถนำมาจัดการกับข้อมูล เพื่อค้นหารูแปบบของข้อมูลนั้นๆ เป็นการมองข้อมูลในมุมใหม่ ในมุมที่แสดงถึงความสัมพันธ์กันภายในข้อมูลชุดนั้นๆ. สมมุติว่าเรามีข้อมูลหลายมิติ ยากที่จะทำความเข้าใจ หรือยากที่จะพรีเซนต์ออกมาในมุมที่มีความหมาย PCA จึงเข้ามาลดความซับซ้อนตรงนี้ลงไป
ข้อดีอีกอย่างหนึ่งก็คือหลังจากที่เราเจอแพทเทิร์นข้อมูลแล้ว เราสามารถลดขนาดของข้อมูลโดยการลดมิติที่ไม่ค่อยมีความสำคัญออกไป โดยที่ไม่ได้สูญเสียข้อมูลไปมากมายนัก จุดนี้สามารถเอาไปใช้ประโยชน์ในงานอื่นๆได้เช่น การบีบอัดรูปภาพดิจิทอล
ว่าด้วยเรื่องของการบีบอัดข้อมูล ยกตัวอย่าง A ที่ประกอบด้วย
\begin{pmatrix}\begin{aligned}\begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}3 \\ 2\end{bmatrix}=\begin{bmatrix}12 \\ 8\end{bmatrix}\\\\ \begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}0 \\ 0\end{bmatrix}=\begin{bmatrix}0 \\ 0\end{bmatrix}\end{aligned}\end{pmatrix}=\begin{pmatrix}\begin{aligned}3a + 2b &=12 \\ 3c + 2d &=8 \\a - b &=0 \\c - d &=0\end{aligned}\end{pmatrix}\therefore \begin{bmatrix}a & b \\ c & d\end{bmatrix}=\begin{bmatrix}2.4 & 2.4 \\ 1.6 & 1.6\end{bmatrix}
ซึ่งก็ใกล้เคียงกับค่าเดิมของ A. ต่อไปเราจะมาดูวิธีการทำ PCA ในแต่ละขั้น. โดยสรุปแล้วจะมีดังนี้
- เก็บข้อมูล
- ลบกับค่าเฉลี่ย
- คำนวณ Covariance Matrice
- คำนวณ EigenVectors และ EigenenValues
- เลือกฟีเจอร์
- สร้างข้อมูลชุดใหม่ในมิติของ EigenVectors
- แสดงข้อมูลชุดใหม่ในมิติที่น้อยลง
1.) เก็บข้อมูล
ในตัวอย่างต่อไปนี้ เราจะมาใช้ข้อมูล 2 มิติกัน เพื่อง่ายต่อการพร็อตกราฟ และทำให้เห็นภาพเปรียบเทียบได้ชัดเจน
x | 5.5 | 2.7 | 3.2 | 2.9 | 4.1 | 3.3 | 3.0 | 2.0 | 2.5 | 2.1 |
---|---|---|---|---|---|---|---|---|---|---|
y | 3.4 | 1.9 | 3.9 | 3.2 | 4.0 | 3.7 | 2.6 | 2.5 | 2 | 1.9 |
2.) ลบกับค่าเฉลี่ย
\begin{matrix}\bar{x}=3.13\\ \bar{y}=2.91\end{matrix}
5.5 | 3.4 | 2.37 | 0.49 |
2.7 | 1.9 | -0.43 | -1.01 |
3.2 | 3.9 | 0.07 | 0.99 |
2.9 | 3.2 | -0.23 | 0.29 |
4.1 | 4.0 | 0.97 | 1.09 |
3.3 | 3.7 | 0.17 | 0.79 |
3.0 | 2.6 | -0.13 | -0.31 |
2.0 | 2.5 | -1.13 | -0.41 |
2.5 | 2 | -0.63 | -0.91 |
2.1 | 1.9 | -1.03 | -1.01 |
3.) คำนวณ Covariance Matrice
cov=\begin{pmatrix}1.06455556 & 0.54522222 \\ 0.54522222 & 0.69433333\end{pmatrix}
4.) คำนวณ EigenVectors และ EigenenValues
eigenvalues=\begin{pmatrix}1.45523381 \\ 0.30365508\end{pmatrix}
eigenvectors=\begin{pmatrix}0.81286254 & -0.58245557 \\ 0.58245557 & 0.81286254\end{pmatrix}
จุดที่สำคัญตรงนี้คือ Eigen vectors ต้องเป็น unit eigenvectors หรือก็คือมีความยาวเท่ากับ 1 เช่น
\sqrt{0.81286254^2 + 0.58245557^2}=1
5.) เลือกฟีเจอร์
จากหัวข้อ Eigen Vector เราจะเห็นว่า
eigenvalues=\begin{pmatrix}1.45523381 \\ 0.30365508\end{pmatrix}
eigenvectors=\begin{pmatrix}0.81286254 & -0.58245557 \\ 0.58245557 & 0.81286254\end{pmatrix}
จากนั้น เราก็เลือก Feature Vector ที่ต้องการ อย่างในที่นี้เรามีข้อมูลเพียงแค่ 2 มิติ และจะทำการลดให้เหลือแค่มิติเดียว เราก็จะได้
FeatureVector=\begin{pmatrix}0.81286254 \\ 0.58245557 \end{pmatrix}
ถ้าหากมีหลายมิติ เราก็จะจัดเรียก FeatureVector ดังต่อไปนี้
FeatureVector= (eig_{1} eig_{2} eig_{3} ... eig_{n})
แล้วก็ทำการเลือก Features ตามจำนวนที่ต้องการ
สมมุติว่าถ้าเราเลือก FeatureVector จาก EigenVector ทุกตัว เราจะได้แบบนี้
แต่ตามตัวอย่าง เราจะทำการเลือกเพียงแค่ 1 มิติเท่านั้น หากลองเอามาพร็อตเป็นกราฟ ก็จะได้ ตามกราฟข้างล่าง
ข้อสังเกตคือ เราปรับมิติที่ 2 ให้เป็น 0 หมดทุกตัว
6.) สร้างข้อมูลชุดใหม่ในมิติของ EigenVectors
คือขั้นตอนสุดท้ายของกระบวนการ PCA เราจะทำการแมบค่าข้อมูลเดิม กับฟีเจอร์ที่เราเลือกไว้ แล้วเราก็จะได้ข้อมูลใหม่ สังเกตว่าตอนแรกเป็น 10x2 มิติ แต่พอเปลี่ยนด้วยกระบวนการนี้ ก็จะเหลือแค่ 10x1 มิติ เท่านั้น
FinalData=DataAdjust \cdotp FeatureVectors
7.) แสดงข้อมูลชุดใหม่ในมิติที่น้อยลง
reconstructedData=finalData \cdot featureVector^T
reconstructedDataAdjust = reconstructedData + means
และถ้าเราลองพร็อตทั้งข้อมูลเดิม ข้อมูลที่ทำการลดมิติ และ Eigent Vector ทั้งหมดก็จะได้
สำหรับ Python ไฟล์ในโพสต์นี้ตามนี้ครับ
ตัวอย่างการวิเคราะห์กราฟแบบสามิติโดยใช้เทคนิค PCA
ตัวอย่างข้อมูล 3 มิติที่พร็อตโดยใช้ matplotlib.pyplot
3D Graph | 3D Graph |
3D Graph | 3D Graph |
3D Graph | PCA |
References:
https://www.investopedia.com/articles/basics/04/050704.asp
https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf
https://georgemdallas.wordpress.com/2013/10/30/principal-component-analysis-4-dummies-eigenvectors-eigenvalues-and-dimension-reduction/
https://www.youtube.com/watch?v=ZqXnPcyIAL8
https://www.youtube.com/watch?v=kw9R0nD69OU
https://www.youtube.com/watch?v=rng04VJxUt4
https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf
https://georgemdallas.wordpress.com/2013/10/30/principal-component-analysis-4-dummies-eigenvectors-eigenvalues-and-dimension-reduction/
https://www.youtube.com/watch?v=ZqXnPcyIAL8
https://www.youtube.com/watch?v=kw9R0nD69OU
https://www.youtube.com/watch?v=rng04VJxUt4
Comments
Post a Comment