% 光伏預測 - 基于SAO優化的GPR
% 數據準備
% 假設有多個輸入特征 X1, X2, …, Xn 和一個目標變量 Y
% 假設數據已經存儲在 X 和 Y 中,每個變量為矩陣,每行表示一個樣本,每列表示一個特征
% 參數設置
numFeatures = size(X, 2); % 輸入特征的數量
% 數據劃分為訓練集和測試集
[trainX, testX, trainY, testY] = train_test_split(X, Y, 0.8); % 使用自定義的劃分函數 train_test_split
% SAO優化過程
saoOptions = optimoptions(‘fminunc’, ‘Display’, ‘off’); % SAO優化算法的選項設置
initialGuess = zeros(1, numFeatures); % 初始化優化變量
[optimalParams, ~] = fminunc(@(params) saoObjective(params, trainX, trainY), initialGuess, saoOptions);
% GPR模型構建與訓練
gprModel = fitrgp(trainX, trainY, ‘KernelFunction’, ‘squaredexponential’, ‘KernelParameters’, optimalParams);
% 預測
predictedY = predict(gprModel, testX);
% 評估
mse = mean((predictedY - testY).^2); % 均方誤差
% 自定義函數 saoObjective,計算SAO優化的目標函數
function loss = saoObjective(params, X, Y)
gprModel = fitrgp(X, Y, ‘KernelFunction’, ‘squaredexponential’, ‘KernelParameters’, params);
[~, negLogLikelihood] = posterior(gprModel, X, Y);
loss = -negLogLikelihood;
end
% 自定義函數 train_test_split,將數據劃分為訓練集和測試集
function [trainX, testX, trainY, testY] = train_test_split(X, Y, trainRatio)
numSamples = size(X, 1);
trainSize = round(numSamples * trainRatio);
indices = randperm(numSamples);
trainIndices = indices(1:trainSize);
testIndices = indices(trainSize+1:end);trainX = X(trainIndices, :);
testX = X(testIndices, :);
trainY = Y(trainIndices, :);
testY = Y(testIndices, :);
end