Principal Components Analysis

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

Date Country Buy Sell Differentials in Inflation Differentials in Interest Rates Current-Account Deficits Public Debt Terms of Trade Political Stability Economic Performance
230517USA3534455412.2962429
230517AUD3029524415.878.93047
230517X?????????
250517Y?????????
250517Z?????????
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
ในที่นี้เราจะมาดูความหมายของแต่ละตัวโดยสังเขป

Standard Deviation
คือการบอกว่าข้อมูลมีความกระจัดกระจายมากน้อยขนาดไหน พิจารณาจากกราฟข้างล่าง



จากกราฟ ค่าเฉลี่ย (X¯\bar{X})ของแต่ละ Series มีค่าเท่ากันคือ 10

X¯=i=1nxin \bar{X} = \dfrac{\displaystyle\sum_{i=1}^n x_i}{n}
แต่ 10 ไม่ได้บอกอะไรมากมายถึงความแตกต่าง อย่างที่เห็นคือ กราฟสีน้ำเงินมีการกระจายตัวมากกว่า ซึ่งกราฟสีส้มมีข้อมูลที่ใกล้เคียงกัน การจะบอกถึงความแตกต่างนี้ ทางสถิติมีตัววัดตัวหนึ่งคือ Standard Deviation วิธีการคำนวณก็ไม่ยาก คือการหาค่าเฉลี่ยของระยะทางระหว่างจุดแต่ละจุด กับจุดกึ่งกลาง (จุดค่าเฉลี่ย) เขียนเป็นสมการได้ว่า

s=i=1n(xiX¯)2n1 s = \sqrt{\dfrac{\displaystyle\sum_{i=1}^n (x_i - \bar{X})^2}{n-1}}

ประเด็นคือ แล้วทำไมต้องหารด้วย n1n-1 ทำไมไม่ใช่ nn เรื่องนี้มันก็จะยาวไป แต่คำตอบสั้นๆคือเราจะได้ค่าที่ใกล้เคียงกับความเป็นจริงมากกว่า ส่วนรายละเอียดที่ลึกกว่านั้นก็ตามนี้ Harley Weston

จากข้อมูลข้างต้น จะได้ว่า
series1 มี Standard Deviation = 8.3266639978645
series2 มี Standard Deviation = 1.8257418583506
ค่า SD จึงบอกความกระจายของข้อมูล และทำให้เห็นภาพได้ชัดเจนขึ้น

Variance
ก็คล้ายๆกับ Standard Deviation ที่ใช้สำหรับการหาความกระจายตัวของชุดข้อมูล สูตรก็เกือบจะเหมือนกันเลยคือ
s2=i=1n(xiX¯)2n1 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 มิติ (x,y,z)(x,y,z) ดังนั้นแล้ว คุณก็จะต้องหา Covariance ระหว่า x,yx, y กับ x,zx, z และ y,zy, z. ถ้าคำนวณหา Covariance ระหว่าง x,xx, x หรือ y,y y, y หรือ z,zz, z เราก็จะได้ Variance ของ x,yx, y และ zz ตามลำดับ สำหรับสูตรของ Covariance ระหว่างสองแกนใดๆ สามารถเขียนได้ดังนี้
cov(X,Y)=i=1n(XiX¯)(YiY¯)(n1) cov(X,Y) = \dfrac{\displaystyle\sum_{i=1}^n (X_i - \bar{X})(Y_i - \bar{Y})}{(n-1)}

การคำนวณไม่ใช่เรื่องยาก ว่าแต่ Covariance บ่งบอกถึงอะไร?
ลองพิจารณาจากกราฟง่ายๆดังนี้


ในที่นี่เรามี 4 จุด (2,2)(2,4)(4,2)(2,2) (2,4) (4,2) และ (4,4)(4,4) . ค่าเฉลี่ยของทั้งแกน X และ Y คือ 3 คำนวณในใจง่ายๆก็จะได้ว่า
จุดแรก (2,2)(2,2) ก็จะได้ (23)(23)=(1)(1)=1( 2 - 3)( 2 - 3) = (-1)(-1) = 1
จุดสอง (2,4)(2,4) ก้จะได้ (23)(43)=(1)(1)=1( 2 - 3)( 4 - 3) = (-1)(1) = -1
จุดสาม (4,2)(4,2) ก็จะได้ (43)(23)=(1)(1)=1( 4 - 3)( 2 - 3) = (1)(-1) = -1
จุดสี่ (4,4)(4,4) ก้จะได้ (43)(43)=(1)(1)=1( 4 - 3)( 4 - 3) = (1)(1) = 1
เอาทั้งหมดมารวมกันก็จะได้
cov(X,Y)=111+1(n1)=0 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 ที่เป็นบวกกับลบ.
อีกอย่างหนึ่งที่น่าสังเกตคือ cov(X,Y)=cov(Y,X)cov(X,Y) = cov(Y,X) สังเกตได้จากสูตร เพราะว่าการคูณมีคุณสมบัติการสลับที่ ดังนั้น สมการนี้จึงเท่ากัน

