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))\nRun Code Online (Sandbox Code Playgroud)\n由于误差函数由两个参数(m 和 b)组成,我们可以将其可视化为二维表面。
\n现在我的问题是,我们如何使用 python 绘制这样的 3D 图形?
\n这是构建 3D 绘图的骨架代码。此代码片段完全超出了问题上下文,但它显示了构建 3D 绘图的基础知识。\n对于我的示例,我需要 x 轴为斜率,y 轴为 y 截距,z 轴为, 错误。
\n有人可以帮我构建这样的图表示例吗?
\nimport 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()\nRun Code Online (Sandbox Code Playgroud)\n上面的代码生成以下图,这与我正在寻找的非常相似。\n
只需替换fun为computeErrorForLineGivenPoints:
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)
产量

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