代码之家  ›  专栏  ›  技术社区  ›  lo tolmencre

如何用numpy简洁地映射平面

  •  1
  • lo tolmencre  · 技术社区  · 6 年前

    我写了一些代码来绘制一个给定数据集上线性函数的平均平方误差,以可视化在最佳回归线的梯度下降训练过程中的进度。

    相关位如下:

    def compute_error(f, X, Y):
        e = lambda x, y : (y - f(x))**2
        return sum(e(x, y) for (x, y) in zip(X, Y))/len(X)
    
    mn, bn, density = abs(target_slope)*1.5, abs(target_intercept)*1.5, 20
    
    M, B = map(list, zip(*[(m, b) for m in np.linspace(-mn, +mn, density)
                 for b in  np.linspace(-bn, +bn, density)]))
    E = [compute_error(lambda x : m*x+b, X, Y) for m, b in zip(M,B)]
    

    这很管用,但很凌乱。我想可能有一个非常简洁的方法来完成同样的事情。到目前为止我得到了这个:

    M, B = map(np.ndarray.flatten, np.mgrid[-mn:+mn:1/density, -bn:+bn:1/density])
    

    我仍然不知道如何改进 E 因为某些原因,现在它比混乱的版本慢得多。

    那么,有什么好的方法可以像 M B 和努比在一起?


    如果你想运行上面的代码,你可以构建 X Y 就像这样:

    import numpy as np
    from numpy.random import normal
    
    target_slope = 3
    target_intercept = 15
    
    def generate_random_data(slope=1, minx=0, maxx=100, n=200, intercept=0):
        f = lambda x : normal(slope*x, maxx/5)+intercept
        X = np.linspace(minx, maxx, n)
        Y = [f(x) for x in X]
        return X, Y
    
    X, Y = generate_random_data(slope=target_slope, intercept=target_intercept)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   xdze2    6 年前
    def compute_error(f, X, Y):
        return np.mean( (Y - f(X))**2 )
    
    MB = np.mgrid[-mn:+mn:2*mn/density, -bn:+bn:2*bn/density]
    MB = MB.reshape((2, -1)).T
    
    E = [compute_error(lambda x : m*x+b, X, Y) for m, b in MB]
    

    可以编写完整的numpy解决方案:

    Y = np.array(Y)
    
    M, B = np.mgrid[-mn:+mn:2*mn/density, -bn:+bn:2*bn/density]
    
    mx = M.reshape((-1,1))*X
    b = B.reshape((-1,1))*np.ones_like(X)
    
    E = np.mean( (mx+b - Y)**2, axis=1 )
    

    也可以在不需要将阵列展平并获得二维阵列误差的情况下编写解决方案。。。

        2
  •  1
  •   Colin Dickie    6 年前

    我不完全理解你在这里想要达到的目标。但是,这可能有助于您开始使用numpy解决方案:

    X, Y = generate_random_data(slope=target_slope, intercept=target_intercept, n=180)
    M, B = np.mgrid[-mn:+mn:1/density, -bn:+bn:1/density]
    f = M.T*X + B.T
    error = np.sum((f-Y)**2)
    

    注意,我不得不改变X,Y值的默认数目