让我们说这个功能很简单
def linear(x,n):
return n+x
并且要尝试的参数范围都是
import numpy as np
parameters = np.random.normal(0, 1, 1000)
哪种方法是绘制所有函数宇宙的最佳方法?
直接的是
import matplotlib.pyplot as plt
for n in parameters: plt.plot(x,linear(x,n))
但是,当多个paraparas(例如1e5)时,这是不可行的。我认为执行此操作的正确方法可能是沿着2D密度图或2D直方图的路线,但是我不确定如何将其应用于我的问题。
进一步的复杂化:上面尝试的每个模型都带有自己的“拟合优度估计值”,例如$ \ chi ^ 2 $。在获得了将模型密度显示为颜色代码的图后,我想通过$ \ chi ^ 2 $值对其进行颜色编码。再一次,我要的是想法或经验。
任何建议都非常欢迎!
答案 0 :(得分:1)
对于您的示例,您可以根据参数n
对数据进行装箱并相应地对函数输出进行装箱。我在下面提供一个简单的例子。如果函数对n
的依赖更加复杂,则(重新)绑定架构也可能变得更加复杂。但这取决于具体情况。如果参数值n
的分布不均匀(如您的示例),则可以考虑使用固定宽度的条形图,而不是运行平均值。但这又是一个品味问题。
from timeit import timeit
import matplotlib
from matplotlib.colors import Normalize
import matplotlib.pyplot as plt
import numpy as np
def linear(x,n):
return n+x
N = 1000
x = np.linspace(0, 1, N)
n = np.random.normal(0, 1, N)
cmap = matplotlib.cm.get_cmap('plasma')
norm = Normalize(vmin=n.min(), vmax=n.max())
def p3():
n2, x2 = np.meshgrid(n, x)
f = linear(x2, n2)
# Now comes the "histogram" step. It involves taking the average over neighboring samples.
# Since data can be distributed non-linearly this might not be the desired behavior but
# similarly it is possible to specify an array of bins and use this for the binning.
sort = np.argsort(n)
n2 = n2[:, sort]
f = f[:, sort]
rebin = 10
n2 = n2.reshape(n2.shape[0], -1, rebin).mean(axis=-1) # Average over 10 samples.
f = f.reshape(f.shape[0], -1, rebin).mean(axis=-1)
x2 = x2[:, ::rebin] # No average required here, values are the same along second axis.
plt.figure()
plt.title('Using histogram method and pcolor')
plt.pcolor(x2, f, n2, cmap=cmap, norm=Normalize(vmin=n2.min(), vmax=n2.max()))
p3()
plt.show()
我还检查了单个线图和散点图。散点图减少了对API的调用次数,但是尽管实际调用具有类似的时间安排,但我发现画布更新花费的时间明显更长(在后台线程中;类似地,保存为png)。
def p1():
plt.figure()
plt.title('Plotting individual functions')
for nn in n:
plt.plot(x, linear(x, nn), '-', color=cmap(norm(nn)))
def p2():
n2, x2 = np.meshgrid(n, x)
f = linear(x2, n2)
plt.figure()
plt.title('Using scatter')
plt.scatter(x2.ravel(), f.ravel(), color=cmap(norm(n2.ravel())))
print('p1: ', timeit('p1()', setup='from __main__ import p1', number=1))
print('p2: ', timeit('p2()', setup='from __main__ import p2', number=1))
plt.show()