【数学建模】通过python实现灰色关联度计算

1.关联分析

关联分析主要作用为对系统的因素进行分析,其主要作用为分辨因素中哪些因素对系统的影响是显著的,哪些影响是次要的。通常而言因素分析的主要方式为回归分析等,但其存在数据量要求大,计算量大等诸多问题,为克服以上问题,可采用关联分析进行系统分析。

数据变换方法

在进行系统分析之前,应对原始数据进行数据变换处理,以消除量纲。
数据变换的定义:

设有序列
x = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) ) x=(x(1), x(2), \cdots, x(n)) x=(x(1),x(2),,x(n))
则称映射:
f : x → y f: x \rightarrow y f:xy
f ( x ( k ) ) = y ( k ) , k = 1 , 2 , ⋯   , n f(x(k))=y(k), \quad k=1,2, \cdots, n f(x(k))=y(k),k=1,2,,n
为序列 x x x到序列 y y y的数据变换。

常见的数据变换方法有:
(1)初始化变换:
f ( x ( k ) ) = x ( k ) x ( 1 ) = y ( k ) , x ( 1 ) ≠ 0 f(x(k))=\frac{x(k)}{x(1)}=y(k), \quad x(1) \neq 0 f(x(k))=x(1)x(k)=y(k),x(1)=0

(2)均值化变换:
f ( x ( k ) ) = x ( k ) x ˉ = y ( k ) , x ˉ = 1 n ∑ k = 1 n x ( k ) f(x(k))=\frac{x(k)}{\bar{x}}=y(k), \quad \bar{x}=\frac{1}{n} \sum_{k=1}^{n} x(k) f(x(k))=xˉx(k)=y(k),xˉ=n1k=1nx(k)

(3)归一化变换:
f ( x ( k ) ) = x ( k ) x 0 = y ( k ) f(x(k))=\frac{x(k)}{x_{0}}=y(k) f(x(k))=x0x(k)=y(k) 等。

关联分析

选取参考数列,一般为时间序列:
x 0 = { x 0 ( k ) ∣ k = 1 , 2 , ⋯   , n } = ( x 0 ( 1 ) , x 0 ( 2 ) , ⋯   , x 0 ( n ) ) x_{0}=\left\{x_{0}(k) \mid k=1,2, \cdots, n\right\}=\left(x_{0}(1), x_{0}(2), \cdots, x_{0}(n)\right) x0={x0(k)k=1,2,,n}=(x0(1),x0(2),,x0(n))
设有 m m m个比较数列:
x i = { x i ( k ) ∣ k = 1 , 2 , ⋯   , n } = ( x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( n ) ) , i = 1 , 2 , ⋯   , m x_{i}=\left\{x_{i}(k) \mid k=1,2, \cdots, n\right\}=\left(x_{i}(1), x_{i}(2), \cdots, x_{i}(n)\right), \quad i=1,2, \cdots, m xi={xi(k)k=1,2,,n}=(xi(1),xi(2),,xi(n)),i=1,2,,m
则比较数列 x i x_{i} xi对参考数列 x 0 x_{0} x0 k k k时刻的关联系数为:

ξ i ( k ) = min ⁡ s min ⁡ t ∣ x 0 ( t ) − x s ( t ) ∣ + ρ max ⁡ s max ⁡ t ∣ x 0 ( t ) − x s ( t ) ∣ ∣ x 0 ( k ) − x i ( k ) ∣ + ρ max ⁡ s max ⁡ t ∣ x 0 ( t ) − x s ( t ) ∣ \xi_{i}(k)=\frac{\min _{s} \min _{t}\left|x_{0}(t)-x_{s}(t)\right|+\rho \max _{s} \max _{t}\left|x_{0}(t)-x_{s}(t)\right|}{\left|x_{0}(k)-x_{i}(k)\right|+\rho \max _{s} \max _{t}\left|x_{0}(t)-x_{s}(t)\right|} ξi(k)=x0(k)xi(k)+ρmaxsmaxtx0(t)xs(t)minsmintx0(t)xs(t)+ρmaxsmaxtx0(t)xs(t)

其中, ρ \rho ρ为分辨系数, max ⁡ s max ⁡ t ∣ x 0 ( t ) − x s ( t ) ∣ \max _{s} \max _{t} \mid x_{0}(t)-x_{s}(t)\mid maxsmaxtx0(t)xs(t) min ⁡ s min ⁡ t ∣ x 0 ( t ) − x s ( t ) ∣ \min _{s} \min _{t} \mid x_{0}(t)-x_{s}(t)\mid minsmintx0(t)xs(t)分别为两数列之间的两级最小差与两级最大差。

