Triển khai Thuật toán CARS cho Tuyển chọn Biến số trong Dữ liệu Quang phổ

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 đa40 – 90Tă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ảm0.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ạo0.05 – 0.20Quyế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ện0.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.

Thẻ: chemometrics PLS-regression spectral-analysis feature-selection Monte-Carlo-sampling

Đăng vào ngày 28 tháng 9 lúc 03:57