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

我想可视化地绘制一个3D图,展示在给定的斜率和y截距下计算出的线性回归的误差函数。这个图将用于说明梯度下降的应用。

假设我们想用一条直线来模拟一组点。为此,我们将使用标准的y=mx+b直线方程,其中m是直线的斜率,b是直线的y截距。为了找到最适合我们数据的直线,我们需要找到最佳的斜率m和y截距b值组合。

解决这类问题的标准方法是定义一个误差函数(也称为成本函数),它衡量给定直线的“优劣”。这个函数将接受一对(m,b)并根据直线与数据的拟合程度返回一个误差值。为了计算给定直线的误差,我们将遍历数据集中的每个(x,y)点,并累加每个点的y值与候选直线的y值(在mx+b处计算)之间的平方距离。通常我们会对这个距离进行平方处理,以确保其为正值,并使我们的误差函数可微分。在Python中,计算给定直线的误差看起来像这样:

# y = mx + b# m是斜率,b是y截距def computeErrorForLineGivenPoints(b, m, 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))

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

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

这里有一个构建3D图的框架代码。这个代码片段完全脱离了问题上下文,但它展示了构建3D图的基础。对于我的例子,我需要x轴表示斜率,y轴表示y截距,z轴表示误差。

有人能帮我构建这样的图例吗?

import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport randomdef fun(x, y):  return x**2 + yfig = plt.figure()ax = fig.add_subplot(111, projection='3d')x = y = np.arange(-3.0, 3.0, 0.05)X, Y = np.meshgrid(x, y)zs = np.array([fun(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])Z = zs.reshape(X.shape)ax.plot_surface(X, Y, Z)ax.set_xlabel('X Label')ax.set_ylabel('Y Label')ax.set_zlabel('Z Label')plt.show()

上面的代码生成以下图表,与我想要的非常相似。这是上面的代码生成的图表


回答:

只需将fun替换为computeErrorForLineGivenPoints

import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport collectionsdef 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, 2noise = 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()

生成输入图像描述

提示:我将computeErrorForLineGivenPoints重命名为error。一般来说,没有必要将函数命名为compute...,因为几乎所有函数都在计算某些东西。你也不需要指定”GivenPoints”,因为函数签名显示points是一个参数。如果你的程序中有其他误差函数或变量,line_errortotal_error可能是这个函数更好的名称。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注