我写了一些代码来绘制一个给定数据集上线性函数的平均平方误差,以可视化在最佳回归线的梯度下降训练过程中的进度。
相关位如下:
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)