Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Thực hiện giảm chiều dữ liệu bằng PCA
Hướng Dẫn Đồ ÁnLập Trình AI

Thực hiện giảm chiều dữ liệu bằng PCA

Chia sẻ
Chia sẻ

Trong kỷ nguyên dữ liệu lớn, nhiều tập dữ liệu chứa hàng trăm, thậm chí hàng nghìn đặc trưng (features). Điều này gây ra vấn đề “lời nguyền chiều” (curse of dimensionality) và làm giảm hiệu quả của các thuật toán học máy. Giảm chiều dữ liệu (Dimensionality Reduction) giúp giải quyết vấn đề này bằng cách giữ lại những thông tin quan trọng nhất.

Principal Component Analysis (PCA) là một phương pháp giảm chiều phổ biến và mạnh mẽ, sử dụng kỹ thuật tuyến tính để biến đổi tập dữ liệu thành các thành phần chính, giúp tối ưu hóa khả năng phân tích và trực quan hóa dữ liệu.

Trước khi đi sâu vào PCA, bạn có thể tham khảo bài Hướng dẫn tiền xử lý dữ liệu sạch để huấn luyện mô hình tốt hơn để chuẩn bị dữ liệu chất lượng. Ngoài ra, bài Tạo dự báo thời tiết đơn giản bằng LSTM sẽ giúp bạn hiểu về dữ liệu dạng time series – lĩnh vực mà PCA cũng thường được áp dụng để trích xuất đặc trưng.

Dữ liệu sử dụng để thực hành

Để thực hành, chúng ta sẽ sử dụng bộ dữ liệu nổi tiếng Wine Dataset từ UCI Machine Learning Repository. Bộ dữ liệu này bao gồm 13 đặc trưng hóa học của 3 loại rượu vang khác nhau, rất phù hợp để áp dụng PCA và trực quan hóa dữ liệu giảm chiều.

📥 Link tải dataset: https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data
📖 Mô tả dữ liệu: https://archive.ics.uci.edu/ml/datasets/wine

Cài đặt thư viện và chuẩn bị môi trường

Chúng ta sẽ sử dụng Scikit-learn để thực hiện PCA cùng với Pandas, Matplotlib và Seaborn để xử lý và trực quan hóa dữ liệu.

!pip install pandas numpy matplotlib seaborn scikit-learn

Import các thư viện cần thiết:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

Đọc và khám phá dữ liệu

Tải và load dữ liệu vào DataFrame.

# Tải dữ liệu
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
columns = ['Class', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium',
           'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
           'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']

df = pd.read_csv(url, header=None, names=columns)
df.head()

Xem thông tin tổng quan về dữ liệu:

df.info()
df.describe()
df['Class'].value_counts()

Tiền xử lý dữ liệu

Chuẩn hóa dữ liệu

PCA bị ảnh hưởng bởi thang đo của các đặc trưng, nên cần chuẩn hóa dữ liệu trước khi áp dụng.

features = columns[1:]
x = df.loc[:, features].values
y = df.loc[:, ['Class']].values

scaler = StandardScaler()
x_scaled = scaler.fit_transform(x)

Thực hiện PCA

Áp dụng PCA để giảm chiều dữ liệu từ 13 xuống 2 thành phần chính (Principal Components) nhằm dễ dàng trực quan hóa.

pca = PCA(n_components=2)
principal_components = pca.fit_transform(x_scaled)

df_pca = pd.DataFrame(data=principal_components, columns=['PC1', 'PC2'])
df_pca = pd.concat([df_pca, df[['Class']]], axis=1)
df_pca.head()

Trực quan hóa dữ liệu sau khi giảm chiều

Sử dụng Seaborn để trực quan hóa 2 thành phần chính.

