You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非零中心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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:22:28