线性回归中误差函数的 3D 图

Mic*_*ael 6 python plot machine-learning matplotlib pandas

我想直观地绘制针对线性回归的给定斜率和 y 截距计算的误差函数的 3D 图表。\n该图将用于说明梯度下降应用程序。

\n

让\xe2\x80\x99s 假设我们想要用一条线对一组点进行建模。为此,我们\xe2\x80\x99 将使用标准 y=mx+b 直线方程,其中 m 是直线\xe2\x80\x99s 斜率,b 是直线\xe2\x80\x99s y 截距。为了找到数据的最佳直线,我们需要找到斜率 m 和 y 截距 b 值的最佳集合。

\n

解决此类问题的标准方法是定义一个误差函数(也称为成本函数),用于测量给定行的 \xe2\x80\x9cgood\xe2\x80\x9d 的情况。该函数将接受 (m,b) 对并根据线条与数据的拟合程度返回错误值。为了计算给定线的误差,我们\xe2\x80\x99将迭代数据集中的每个(x,y)点,并对每个点\xe2\x80\x99s y值和候选线之间的平方距离求和\ xe2\x80\x99s y 值(在 mx+b 处计算)。通常对这个距离进行平方以确保它是正的并使我们的误差函数可微。在 python 中,计算给定行的误差将如下所示:

\n
# y = mx + b\n# m is slope, b is y-intercept\ndef computeErrorForLineGivenPoints(b, m, points):\n    totalError = 0\n    for i in range(0, len(points)):\n        totalError += (points[i].y - (m * points[i].x + b)) ** 2\n    return totalError / float(len(points))\n
Run Code Online (Sandbox Code Playgroud)\n

由于误差函数由两个参数(m 和 b)组成,我们可以将其可视化为二维表面。

\n

现在我的问题是,我们如何使用 python 绘制这样的 3D 图形?

\n

这是构建 3D 绘图的骨架代码。此代码片段完全超出了问题上下文,但它显示了构建 3D 绘图的基础知识。\n对于我的示例,我需要 x 轴为斜率,y 轴为 y 截距,z 轴为, 错误。

\n

有人可以帮我构建这样的图表示例吗?

\n
import numpy as np\nfrom mpl_toolkits.mplot3d import Axes3D\nimport matplotlib.pyplot as plt\nimport random\n\ndef fun(x, y):\n  return x**2 + y\n\nfig = plt.figure()\nax = fig.add_subplot(111, projection=\'3d\')\nx = y = np.arange(-3.0, 3.0, 0.05)\nX, Y = np.meshgrid(x, y)\nzs = np.array([fun(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])\nZ = zs.reshape(X.shape)\n\nax.plot_surface(X, Y, Z)\n\nax.set_xlabel(\'X Label\')\nax.set_ylabel(\'Y Label\')\nax.set_zlabel(\'Z Label\')\n\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

上面的代码生成以下图,这与我正在寻找的非常相似。\n这是上面代码产生的结果

\n

unu*_*tbu 7

只需替换funcomputeErrorForLineGivenPoints

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import collections

def error(m, b, points):
    totalError = 0
    for i in range(0, len(points)):
        totalError += (points[i].y - (m * points[i].x + b)) ** 2
    return totalError / float(len(points))

x = y = np.arange(-3.0, 3.0, 0.05)
Point = collections.namedtuple('Point', ['x', 'y'])

m, b = 3, 2
noise = np.random.random(x.size)
points = [Point(xp, m*xp+b+err) for xp,err in zip(x, noise)]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ms = np.linspace(2.0, 4.0, 10)
bs = np.linspace(1.5, 2.5, 10)

M, B = np.meshgrid(ms, bs)
zs = np.array([error(mp, bp, points) 
               for mp, bp in zip(np.ravel(M), np.ravel(B))])
Z = zs.reshape(M.shape)

ax.plot_surface(M, B, Z, rstride=1, cstride=1, color='b', alpha=0.5)

ax.set_xlabel('m')
ax.set_ylabel('b')
ax.set_zlabel('error')

plt.show()
Run Code Online (Sandbox Code Playgroud)

产量 在此输入图像描述

提示:我重命名computeErrorForLineGivenPointserror. 一般来说,不需要命名函数,compute...因为几乎所有函数都会计算一些东西。您也不需要指定“GivenPoints”,因为函数签名显示这points是一个参数。如果您的程序中有其他错误函数或变量,line_error或者total_error可能是此函数的更好名称。