介绍
线性回归是一种用于建立输入特征和输出变量之间线性关系的回归算法。通过使用最小二乘法,它寻找一个最佳拟合的直线或超平面,以描述输入特征和输出变量之间的关系。
算法原理
线性回归算法的目标是找到一条直线或超平面,使得输入特征的线性组合与输出变量的值之间的误差最小化。这个误差可以通过最小二乘法来衡量。
最小二乘法是通过最小化残差平方和来找到最佳拟合直线或超平面的方法。残差是预测值与实际值之间的差异,平方和则是为了处理正负差异的问题。
公式推导
首先,我们定义输入特征的向量为X,输出变量的向量为y。线性回归模型可表示为:
$$y = Xw$$
其中,w是一个权重向量,表示输入特征对输出变量的影响程度。
我们的目标是找到一个最佳的w,使得预测值与实际值之间的误差最小化。我们可以定义误差函数(损失函数)为:
$$J(w) = \frac{1}{2m} \sum_{i=1}^{m}(y_i – X_iw)^2$$
这个误差函数是一个凸函数,可以通过求解梯度为零的方程来找到最小值。
为了最小化误差函数,我们需要计算它的梯度,并令其等于零。对误差函数求导,得到梯度为:
$$\nabla J(w) = \frac{1}{m} X^T(Xw – y)$$
令梯度为零,我们可以得到最佳权重向量w的解析解:
$$w = (X^TX)^{-1}X^Ty$$
计算步骤
- 导入所需库,并加载数据集
- 准备输入特征向量X和输出变量向量y
- 添加截距列(全为1)到X矩阵中
- 计算最佳权重向量w
- 进行预测
- 可选:绘制散点图和拟合直线
复杂Python代码示例
首先,我们导入所需的库和模块(numpy和matplotlib):
import numpy as np
import matplotlib.pyplot as plt
然后,我们定义一个虚拟数据集来演示线性回归算法。假设我们有100个样本点,其中输入特征x是一个在0到1之间的随机数,输出变量y是输入特征加上一个随机噪声的线性函数关系。
np.random.seed(0)
X = np.random.rand(100, 1)
noise = np.random.randn(100, 1) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls 0.1
y = 2 + 3 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls X + noise
接下来,我们将添加一个截距列(全为1)到X矩阵中,并计算最佳权重向量w:
X_intercept = np.hstack((np.ones((X.shape[0], 1)), X))
w = np.linalg.inv(X_intercept.T.dot(X_intercept)).dot(X_intercept.T).dot(y)
然后,我们可以使用这个最佳权重向量进行预测:
y_pred = X_intercept.dot(w)
最后,我们可以绘制散点图和拟合直线,以可视化预测结果:
plt.scatter(X, y)
plt.plot(X, y_pred, color='red')
plt.show()
代码细节解释
在代码中的第一个部分,我们使用numpy
库的random
模块来生成一个服从均匀分布的随机输入特征X。然后,我们添加一个服从标准正态分布的随机噪声项到输出变量y中。
接下来,我们通过使用np.hstack()
函数将截距列(全为1)添加到输入特征矩阵X中。这样做是为了在计算最佳权重向量w时考虑到截距项。
然后,我们使用np.linalg.inv()
函数计算矩阵的逆,dot()
函数进行矩阵乘法,以获得最佳权重向量w的解析解。
最后,我们使用dot()
函数将输入特征矩阵X与最佳权重向量w相乘,以获得预测值y_pred。
最后,我们使用plt.scatter()
函数绘制散点图,plt.plot()
函数绘制拟合直线,并使用plt.show()
函数显示这个图形。
这样,我们得到了一个带有散点图和拟合直线的可视化结果。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/821884/
转载文章受原作者版权保护。转载请注明原作者出处!