plt.figure(figsize=(8,6))
sns.scatterplot(data=df_pca, x='PC1', y='PC2', hue='Class', palette='Set1')
plt.title('PCA - 2 Thành phần chính của Wine Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

Phân tích tỉ lệ phương sai (Variance Ratio)

Tỉ lệ phương sai giúp bạn hiểu mỗi thành phần chính giải thích bao nhiêu phần trăm thông tin.

explained_variance = pca.explained_variance_ratio_
print("Tỉ lệ phương sai giải thích:", explained_variance)
print("Tổng phương sai giải thích:", sum(explained_variance))

Hiển thị biểu đồ phương sai:

pca_full = PCA().fit(x_scaled)
plt.figure(figsize=(8,6))
plt.plot(np.cumsum(pca_full.explained_variance_ratio_))
plt.xlabel('Số lượng thành phần chính')
plt.ylabel('Tổng phương sai giải thích')
plt.title('Biểu đồ Scree: Chọn số thành phần chính tối ưu')
plt.show()

Áp dụng PCA trước khi huấn luyện mô hình ML

PCA thường được sử dụng để giảm chiều dữ liệu trước khi huấn luyện các thuật toán ML. Ví dụ với Logistic Regression:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Chia dữ liệu
X_train, X_test, y_train, y_test = train_test_split(principal_components, y, test_size=0.3, random_state=42)

# Huấn luyện Logistic Regression
clf = LogisticRegression()
clf.fit(X_train, y_train.ravel())

# Dự đoán và đánh giá
y_pred = clf.predict(X_test)
print("Độ chính xác:", accuracy_score(y_test, y_pred))

Giảm Chiều Dữ Liệu Từ Ảnh Bằng PCA

Khi làm việc với hình ảnh kỹ thuật số, một trong những thách thức lớn nhất là kích thước dữ liệu. Một bức ảnh độ phân giải cao có thể chứa hàng triệu pixel, mỗi pixel lại có nhiều giá trị màu khác nhau, dẫn đến kích thước file lớn. Giảm chiều dữ liệu (Dimensionality Reduction) giúp nén ảnh bằng cách loại bỏ thông tin dư thừa nhưng vẫn giữ lại những đặc trưng quan trọng.

Dữ liệu sử dụng để thực hành

Chúng ta sẽ sử dụng ảnh mẫu Lena – một ảnh kinh điển trong xử lý ảnh, hoặc bạn có thể tải bất kỳ bức ảnh nào từ máy tính của bạn.

📥 Link tải ảnh Lena (PNG): https://github.com/opencv/opencv/raw/master/samples/data/lena.jpg

Hãy tải ảnh này và upload vào Google Colab hoặc Jupyter Notebook để thực hành.

Cài đặt thư viện và chuẩn bị môi trường

Chúng ta sẽ sử dụng các thư viện: NumPy, Matplotlib để xử lý và hiển thị ảnh, Scikit-learn để thực hiện PCA.

!pip install numpy matplotlib scikit-learn opencv-python

Import các thư viện:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import cv2

Đọc và hiển thị ảnh gốc

Trước tiên, đọc ảnh và hiển thị để quan sát kích thước và màu sắc.

# Đọc ảnh
image = cv2.imread('lena.jpg')
# Chuyển từ BGR (OpenCV) sang RGB (Matplotlib)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Hiển thị ảnh
plt.figure(figsize=(6,6))
plt.imshow(image_rgb)
plt.title('Ảnh gốc')
plt.axis('off')
plt.show()

Kiểm tra kích thước ảnh:

print("Kích thước ảnh:", image_rgb.shape)

Chuyển đổi ảnh sang kênh xám để đơn giản hóa

Để dễ hình dung, trước tiên hãy làm việc với ảnh xám (1 kênh màu).

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.figure(figsize=(6,6))
plt.imshow(image_gray, cmap='gray')
plt.title('Ảnh xám')
plt.axis('off')
plt.show()

Giảm chiều dữ liệu ảnh bằng PCA

Xác định số lượng thành phần chính

Hình ảnh xám là một ma trận 2D, chúng ta sẽ áp dụng PCA để giảm số lượng thành phần chính.

# Áp dụng PCA
pca = PCA(0.95)  # Giữ lại 95% phương sai
image_pca = pca.fit_transform(image_gray)

print("Số thành phần chính giữ lại:", pca.n_components_)

Tái tạo ảnh từ các thành phần chính

image_reconstructed = pca.inverse_transform(image_pca)

plt.figure(figsize=(6,6))
plt.imshow(image_reconstructed, cmap='gray')
plt.title('Ảnh tái tạo sau PCA')
plt.axis('off')
plt.show()

So sánh ảnh gốc và ảnh nén

Hiển thị ảnh gốc và ảnh nén cạnh nhau để so sánh.

fig, ax = plt.subplots(1,2, figsize=(12,6))

ax[0].imshow(image_gray, cmap='gray')
ax[0].set_title('Ảnh gốc')
ax[0].axis('off')

ax[1].imshow(image_reconstructed, cmap='gray')
ax[1].set_title('Ảnh nén (PCA)')
ax[1].axis('off')

plt.show()

Tính toán tỷ lệ nén

original_size = image_gray.size
compressed_size = pca.n_components_ * (image_gray.shape[0] + image_gray.shape[1])

compression_ratio = compressed_size / original_size
print(f"Tỷ lệ nén: {compression_ratio:.2f}")

Giảm chiều dữ liệu ảnh màu (RGB)

Với ảnh màu, ta áp dụng PCA riêng cho từng kênh R, G, B.

def pca_color_image(image, variance_ratio=0.95):
    channels = []
    for i in range(3):  # RGB
        channel = image[:, :, i]
        pca = PCA(variance_ratio)
        transformed = pca.fit_transform(channel)
        reconstructed = pca.inverse_transform(transformed)
        channels.append(reconstructed)
    return np.stack(channels, axis=2).astype(np.uint8)

image_rgb_pca = pca_color_image(image_rgb, 0.95)

plt.figure(figsize=(6,6))
plt.imshow(image_rgb_pca)
plt.title('Ảnh màu nén bằng PCA (95% phương sai)')
plt.axis('off')
plt.show()

Mở rộng: Điều chỉnh mức độ nén

Thử giảm tỷ lệ phương sai giữ lại để quan sát sự thay đổi chất lượng ảnh.

for variance in [0.99, 0.95, 0.90, 0.80]:
    image_pca = pca_color_image(image_rgb, variance)
    plt.figure(figsize=(6,6))
    plt.imshow(image_pca)
    plt.title(f'Ảnh màu nén với {int(variance*100)}% phương sai')
    plt.axis('off')
    plt.show()

Kết luận

Bạn vừa học cách sử dụng PCA để giảm chiều dữ liệu từ ảnh, qua đó thực hiện nén ảnh hiệu quả mà vẫn giữ được phần lớn chất lượng hình ảnh. Đây là một ứng dụng thực tế của PCA trong xử lý ảnh, đồng thời giúp bạn hiểu sâu hơn về cách PCA trích xuất thông tin quan trọng nhất từ dữ liệu đa chiều.

Bạn có thể mở rộng kỹ thuật này để xử lý video, nơi từng frame được nén bằng PCA, hoặc kết hợp với các thuật toán nén ảnh tiên tiến khác để đạt tỷ lệ nén cao hơn.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!