从头开始学习为Python中任意数量的变量开发多元线性回归。
线性回归可能是最简单的机器学习算法。对于初学者来说非常好,因为它使用简单的公式。因此,这对学习机器学习概念很有帮助。在本文中,我将尝试逐步解释多元线性回归。
概念和公式
线性回归使用我们在学校都学过的简单公式:
Y = C + AX
提醒一下,Y是输出或因变量,X是输入或自变量,A是斜率,C是截距。
对于线性回归,对于相同的公式,我们遵循以下符号:
如果我们有多个自变量,则线性回归的公式将如下所示:
在这里," h"称为假设。这是预测的输出变量。Theta0是偏差项,所有其他theta值是系数。它们首先是随机启动的,然后使用算法进行优化,以便此公式可以紧密预测因变量。
成本函数和梯度下降
当theta值从一开始就被初始化时,该公式未经过训练以预测因变量。该假设与原始输出变量" Y"相去甚远。这是估算所有训练数据的累积距离的公式:
这称为成本函数。如果您注意到了,它从假设(预测输出)中减去y(原始输出),取平方去掉负数,求和除以2乘以m。在此,m是训练数据的数量。您可能会看到成本函数是原始输出和预测输出之间差异的指示。机器学习算法的思想是最小化成本函数,以使原始输出与预测输出之间的差异更小。为此,我们需要优化theta值。
这是我们更新theta值的方法。我们将成本函数相对于每个theta值的偏微分,然后从现有theta值中减去该值,
在此,alpha是学习率,它是一个常数。我没有为所有theta值显示相同的公式。但这是所有theta值的相同公式。经过微分后,公式得出为:
这称为梯度下降。
逐步实现算法
我要使用的数据集来自吴安德(Andre Ng)的Coursera机器学习课程。我将在此页面底部提供链接。请随时下载数据集并通过本教程进行练习。我鼓励您在阅读数据集时进行练习(如果这对您来说是新的)。那是了解它的唯一方法。
在此数据集中,只有两个变量。但是我开发了适用于任意数量变量的算法。如果您对10个变量或20个变量使用相同的算法,那么它也应该工作。我将在Python中使用Numpy和Pandas库。所有这些丰富的Python库使机器学习算法更加容易。导入包和数据集:
import pandas as pd
import numpy as np
df = pd.read_csv('ex1data2.txt', header = None)
df.head()
(1) 在偏项中添加一列。之所以选择1,是因为如果您将一个值乘以任意值,则该值不会改变。
df = pd.concat([pd.Series(1, index=df.index, name='00'), df], axis=1)
df.head()
(2) 定义输入变量或自变量X以及输出变量或因变量y。在此数据集中,列0和1是输入变量,列2是输出变量。
X = df.drop(columns=2)
y = df.iloc[:, 3]
(3) 通过将每一列除以该列的最大值来标准化输入变量。这样,每列的值将在0到1之间。此步骤不是必需的。但这会使算法更快地达到最佳状态。同样,如果您注意到数据集,则列0的元素与列1的元素相比太大。如果对数据集进行规范化,则可以防止第一列在算法中占主导地位。
for i in range(1, len(X.columns)):
X[i-1] = X[i-1]/np.max(X[i-1])
X.head()
(4) 初始化theta值。我将它们初始化为零。但是任何其他数字都可以。
theta = np.array([0]*len(X.columns))
#Output: array([0, 0, 0])
(5) 计算在上式中以m表示的训练数据的数量:
m = len(df)
(6) 定义假设函数
def hypothesis(theta, X):
return theta*X
(7) 使用上述成本函数的公式定义成本函数
def computeCost(X, y, theta):
y1 = hypothesis(theta, X)
y1=np.sum(y1, axis=1)
return sum(np.sqrt((y1-y)**2))/(2*47)
(8) 编写梯度下降函数。此函数将以X,y,theta,学习率(公式中的alpha)和历元(或迭代)作为输入。我们需要不断更新theta值,直到成本函数达到最小值为止。
def gradientDescent(X, y, theta, alpha, i):
J = [] #cost function in each iterations
k = 0
while k < i:
y1 = hypothesis(theta, X)
y1 = np.sum(y1, axis=1)
for c in range(0, len(X.columns)):
theta[c] = theta[c] - alpha*(sum((y1-y)*X.iloc[:,c])/len(X))
j = computeCost(X, y, theta)
J.append(j)
k += 1
return J, j, theta
(9) 使用梯度下降函数获得最终成本,每次迭代的成本列表以及优化的参数theta。我选择alpha为0.05。但是您可以尝试使用其他一些值(例如0.1、0.01、0.03、0.3)来查看会发生什么。我运行了10000次迭代。请尝试进行更多或更少的迭代,以查看差异。
J, j, theta = gradientDescent(X, y, theta, 0.05, 10000)
(10) 使用优化的theta预测输出
y_hat = hypothesis(theta, X)y_hat = np.sum(y_hat, axis=1)
(11) 绘制原始y和预测输出y_hat
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(x=list(range(0, 47)),yy= y, color='blue')
plt.scatter(x=list(range(0, 47)), y=y_hat, color='black')
plt.show()
一些输出点几乎与预测输出重叠。有些接近但不重叠。
(12) 绘制每次迭代的成本以查看行为
plt.figure()
plt.scatter(x=list(range(0, 10000)), y=J)
plt.show()
每次迭代的成本都在下降。这表明算法运行良好。
希望对您有所帮助,您也可以自己尝试一下。我鼓励您下载数据集,并在阅读本章以学习机器学习概念时尝试自己运行所有代码。这是数据集的链接:
https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex1data2.txt
原文地址:https://www.toutiao.com/i6907382831228600840/