目录
一、概念
1.1应用
1.2灰色预测概念
1.2.1概念
补充概念
1.2.2应用条件
1.2.3模型
1.2.4灰色关联度
背景
优点
步骤
注意
听不懂了吧!!!
上例题
1.3灰色生成数列
1.3.1概念
1.3.1方式
累加生成
前缀和
特点
累减生成
差分
累加对应积分累减对应微分
加权邻值生成
二、灰色模型GM(1,1)
2.1概念
2.2原理
2.3步骤
案例
2.4基于python的灰色预测法
例题
2.4.1导入数据
#原数据
data=np.array([[72.03,241.2,1592.74],[73.84,241.2,1855.36],[74.49,244.8,2129.60],[76.68,250.9,2486.86],[78.00,250.9,2728.94],[79.68,252.2,3038.90]])
#要预测数据的真实值
data_T=np.array([[81.21,256.5,3458.05],[82.84,259.4,3900.27],[84.5,262.4,4399.06],[86.19,265.3,4961.62],[87.92,268.3,5596.1],[89.69,271.4, 6311.79],[91.49,274.5,7118.96]])
2.4.2 进行累加数据
#累加数据
data1=np.cumsum(data.T,1) #按列相加
print(data1)
2.4.3 求解系数
[m,n]=data1.shape #得到行数和列数 m=3,n=6
#对这三列分别进行预测
X=[i for i in range(1997,2003)]#已知年份数据
X=np.array(X)
X_p=[i for i in range(2003,2010)]#预测年份数据
X_p=np.array(X_p)
X_sta=X[0]-1#最开始参考数据
#求解未知数
for j in range(3):
B=np.zeros((n-1,2))
for i in range(n-1):
B[i,0]=-1/2*(data1[j,i]+data1[j,i+1])
B[i,1]=1
Y=data.T[j,1:7]
a_u=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y.T)
print(a_u)
#进行数据预测
a=a_u[0]
u=a_u[1]
2.4.4 预测数据及对比
[m,n]=data1.shape #得到行数和列数 m=3,n=6
#对这三列分别进行预测
X=[i for i in range(1997,2003)]#已知年份数据
X=np.array(X)
X_p=[i for i in range(2003,2010)]#预测年份数据
X_p=np.array(X_p)
X_sta=X[0]-1#最开始参考数据
#求解未知数
for j in range(3):
B=np.zeros((n-1,2))
for i in range(n-1):
B[i,0]=-1/2*(data1[j,i]+data1[j,i+1])
B[i,1]=1
Y=data.T[j,1:7]
a_u=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y.T)
# print(a_u)
#进行数据预测
a=a_u[0]
u=a_u[1]
T=[i for i in range(1997,2010)]
T=np.array(T)
data_p=(data1[0,j]-u/a)*np.exp(-a*(T-X_sta-1))+u/a #累加数据
# print(data_p)
data_p1=data_p
data_p1[1:len(data_p)]=data_p1[1:len(data_p)]-data_p1[0:len(data_p)-1]
# print(data_p1)
title_str=['第一产业GDP预测','居民消费价格指数预测','第三产业GDP预测']
plt.subplot(221+j)
data_n=data_p1
plt.scatter(range(1997,2003),data[:,j])
plt.plot(range(1997,2003),data_n[X-X_sta])
plt.scatter(range(2003,2010),data_T[:,j])
plt. plot(range(2003,2010),data_n[X_p-X_sta-1])
# plt.title(title_str[j])
plt.legend(['实际原数据','拟合数据','预测参考数据','预测数据'])
y_n=data_n[X_p-X_sta-1].T
y=data_T[:,j]
wucha=sum(abs(y_n-y)/y)/len(y)
titlestr1=[title_str[j],'预测相对误差:',wucha]
plt.title(titlestr1)
plt.show()
完整代码
import numpy as np
import matplotlib.pyplot as plt
import math
# 解决图标题中文乱码问题
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
#原数据
data=np.array([[72.03,241.2,1592.74],[73.84,241.2,1855.36],[74.49,244.8,2129.60],[76.68,250.9,2486.86],[78.00,250.9,2728.94],[79.68,252.2,3038.90]])
#要预测数据的真实值
data_T=np.array([[81.21,256.5,3458.05],[82.84,259.4,3900.27],[84.5,262.4,4399.06],[86.19,265.3,4961.62],[87.92,268.3,5596.1],[89.69,271.4, 6311.79],[91.49,274.5,7118.96]])
#累加数据
data1=np.cumsum(data.T,1)
print(data1)
[m,n]=data1.shape #得到行数和列数 m=3,n=6
#对这三列分别进行预测
X=[i for i in range(1997,2003)]#已知年份数据
X=np.array(X)
X_p=[i for i in range(2003,2010)]#预测年份数据
X_p=np.array(X_p)
X_sta=X[0]-1#最开始参考数据
#求解未知数
for j in range(3):
B=np.zeros((n-1,2))
for i in range(n-1):
B[i,0]=-1/2*(data1[j,i]+data1[j,i+1])
B[i,1]=1
Y=data.T[j,1:7]
a_u=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y.T)
# print(a_u)
#进行数据预测
a=a_u[0]
u=a_u[1]
T=[i for i in range(1997,2010)]
T=np.array(T)
data_p=(data1[0,j]-u/a)*np.exp(-a*(T-X_sta-1))+u/a #累加数据
# print(data_p)
data_p1=data_p
data_p1[1:len(data_p)]=data_p1[1:len(data_p)]-data_p1[0:len(data_p)-1]
# print(data_p1)
title_str=['第一产业GDP预测','居民消费价格指数预测','第三产业GDP预测']
plt.subplot(221+j)
data_n=data_p1
plt.scatter(range(1997,2003),data[:,j])
plt.plot(range(1997,2003),data_n[X-X_sta])
plt.scatter(range(2003,2010),data_T[:,j])
plt. plot(range(2003,2010),data_n[X_p-X_sta-1])
# plt.title(title_str[j])
plt.legend(['实际原数据','拟合数据','预测参考数据','预测数据'])
y_n=data_n[X_p-X_sta-1].T
y=data_T[:,j]
wucha=sum(abs(y_n-y)/y)/len(y)
titlestr1=[title_str[j],'预测相对误差:',wucha]
plt.title(titlestr1)
plt.show()
2.5基于MATLAB的灰色预测法
2.5.1 导入数据
%原数据
data=[72.03,241.2,1592.74;73.84 ,241.2,1855.36;74.49,244.8,2129.60;...
76.68,250.9,2486.86;78.00,250.9,2728.94;79.68,252.2,3038.90]
%要预测数据的真实值
data_T=[81.21,256.5,3458.05;82.84,259.4,3900.27;84.5,262.4,4399.06;...
86.19,265.3,4961.62;87.92,268.3,5596.1;89.69,271.4, 6311.79;91.49,274.5,7118.96]
2.5.2 进行累加数据
%% 累加数据
data1=cumsum(data,1)
2.5.3 求解系数
for j=1:size(data,2)
B=zeros(size(data,1)-1,2);
for i=1:size(data,1)-1
B(i,1)=-1/2*(data1(i,j)+data1(i+1,j));
B(i,2)=1;
end
Y=data(2:end,j);
a_u=inv(B'*B)*B'*Y
2.5.4 预测数据及对比
for j=1:size(data,2)
B=zeros(size(data,1)-1,2);
for i=1:size(data,1)-1
B(i,1)=-1/2*(data1(i,j)+data1(i+1,j));
B(i,2)=1;
end
Y=data(2:end,j);
a_u=inv(B'*B)*B'*Y;
%进行数据预测
a=a_u(1); u=a_u(2);
T=[X,X_p];
data_p=(data1(1,j)-u/a).*exp(-a.*(T-X_sta))+u/a;%累加数据
data_p1(1)=data_p(1);
for n=2:length(data_p)
data_p1(n)=data_p(n)-data_p(n-1)
end
title_str={'第一产业GDP预测','居民消费价格指数预测','第三产业GDP预测'};
figure(1)
subplot(2,2,j)
plot(X,data(:,j),'*','LineWidth',1,'DisplayName','实际原数据')
hold on
plot(X_p,data_T(:,j),'o','LineWidth',1,'DisplayName','预测参考数据')
hold on
data_n=data_p1;
plot(X(2:end),data_n(X(2:end)-X_sta),'LineWidth',2,'DisplayName','拟合数据')
plot(X_p,data_n(X_p-X_sta),'LineWidth',2,'DisplayName','预测数据')
y_n=data_n(X_p-X_sta)';
y=data_T(:,j);
wucha=sum(abs(y_n-y)./y)/length(y);
titlestr1=[title_str{1,j},' 预测相对误差:',num2str(wucha)];
hold on
legend('show','Location','Best');
title(titlestr1)
end
完整代码
clc;clear;
%原数据
data=[72.03,241.2,1592.74;73.84 ,241.2,1855.36;74.49,244.8,2129.60;...
76.68,250.9,2486.86;78.00,250.9,2728.94;79.68,252.2,3038.90];
%要预测数据的真实值
data_T=[81.21,256.5,3458.05;82.84,259.4,3900.27;84.5,262.4,4399.06;...
86.19,265.3,4961.62;87.92,268.3,5596.1;89.69,271.4, 6311.79;91.49,274.5,7118.96];
%% 累加数据
data1=cumsum(data,1);
%% 求解系数
%对这三列分别进行预测
X=(1997:2002);%已知年份数据
X_p=(2003:2009);%预测年份数据
X_sta=X(1)-1;%最开始参考数据
for j=1:size(data,2)
B=zeros(size(data,1)-1,2);
for i=1:size(data,1)-1
B(i,1)=-1/2*(data1(i,j)+data1(i+1,j));
B(i,2)=1;
end
Y=data(2:end,j);
a_u=inv(B'*B)*B'*Y;
%进行数据预测
a=a_u(1); u=a_u(2);
T=[X,X_p];
data_p=(data1(1,j)-u/a).*exp(-a.*(T-X_sta))+u/a;%累加数据
data_p1(1)=data_p(1);
for n=2:length(data_p)
data_p1(n)=data_p(n)-data_p(n-1);
end
title_str={'第一产业GDP预测','居民消费价格指数预测','第三产业GDP预测'};
figure(1)
subplot(2,2,j)
plot(X,data(:,j),'*','LineWidth',1,'DisplayName','实际原数据')
hold on
plot(X_p,data_T(:,j),'o','LineWidth',1,'DisplayName','预测参考数据')
hold on
data_n=data_p1;
plot(X(2:end),data_n(X(2:end)-X_sta),'LineWidth',2,'DisplayName','拟合数据')
plot(X_p,data_n(X_p-X_sta),'LineWidth',2,'DisplayName','预测数据')
y_n=data_n(X_p-X_sta)';
y=data_T(:,j);
wucha=sum(abs(y_n-y)./y)/length(y);
titlestr1=[title_str{1,j},' 预测相对误差:',num2str(wucha)];
hold on
legend('show','Location','Best');
title(titlestr1)
end
三、灰色关联分析
例题
3.1步骤
注释
3.2原理
3.3基于python的 灰色关联分析
3.3.1 读取数据
#导入数据
data=pd.read_excel('D:\桌面\huiseguanlian.xlsx')
print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[1:]
print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values
print(data1)
3.3.2 数据标准化
#0.002~1区间归一化
[m,n]=data1.shape #得到行数和列数
data2=data1.astype('float')
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
d_max=max(data2[:,j])
d_min=min(data2[:,j])
data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)
3.3.3 绘制 x1,x4,x5,x6,x7 的折线图
t=range(2007,2014)
plt.plot(t,data3[:,0],'*-',c='red')
for i in range(4):
plt.plot(t,data3[:,2+i],'.-')
plt.xlabel('year')
plt.legend(['x1','x4','x5','x6','x7'])
plt.title('灰色关联分析')
3.3.4 计算灰色相关系数
3.4.1 得到其他列和参考列相等的绝对值
# 得到其他列和参考列相等的绝对值
for i in range(3,7):
data3[:,i]=np.abs(data3[:,i]-data3[:,0])
3.4.2 得到绝对值矩阵的全局最大值和最小值
#得到绝对值矩阵的全局最大值和最小值
data4=data3[:,3:7]
d_max=np.max(data4)
d_min=np.min(data4)
3.4.3 定义分辨系数
a=0.5
3.4.4 计算灰色关联矩阵
data4=(d_min+a*d_max)/(data4+a*d_max)
xishu=np.mean(data4, axis=0)
print(' x4,x5,x6,x7 与 x1之间的灰色关联度分别为:')
print(xishu)
完整代码
#导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决图标题中文乱码问题
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
#导入数据
data=pd.read_excel('D:\桌面\huiseguanlian.xlsx')
# print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[1:]
# print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values
print(data1)
#0.002~1区间归一化
[m,n]=data1.shape #得到行数和列数
data2=data1.astype('float')
data3=data2
ymin=0.002
ymax=1
for j in range(0,n):
d_max=max(data2[:,j])
d_min=min(data2[:,j])
data3[:,j]=(ymax-ymin)*(data2[:,j]-d_min)/(d_max-d_min)+ymin
print(data3)
# 绘制 x1,x4,x5,x6,x7 的折线图
t=range(2007,2014)
plt.plot(t,data3[:,0],'*-',c='red')
for i in range(4):
plt.plot(t,data3[:,2+i],'.-')
plt.xlabel('year')
plt.legend(['x1','x4','x5','x6','x7'])
plt.title('灰色关联分析')
# 得到其他列和参考列相等的绝对值
for i in range(3,7):
data3[:,i]=np.abs(data3[:,i]-data3[:,0])
#得到绝对值矩阵的全局最大值和最小值
data4=data3[:,3:7]
d_max=np.max(data4)
d_min=np.min(data4)
a=0.5 #定义分辨系数
# 计算灰色关联矩阵
data4=(d_min+a*d_max)/(data4+a*d_max)
xishu=np.mean(data4, axis=0)
print(' x4,x5,x6,x7 与 x1之间的灰色关联度分别为:')
print(xishu)