关联分析主要作用为对系统的因素进行分析,其主要作用为分辨因素中哪些因素对系统的影响是显著的,哪些影响是次要的。通常而言因素分析的主要方式为回归分析等,但其存在数据量要求大,计算量大等诸多问题,为克服以上问题,可采用关联分析进行系统分析。
在进行系统分析之前,应对原始数据进行数据变换处理,以消除量纲。
数据变换的定义:
设有序列
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:x→y
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ˉ=n1∑k=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)∣+ρmaxsmaxt∣x0(t)−xs(t)∣minsmint∣x0(t)−xs(t)∣+ρmaxsmaxt∣x0(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 maxsmaxt∣x0(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 minsmint∣x0(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=n1∑k=1nξi(k)
通过对某健将级女子铅球运动员的跟踪调查,获得其1982-1986年每年最好成绩以及16项专项素质和身体素质的时间序列资料,试对此铅球运动员的专项成绩进行因素分析。
首先对原始数据进行初始化处理:
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)
司守奎, 徐珂文, 李日华. 数学建模算法与程序[J]. 海军航空工程学院, 2007, 9: 95-98.