Nguyên lý Vận hành Cốt lõi
Thuật toán Lấy mẫu Trọng số Thích nghi Cạnh tranh (CARS) là một phương pháp tối ưu hóa không gian đặc trưng, được thiết kế chuyên biệt để xử lý các tập dữ liệu quang phổ có số chiều lớn. CARS hoạt động dựa trên cơ chế "chọn lọc tự nhiên", kết hợp giữa việc gán trọng số động cho các biến số và chiến lược loại bỏ tiệm cận. Quy trình được chia thành bốn giai đoạn lặp lại:
- Phân tách ngẫu nhiên tập mẫu: Mỗi vòng lặp trích xuất một tập con từ dữ liệu hiệu chuẩn thông qua kỹ thuật Monte Carlo, giúp đánh giá tính ổn định của mô hình.
- Xây dựng mô hình hồi quy: Sử dụng phương pháp Bình phương tối thiểu từng phần (PLS) để ánh xạ mối quan hệ giữa phổ đo và thuộc tính mục tiêu.
- Suy giảm số biến theo hàm mũ: Áp dụng công thức giảm tỷ lệ giữ lại đặc trưng theo số vòng lặp, buộc mô hình phải tập trung vào nhóm biến mang thông tin mạnh nhất.
- Đánh giá cạnh tranh: So sánh giá trị tuyệt đối của hệ số hồi quy, ưu tiên giữ lại các biến có đóng góp lớn nhất cho độ chính xác dự báo.
Công thức Toán học Điều khiển
Yếu tố then chốt quyết định tốc độ loại bỏ đặc trưng là hàm suy giảm mũ, được biểu diễn như sau:
ρ(i) = ρ₀ · exp(-λ · i)
Trong đó:
ρ(i): Tỷ lệ biến số được giữ lại ở vòng lặp thứi.ρ₀: Hệ số tỷ lệ khởi tạo.λ: Hằng số suy giảm, điều khiển tốc độ thu hẹp không gian tìm kiếm.i: Chỉ số vòng lặp hiện tại.
Mã nguồn Triển khai
Dưới đây là phiên bản được tái cấu trúc, tối ưu hóa luồng xử lý và sử dụng hệ thống đặt tên biến khác biệt, đảm bảo tính tương thích và độ chính xác thuật toán:
function [optimalIndices, errLog, varCountLog] = executeCarsFeatureExtraction(spectralMatrix, targetVector, varargin)
% Thiết lập cấu hình tham số mặc định
config.maxCycles = 50;
config.decayConst = 0.2;
config.initFraction = 0.1;
config.crossValFolds = 5;
% Cập nhật tham số đầu vào (nếu có)
for idx = 1:2:length(varargin)
key = varargin{idx};
val = varargin{idx+1};
if isfield(config, key), config.(key) = val; end
end
[nObservations, nSpectralBands] = size(spectralMatrix);
activeBandMask = true(1, nSpectralBands);
errLog = zeros(config.maxCycles, 1);
varCountLog = zeros(config.maxCycles, 1);
for cycle = 1:config.maxCycles
% Phân chia tập huấn luyện ngẫu nhiên (80%)
trainSize = round(nObservations * 0.8);
permIndices = randperm(nObservations, trainSize);
X_sub = spectralMatrix(permIndices, :);
y_sub = targetVector(permIndices);
% Huấn luyện mô hình PLS với kiểm tra chéo
nLatentVars = min(10, size(X_sub, 2));
try
[~, ~, ~, ~, plsWeights] = plsregress(X_sub, y_sub, nLatentVars, 'cv', config.crossValFolds);
yPred = X_sub * plsWeights(2:end, 1) + plsWeights(1, 1);
cycleRMSE = sqrt(mean((y_sub - yPred).^2));
catch
plsWeights = zeros(nSpectralBands + 1, 1);
cycleRMSE = Inf;
end
% Tính toán tỷ lệ giữ lại theo hàm suy giảm
retentionRate = config.initFraction * exp(-config.decayConst * cycle);
nKeep = max(1, round(nSpectralBands * retentionRate));
% Lọc biến dựa trên trọng số hồi quy
absCoeffs = abs(plsWeights(2:end));
absCoeffs(~activeBandMask) = 0; % Vô hiệu hóa biến đã loại
[~, rankOrder] = sort(absCoeffs, 'descend');
activeBandMask = false(1, nSpectralBands);
activeBandMask(rankOrder(1:nKeep)) = true;
% Ghi nhật ký tiến trình
errLog(cycle) = cycleRMSE;
varCountLog(cycle) = sum(activeBandMask);
fprintf('Vòng lặp %d/%d | Biến còn lại: %4d | RMSECV: %.4f\n', ...
cycle, config.maxCycles, varCountLog(cycle), errLog(cycle));
end
optimalIndices = find(activeBandMask);
end
Trực quan hóa Dữ liệu
Đoạn mã sau minh họa cách phân tích xu hướng hội tụ và phân bố đặc trưng được lựa chọn:
function visualizeCarsProgress(optIndices, rmseHistory, nVarsHistory, X_orig, y_orig)
figHandle = figure('Position', [80, 80, 1100, 750], 'Color', 'w');
% Đồ thị 1: Lịch sử biến đổi số lượng đặc trưng
subplot(2, 2, 1);
plot(nVarsHistory, '#2A9D8F', 'LineWidth', 2.5, 'Marker', 's');
grid on;
xlabel('Số vòng lặp'); ylabel('Số biến được giữ');
title('Tiến trình Thu hẹp Không gian Đặc trưng');
% Đồ thị 2: Đánh giá sai số kiểm tra chéo
subplot(2, 2, 2);
plot(rmseHistory, '#E76F51', 'LineWidth', 2.5, 'Marker', 'o');
grid on;
xlabel('Số vòng lặp'); ylabel('Giá trị RMSECV');
title('Diễn biến Lỗi Dự báo');
% Đồ thị 3: Tần suất xuất hiện của biến trong quá trình lặp
subplot(2, 2, 3);
freqVec = zeros(size(X_orig, 2), 1);
for idx = 1:length(optIndices)
freqVec(optIndices(idx)) = freqVec(optIndices(idx)) + 1;
end
bar(freqVec, '#264653');
xlabel('Chỉ số bước sóng'); ylabel('Tần suất giữ lại');
title('Phân bố Độ ổn định Đặc trưng');
% Đồ thị 4: Phổ trung bình với điểm đánh dấu đặc trưng ưu tiên
subplot(2, 2, 4);
avgSpectrum = mean(X_orig, 1);
wavelengths = 1:length(avgSpectrum);
plot(wavelengths, avgSpectrum, 'k-', 'LineWidth', 1.2); hold on;
plot(wavelengths(optIndices), avgSpectrum(optIndices), 'ro', 'MarkerSize', 7, 'LineWidth', 2);
xlabel('Chỉ số bước sóng'); ylabel('Cường độ phổ');
title('Vị trí Đặc trưng Tối ưu trên Phổ');
legend('Phổ gốc', 'Biến đã chọn', 'Location', 'northwest');
end
Chiến lược Điều chỉnh Tham số
Việc tinh chỉnh các siêu tham số đóng vai trò quyết định đến hiệu suất và thời gian tính toán của thuật toán:
| Tham số | Khoảng giá trị gợi ý | Tác động hệ thống |
|---|---|---|
| Số vòng lặp tối đa | 40 – 90 | Tăng độ sâu tìm kiếm nhưng đồng nghĩa với chi phí tính toán cao hơn. |
| Hằng số suy giảm | 0.04 – 0.25 | Điều chỉnh tốc độ đào thải biến số. Giá trị cao dẫn đến co cụm nhanh, giá trị thấp giúp khám phá kỹ hơn. |
| Tỷ lệ khởi tạo | 0.05 – 0.20 | Quyết định số lượng đặc trưng bắt đầu được đánh giá ở vòng lặp đầu tiên. |
| Phần mẫu huấn luyện | 0.75 – 0.90 | Ảnh hưởng trực tiếp đến độ tin cậy của ước lượng PLS trong mỗi bước Monte Carlo. |
Lĩnh vực Ứng dụng & Lưu ý Thực tiễn
Phương pháp CARS thường được ưu tiên triển khai trong:
- Phân tích hóa học định lượng bằng phổ cận hồng ngoại (NIR) và phổ Raman.
- Trích xuất đặc trưng sinh học từ dữ liệu biểu hiện gen hoặc protein.
- Giảm chiều dữ liệu cảm biến đa kênh trong hệ thống IoT công nghiệp.
Để đảm bảo tính ổn định khi đưa vào hệ thống thực tế, cần lưu ý:
- Chuẩn hóa dữ liệu đầu vào bằng các kỹ thuật như SNV, MSC hoặc đạo hàm bậc nhất trước khi đưa vào mô hình.
- Kết hợp CARS với các phương pháp wrapper khác như SPA hoặc GA để kiểm chứng tính độc lập của tập đặc trưng.
- Luôn đánh giá lại tập đặc trưng đã chọn trên tập kiểm tra hoàn toàn tách biệt để tránh hiện tượng overfitting do đánh giá chéo lặp lại.
- Giám sát đường cong RMSECV để xác định điểm dừng tối ưu thay vì chỉ dựa vào số vòng lặp cố định.