หลังจากที่ได้อธิบายหลักการของ
การวิเคราะห์องค์ประกอบหลัก (主成分分析, principle component Analysis) หรือ
PCA ไปแล้วใน
https://phyblas.hinaboshi.com/20180727 และพูดถึงวิธีการคำนวณหาองค์ประกอบอย่างรวดเร็วโดย
การแยกค่าเอกฐาน (奇异值分解, singular value decomposition) หรือ
SVD https://phyblas.hinaboshi.com/20190916 คราวนี้จะมาใช้ sklearn ในการวิเคราะห์องค์ประกอบหลัก
sklearn มีฟังก์ชันที่ใช้ทำการวิเคราะห์องค์ประกอบหลัก คือ sklearn.decomposition.PCA
การคำนวณเพื่อหาองค์ประกอบภายในฟังก์ชันนี้ใช้ SVD ซึ่งคำนวณได้ค่อนข้างเร็วแม้จำนวนมิติของข้อมูลจะมาก
และปกติเวลาทำการวิเคราะห์องค์ประกอบหลักจะต้องทำให้ค่าเฉลี่ยของข้อมูลเป็น 0 ในทุกมิติก่อน แต่หากใช้ sklearn จุดกึ่งกลางจะถูกหาให้โดยอัตโนมัติ
ต่อไปจะเป็นคำอธิบายและยกตัวอย่างวิธีการใช้
ในบทความนี้จะไม่อธิบายหลักการของการวิเคราะห์องค์ประกอบหลัก เพราะได้เขียนไปแล้วในบทความข้างต้น บทความนี้จะเน้นที่การคำนวณโดยใช้ sklearn
ตัวอย่าง สร้างข้อมูล ๓ มิติแล้ววิเคราะห์องค์ประกอบหลัก เอาองค์ประกอบหลักมา ๒ มิติ


วิธีการใช้นั้นจะเริ่มจากสร้างออบเจ็กต์ของคลาส sklearn.decomposition.PCA โดยหากต้องการลดจำนวนมิติก็ให้กำหนดค่าจำนวนองค์ประกอบลงไปด้วย
จากนั้นก็ใช้เมธอด fit โดยใส่ข้อมูลที่ต้องการจะวิเคราะห์เข้าไป
สุดท้ายใช้เมธอด transform เพื่อแปลงข้อมูลให้อยู่ในระบบพิกัดขององค์ประกอบที่ได้มา
ในตัวอย่างนี้ X คือข้อมูลเดิม มี ๓ มิติ นำไปวิเคราะห์องค์ประกอบหลักด้วย fit แล้วใช้ transform เพื่อเป็น Xi ซึ่งเป็นข้อมูลในพิกัดองค์ประกอบ ซึ่งเหลือ ๒ มิติ
เมื่อสั่ง fit ไป ค่าที่ป้อนลงไปจะถูกใช้ในการคำนวณ SVD แล้วผลที่ได้จากการคำนวณต่างๆเก็บเอาไว้ในแอตทริบิวต์ต่างๆภายในออบเจ็กต์ซึ่งลงท้ายด้วย _ ซึ่งสามารถนำมาใช้ได้ ดังนี้
components_ |
อาเรย์ค่าน้ำหนักขององค์ประกอบต่างๆ |
explained_variance_ |
ความบ่งบอกความแปรปรวน |
explained_variance_ratio_ |
อัตราความบ่งบอกความแปรปรวน |
singular_values_ |
ค่าเอกฐานที่คำนวณมาได้จาก SVD |
mean_ |
ค่าเฉลี่ยของข้อมูลเดิมในแต่ละมิติ |
n_components_ |
จำนวนองค์ประกอบหลัก |
noise_variance_ |
ค่าความแปรปรวนของคลื่นรบกวนภายในข้อมูล |
ลองดูค่าแต่ละตัวนี้
ได้
ทั้ง explained_variance_ หรือ explained_variance_ratio_ และ singular_values_ ล้วนเป็นอาเรย์จำนวนเท่ากับจำนวนองค์ประกอบที่เลือกเหลือไว้ บอกถึงความสำคัญขององค์ประกอบแต่ละตัว เรียงตามลำดับมากที่สุด
โดยที่ explained_variance_ratio_ เหมือนกับ explained_variance_ แค่ทำให้ผลรวมเหลือเป็น 1
ลองเทียบระหว่าง ๒ ค่านี้ดู
ผลรวมของ explained_variance_ratio_ จะเป็นตัวบอกว่ามิติที่เหลืออยู่นั้นรักษาข้อมูลเดิมไว้ได้ดีแค่ไหน
ค่าเข้าใกล้ 1 หมายความว่ามิติที่ตัดทิ้งไปนั้นไม่ได้สำคัญ แต่ถ้ายิ่งเลขน้อยแสดงว่าข้อมูลอยู่ในมิติที่ตัดทิ้งไปมาก พอตัดมิติไปข้อมูลจะเปลี่ยนไปจากเดิมมาก
ค่าผลรวมจะเป็น 1 ถ้าหากจำนวนมิติขององค์ประกอบเท่ากับข้อมูลก่อนแปลง
singular_values_ นั้นถ้ายกกำลังสองจะพบว่าอัตราส่วนของแต่ละค่าจะเท่ากับ explained_variance_
ส่วน components_ คืออาเรย์ที่บอกค่าน้ำหนักขององค์ประกอบแต่ละตัวภายในข้อมูลเดิม
ขนาดเป็น จำนวนองค์ประกอบที่กำหนด × จำนวนมิติเดิม
ค่าที่ได้มาในพิกัดใหม่จะมีค่าเฉลี่ยในทุกองค์ประกอบเป็น 0 เสมอ ไม่ว่าข้อมูลเดิมจะมีค่าเฉลี่ยในแต่ละมิติอยู่ตรงไหน
ที่ว่า sklearn จะทำการหาค่าเฉลี่ยของข้อมูลให้อัตโนมัติก่อนที่จะทำการคำนวณนั้น ค่าเฉลี่ยนั้นเก็บอยู่ที่ mean_ นั่นเอง ตอนที่แปลงกลับค่านี้ก็ถูกนำมาใช้
เมธอด fit นั้นการคำนวณภายในก็คือการเอาข้อมูลที่ใส่ไปมาลบค่าเฉลี่ยแล้ว
ในทางกลับกันสามารถแปลงข้อมูลกลับจากพิกัดขององค์ประกอบกลับเป็นข้อมูลในพิกัดเดิมได้โดยคูณ components_ แล้วก็บวกด้วย mean_ หรือใช้เมธอด .inverse_transform()
ลองทำการแปลงข้อมูลกลับ

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