首页 > 其他分享 >MATLAB的多种预测模型函数(上)建议收藏,可直接调用

MATLAB的多种预测模型函数(上)建议收藏,可直接调用

时间:2024-05-28 23:30:36浏览次数:20  
标签:调用 end 预测 收藏 MATLAB st2 alpha yt st1

初始变量:

yt: 输入的时间序列数据
j: 预测的未来步数

 线性回归预测法:
function results = forecast13(~, yt, j)
    % yt: 输入的时间序列数据
    % j: 预测的未来步数
    
    % 确定输入数据的长度
    n = length(yt);
    
    % 将时间序列数据转换为设计矩阵,用于线性回归
    X = [ones(n, 1), (1:n)']; % 添加截距项和时间趋势项
    
    % 使用最小二乘法进行线性回归
    B = regress(yt', X);
    
    % 初始化预测结果数组
    predictions = zeros(j, 1);
    
    % 计算最后一个已知数据点的索引
    lastIndex = n;
    
    % 使用线性回归模型进行预测
    for i = 1:j
        % 预测未来值
        predictions(i) = B(1) + B(2) * (lastIndex + i);
    end
    
    % 将预测结果转换为列向量形式
    predictions = predictions';
    
    % 将预测结果添加到原始时间序列数据中
    % 确保yt也是一个列向量
    if isvector(yt) && iscolumn(yt)
        yt = [yt; predictions];
    else
        yt = [yt, predictions]; % 如果yt不是列向量,使用水平拼接
    end
    
    % 输出预测结果
    results = yt(n+1:end);
end

简单移动平均法

function results = forecast2(~, yt, j)
    % yt: 输入的时间序列数据
    % j: 预测的未来步数
    
    % 初始化参数
    m = length(yt);          % 时间序列的长度
    m1 = length(yt);         % 原始时间序列的长度(用于最后返回结果的切片)
    a = j;                   % 预测的步数
    
    % 计算移动平均的窗口大小,这里假设窗口大小为3(可以根据需要调整)
    k = 3;
    
    % 初始化预测数组
    y_forecast = NaN(1, j);  % 用于存储每一步的预测值
    
    % 计算第一个移动平均值
    movingAverage = mean(yt(end-k+1:end));
    
    % 使用简单移动平均法进行预测
    for i = 1:a
        % 将计算得到的移动平均值添加到时间序列的末尾
        yt = [yt, movingAverage];
        m = length(yt);      % 更新时间序列长度
        
        % 更新移动平均值,这里使用时间序列的最后k个值
        movingAverage = mean(yt(end-k+1:end));
        
        % 存储预测值
        y_forecast(i) = movingAverage;
    end
    
    % 输出预测结果
    results = yt(1, m1+1:end);
end

局部加权回归预测法 :

function results = forecast14(~, yt, j)
    % yt: 输入的时间序列数据
    % j: 预测的未来步数
    
    % 确定输入数据的长度
    n = length(yt);
    
    % 确保yt是一个列向量
    if ~iscolumn(yt)
        yt = yt';
    end
    
    % 初始化预测结果数组
    predictions = zeros(j, 1);
    
    % 用于存储更新后的时间序列数据
    yt_updated = [yt; predictions]; % 预先分配空间以简化代码
    
    % 进行预测
    for i = 1:j
        % 定义局部加权回归的权重函数
        bandwidth = 3; % 局部加权回归的带宽
        indices = max(1, n-j+i-(bandwidth-1)):(n-j+i); % 选择最近的bandwidth个数据点作为回归基础
        indices = indices(:)'; % 确保indices是行向量
        
        % 创建设计矩阵 Xi
        Xi = [ones(length(indices), 1), indices]; % 添加截距项和时间趋势项
        
        % 计算权重
        weights = exp(-0.5 * (((indices - (n-j+i-(bandwidth-1))).^2) / (bandwidth * 0.1)));
        weights = weights / sum(weights); % 归一化权重
        
        % 计算局部加权回归预测值
        XiW = Xi * diag(weights);
        local_pred = XiW * regress(yt(indices)', Xi);
        
        % 使用局部加权回归预测值
        predictions(i) = local_pred(1) + local_pred(2) * (n-j+i);
    end
    
    % 输出预测结果
    results = yt_updated(n+1:end);
end
Holt-Winters季节性模型法 :
function results = forecast12(~, yt, j)
    alpha = 0.3; % 光滑系数
    beta = 0.1;  % 趋势系数
    gamma = 0.1; % 季节性系数
    n = length(yt);
    st1_0 = mean(yt(1:3)); st2_0=st1_0; st3_0=st1_0;
    st1 = alpha * yt(1) + (1 - alpha) * st1_0;
    st2 = alpha * st1 + (1 - alpha) * st2_0;
    st3 = alpha * st2 + (1 - alpha) * st3_0;
    
    % 初始化yt数组以存储预测值
    yt_with_forecast = yt;
    
    for i = 2:(n + j)
        if i > n
            % 计算预测值并添加到yt_with_forecast中
            a = 3 * st1 - 3 * st2 + st3;
            b = 0.5 * alpha / (1 - alpha)^2 * ((6 - 5 * alpha) * st1 - 2 * (5 - 4 * alpha) * st2 + (4 - 3 * alpha) * st3);
            c = 0.5 * alpha^2 / (1 - alpha)^2 * (st1 - 2 * st2 + st3);
            yt_with_forecast(i) = a + b + c;
        end
        
        st1 = alpha * yt_with_forecast(i) + (1 - alpha) * st1;
        st2 = alpha * st1 + (1 - alpha) * st2;
        st3 = alpha * st2 + (1 - alpha) * st3;
    end
    
    results = yt_with_forecast(n+1:end);
end


欢迎关注“我是电脑高手”,持续更新。

标签:调用,end,预测,收藏,MATLAB,st2,alpha,yt,st1
From: https://blog.csdn.net/2301_82176231/article/details/139280362

相关文章