Python - 生成特定自相关的数组

Bar*_*ich 7 python random numpy correlation scikit-learn

我感兴趣的是生成一个长度为N的数组(或numpy系列),它将在滞后1处表现出特定的自相关性.理想情况下,我想指定均值和方差,并从(多)正态分布中得出数据.但最重要的是,我想指定自相关.我如何用numpy或scikit-learn做到这一点?

只是为了明确和准确,这是我想要控制的自相关:

numpy.corrcoef(x[0:len(x) - 1], x[1:])[0][1]
Run Code Online (Sandbox Code Playgroud)

Dan*_*ață 6

如果您只对滞后一时的自相关感兴趣,则可以生成一个阶次为1 的自回归过程,其参数等于所需的自相关。Wikipedia页面上提到了此属性,但并不难证明。

这是一些示例代码:

import numpy as np

def sample_signal(n_samples, corr, mu=0, sigma=1):
    assert 0 < corr < 1, "Auto-correlation must be between 0 and 1"

    # Find out the offset `c` and the std of the white noise `sigma_e`
    # that produce a signal with the desired mean and variance.
    # See https://en.wikipedia.org/wiki/Autoregressive_model
    # under section "Example: An AR(1) process".
    c = mu * (1 - corr)
    sigma_e = np.sqrt((sigma ** 2) * (1 - corr ** 2))

    # Sample the auto-regressive process.
    signal = [c + np.random.normal(0, sigma_e)]
    for _ in range(1, n_samples):
        signal.append(c + corr * signal[-1] + np.random.normal(0, sigma_e))

    return np.array(signal)

def compute_corr_lag_1(signal):
    return np.corrcoef(signal[:-1], signal[1:])[0][1]

# Examples.
print(compute_corr_lag_1(sample_signal(5000, 0.5)))
print(np.mean(sample_signal(5000, 0.5, mu=2)))
print(np.std(sample_signal(5000, 0.5, sigma=3)))
Run Code Online (Sandbox Code Playgroud)

该参数corr可让您设置滞后一所需的自相关和可选参数,musigma,则可控制所生成信号的均值和标准差。