从零开始的数模(二十五)灰色关联分析

目录

一、概念

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.5基于MATLAB的灰色预测法

​编辑

​编辑

完整代码 

三、灰色关联分析

3.1步骤

 3.2原理

​编辑 3.3基于python的 灰色关联分析

完整代码


一、概念

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)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烟雨平生9527

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

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

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

打赏作者

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

抵扣说明:

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

余额充值