非零中心PDF卷积出现意外偏移,求技术分析
卷积两个非零中心PDF时区间不符的问题分析
问题描述
我尝试对两个非零中心的PDF进行卷积,分别是Uniform(0.2, 0.5)均匀分布和triangular(0.1, 0.2, 0.3)三角分布,但结果不符合预期。我预期卷积结果的区间为(0.3, 0.8),但实际得到的卷积结果位于(0.35, 0.85)。
原代码
import numpy as np import plotly.express as px # X values for bot x_vec = np.linspace(0, 1, 100000, dtype='float32') # Distribution values # Uniform distribution p_x = np.where((x_vec >= 0.2) & (x_vec <= 0.5), 1/0.3, 0) pdf_1 = p_x / np.sum(p_x) # Scaling to be a PDF # Triangular distribution p_x = np.where((x_vec >= 0.1) & (x_vec <= 0.3), np.interp(x_vec, [0.1, 0.2, 0.3], [0, 10, 0]), 0) pdf_2 = p_x / np.sum(p_x) # Scaling to be a PDF # Convolution conv_pdf = np.convolve(pdf_1, pdf_2, 'full') # Plotting fig = px.scatter() fig.add_scatter(x=x_vec, y=pdf_1, name='pdf_sample_1') fig.add_scatter(x=x_vec, y=pdf_2, name='pdf_sample_2') fig.add_scatter(x=x_vec, y=conv_pdf, name='convolution') fig.add_vline(x=0.35) # Added to show start of convolution != 0 fig.add_vline(x=0.85) # Added to show end of convolution != 0 fig.show()
问题根源
1. 卷积结果的x轴坐标不匹配
np.convolve用'full'模式生成的conv_pdf长度为len(pdf_1) + len(pdf_2) - 1(即199999个元素),但你绘图时仍使用原x_vec(仅100000个元素)对应,这导致坐标映射完全错误,你看到的(0.35, 0.85)是错误坐标带来的假象。
2. PDF离散化的归一化方式错误
你用np.sum(p_x)直接归一化PDF,这仅保证离散采样点的和为1,但连续PDF的离散化需要保证采样点值乘以步长的和为1。x_vec的步长为(1-0)/99999 ≈ 1e-5,错误的归一化会导致离散PDF的缩放偏差,进一步影响卷积结果的数值表现。
修正方案
步骤1:计算采样步长
step = x_vec[1] - x_vec[0]
步骤2:修正PDF归一化
# 均匀分布PDF修正 p_x = np.where((x_vec >= 0.2) & (x_vec <= 0.5), 1/0.3, 0) pdf_1 = p_x / (np.sum(p_x) * step) # 三角分布PDF修正 p_x = np.where((x_vec >= 0.1) & (x_vec <= 0.3), np.interp(x_vec, [0.1, 0.2, 0.3], [0, 10, 0]), 0) pdf_2 = p_x / (np.sum(p_x) * step)
步骤3:生成卷积结果的对应x轴坐标
conv_x = np.linspace(x_vec[0] + x_vec[0], x_vec[-1] + x_vec[-1], len(conv_pdf))
步骤4:修正绘图代码
fig = px.scatter() fig.add_scatter(x=x_vec, y=pdf_1, name='pdf_sample_1') fig.add_scatter(x=x_vec, y=pdf_2, name='pdf_sample_2') # 卷积结果需乘以步长,将离散卷积和转换为连续PDF数值 fig.add_scatter(x=conv_x, y=conv_pdf * step, name='convolution') fig.add_vline(x=0.3) fig.add_vline(x=0.8) fig.show()
验证结果
修正后,卷积结果的区间将与预期一致:最小值为0.2+0.1=0.3,最大值为0.5+0.3=0.8。
内容的提问来源于stack exchange,提问作者ArthurOA
相关产品推荐
相关产品推荐