Covariance Matrix
คือ Matrix ของ Covariance ทุกคู่ระหว่างมิติต่างๆ ยกตัวอย่างเช่น ถ้าข้อมูล 3 มิติ x,yx,y และ zz;
ดังนั้นแล้ว Covariance Matrix ก็จะเขียนได้ว่า

(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)) \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 นั่นเอง. นอกจากนี้แล้ว con(a,b)=con(b,a)con(a,b) = con(b,a) ดังนั้น เมทริกซ์นี้สมมาตรกันในแกนหลัก. สูตรของ Covariance คือ

Cn×n=(ci,j,ci,j=cov(Dimi,Dimj)) C^{n \times n}=(c_{i,j}, c_{i,j}=cov(Dim_i,Dim_j))

ซึ่ง Cn×nC^{n \times n} เป็นเมทริกซ์ nn แถวและ nn คอลัมน์. และ DimxDim_x คือมิติที่ xx ของข้อมูลนั้นๆ


EigenVectors
คือการคูณกันระหว่าง matrix กับ vector. แต่ที่พิเศษมากไปกว่าการคูณเมทริกซ์ธรรมดาก็คือ ผลคูณระหว่าง matrix กับ vector นี้ ก็คือ vector ที่เอาไปคูณนั่นเอง เพียงแต่อาจมีขนาดสั้นยาวของเวกเตอร์ผลลัพธ์ที่อาจแตกต่างไปจาก vector ตัวตั้งที่เอาไปคูณ 

Av=λv Av = \lambda v

เพื่อให้เห็นภาพและเข้าใจ Eigen vector ให้มากขึ้น พิจารณาพฤติกรรมการคูณเมตริกดังต่อไปนี้

A=[1001],v=[11],Av=[11] 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 ไม่มีการแปลงตัวใดๆทั้งนั้น
เราสามารถมองว่า vv คือเวกเตอร์ใดๆก็ตามเวกเตอร์หนึ่ง พอมีเมทริกซ์อันใดอันหนึ่งเข้ามาคูณ ( AA ) อันที่สามารถคูณกันได้ คือมีมิติที่สามารถคูณกันได้ ผลลัพธ์นั้นก็คือการแปลงรูปของ vv นั้นๆให้กลายไปเป็น vv ใหม่ ที่อยู่ในโลกของ AA นั้นๆ
คราวนี้ถ้าเกิด A มีการ transform ไป ลองนึกดูว่าเราหมุนกราฟนี้ทวนเข็มนาฬิกาไป 90 องศา รูปที่ได้ก็จะเป็นแบบนี้


ถ้าจะอธิบายกราฟข้างบนนี้ด้วยเมทริกซ์ A กราฟสีเขียวจากที่เคยเป็น (1,0) ก็กลายมาเป็น (0,1). ส่วนสีน้ำเงินก็เปลี่ยนจาก ( 0 , 1) ไปเป็น (-1,0). ดังนั้น A จึงสามารถเขียนใหม่ได้ว่า

A=[0110],v=[11],Av=[11] 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 หลังคูณมีทิศทางเดียวกัน ก็จะเป็นดังตัวอย่างต่อไปนี้
ให้

(Graph1):A=[1001],v=[32],Av=[32] (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}

