python生成白噪声与纯随机检验——Ljung-Box检验

生成白噪声

生成白噪声的代码请参考:https://blog.csdn.net/sinat_24259567/article/details/93889547

import numpy as np


def generate_white_noise(signal: np.ndarray, snr=10):
    """生成白噪声"""
    noise = np.random.randn(signal.shape[0], signal.shape[1])  # 产生N(0,1)噪声数据
    noise = noise - np.mean(noise)  # 均值为0
    signal_power = np.linalg.norm(signal - signal.mean()) ** 2 / signal.size  # 此处是信号的std**2
    noise_variance = signal_power / np.power(10, (snr / 10))  # 此处是噪声的std**2
    noise = (np.sqrt(noise_variance) / np.std(noise)) * noise  ##此处是噪声的std**2
    # signal_noise = noise + signal  # 将噪声与原始数据合成
    return noise

Ljung-Box检验

这里使用Ljung-Box检验检验白噪声,白噪声检验是一种纯随机性检验

Ljung-Box检验 stats文档地址:https://www.statsmodels.org/dev/generated/statsmodels.stats.diagnostic.acorr_ljungbox.html

Ljung-Box检验:

  • H0假设:序列的每个值是独立的,即纯随机
  • HA假设:序列之间不是独立的,即存在相关性

使用如下代码:

from statsmodels.stats.diagnostic import acorr_ljungbox


arr_noise = generate_white_noise(array) # 一维数据,可以是白噪声或其他序列
ljungbox_result = acorr_ljungbox(arr_noise, lags=20)  # 返回统计量和p值,lags为检验的延迟数

ljungbox_resulttuple格式数据,得到的结果:

  • 第1行为Ljung-Box统计量
  • 第2行为p值

如果p<0.05,拒绝原假设,说明原始序列存在相关性
如果p>=0.05,接收原假设,说明原始序列独立,纯随机

注意:其中lags为检验的延迟数,需要指定一个值,值的确认一般是20,或是序列长度,一般需要ljungbox_result中最小的p值大于等于0.05,才能确定这个序列是纯随机的(相当于每个p都大于等于0.05)

示例代码

from statsmodels.stats.diagnostic import acorr_ljungbox
import numpy as np


def generate_white_noise(signal: np.ndarray, snr=10):
    """生成白噪声,signal为1维向量"""
    noise = np.random.randn(signal.shape[0])  # 产生N(0,1)噪声数据
    noise = noise - np.mean(noise)  # 均值为0
    signal_power = np.linalg.norm(signal - signal.mean()) ** 2 / signal.size  # 此处是信号的std**2
    noise_variance = signal_power / np.power(10, (snr / 10))  # 此处是噪声的std**2
    noise = (np.sqrt(noise_variance) / np.std(noise)) * noise  ##此处是噪声的std**2
    # signal_noise = noise + signal  # 将噪声与原始数据合成
    return noise


if __name__ == '__main__':
    array = np.random.randint(0, 10, size=(100))
    arr_noise = generate_white_noise(array)
    ljungbox_result = acorr_ljungbox(arr_noise, lags=20)  # 返回统计量和p值,lags为检验的延迟数
    print(ljungbox_result)

参考文章

How to Perform a Ljung-Box Test in Python:https://www.statology.org/ljung-box-test-python/

你可能感兴趣的:(python,统计分析,python)