数据挖掘当中的时间序列分析——不等权平滑分析

文章目录

前言

一、时间序列分析简介

1.1、简介

1.2、事物的变化过程

1.3、序列分析

1.4、时间序列分析

二、预测方法

2.1、简单移动平均法

2.2、指数平滑方法

1)不等权的平均方法

2)十一点不等权平滑

3)十五点平滑公式

4)二十一点平滑公式


前言

本文主要介绍数据挖掘当中对与时间序列分析的一些分析方法介绍,以下案例经供参考

一、时间序列分析简介

1.1、简介

时间序列数据是常见的数据类型之一,时间序列分析基于随机过程理论和数理统计学方法,研究时间序列数据所遵从的统计规律,常用于系统描述、系统分析、预测未来等。
时间序列数据主要是根据时间先后,对同样的对象按照等时间间隔收集的数据,比如每日的平均气温、每天的销售额、每月的降水量等。虽然有些序列所描述的内容取值是连续的,比如气温的变化可能是连续的,但是由于观察的时间段并不是连续的,所以可以认为是离散的时间序列数据。
一般地,对任何变量做定期记录就能构成一个时间序列。根据所研究序列数量的不同,可以将时间序列数据分为一元时间序列数据和多元时间序列数据。

1.2、事物的变化过程

a、确定性过程:变化过程可以根据t的确定函数值

b、随机过程:无确定形式,可以根据概率统计方法

1.3、序列分析

研究数据中序列信息与时间相关的序列问题

1.4、时间序列分析

动态数据处理统计方法

影响的四个因素:

  • 长期趋势
  • 季节变动
  • 循环波动
  • 不规则变化

二、预测方法

平滑法:数据平滑处理

2.1、简单移动平均法

2.2、指数平滑方法

1)不等权的平均方法

代码示例:

#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");
}
}

此处的权值是未加入的。

2)十一点不等权平滑

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;
} 

3)十五点平滑公式

#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;
} 

4)二十一点平滑公式

#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;
} 

总结

以上就是今天所介绍的主要内容,本文主要介绍了时间序列分析的几种指数平滑方法,以及几种平滑公式的使用

最后欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张小鱼༒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值