1、简单介绍: EOF是一种分析矩阵数据中的结构特征,提取主要数据特征量的一种方法。EOF又名PCA.(嘿嘿先这么想,其实在python里就一个函数鸭,PCA可以额外写一篇进行解释,这里只写一下应用啦)。Lorenz在1950年代首次将其引入气象和气候研究。 2、原理 选定要分析的数据,进行数据预处理,通常处理成距平的形式。得到一个数据矩阵Xm×n. 数据大概就是这样的:这个原出处我也没找到,就是给大家看看数据格式。
(1)开始导入包
import pandas as pd
import numpy as np
(2)把数据转换成距平和把数据标准化。
line = np.mean(data,axis=1)
data = np.array(data)
line = np.array(line)
for i in range(line.shape[0]):
data[i,:]=data[i,:]-line[i]
mu = np.mean(data, axis=0)
sigma = np.std(data, axis=0)
data = (data - mu) / sigma
(3)计算X与其转置矩阵XT的交叉积,得到方阵并求出特征值 Cm×m = 1/n×X × XT 如果X是已经处理成了距平的话,则C称为协方差阵;如果X已经标准化(即C中每行数据的平均值为0,标准差为1),则C称为相关系数阵。 这里我把我对标准化的理解说一下,我感觉这个东西是用来处理一种多维tensor可能不同的变量的方差啊等数据差异很大的问题。如X={X1,X2},X1的方差等数据远远大于X2,如果求欧几里得距离等操作的话X1对结果影响远大于X2,所以要进行标准化。
计算特征值和特征向量:
import pandas as pd
import numpy as np
import cmath
eof_data =pd.read_csv(r'C:/Users/13056/Desktop/气温.csv',encoding = 'gb2312')
data = eof_data.drop(['站点'],axis=1)
#来一手数据标准化
mean = np.mean(data, axis=0) # 求平均值
std = np.std(data, axis=0) # 标准差
data_zcore = (data - mean)/std
#求交叉积
data1 = np.array(data_zcore)
data2 = np.array(data_zcore.T)
data_eof = (np.dot(data1,data2))/data1.shape[1]
eigenvalue,featurevector=np.linalg.eig(data_eof)
#这里说一下eigenvalue是特征值,featurevector是特征向量,俺用库做的,因为懒。
(4)求时间系数矩阵
#3求时间系数矩阵
data_e = np.zeros([data1.shape[0],data1.shape[0]])
i =0
sum1=0
for e in eigenvalue:
sum1+=e
data_e [i][i]=e
i+=1
data_T = data_e.T.dot(data1)
(5)求方差贡献率
R = []
for e in eigenvalue:
k = e/sum1
R.append(k)
(6)我要拿特征根大于1的数据,一共五个
i = 0
for e in eigenvalue:
if e>1 :
i += 1
else:
break
l_R = R[0:i]
l_eigenvalue = eigenvalue[0:i]
l_featurevector = featurevector[0:i]
l_eigenvalue = eigenvalue[0:i]
l_data_T =data_T[0:i]
(7)显著性检验(重点!!!)
ca=[]
ca.append(l_eigenvalue[0])
ej = l_eigenvalue *cmath.sqrt(2/i)
for m in range(i-1):
if (l_eigenvalue[m+1]-l_eigenvalue[m])>=ej[m]:
ca.append(l_eigenvalue[m+1])
3、画图
具体是用Echarts写的。点击这里