(Graph2):A=[2321],v=[32],Av=[128] (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 แล้ว ก็จะได้ว่า
(Graph2):A=[2321],v=[32],Av=4[32],λ=4 (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) สามารถทำเป็นกราฟได้ดังนี้

(Graph3):A=[1001],v=[11],Av=[11] (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}

(Graph4):A=[2321],v=[11],Av=[11] (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

(Graph4):A=[2321],v=[11],Av=1[11],λ=1 (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 ก็ตาม ทั้งหมดนั้นก็จะตั้งฉากซึ่งกันและกันหมด
คราวนี้ลองมาคิดย้อนกลับ ถ้าสมมุติว่าเราไม่รู้ ว่า A=[2321] A=\begin{bmatrix}2 & 3 \\ 2 & 1\end{bmatrix} แต่เรามี Eigen vectors กับ λ \lambda ของแต่ละ Eigen vector เราก็จะสามารถคำนวณหา A ได้ทันที เช่น

([abcd][32]=[128][abcd][11]=[11])=(3a+2b=123c+2d=8ab=1cd=1) \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 หรือก็คือ λ \lambda นั่นเอง คือค่าที่บอกว่าหากมีการ transform Eigent Vector นั้นๆแล้ว แล้วมันจะสเกลเป็นกี่เท่า. และλ \lambda ก็จะมาคู่กับ v เสมอ

Principal Components Analysis

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

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

ว่าด้วยเรื่องของการบีบอัดข้อมูล  ยกตัวอย่าง A ที่ประกอบด้วย (a,b,c,d) ( a, b , c ,d ) ในหัวข้อ Eigen Vector ถ้าเราไม่สนใจค่า λ=1 \lambda = -1 เราก็จะยังได้

([abcd][32]=[128][abcd][00]=[00])=(3a+2b=123c+2d=8ab=0cd=0)[abcd]=[2.42.41.61.6] \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 ในแต่ละขั้น. โดยสรุปแล้วจะมีดังนี้
  1. เก็บข้อมูล
  2. ลบกับค่าเฉลี่ย
  3. คำนวณ Covariance Matrice
  4. คำนวณ  EigenVectors และ EigenenValues
  5. เลือกฟีเจอร์
  6. สร้างข้อมูลชุดใหม่ในมิติของ EigenVectors
  7. แสดงข้อมูลชุดใหม่ในมิติที่น้อยลง
1.) เก็บข้อมูล
ในตัวอย่างต่อไปนี้ เราจะมาใช้ข้อมูล 2 มิติกัน เพื่อง่ายต่อการพร็อตกราฟ และทำให้เห็นภาพเปรียบเทียบได้ชัดเจน

x 5.52.73.22.94.13.33.02.02.52.1
y 3.41.93.93.24.03.72.62.521.9



2.) ลบกับค่าเฉลี่ย
x¯=3.13y¯=2.91 \begin{matrix}\bar{x}=3.13\\ \bar{y}=2.91\end{matrix}

xx yy xx¯x - \bar{x} yy¯y - \bar{y}
5.53.42.370.49
2.71.9-0.43-1.01
3.23.90.070.99
2.93.2-0.230.29
4.14.00.971.09
3.33.70.170.79
3.02.6-0.13-0.31
2.02.5-1.13-0.41
2.52-0.63-0.91
2.11.9-1.03-1.01


3.) คำนวณ Covariance Matrice

cov=(1.064555560.545222220.545222220.69433333) cov=\begin{pmatrix}1.06455556 & 0.54522222 \\ 0.54522222 & 0.69433333\end{pmatrix}
4.) คำนวณ  EigenVectors และ EigenenValues

eigenvalues=(1.455233810.30365508) eigenvalues=\begin{pmatrix}1.45523381 \\ 0.30365508\end{pmatrix}

eigenvectors=(0.812862540.582455570.582455570.81286254) eigenvectors=\begin{pmatrix}0.81286254 & -0.58245557 \\ 0.58245557 & 0.81286254\end{pmatrix}

จุดที่สำคัญตรงนี้คือ Eigen vectors ต้องเป็น unit eigenvectors หรือก็คือมีความยาวเท่ากับ 1 เช่น
0.812862542+0.582455572=1 \sqrt{0.81286254^2 + 0.58245557^2}=1

5.) เลือกฟีเจอร์
จากหัวข้อ Eigen Vector เราจะเห็นว่า λ \lambda ที่มีค่ามากที่สุดคือองค์ประกอบที่สำคัญของข้อมูล (Principal component) ดังนั้น เราจะทำการเรียงลำดับ Eigen Vector จากมากไปหาน้อย ตามค่าของ Eiven values ที่มากับแต่ละตัว เราก็จะได้
eigenvalues=(1.455233810.30365508) eigenvalues=\begin{pmatrix}1.45523381 \\ 0.30365508\end{pmatrix}


eigenvectors=(0.812862540.582455570.582455570.81286254) eigenvectors=\begin{pmatrix}0.81286254 & -0.58245557 \\ 0.58245557 & 0.81286254\end{pmatrix}

