前言
一、时间序列分析简介
1.1、简介
1.2、事物的变化过程
1.3、序列分析
1.4、时间序列分析
二、预测方法
2.1、简单移动平均法
2.2、指数平滑方法
1)不等权的平均方法
2)十一点不等权平滑
3)十五点平滑公式
4)二十一点平滑公式
本文主要介绍数据挖掘当中对与时间序列分析的一些分析方法介绍,以下案例经供参考
时间序列数据是常见的数据类型之一,时间序列分析基于随机过程理论和数理统计学方法,研究时间序列数据所遵从的统计规律,常用于系统描述、系统分析、预测未来等。
时间序列数据主要是根据时间先后,对同样的对象按照等时间间隔收集的数据,比如每日的平均气温、每天的销售额、每月的降水量等。虽然有些序列所描述的内容取值是连续的,比如气温的变化可能是连续的,但是由于观察的时间段并不是连续的,所以可以认为是离散的时间序列数据。
一般地,对任何变量做定期记录就能构成一个时间序列。根据所研究序列数量的不同,可以将时间序列数据分为一元时间序列数据和多元时间序列数据。
a、确定性过程:变化过程可以根据t的确定函数值
b、随机过程:无确定形式,可以根据概率统计方法
研究数据中序列信息与时间相关的序列问题
动态数据处理统计方法
影响的四个因素:
平滑法:数据平滑处理
代码示例:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
int main()
{
int i,j,m,n;
m=12;
n=3;
double n1;
double a[12]={1500.0,1725.0,1510.0,1720.0,1330.0,1535.0,1740.0,1810.0,1760.0,1930.0,2000.0,1858.0};
double b[20]={0};
for (i=0;i<=m-n;i++)
{
for (j=0;j<=n-1;j++)
{
b[n+i]=b[n+i]+a[j+i];
n1=m;
}
b[n+i]=b[n+i]/n1;
n1=0.0;
}
for (i=n;i<=m;i++)
{
printf("平均值=%f",b[i]);
printf("\n");
}
}
此处的权值是未加入的。
ps:附上数据,下面的代码运行也是使用以下数据
100 30 350 41
20 10 25 8
3.5 20 25 17
4.5 45 40 4
5 25 4 5
4 12 50 36
4 9 70 26
5 25 200 26
25 100 200 24
1.5 10 10 21
5 50 300 56
6 10 10 10
6 11 10 9
6 10 13 24
6 10 9 10
4 20 12 11
25 12 13 16
100 10 30 11
25 8 10 21
25 30 25 60
30 10 80 26
20 12 80 41
25 15 80 40
30 40 300 16
25 80 400 11
15 10 6 9
20 10 15 15
20 10 10 7
25 10 8 3
25 20 8 5
20 8 8 6
25 12 8 5
15 10 10 5
15 8 4 28
20 8 4 8
5 10 5 11
25 15 10 12
25 8 6 3
25 15 10 9
20 12 10 21
20 20 10 2
20 10 8 2
15 8 10 2
25 15 10 2
40 12 10 2
25 10 10 10
25 25 5 9
15 6 25 16
公式一的算法介绍
#include "stdio.h"
#include "math.h"
#include "stdio.h"
int main()
{
FILE *fp;
FILE *fp1;
int i,j,m,n,p,w,d;
double z[100][100]={0};
double te[100][100],re[100][100],mean[100],a;
m=4;//时间序列总数
n=48;//样本数
w=5;//单侧平滑点数
if((fp=fopen("时间序列分析原始数据.txt","r"))==NULL)
{
printf("打开文件失败!\n");
return 0;
}
for(i=1;i<=n;i++)//读取数据
for(j=1;j<=m;j++)
fscanf(fp,"%le",&z[i][j]);
fclose(fp);
if((int)(n/10)*10==n){
d=n/10;//时间延迟数
}
else{
d=(int)(n/10)+1;
}
for(i=1;i<=n;i++){
for(j=w+1;j<=n-w;j++){
te[j][i]=(89*z[j][i]+84*(z[j+1][i]+z[j-1][i])+69*(z[j+2][i]+z[j-2][i])+44*(z[j+3][i]+z[j-3][i])+9*(z[j+4][i]+z[j-4][i])-36*(z[j+5][i]+z[j-5][i]))/429;
re[j][i]=z[j][i]-te[j][i];
}
}
printf("预测值");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",te[j][i]);
printf("\n");
}
printf("误差");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",re[j][i]);
printf("\n");
}
for(i=1;i<=m;i++){
a=0;
for(j=1;j<=n;j++)
a=a+z[j][i];
mean[i]=a/n;
}
for(p=0;p<=d;p++)
{
for(j=1;j<=m;j++){
a=0;
for(i=1;i<=n-p;i++)
a=a+(z[i][j]-mean[j])*(z[i+p][j]-mean[j]);
}
}
printf("原始数据平均值");
printf("\n");
for(i=1;i<=m;i++)
printf("%f",mean[i]);
printf("\n");
fp1=fopen("时间序列分析结果1.txt","w");
if(fp1==NULL){
printf("创建文件失败!\n");
return 0;
}
fprintf(fp1,"预测值\n");
for(j=w+1;j<=n-w;j++)//将结果写入文本文件
{
for(i=1;i<=m;i++)
fprintf(fp1,"%f",te[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"误差\n");
for(j=w+1;j<=n-w;j++){
for(i=1;i<=m;i++)
fprintf(fp1,"%f",re[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"原始数据平均值\n");
for(i=1;i<=m;i++)
fprintf(fp1,"%f",mean[i]);
fprintf(fp1,"\n");
fclose(fp1);
return 0;
}
公式二的算法介绍
#include "stdio.h"
#include "math.h"
#include "stdio.h"
int main()
{
FILE *fp;
FILE *fp1;
int i,j,m,n,p,w,d;
double z[100][100]={0};
double te[100][100],re[100][100],mean[100],a;
m=4;//时间序列总数
n=48;//样本数
w=5;//单侧平滑点数
if((fp=fopen("时间序列分析原始数据.txt","r"))==NULL)
{
printf("打开文件失败!\n");
return 0;
}
for(i=1;i<=n;i++)//读取数据
for(j=1;j<=m;j++)
fscanf(fp,"%le",&z[i][j]);
fclose(fp);
if((int)(n/10)*10==n){
d=n/10;//时间延迟数
}
else{
d=(int)(n/10)+1;
}
for(i=1;i<=n;i++){
for(j=w+1;j<=n-w;j++){
te[j][i]=(143*z[j][i]+120*(z[j+1][i]+z[j-1][i])+60*(z[j+2][i]+z[j-2][i])-10*(z[j+3][i]+z[j-3][i])-45*(z[j+4][i]+z[j-4][i])+18*(z[j+5][i]+z[j-5][i]))/429;
re[j][i]=z[j][i]-te[j][i];
}
}
printf("预测值");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",te[j][i]);
printf("\n");
}
printf("误差");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",re[j][i]);
printf("\n");
}
for(i=1;i<=m;i++){
a=0;
for(j=1;j<=n;j++)
a=a+z[j][i];
mean[i]=a/n;
}
for(p=0;p<=d;p++)
{
for(j=1;j<=m;j++){
a=0;
for(i=1;i<=n-p;i++)
a=a+(z[i][j]-mean[j])*(z[i+p][j]-mean[j]);
}
}
printf("原始数据平均值");
printf("\n");
for(i=1;i<=m;i++)
printf("%f",mean[i]);
printf("\n");
fp1=fopen("时间序列分析结果2.txt","w");
if(fp1==NULL){
printf("创建文件失败!\n");
return 0;
}
fprintf(fp1,"预测值\n");
for(j=w+1;j<=n-w;j++)//将结果写入文本文件
{
for(i=1;i<=m;i++)
fprintf(fp1,"%f",te[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"误差\n");
for(j=w+1;j<=n-w;j++){
for(i=1;i<=m;i++)
fprintf(fp1,"%f",re[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"原始数据平均值\n");
for(i=1;i<=m;i++)
fprintf(fp1,"%f",mean[i]);
fprintf(fp1,"\n");
fclose(fp1);
return 0;
}
#include "stdio.h"
#include "math.h"
#include "stdio.h"
int main()
{
FILE *fp;
FILE *fp1;
int i,j,m,n,p,w,d;
double z[100][100]={0};
double te[100][100],re[100][100],mean[100],a;
m=4;//时间序列总数
n=48;//样本数
w=7;//单侧平滑点数
if((fp=fopen("时间序列分析原始数据.txt","r"))==NULL)
{
printf("打开文件失败!\n");
return 0;
}
for(i=1;i<=n;i++)//读取数据
for(j=1;j<=m;j++)
fscanf(fp,"%le",&z[i][j]);
fclose(fp);
if((int)(n/10)*10==n){
d=n/10;//时间延迟数
}
else{
d=(int)(n/10)+1;
}
for(i=1;i<=n;i++){
for(j=w+1;j<=n-w;j++){
te[j][i]=(74*z[j][i]+67*(z[j+1][i]+z[j-1][i])+46*(z[j+2][i]+z[j-2][i])+21*(z[j+3][i]+z[j-3][i])+3*(z[j+4][i]+z[j-4][i])-5*(z[j+5][i]+z[j-5][i])-6*(z[j+6][i]+z[j-6][i])-3*(z[j+7][i]+z[j-7][i]))/320;
re[j][i]=z[j][i]-te[j][i];
}
}
printf("预测值");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",te[j][i]);
printf("\n");
}
printf("误差");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",re[j][i]);
printf("\n");
}
for(i=1;i<=m;i++){
a=0;
for(j=1;j<=n;j++)
a=a+z[j][i];
mean[i]=a/n;
}
for(p=0;p<=d;p++)
{
for(j=1;j<=m;j++){
a=0;
for(i=1;i<=n-p;i++)
a=a+(z[i][j]-mean[j])*(z[i+p][j]-mean[j]);
}
}
printf("原始数据平均值");
printf("\n");
for(i=1;i<=m;i++)
printf("%f",mean[i]);
printf("\n");
fp1=fopen("时间序列分析结果3.txt","w");
if(fp1==NULL){
printf("创建文件失败!\n");
return 0;
}
fprintf(fp1,"预测值\n");
for(j=w+1;j<=n-w;j++)//将结果写入文本文件
{
for(i=1;i<=m;i++)
fprintf(fp1,"%f",te[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"误差\n");
for(j=w+1;j<=n-w;j++){
for(i=1;i<=m;i++)
fprintf(fp1,"%f",re[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"原始数据平均值\n");
for(i=1;i<=m;i++)
fprintf(fp1,"%f",mean[i]);
fprintf(fp1,"\n");
fclose(fp1);
return 0;
}
#include "stdio.h"
#include "math.h"
#include "stdio.h"
int main()
{
FILE *fp;
FILE *fp1;
int i,j,m,n,p,w,d;
double z[100][100]={0};
double te[100][100],re[100][100],mean[100],a;
m=4;//时间序列总数
n=48;//样本数
w=10;//单侧平滑点数
if((fp=fopen("时间序列分析原始数据.txt","r"))==NULL)
{
printf("打开文件失败!\n");
return 0;
}
for(i=1;i<=n;i++)//读取数据
for(j=1;j<=m;j++)
fscanf(fp,"%le",&z[i][j]);
fclose(fp);
if((int)(n/10)*10==n){
d=n/10;//时间延迟数
}
else{
d=(int)(n/10)+1;
}
for(i=1;i<=n;i++){
for(j=w+1;j<=n-w;j++){
te[j][i]=(60*z[j][i]+57*(z[j+1][i]+z[j-1][i])+47*(z[j+2][i]+z[j-2][i])+33*(z[j+3][i]+z[j-3][i])+18*(z[j+4][i]+z[j-4][i])+6*(z[j+5][i]+z[j-5][i])-2*(z[j+6][i]+z[j-6][i])-5*(z[j+7][i]+z[j-7][i])-5*(z[j+8][i]+z[j-8][i])-3*(z[j+9][i]+z[j-9][i])-1*(z[j+10][i]+z[j-10][i]))/350;
re[j][i]=z[j][i]-te[j][i];
}
}
printf("预测值");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",te[j][i]);
printf("\n");
}
printf("误差");
printf("\n");
for(j=w+1;j<=n-w;j++)
{
for(i=1;i<=m;i++)
printf("%f",re[j][i]);
printf("\n");
}
for(i=1;i<=m;i++){
a=0;
for(j=1;j<=n;j++)
a=a+z[j][i];
mean[i]=a/n;
}
for(p=0;p<=d;p++)
{
for(j=1;j<=m;j++){
a=0;
for(i=1;i<=n-p;i++)
a=a+(z[i][j]-mean[j])*(z[i+p][j]-mean[j]);
}
}
printf("原始数据平均值");
printf("\n");
for(i=1;i<=m;i++)
printf("%f",mean[i]);
printf("\n");
fp1=fopen("时间序列分析结果4.txt","w");
if(fp1==NULL){
printf("创建文件失败!\n");
return 0;
}
fprintf(fp1,"预测值\n");
for(j=w+1;j<=n-w;j++)//将结果写入文本文件
{
for(i=1;i<=m;i++)
fprintf(fp1,"%f",te[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"误差\n");
for(j=w+1;j<=n-w;j++){
for(i=1;i<=m;i++)
fprintf(fp1,"%f",re[j][i]);
fprintf(fp1,"\n");
}
fprintf(fp1,"\n");
fprintf(fp1,"\n");
fprintf(fp1,"原始数据平均值\n");
for(i=1;i<=m;i++)
fprintf(fp1,"%f",mean[i]);
fprintf(fp1,"\n");
fclose(fp1);
return 0;
}
总结
以上就是今天所介绍的主要内容,本文主要介绍了时间序列分析的几种指数平滑方法,以及几种平滑公式的使用
最后欢迎大家点赞,收藏⭐,转发,
如有问题、建议,请您在评论区留言哦。