Phân tích thành phần chính hay nói ngắn gọn là PCA được biết đến như một kỹ thuật giảm kích thước
Nó đã xuất hiện từ năm 1901 và vẫn được sử dụng như một phương pháp giảm kích thước chủ yếu trong học máy và thống kê. PCA là một phương pháp thống kê không giám sát
Trong bài viết này, chúng ta sẽ có một số trực giác về PCA và sẽ tự triển khai nó từ đầu bằng Python và NumPy
Tại sao lại sử dụng PCA ngay từ đầu?
Để hỗ trợ nguyên nhân sử dụng PCA, hãy xem xét một ví dụ
Giả sử chúng ta có một tập dữ liệu có hai biến và 10 số điểm dữ liệu. Nếu chúng tôi được yêu cầu trực quan hóa các điểm dữ liệu, chúng tôi có thể làm điều đó rất dễ dàng. Kết quả cũng rất dễ hiểu
X128142215252942X236261816202364Example Data pointsBây giờ, nếu chúng ta cố gắng tăng số lượng biến, chúng ta gần như không thể tưởng tượng được một chiều cao hơn ba chiều.
Vấn đề mà chúng tôi gặp phải khi phân tích các tập dữ liệu chiều cao hơn thường được gọi là "Lời nguyền của chiều". Thuật ngữ này lần đầu tiên được đặt ra bởi Richard E. người gác chuông
Phân tích thành phần chính làm giảm dữ liệu chiều cao xuống kích thước thấp hơn trong khi nắm bắt được mức độ biến đổi tối đa của tập dữ liệu. Trực quan hóa dữ liệu là ứng dụng phổ biến nhất của PCA. PCA cũng được sử dụng để giúp đào tạo thuật toán nhanh hơn bằng cách giảm số lượng kích thước của dữ liệu
Triển khai PCA với python
Để nắm bắt trực giác tối đa từ nội dung được đưa ra dưới đây, chúng tôi cho rằng bạn phải biết một chút về đại số tuyến tính và ma trận. Nếu không thì chúng tôi rất khuyến khích bạn xem loạt bài về đại số tuyến tính của 3Blue1Brown trên YouTube của Grant Sanderson, để xem lại các khái niệm vì nó sẽ rất có ích trong hành trình Học máy của bạn phía trước
Chúng ta có thể nghĩ về phân tích Thành phần chính giống như lắp một hình elip n chiều vào dữ liệu sao cho mỗi trục của hình elip đại diện cho một thành phần chính. Trục thành phần chính càng lớn thì độ biến thiên của dữ liệu mà nó đại diện càng lớn
Các bước triển khai PCA trong Python
#Importing required libraries import numpy as np
1. Trừ đi giá trị trung bình của từng biến
Trừ giá trị trung bình của từng biến khỏi tập dữ liệu để tập dữ liệu phải được căn giữa ở gốc. Làm điều này chứng tỏ là rất hữu ích khi tính toán ma trận hiệp phương sai
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]
Dữ liệu được tạo bởi đoạn mã trên có kích thước [20,5] i. e. 20 ví dụ và 5 biến cho mỗi ví dụ. chúng tôi đã tính giá trị trung bình của từng biến và trừ giá trị đó khỏi mỗi hàng của cột tương ứng
2. Tính ma trận hiệp phương sai
Tính ma trận hiệp phương sai của dữ liệu trung bình. Bạn có thể biết thêm về ma trận hiệp phương sai trong bài viết Wikipedia thực sự nhiều thông tin này tại đây
Ma trận hiệp phương sai là ma trận vuông biểu thị hiệp phương sai của các phần tử với nhau. Hiệp phương sai của một phần tử với chính nó không là gì khác ngoài Phương sai của nó
Đó là lý do tại sao các phần tử đường chéo của ma trận hiệp phương sai chỉ là phương sai của các phần tử
# calculating the covariance matrix of the mean-centered data. cov_mat = np.cov[X_meaned , rowvar = False]
Chúng ta có thể dễ dàng tính toán Ma trận hiệp phương sai bằng phương pháp
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]0. Giá trị mặc định cho
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]1 được đặt thành
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]2, hãy nhớ đặt thành
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]3 để có được ma trận hiệp phương sai theo thứ nguyên yêu cầu
3. Tính toán các giá trị riêng và vectơ riêng
Bây giờ, hãy tính toán Giá trị riêng và vectơ riêng cho ma trận Hiệp phương sai đã tính toán. Các vectơ riêng của ma trận Hiệp phương sai mà chúng ta nhận được là Trực giao với nhau và mỗi vectơ đại diện cho một trục chính
Giá trị riêng cao hơn tương ứng với độ biến thiên cao hơn. Do đó, trục chính có Giá trị riêng cao hơn sẽ là trục ghi lại độ biến thiên cao hơn trong dữ liệu
Trực giao có nghĩa là các vectơ vuông góc với nhau. Giá trị riêng và vectơ dường như rất đáng sợ cho đến khi chúng ta có được ý tưởng và khái niệm đằng sau nó
#Calculating Eigenvalues and Eigenvectors of the covariance matrix eigen_values , eigen_vectors = np.linalg.eigh[cov_mat]
Phương thức NumPy
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]4 trả về các giá trị riêng và vectơ riêng của một Hermitian phức tạp hoặc một ma trận đối xứng thực
4. Sắp xếp các giá trị riêng theo thứ tự giảm dần
Sắp xếp các giá trị riêng theo thứ tự giảm dần cùng với vectơ riêng tương ứng của chúng
Hãy nhớ rằng mỗi cột trong ma trận véc tơ riêng tương ứng với một thành phần chính, vì vậy việc sắp xếp chúng theo thứ tự giảm dần của Giá trị riêng sẽ tự động sắp xếp thành phần chính theo thứ tự giảm dần của độ biến thiên của chúng
Do đó, cột đầu tiên trong ma trận vectơ Eigen được sắp xếp lại của chúng tôi sẽ là thành phần chính nắm bắt được độ biến thiên cao nhất
#sort the eigenvalues in descending order sorted_index = np.argsort[eigen_values][::-1] sorted_eigenvalue = eigen_values[sorted_index] #similarly sort the eigenvectors sorted_eigenvectors = eigen_vectors[:,sorted_index]
#Generate a dummy dataset. X = np.random.randint[10,50,100].reshape[20,5] # mean Centering the data X_meaned = X - np.mean[X , axis = 0]5 trả về một mảng các chỉ số có cùng hình dạng
5. Chọn một tập hợp con từ ma trận Eigenvalue được sắp xếp lại
Chọn một tập hợp con từ ma trận Eigenvalue được sắp xếp lại theo nhu cầu của chúng tôi. e. số_comp = 2. Điều này có nghĩa là chúng tôi đã chọn hai thành phần chính đầu tiên
# select the first n eigenvectors, n is desired dimension # of our final reduced data. n_components = 2 #you can select any number of components. eigenvector_subset = sorted_eigenvectors[:,0:n_components]
n_components = 2 có nghĩa là dữ liệu cuối cùng của chúng tôi sẽ được giảm xuống chỉ còn 2 biến. nếu chúng ta thay đổi nó thành 3 thì dữ liệu của chúng ta sẽ giảm xuống còn 3 biến
6. Chuyển đổi dữ liệu
Cuối cùng, chuyển đổi dữ liệu bằng cách có một tích vô hướng giữa Chuyển vị của tập hợp con vectơ riêng và Chuyển vị của dữ liệu trung bình. Bằng cách chuyển đổi kết quả của sản phẩm chấm, kết quả chúng tôi nhận được là dữ liệu được giảm xuống các kích thước thấp hơn từ các kích thước cao hơn
#Transform the data X_reduced = np.dot[eigenvector_subset.transpose[],X_meaned.transpose[]].transpose[]
Kích thước cuối cùng của X_reduced sẽ là [ 20, 2 ] và ban đầu dữ liệu có kích thước cao hơn [ 20, 5 ]
Giờ đây, chúng tôi có thể trực quan hóa dữ liệu của mình bằng các công cụ có sẵn mà chúng tôi có. tiếng hoan hô. nhiệm vụ hoàn thành
Mã hoàn chỉnh để phân tích thành phần chính trong Python
Bây giờ, hãy kết hợp mọi thứ ở trên bằng cách tạo một hàm và thử phân tích Thành phần chính của chúng ta từ đầu trên một ví dụ
import numpy as np def PCA[X , num_components]: #Step-1 X_meaned = X - np.mean[X , axis = 0] #Step-2 cov_mat = np.cov[X_meaned , rowvar = False] #Step-3 eigen_values , eigen_vectors = np.linalg.eigh[cov_mat] #Step-4 sorted_index = np.argsort[eigen_values][::-1] sorted_eigenvalue = eigen_values[sorted_index] sorted_eigenvectors = eigen_vectors[:,sorted_index] #Step-5 eigenvector_subset = sorted_eigenvectors[:,0:num_components] #Step-6 X_reduced = np.dot[eigenvector_subset.transpose[] , X_meaned.transpose[] ].transpose[] return X_reduced
Chúng tôi đã định nghĩa một hàm có tên PCA chấp nhận ma trận dữ liệu và số lượng thành phần làm đối số đầu vào
Chúng tôi sẽ sử dụng bộ dữ liệu IRIS và áp dụng chức năng PCA của chúng tôi cho nó
import pandas as pd #Get the IRIS dataset url = "//archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data" data = pd.read_csv[url, names=['sepal length','sepal width','petal length','petal width','target']] #prepare the data x = data.iloc[:,0:4] #prepare the target target = data.iloc[:,4] #Applying it to PCA function mat_reduced = PCA[x , 2] #Creating a Pandas DataFrame of reduced Dataset principal_df = pd.DataFrame[mat_reduced , columns = ['PC1','PC2']] #Concat it with target variable to create a complete Dataset principal_df = pd.concat[[principal_df , pd.DataFrame[target]] , axis = 1]
Mẹo quan trọng. chúng ta nên chuẩn hóa dữ liệu bất cứ khi nào cần thiết trước khi áp dụng bất kỳ thuật toán ML nào cho dữ liệu đó. Trong đoạn mã trên, chúng tôi đã không chuẩn hóa dữ liệu của mình, nhưng chúng tôi đã làm như vậy khi triển khai PCA
Hãy vẽ kết quả của chúng tôi bằng cách sử dụng thư viện seaborn và matplotlib
import seaborn as sb import matplotlib.pyplot as plt plt.figure[figsize = [6,6]] sb.scatterplot[data = principal_df , x = 'PC1',y = 'PC2' , hue = 'target' , s = 60 , palette= 'icefire']
Đó là nó. Nó hoạt động hoàn hảo
Phần kết luận
Trong bài viết này, chúng ta đã tìm hiểu về PCA, cách PCA hoạt động và triển khai PCA bằng NumPy. học tập vui vẻ