动态PCA的核心思想主要是将原来的数据集X进行矩阵的增广,获得新的数据集,然后再对新的数据集进行PCA的降维处理。原理的话我这里就不进行推导展示了,网上有很多,可以去参考一下
首先,对数据进行增广:
def getAugmentedData(data):
lag = 20
augmented_data = lagmat(data, maxlag=lag, trim="forward", original='in')
return augmented_data
这里的lag可以根据自己的需求进行调节
使用传统PCA进行降维处理:
def Dynamic_PCA(data):
"""
动态PCA
:param data:
:return:
"""
# 求出行列数
m, n = np.shape(data)
# 求均值
mean_data = np.mean(data, 0)
# 求方差
std_data = np.std(data, 0)
# 中心化
center_data = (data - mean_data) / std_data
# 计算协方差矩阵
cov_data_matrix = np.cov(center_data.T)
# 对协方差矩阵进程奇异值分解
# 此函数返回三个值 u s v 此时v是u的转置
eig_vector, eig_value, eig_vector_t = np.linalg.svd(cov_data_matrix)
print("特征值:", eig_value)
v_sum = np.sum(eig_value)
eig_value_num = [] # 主元个数
var_contribute_rate = 0 # 累积方差贡献率
for i in range(len(eig_value)):
one_var_contribute_rate = eig_value[i] / v_sum
if i == 0:
var_contribute_rate = one_var_contribute_rate
else:
var_contribute_rate = var_contribute_rate + one_var_contribute_rate
if var_contribute_rate < 0.85: # 累积方差贡献率
pass
else:
eig_value_num.append(i + 1)
# print("k:", k)
break
n_components = eig_value_num[0]
# 选的对应的特征值与特征向量
new_eig_value = np.diag(1 / eig_value[:n_components])
new_eig_vector = eig_vector[:, :n_components]
return np.dot(data, new_eig_vector)