จากนั้น เราก็เลือก Feature Vector ที่ต้องการ อย่างในที่นี้เรามีข้อมูลเพียงแค่ 2 มิติ และจะทำการลดให้เหลือแค่มิติเดียว เราก็จะได้
FeatureVector=(0.812862540.58245557) FeatureVector=\begin{pmatrix}0.81286254 \\ 0.58245557 \end{pmatrix}


ถ้าหากมีหลายมิติ เราก็จะจัดเรียก FeatureVector ดังต่อไปนี้

FeatureVector=(eig1eig2eig3...eign) FeatureVector= (eig_{1} eig_{2} eig_{3} ... eig_{n})

แล้วก็ทำการเลือก Features ตามจำนวนที่ต้องการ
สมมุติว่าถ้าเราเลือก FeatureVector จาก EigenVector ทุกตัว เราจะได้แบบนี้


แต่ตามตัวอย่าง เราจะทำการเลือกเพียงแค่ 1 มิติเท่านั้น หากลองเอามาพร็อตเป็นกราฟ ก็จะได้ ตามกราฟข้างล่าง

ข้อสังเกตคือ เราปรับมิติที่ 2 ให้เป็น 0 หมดทุกตัว

6.) สร้างข้อมูลชุดใหม่ในมิติของ EigenVectors
คือขั้นตอนสุดท้ายของกระบวนการ PCA เราจะทำการแมบค่าข้อมูลเดิม กับฟีเจอร์ที่เราเลือกไว้ แล้วเราก็จะได้ข้อมูลใหม่ สังเกตว่าตอนแรกเป็น 10x2 มิติ แต่พอเปลี่ยนด้วยกระบวนการนี้ ก็จะเหลือแค่ 10x1 มิติ เท่านั้น

FinalData=DataAdjustFeatureVectors FinalData=DataAdjust \cdotp FeatureVectors

7.) แสดงข้อมูลชุดใหม่ในมิติที่น้อยลง
reconstructedData=finalDatafeatureVectorT reconstructedData=finalData \cdot featureVector^T
reconstructedDataAdjust=reconstructedData+means reconstructedDataAdjust = reconstructedData + means


และถ้าเราลองพร็อตทั้งข้อมูลเดิม ข้อมูลที่ทำการลดมิติ และ Eigent Vector ทั้งหมดก็จะได้


