为了找到使得代价函数值最小的θ,,这里有一个封闭解[closed-form solution]——换句话说,直接给出结果的数学方程。这叫做正规方程[Normal Equation](方程4-4):

方程4 - 4 正规方程

θ(带有^上标)是使得代价函数值最小的θ值。

y是目标值向量,该目标值包含

让我们生成一些线性的数据来测试这个方程式(图4-1):

import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

图4 - 1 随机生成的线性数据集

现在我们用正规方程来计算θ(带有^上标)。我们将使用NumPy的线性代数模块( np.linalg)中的inv() 函数,计算矩阵的逆矩阵 ,dot()函数计算矩阵乘法:

X_b = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)

我们用来生成数据的实际函数是y = 4 + 3 + 高斯噪声。我们来看看这个方程

>>> theta_best
array([[ 4.21509616],
[ 2.77011339]])

我们会希望 = 4和 = 3,而不是 = 3.865和 = 3.139。很接近,但是噪声使得恢复原函数的准确参数变得不可能。
现在您可以使用θ作出预测:

>>> X_new = np.array([[0], [2]])
>>> X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
>>> y_predict = X_new_b.dot(theta_best)
>>> y_predict
array([[ 4.21509616],
[ 9.75532293]])

让我们来绘制这个模型的预测图(图4-2):

图4 - 2 线性回归模型预测

使用Scikit-Learn的等效代码是这样的。

>>> from sklearn.linear_model import LinearRegression
>>> lin_reg = LinearRegression()
>>> lin_reg.fit(X, y)
>>> lin_reg.intercept_, lin_reg.coef_
(array([ 4.21509616]), array([[ 2.77011339]]))
>>> lin_reg.predict(X_new)
array([[ 4.21509616],
[ 9.75532293]])

results matching ""

    No results matching ""