我试图卷积两个PDF,但结果对我来说没有意义。
我在卷积一个三角分布和一个均匀分布。它们都不是以零为中心的。
代码如下:
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()
字符串
我期望均匀(0.2,0.5)和三角形(0.1,0.2,0.3)的卷积位于(0.3,0.8)中。如下图所示,卷积位于(0.35,0.85)。
的数据
谁能告诉我我做错了什么?
1条答案
按热度按时间mutmk8jj1#
它确实位于(0.3,0.8)
字符串
x1c 0d1x的数据
这和你的代码之间唯一的区别是我使用的是matplotlib而不是plotly。而且,可能更重要的是,截断,因为全卷积具有比输入阵列更大的形状。索引i是
Σaₘbᵢ₋ₘ
,所以如果你把索引0看作x=0,把索引99999看作x=1,这就是∫a(x)b(i/99999-x)dx
的估计,也就是(a*b)(i/99999)
。所以区间[0,1]中的a*b
确实是conv_pdf[:100000]
。conv_pdf
具有更多值的事实,与您还计算了[0,2 [中所有x的(a*b)(x)
的事实相匹配。这就是为什么我对绘制
conv_pdf[:100000]
是正确的事情这一事实充满信心。至于为什么会得到另一个结果,我真的不知道。但我可以推测,这是因为当
x
数组和y
数组的长度不同时,plotly的React与matplotlib的不同。如果您使用plt.plot(x,conv_pdf)
,则Matplotlib会失败。同时巧妙地重新解释,或插值,或什么的,数据。但重点是,这条线fig.add_scatter(x=x_vec, y=conv_pdf, name='convolution')
个具有奇怪的行为,因为
x
和y
的大小不匹配编辑
出于好奇,我已经安装了plotly,并尝试了您的代码:没有移位,也没有产生错误。所以我说的话有一半是真的:plotly的React与matplotlib不同。Matplotlib将失败,因为
conv_pdf
与x_vec
的形状不同。阴谋,的确不起作用。但是,至少在我的版本中,它只截断了情节,只绘制了有意义的部分(所以它只绘制了conv_pdf
的第一个值100000,并放弃了其余的。就像我对我的plt.plot(x, conv_pdf[:100000])
所做的那样。所以,我的答案应该是“不可复制或由错字引起”的投票。因为你现在看到的是
scatter(x,y)
与x和y的大小相同)。x
,然后命名为x_vec
;所以我认为你发布的代码是试图总结你在笔记本或交互式解释器中所做的实验。那么,您确定conv_pdf
是正确的)吗?无论哪种方式,当我在我的解释器中逐字复制你的代码时,唯一的更正是添加一个
x_vec=x
别名,我得到的情节与我以前的完全相同(但风格与你的完全相同)代码的结果(在编辑中编辑:同时,当我输入这个的时候,你更正了你的代码。所以,为了解脱,我只是用你的鳕鱼的逐字复制和粘贴重做了这个图,这就是我得到的)
的