【MATLAB第29期】基于MATLAB的K最邻近KNN时间序列预测模型,含预测未来

文章介绍了如何使用MATLAB基于K近邻(KNN)算法进行时间序列的连续值预测。通过计算最近邻数据点的均值来预测未来值,利用欧式距离作为距离度量,并探讨了模型的优缺点,包括对数据预处理的需求以及在某些数据集上的局限性。
摘要由CSDN通过智能技术生成

【MATLAB第29期】基于MATLAB的K最邻近KNN时间序列预测模型,含预测未来

一、简介

  • 基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数据点平均值而获得预测值。

    k近邻回归模型是无参数模型,只是借助k个最近训练样本的目标数值,对待测样本的回归值进行决策。即根据样本的相似度预测回归值。
    本文用来衡量样本待测样本回归值的方式为: 对K个近邻目标数值使用普通的算数平均算法

    KNN参数根据每个查询点的最邻近的k个数据点的均值作为预测值,其中,k是用户指定的整数,即最邻近的邻居数量。

    KNN模型建立
    当使用knn计算某个数据点的预测值时,模型会从训练数据集中选择离该数据点最近的k个数据点,并且把它们的y值取均值,把该均值作为新数据点的预测值:对于knn分类,使用score方法评估模型,对于回归的问题,返回的是RMSE,也叫做均方根误差,是回归模型预测的优度度量,

二、展示代码

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行
%%  导入数据(时间序列的单列数据)
result = xlsread('指数偏移预测2.xlsx');
data =result (:,2);%数据只需要第二列就够了, 不需要第一列编号数据,如果编号作为输入,数值作为输出误差会很大

%% 标准化数据预处理
mu = mean(data); %整个数据的均值 
sig = std(data);  %整个数据的标准值
dataStandardized = (data - mu) / sig;%标准化后的数据

%滑动窗口 参数设为9 ,即第1-70数据训练 ,预测10-79 。2-71测试,预测 11-80
XTrain= dataStandardized(1:70,:);%前70个数据训练
YTrain = dataStandardized(10:79,:);% 前70个数据训练
XTest = dataStandardized(2:71);%测试输入
YTest=data(11:80);%测试输出  测试输出数据就不用标准化处理了, 因为最后是直接与原值做对比的

%% KNN参数
%根据每个查询点的最邻近的k个数据点的均值作为预测值,其中,k是用户指定的整数,即最邻近的邻居数量。
k = 2;  %k一般取小值 ,2合适一些,1误差太小不真实
metric = 'euclidean';%欧式变换
%metric:计算距离的度量,
weights = {'uniform'};
%weights:权重,默认值weights ='uniform',为每个邻居分配统一的权重。
%构建模型
    mdl = mdl.fit(XTrain,YTrain);
  
    figure()
subplot(1,1,i)
    plot(10:79,YTest','-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255) ;hold on
    plot(10:79,Ypred(i,:),'-o','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255 ) ;hold off
    xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
    %ylim([ 78 87])
   legend('KNN预测测试数据','实际分析数据','Location','NorthWest','FontName','华文宋体');

    title(strcat('kNN模型 (k = 2, metric = ''euclidean'', weights = ''', weights(i), ''')'),'fontsize',12,'FontName','华文宋体')
%%  均方根误差
error(1,i) = sqrt(sum((Ypred(i,:)  - YTest').^2) ./ size(YTest,1));

disp(['测试集' num2str(i) '数据的RMSE为:', num2str(error(1,i))])
end

%% 预测未来
ype_num=10;%预测数量-
 figure()
    plot(0:79,data,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255) ;hold on
    plot(79:89,Ypred_10,'-o','Color','r','linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255 ) ;hold off
    xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
   % ylim([ 78 87])
   legend('实际分析数据','KNN预测数据','Location','NorthWest','FontName','华文宋体');

    title(strcat('kNN模型 (k = 2, metric = ''euclidean'', weights = ''', weights(i), ''')'),'fontsize',12,'FontName','华文宋体')

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、总结

  • knn回归模型的优缺点 knn回归有两个重要的参数:最邻近数据点的数量k,数据点之间距离的度量方法。
    在实践中,通常使用较小的k值。默认的距离度量是欧式距离

    knn回归模型的优点之一是模型很容易理解,通常不需要过多的调参就可以得到不错的性能,并且构建模型的速度通常很快。但是使用knn算法时,对数据进行预处理是很重要的,对特征很多的数据集、对于大多数特征值都为0的数据集,效果往往不是很好

五、代码获取

1.阅读首页置顶文章
2.关注CSDN
3.根据自动回复消息,回复“29期”以及相应指令,即可获取对应下载方式。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘摇的土木狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值