生成白噪声的代码请参考: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检验 stats文档地址:https://www.statsmodels.org/dev/generated/statsmodels.stats.diagnostic.acorr_ljungbox.html
Ljung-Box检验:
使用如下代码:
from statsmodels.stats.diagnostic import acorr_ljungbox
arr_noise = generate_white_noise(array) # 一维数据,可以是白噪声或其他序列
ljungbox_result = acorr_ljungbox(arr_noise, lags=20) # 返回统计量和p值,lags为检验的延迟数
ljungbox_result
为tuple
格式数据,得到的结果:
如果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/