NumPy - Rayleigh 分布
什么是 Rayleigh 分布?
Rayleigh 分布是一种连续概率分布,用于建模二维平面中向量的幅度,其中其分量是独立的且方差相等的正态分布。
它由一个尺度参数 σ(sigma)定义。这种分布常用于信号处理和通信理论中来建模散射信号。
例如,Rayleigh 分布可以描述风速的分布,前提是两个正交方向的风速分量是独立的且正态分布的。
Rayleigh 分布的概率密度函数 (PDF) 定义为 −
f(x; σ) = (x / σ2) * exp(-x2 / (2σ2)) for x ≥ 0, 0 otherwise
其中,
- σ:尺度参数(与标准差相关)。
- x:向量的幅度。
- exp:指数函数。
使用 NumPy 生成 Rayleigh 分布
NumPy 提供了 numpy.random.rayleigh() 函数来从 Rayleigh 分布中生成样本。您可以指定尺度参数 σ 和生成样本的大小。
示例
在本示例中,我们生成 10 个来自尺度参数 σ=1 的 Rayleigh 分布的随机样本 −
import numpy as np
# 生成 10 个来自尺度参数 σ=1 的 Rayleigh 分布的随机样本
samples = np.random.rayleigh(scale=1, size=10)
print("Random samples from Rayleigh distribution:", samples)
以下是得到的结果 −
Random samples from Rayleigh distribution: [1.31998799 0.72631303 2.4544915 0.31195556 1.14244968 0.299947020.74889027 0.2239033 1.43290625 1.18894253]
可视化 Rayleigh 分布
可视化 Rayleigh 分布有助于更好地理解其特性。我们可以使用 Matplotlib 等库创建直方图来显示生成样本的分布。
示例
在以下示例中,我们首先生成 1000 个来自尺度参数 σ=1 的 Rayleigh 分布的随机样本。然后创建直方图来可视化该分布 −
import numpy as np
import matplotlib.pyplot as plt
# 生成 1000 个来自尺度参数 σ=1 的 Rayleigh 分布的随机样本
samples = np.random.rayleigh(scale=1, size=1000)
# 创建直方图来可视化分布
plt.hist(samples, bins=30, edgecolor='black', density=True)
plt.title('Rayleigh Distribution')
plt.xlabel('Magnitude')
plt.ylabel('Frequency')
plt.show()
直方图显示了 Rayleigh 试验中向量幅度的频率。条形代表每个可能结果的概率,形成 Rayleigh 分布的特征形状 −
Rayleigh 分布的应用
Rayleigh 分布用于各个领域来建模分量为高斯随机变量的向量的幅度。以下是一些实际应用 −
- 信号处理:建模具有多个散射路径的信号包络。
- 雷达系统:建模来自具有随机散射目标的接收信号强度。
- 通信理论:建模受多径衰落影响的信号幅度。
生成累积 Rayleigh 分布
有时,我们对 Rayleigh 分布的累积分布函数 (CDF) 感兴趣,它给出了在该区间内获得最多 x 个事件(包括 x)的概率。
NumPy 没有内置 Rayleigh 分布 CDF 的函数,但我们可以使用循环和 SciPy 库中的 scipy.stats.rayleigh.cdf() 函数来计算它。
示例
以下是一个在 NumPy 中生成累积 Rayleigh 分布的示例 −
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import rayleigh
# 定义 scale 参数
sigma = 1
# 生成累积分布函数 (CDF) 值
x = np.linspace(0, 5, 100)
cdf = rayleigh.cdf(x, scale=sigma)
# 绘制 CDF
plt.plot(x, cdf, marker='o', linestyle='-', color='b')
plt.title('Cumulative Rayleigh Distribution')
plt.xlabel('Magnitude')
plt.ylabel('Cumulative probability')
plt.grid(True)
plt.show()
该图显示了在 Rayleigh 试验中获得最多每个 magnitude(包括该 magnitude)的累积概率。CDF 是一条平滑曲线,随着 magnitude 增加而递增至 1 −
Rayleigh 分布的属性
Rayleigh 分布具有几个关键属性,例如 −
- Scale 参数 (σ): scale 参数与底层 Gaussian 随机变量的标准差相关。
- 均值和方差: Rayleigh 分布的均值为 σ√(π/2),方差为 (2-π/2)σ2。
- 偏度: 该分布向右偏斜,具有长尾。
在假设检验中使用 Rayleigh 分布
Rayleigh 分布常用于假设检验,特别是在对向量 magnitude 进行测试时。
一种常见的测试是 Rayleigh 测试,用于确定观测到的 magnitude 是否与期望的 magnitude 显著不同。以下是一个使用 scipy.stats.rayleigh() 函数的示例:
示例
在本示例中,我们执行 Rayleigh 测试,以确定观测到的 magnitude (1.5) 是否与期望的 scale (=1) 显著不同。p-value 表示在零假设为真的前提下,获得至少与观测结果一样极端的结果的概率 −
from scipy.stats import rayleigh
# 观测到的 magnitude
observed_magnitude = 1.5
# 期望的 scale 参数 (σ)
expected_scale = 1
# 执行 Rayleigh 测试
p_value = rayleigh.sf(observed_magnitude, scale=expected_scale)
print("P-value from Rayleigh test:", p_value)
得到的输出如下所示 −
P-value from Rayleigh test: 0.32465246735834974
为可重复性设置种子
为了确保可重复性,您可以在生成 Rayleigh 分布之前设置特定的种子。这确保了每次运行代码时生成相同的随机数序列。
示例
通过设置种子,您确保随机生成每次执行代码时产生相同的结果,如以下示例所示 −
import numpy as np
# 为可重复性设置种子
np.random.seed(42)
# 生成 10 个来自 scale=1 的 Rayleigh 分布的随机样本
samples = np.random.rayleigh(scale=1, size=10)
print("Random samples with seed 42:", samples)
产生的结果如下 −
Random samples with seed 42: [0.96878077 2.45361832 1.62280356 1.35125316 0.58245149 0.58240242 0.34594441 2.00560757 1.35578918 1.56923552]