Dynamic PCA

247 阅读1分钟

动态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)