สำหรับ Python ไฟล์ในโพสต์นี้ตามนี้ครับ
import matplotlib.pyplot as plt
import numpy as np
def plot(data, label=""):
# plt.figure(label)
plt.scatter(data[:, 0], data[:, 1], label=label)
plt.axis('equal')
plt.grid(True)
plt.show(block=False)
def plot1dOn2d(data, label=""):
# plt.figure(label)
plt.scatter(data[:, 0], np.zeros(data.shape[0]), label=label)
plt.axis('equal')
plt.grid(True)
plt.show(block=False)
def plotVector(x, y, label='', color='b', org=[[0], [0]]):
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.gca().set_aspect('equal', adjustable='box')
# plt.axis('scaled')
plt.quiver(*org, x, y, color=[color], angles='xy', scale_units='xy', scale=1, headwidth=3, label=label)
# plt.axis('equal')
plt.grid(True)
## Step 1. Generate some data.
X = np.array([[5.5, 2.7, 3.2, 2.9, 4.1, 3.3, 3.0, 2.0, 2.5, 2.1],
[3.4, 1.9, 3.9, 3.2, 4.0, 3.7, 2.6, 2.5, 2, 1.9]])
print("X", X)
# Reshape to have a suitable matrix structure for further steps.
X = X.T
print("X.shape", X.shape)
print("X", X)
plot(X, "Original Data")
## Step 2. Subtract the mean.
meanColumns = np.average(X, axis=0)
print("meanColumns: ", meanColumns)
print("meanColumns.shape", meanColumns.shape)
X_sub_mean = np.empty(X.shape)
for i in range(len(X)):
for j in range(len(X[i])):
X_sub_mean[i][j] = X[i][j] - meanColumns[j]
# X_sub_mean[i][0] = X[i][0] - meanX
# X_sub_mean[i][1] = X[i][1] - meanY
# plot(X_sub_mean, "Subtract mean")
print("X_sub_mean", X_sub_mean)
## Step 3 Calculate covariance matrice.
C = np.empty([X.shape[1], X.shape[1]])
def covariance(X, meanX, Y, meanY):
print(X, meanX, Y, meanY)
a = X - meanX
b = Y - meanY
total = 0
for i in range(len(a)):
total = total + a[i] * b[i]
return total / (len(X) - 1)
for i in range(C.shape[0]):
for j in range(C.shape[1]):
print("i,j = ", i, j)
C[i][j] = covariance(X[:, i], meanColumns[i], X[:, j], meanColumns[j])
print("C", C)
# Step 4 Calculate EigenVectors and EvenenValues
Ew, Ev = np.linalg.eig(C)
print("Ew, Ev ", Ew, Ev)
plotVector(Ew[0] * Ev[0][0], Ew[0] * Ev[1][0], color="black", org=meanColumns, label="First Eigent")
plotVector(Ew[1] * Ev[0][1], Ew[1] * Ev[1][1], color="g", org=meanColumns, label="Second Eigent")
# sort Eigen Vector
idx = Ew.argsort()[::-1]
eigenValues = Ew[idx]
eigenVectors = Ev[:, idx]
# eigenVectors
print("Sort ew", eigenValues)
print("Sort ev", eigenVectors)
# Step 5: Choosing components and forming a feature vector.
featureVector = eigenVectors[:, 0:1] # use plot1dOn2d
# featureVector = eigenVectors[:, 0:2] # use plot
print("featureVector", featureVector)
print("featureVector.shape", featureVector.shape)
print("eigenVectors.T.shape", featureVector.T.shape)
print("X_sub_mean.T.shape", X_sub_mean.T[0:1, :].shape)
# Step 6: Deriving the new data set.
finalData = np.dot(X_sub_mean, featureVector)
print("finalData", finalData)
# plot1dOn2d(finalData , "finalData")
# plot(finalData , "finalData")
print("finalData.shape", finalData.shape)
print("featureVector.shape", featureVector.shape)
# Step 7 Getting Old data back.
reconstructedData = np.dot(finalData, featureVector.T)
reconstructedDataAdjust = reconstructedData + meanColumns
print("reconstructedDataAdjust.shape", reconstructedDataAdjust.shape)
plot(reconstructedDataAdjust, "reconstructedDataAdjust")
plt.show(True)

ตัวอย่างการวิเคราะห์กราฟแบบสามิติโดยใช้เทคนิค PCA

