如何在matplotlib中制作曲线图

4
我正在尝试可视化二维数据在神经网络层中传递时如何被转换和“弯曲”。仿射变换和平移很容易,但是可视化激活函数(例如tanh或逻辑函数)如何将二维空间弯曲成曲线网格更具挑战性。
为了理解我的意思,Chris Olah 在他的文章 Neural Networks, Manifolds, and Topology 中已经做到了这一点。

enter image description here

你们中有人知道如何做到这个吗?


1
http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#curvilinear-grid - tmdavison
1个回答

2
我将以下解决方案提供给您:
首先,我使用NumPy的linspace函数指定了一个常规的二维网格:
x_range = range(-5,6)
y_range = range(-5,6)

lines = np.empty((len(x_range)+len(y_range), 2, 100))

for i in x_range: # vertical lines
    linspace_x = np.linspace(x_range[i], x_range[i], 100)
    linspace_y = np.linspace(min(y_range), max(y_range), 100)
    lines[i] = (linspace_x, linspace_y)
for i in y_range: # horizontal lines
    linspace_x = np.linspace(min(x_range), max(x_range), 100)
    linspace_y = np.linspace(y_range[i], y_range[i], 100)
    lines[i+len(x_range)] = (linspace_x, linspace_y)

然后,我在网格上执行了任意的仿射变换。(这类似于神经网络中激活和权重之间的向量矩阵乘法。)

def affine(z):
    z[:, 0] = z[:, 0] + z[:,1] * 0.3 # transforming the x coordinates
    z[:, 1] = 0.5 * z[:, 1] - z[:, 0] * 0.8 # transforming the y coordinates
    return z

transformed_lines = affine(lines)

最后但并非最不重要的,使用组成网格中每条线的(现在已经转换的)坐标,我应用了一个非线性函数(在这种情况下是逻辑函数):
def sigmoid(z):
    return 1.0/(1.0+np.exp(-z))

bent_lines = sigmoid(transformed_lines)

用matplotlib绘制新的线条:
plt.figure(figsize=(8,8))
plt.axis("off")
for line in bent_lines:
    plt.plot(line[0], line[1], linewidth=0.5, color="k")
plt.show()

结果:

这里输入图片描述


你能否发布你的完整工作代码?当我使用你的代码片段时,我无法得到你所显示的结果。谢谢。 - calmymail
只是复制了代码,它按照描述运行。我上面省略的只有 numpy 和 matplotlib 的导入。 - wstr
我无法看到上面显示的网格。我的图表缺少从左上角到右下角的线条。我如何直接给您发送电子邮件? - calmymail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接