numpy PDF卷积中的意外偏移

q9rjltbz  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(64)

我试图卷积两个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)。


的数据
谁能告诉我我做错了什么?

mutmk8jj

mutmk8jj1#

它确实位于(0.3,0.8)

import matplotlib.pyplot as plt
plt.plot(x,pdf_1)
plt.plot(x,pdf_2)
plt.plot(x,conv_pdf[:len(x)]) # Since you used 'full', shape of conv_pdf is len(pdf_1)+len(pdf_2)-1=199999. Corresponding to result in interval [0,2[. Which is expected
plt.axvline(0.3)
plt.axvline(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')
具有奇怪的行为,因为xy的大小不匹配

编辑

出于好奇,我已经安装了plotly,并尝试了您的代码:没有移位,也没有产生错误。所以我说的话有一半是真的:plotly的React与matplotlib不同。Matplotlib将失败,因为conv_pdfx_vec的形状不同。阴谋,的确不起作用。但是,至少在我的版本中,它只截断了情节,只绘制了有意义的部分(所以它只绘制了conv_pdf的第一个值100000,并放弃了其余的。就像我对我的plt.plot(x, conv_pdf[:100000])所做的那样。
所以,我的答案应该是“不可复制或由错字引起”的投票。因为你现在看到的是

  • 要么是你的plotly版本中的bug(bug可能与不同的大小有关,tho。我很难想象,任何阴谋版本可以只是一个普通的scatter(x,y)与x和y的大小相同)。
  • 或者是实验中的问题(显然,您的代码与您发布的代码不完全相同,因为您先将x坐标命名为x,然后命名为x_vec;所以我认为你发布的代码是试图总结你在笔记本或交互式解释器中所做的实验。那么,您确定conv_pdf是正确的)吗?

无论哪种方式,当我在我的解释器中逐字复制你的代码时,唯一的更正是添加一个x_vec=x别名,我得到的情节与我以前的完全相同(但风格与你的完全相同)
代码的结果(在编辑中编辑:同时,当我输入这个的时候,你更正了你的代码。所以,为了解脱,我只是用你的鳕鱼的逐字复制和粘贴重做了这个图,这就是我得到的)


相关问题