使用python进行线性回归的简单数学方法
线性回归是机器学习中最简单的算法之一。但我们大多数人都不知道模型背后的数学。在我们深入研究线性回归的数学之前,让我们先简单介绍一下。
顾名思义,该算法适用于回归问题。基本线性回归是线性模型,意味着我们必须建立输入(x)变量和输出(y)变量之间的线性关系。线性回归是一种监督学习算法。监督意味着机器学习中的学习类型,可以应用于标记数据集。当输入(x)是单个变量时,该模型称为简单线性回归,当有多个输入变量(x)时,它被称为多个线性回归。
简单线性回归模型表示:
假设我们有一个城市住房价格的数据集,我们输入(x)一个独立变量作为房屋的特征,输出(y)是一个房屋价格的因变量。我们必须建立这两个变量之间的关系,如果我们有一些输入变量,我们可以预测房屋价格。为此,我们将使用称为“线性回归”的算法,基本上在这个算法中我们必须在两个变量之间放置最佳拟合线输入(x)和输出(y)。这个最佳拟合线可以用下面称为假设函数的方程表示:
假设函数方程
这里θ 0,θ1是截距和直线的斜率。hθ(X)是输出(价格),x是我们的数据集,然后我们的方程变为具有多于一个的特征给定data-set的输入(函数):Hθ(X)= θ 0 + θ1 X1 + θ 2×2 ,其中X1和X2两个features.Lets停留在一个特征数据set.But如何找到系数θ 0,θ1?这是学习过程。我们可以使用不同的方法找到它们。一个称为均方误差法,另一个称为梯度下降法。均方误差法用于找出给定输出和预测输出之间的误差,而梯度下降用于最小化误差。让我们逐一讨论这两个。
均方误差:
我们可以通过使用“均方误差”方法来测量上述方程或函数的精度。这取得了函数的所有结果与来自x和实际输出y的输入的平均差。成本函数方程式由下式给出:
简单线性回归的成本函数
这个函数被称为“平方误差函数”或“平均平方误差”。正如我们所看到的那样,平均值减半(1/2)是为了便于计算梯度下降,因为平方函数的导数项将抵消(1/2)项,我们将在渐变时看到这一点讨论了下降法。
在本文的前面我们讨论过,我们将把x和y之间的关系近似为一条线。假设我们输入和输出很少。我们在2D空间中绘制这些散点,我们将得到类似下图的内容。
现在已经讨论了很多理论,让我们来看一下成本函数的实现部分。这里我们将使用python 3.7来实现成本函数。
# Calculate Cost/error function of our reggression line def cost_function(m,b,points): N = float(len(points)) c=0 for i in range(0,len(points)): x=points[i,0] y=points[i,1] c += (((m*x)+b)-y)**2 return c/N
从上面的代码可以看出,我们有一个函数cost_function.Here我们必须传递三个参数m(斜率),b(截距)和point(数据集)。做了一些数学运算后我们得到了成本函数的返回值,我们必须尽量减少使用梯度下降的方法。
梯度下降:
我们有假设函数,我们有一种方法可以衡量它与数据的匹配程度。现在我们需要估计假设函数中的参数。这就是梯度下降的作用,现在假设我们图基于其字段θ0和θ1假设函数。我们把x轴θ0 和y轴θ1,垂直z轴上的成本函数,用在成本函数垂直z轴。我们的图上的点将是成本函数的结果,使用我们的假设和那些特定的θ参数。下图描绘了这样的设置。
现在我们知道我们的目标是最小化误差,这是图上的最小点,如上面的红色箭头所示。我们这样做的方法是采用我们的成本函数的导数。切线的斜率是该点的导数,它将为我们提供一个朝向的方向。我们在最陡下降的方向上降低成本函数。每个步骤的大小由参数α确定,该参数称为学习速率。
例如,上图中每个“星星”之间的距离表示由参数α确定的步长。较小的α将导致较小的步长,较大的α将导致较大的步长。在其中的步长是采取的方向由的偏导数来确定Ĵ(θ 0,θ 1) 。根据图表的开始位置,可能会在不同的点上结束。上图显示了两个不同的起点,最终出现在两个不同的地方。梯度下降算法是:
重复直至收敛:
θj:=θj−α∂θj∂J(θ0,θ1)
其中j = 0,1表示特征索引号。
在每次迭代j,应该同时更新参数θ1,θ2,...,θn。
区分上述方程后,我们有以下几点:
简单线性回归的梯度下降
现在让我们在python代码中实现所有这些:
#Run gradient descent for one epoch with data points def gradient_step(self,b,m,a,points): b_gradient=0.0 m_gradient=0.0 N=float(len(points)) for i in range(0,len(points)): x=points[i,0] y=points[i,1] b_gradient += -(2/N) * (y - ((m * x) + b)) m_gradient += -(2/N) * x * (y - ((m * x) + b)) new_b=b-(a*b_gradient) new_m=m-(a*m_gradient) return [new_b,new_m] # Gradient_runner for iterations def gradient_runner(self,no_of_iterations,points,b,m,a): for i in range(no_of_iterations): b,m=self.gradient_step(b,m,a,points) return [b,m]
这就是线性回归的第一部分,到目前为止你已经了解了线性回归,均方法和梯度下降法。以后我将通过一些使用python的示例来讨论更多关于梯度下降直观和输出预测的内容。