由于通过上述公式每个数列的每个时刻都能求出一个关联数,为防止信息过于分散,定义比较数列 x i x_{i} xi对参考数列 x 0 x_{0} x0的关联度 r i r_{i} ri
r i = 1 n ∑ k = 1 n ξ i ( k ) r_{i}=\frac{1}{n} \sum_{k=1}^{n} \xi_{i}(k) ri=n1k=1nξi(k)

2.实例

通过对某健将级女子铅球运动员的跟踪调查,获得其1982-1986年每年最好成绩以及16项专项素质和身体素质的时间序列资料,试对此铅球运动员的专项成绩进行因素分析。
【数学建模】通过python实现灰色关联度计算_第1张图片
首先对原始数据进行初始化处理:

y = ( 1 , x ( 2 ) x ( 1 ) , ⋯   , x ( n ) x ( 1 ) ) y=\left(1, \frac{x(2)}{x(1)}, \cdots, \frac{x(n)}{x(1)}\right) y=(1,x(1)x(2),,x(1)x(n))

同时注意到最后两个数列为跑步时间,数值减少时意味着运动员水平的进步,因此应采取公式:

y i = ( 1 , x i ( 1 ) x i ( 2 ) , x i ( 1 ) x i ( 3 ) , x i ( 1 ) x i ( 4 ) , x i ( 1 ) x i ( 5 ) ) , i = 15 , 16 y_{i}=\left(1, \frac{x_{i}(1)}{x_{i}(2)}, \frac{x_{i}(1)}{x_{i}(3)}, \frac{x_{i}(1)}{x_{i}(4)}, \frac{x_{i}(1)}{x_{i}(5)}\right), i=15,16 yi=(1,xi(2)xi(1),xi(3)xi(1),xi(4)xi(1),xi(5)xi(1)),i=15,16

取分辨系数 ρ = 0.5 \rho=0.5 ρ=0.5,计算各数列关联度Matlab程序如下:

clc,clear
load x.txt   %把原始数据存放在纯文本文件 x.txt 中
for i=1:15     
    x(i,:)=x(i,:)/x(i,1);   %标准化数据 
end
for i=16:17     
    x(i,:)=x(i,1)./x(i,:);  %标准化数据 
end
data=x; 
n=size(data,2); %求矩阵的列数,即观测时刻的个数 
ck=data(1,:);  %提出参考数列 
bj=data(2:end,:); %提出比较数列 
m2=size(bj,1); %求比较数列的个数 
for j=1:m2       
    t(j,:)=bj(j,:)-ck; 
end
mn=min(min(abs(t')));  %求小差
mx=max(max(abs(t')));  %求大差
rho=0.5;  %分辨系数设置 
ksi=(mn+rho*mx)./(abs(t)+rho*mx);  %求关联系数 
r=sum(ksi')/n  %求关联度 
[rs,rind]=sort(r,'descend')   %对关联度进行排序

利用python解决:

import numpy as np

#进行关联度分析
data = open('athlete score.txt').readlines()

#数据初始化处理
for lines in range(15):
    data[lines] = list(eval(data[lines]))
    for i in range(1,len(data[lines])+1):
        data[lines][-i] = data[lines][-i] / data[lines][0]
for lines in range(1,3):
    data[-lines] = data[-lines].replace(",,",'.')
    data[-lines] = list(eval(data[-lines]))
    for i in range(1,len(data[-lines])+1):
        data[-lines][-i] = data[-lines][0] / data[-lines][-i]

#提出参考数列、比较数列
x0 = np.array(data[0])
xi = np.array(data[1:])

t = xi - x0

#求两级最大差、两极最小差
maxi,mini = np.max(np.abs(t)),np.min(np.abs(t))
rho = 0.5

#求关联系数、关联度
kesi = ((mini + rho*maxi) / (np.abs(t) + rho*maxi)) / np.size(x0)
ri = kesi.sum(axis=1)

print(ri)

程序运行结果如下:
运行结果
对比Matlab结果:
【数学建模】通过python实现灰色关联度计算_第2张图片

参考文献

司守奎, 徐珂文, 李日华. 数学建模算法与程序[J]. 海军航空工程学院, 2007, 9: 95-98.

你可能感兴趣的:(【数学建模】通过python实现灰色关联度计算)