ตัวอย่างข้อมูล 3 มิติที่พร็อตโดยใช้ matplotlib.pyplot
xs = [-50, -50, -49, -49, -48, -48, -47, -47, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -41, -41, -40, -40, -39, -39, -38, -38, -37, -37, -36, -36, -35, -35, -34, -34, -33, -33, -32, -32, -31, -31, -30, -30, -29, -29, -28, -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -16, -16, -15, -15, -14, -14, -13, -13, -12, -12, -11, -11, -10, -10, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49]
ys = [0.0, -0.0, 4.974937185533098, -4.974937185533098, 7.000000000000001, -7.000000000000001, 8.529361054615988, -8.529361054615988, 9.797958971132712, -9.797958971132712, 10.897247358851683, -10.897247358851683, 11.874342087037917, -11.874342087037917, 12.757350822173073, -12.757350822173073, 13.564659966250536, -13.564659966250536, 14.309088021254185, -14.309088021254185, 15.0, -15.0, 15.644487847162015, -15.644487847162015, 16.24807680927192, -16.24807680927192, 16.815171720800237, -16.815171720800237, 17.349351572897472, -17.349351572897472, 17.853571071357123, -17.853571071357123, 18.330302779823363, -18.330302779823363, 18.78163997099295, -18.78163997099295, 19.209372712298546, -19.209372712298546, 19.61504524593303, -19.61504524593303, 20.0, -20.0, 20.3654118544163, -20.3654118544163, 20.71231517720798, -20.71231517720798, 21.04162541250081, -21.04162541250081, 21.354156504062622, -21.354156504062622, 21.650635094610966, -21.650635094610966, 21.93171219946131, -21.93171219946131, 22.197972880423112, -22.197972880423112, 22.44994432064365, -22.44994432064365, 22.688102609076854, -22.688102609076854, 22.912878474779202, -22.912878474779202, 23.124662159694356, -23.124662159694356, 23.323807579381203, -23.323807579381203, 23.510635891017493, -23.510635891017493, 23.68543856465402, -23.68543856465402, 23.84848003542364, -23.84848003542364, 24.0, -24.0, 24.14021540914662, -24.14021540914662, 24.269322199023193, -24.269322199023193, 24.387496796514398, -24.387496796514398, 24.49489742783178, -24.49489742783178, 24.591665254715874, -24.591665254715874, 24.677925358506133, -24.677925358506133, 24.753787588973125, -24.753787588973125, 24.819347291981714, -24.819347291981714, 24.8746859276655, -24.8746859276655, 24.919871588754223, -24.919871588754223, 24.95495942693556, -24.95495942693556, 24.979991993593593, -24.979991993593593, 24.994999499899976, -24.994999499899976, 25.0, -25.0, 24.994999499899976, -24.994999499899976, 24.979991993593593, -24.979991993593593, 24.95495942693556, -24.95495942693556, 24.919871588754223, -24.919871588754223, 24.8746859276655, -24.8746859276655, 24.819347291981714, -24.819347291981714, 24.753787588973125, -24.753787588973125, 24.677925358506133, -24.677925358506133, 24.591665254715874, -24.591665254715874, 24.49489742783178, -24.49489742783178, 24.387496796514398, -24.387496796514398, 24.269322199023193, -24.269322199023193, 24.14021540914662, -24.14021540914662, 24.0, -24.0, 23.84848003542364, -23.84848003542364, 23.68543856465402, -23.68543856465402, 23.510635891017493, -23.510635891017493, 23.323807579381203, -23.323807579381203, 23.124662159694356, -23.124662159694356, 22.912878474779202, -22.912878474779202, 22.688102609076854, -22.688102609076854, 22.44994432064365, -22.44994432064365, 22.197972880423112, -22.197972880423112, 21.93171219946131, -21.93171219946131, 21.650635094610966, -21.650635094610966, 21.354156504062622, -21.354156504062622, 21.04162541250081, -21.04162541250081, 20.71231517720798, -20.71231517720798, 20.3654118544163, -20.3654118544163, 20.0, -20.0, 19.61504524593303, -19.61504524593303, 19.209372712298546, -19.209372712298546, 18.78163997099295, -18.78163997099295, 18.330302779823363, -18.330302779823363, 17.853571071357123, -17.853571071357123, 17.349351572897472, -17.349351572897472, 16.815171720800237, -16.815171720800237, 16.24807680927192, -16.24807680927192, 15.644487847162015, -15.644487847162015, 15.0, -15.0, 14.309088021254185, -14.309088021254185, 13.564659966250536, -13.564659966250536, 12.757350822173073, -12.757350822173073, 11.874342087037917, -11.874342087037917, 10.897247358851683, -10.897247358851683, 9.797958971132712, -9.797958971132712, 8.529361054615988, -8.529361054615988, 7.000000000000001, -7.000000000000001, 4.974937185533098, -4.974937185533098]
zs = [2, 4, -6, 0, -4, 8, 4, -7, 10, -8, 2, 6, 4, -5, -4, -8, 4, 6, 1, -5, -5, 7, 10, -4, 6, -6, 9, -10, 4, -7, -5, 1, -7, -1, -6, -4, 4, 8, 0, 2, 10, -10, -6, -4, 4, 1, -1, 4, -6, -7, -8, -3, 5, -2, -4, -2, -4, 7, -4, -8, -4, -5, 2, -7, 0, 9, 8, 10, -4, 1, -3, -9, 7, -9, -6, 10, 6, 4, 4, 9, -7, -7, -10, 2, -10, -4, 8, 7, 5, 8, -10, -1, 3, 1, -1, -6, 0, -3, 10, 6, 0, 9, 9, 4, -9, 2, 9, 8, -6, 5, -3, -5, 4, 0, 1, 5, 2, -3, 10, -1, -5, 5, -4, 8, 9, 7, 5, 6, -3, -2, -6, -1, 0, -4, 5, -2, -8, 6, 9, -4, -3, -10, -5, 6, -9, 8, -4, 5, -3, -5, -2, 1, 7, -4, -5, -6, 4, 5, 9, 6, 8, 7, 5, 6, -7, 4, 3, -4, 3, 6, 0, -8, 8, -9, 4, -1, 9, -6, 9, 1, 5, -6, -8, -10, 0, -8, 9, 4, 8, 8, 4, -7, -7, -7, 2, -2, -7, 9, -6, 0]
view raw gistfile1.txt hosted with ❤ by GitHub

3D Graph3D Graph
3D Graph3D Graph
3D GraphPCA


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

Popular posts from this blog

Probability (Part 1)

ประวัติ Deep Learning