线性回归-最小二乘法入门(波士顿房价)
简介:本文讲解,线性回归-最小二乘法入门。
首先需要在jupyter中安装对应的环境。
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/simple
线性归回归原理讲解
线性回归模型
线性回归是一种统计学上常用的建模方法,用于描述自变量(输入)与因变量(输出)之间的线性关系。线性回归模型假设因变量与自变量之间存在着线性关系,这意味着通过自变量的线性组合可以预测因变量的数值。
线性回归模型的数学表达式通常如下所示:
其中:
- y 是因变量(输出),
- x1,x2,…,xn 是自变量(输入),
- b0,b1,b2,…,bn 是模型的系数,代表着自变量对因变量的影响程度,
- ε 是误差项,代表了模型无法解释的部分。
线性回归模型的目标是找到最优的系数 b 0 , b 1 , b 2 , … , b n ,使得模型的预测值与实际观测值之间的差异尽可能小。通常使用最小二乘法来估计这些系数,即通过最小化观测值与模型预测值之间的残差平方和来确定系数的值。
线性回归模型常被用于以下情况:
- 预测:通过已知的自变量来预测因变量的值。
- 解释:分析自变量与因变量之间的关系,确定哪些自变量对因变量有显著影响。
- 控制:根据模型的结果调整自变量的值,以控制因变量的值。
最小二乘法
最小二乘法是一种常用的参数估计方法,通常用于线性回归模型中。它的目标是通过最小化观测值与模型预测值之间的残差平方和来确定模型的参数,以使模型的拟合效果达到最优。
在线性回归模型中,我们希望找到一条直线(或者在多维情况下是一个超平面),最能够拟合数据点的分布。最小二乘法通过调整直线的斜率和截距(或者在多维情况下调整各个自变量的系数),使得拟合线与数据点的残差平方和最小化。
残差指的是每个观测值与模型预测值之间的差异,残差平方和则是所有观测值的残差平方的总和。最小二乘法的目标是找到一组参数,使得这个残差平方和达到最小。
数学上,对于简单的一元线性回归模型 ,其中 y 是因变量,x 是自变量,b0和 b1
是模型的系数,ε 是误差项,最小二乘法的目标是找到最优的 b0和 b1,使得残差平方和最小化。
最小二乘法的步骤包括:
- 定义线性模型的形式。
- 定义损失函数,通常是残差平方和。
- 求解损失函数的最小值,通常通过求导数等方法来确定参数的最优解。
- 评估模型拟合的好坏,可以使用各种统计指标来评估线性模型的拟合效果,如R方(拟合优度)等。
自己实现线性回归代码
线性回归模型的最小二乘参数估计是通过最小化残差平方和来确定模型参数的方法。在线性回归中,我们假设因变量 y 与自变量 X 之间存在线性关系,即:
其中:
- y 是因变量(输出),
- x1 , x2 , … , xn 是自变量(输入),
- θ 0 ,θ1 ,…,θn是模型的参数,称为系数,
- ε 是误差项,代表了模型无法解释的部分。
最小二乘法的目标是找到一组参数 θ0 , θ1 , … , θn ,使得模型的预测值与实际观测值之间的差异尽可能小。
参数的估计公式可以表示为:
其中:
- θ是一个包含所有参数的向量,
- X是包含所有样本的特征矩阵,每行对应一个样本,每列对应一个特征,
- y是因变量向量。
这个公式通过矩阵运算直接得到了最优参数。
- 算法设计思路
- 导入必要的库:
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_boston
在这里,导入了 NumPy 用于数值计算,Matplotlib 用于绘图,以及 scikit-learn 中的 load_boston 函数用于加载波士顿房价数据集。
- 定义自定义线性回归模型类 LinearRegression:
class LinearRegression: def __init__(self): self.theta = None # 模型参数 # 拟合函数 def fit(self, X, y): # 添加偏置项,构建设计矩阵 X_b = np.c_[np.ones((len(X), 1)), X] # 计算最优参数,应用最小二乘法 self.theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) # 预测函数 def predict(self, X): # 添加偏置项,构建设计矩阵 X_b = np.c_[np.ones((len(X), 1)), X] # 返回预测值 return X_b.dot(self.theta)
在这个类中,定义了两个方法,fit 方法用于训练模型,predict 方法用于预测数据。在 fit 方法中,首先添加了偏置项(即截距),然后构建了设计矩阵 X_b,使用最小二乘法计算了最优参数 theta。在 predict 方法中,使用训练得到的参数 theta 进行预测。
- 加载波士顿房价数据集:
boston = load_boston() X = boston.data[:, 5] # 选择房间数量作为自变量 y = boston.target # 房屋价格作为因变量
我们从波士顿房价数据集中提取了自变量 X(房间数量)和因变量 y(房屋价格)。
- 创建线性回归对象并训练模型:
lr_model = LinearRegression() lr_model.fit(X, y)
实例化了 LinearRegression 类,并调用 fit 方法来训练模型。
- 打印模型参数:
print("参数:", lr_model.theta)
这行代码用于输出训练得到的模型参数。
- 绘制数据散点图和拟合直线:
plt.scatter(X, y, color='blue') # 绘制数据散点图 plt.plot(X, lr_model.predict(X), color='red') # 绘制拟合直线
使用 Matplotlib 绘制了数据散点图和拟合的直线。数据散点图展示了房间数量与房价之间的关系,而拟合直线表示了模型对数据的拟合情况。
- 添加标签和标题,并显示图形:
plt.xlabel('房间平均数') plt.ylabel('房价') plt.title('波士顿房屋数据集的线性回归') plt.show()
这些代码用于添加 x 轴和 y 轴的标签,以及图形的标题,并调用 plt.show() 方法显示绘制的图形。
- 完整代码
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_boston # 自定义线性回归模型类 class LinearRegression: def __init__(self): self.theta = None # 模型参数 # 拟合函数 def fit(self, X, y): # 添加偏置项,构建设计矩阵 X_b = np.c_[np.ones((len(X), 1)), X] # 计算最优参数,应用最小二乘法 self.theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) # 预测函数 def predict(self, X): # 添加偏置项,构建设计矩阵 X_b = np.c_[np.ones((len(X), 1)), X] # 返回预测值 return X_b.dot(self.theta) # 加载波士顿房价数据集 boston = load_boston() X = boston.data[:, 5] # 选择房间数量作为自变量 y = boston.target # 房屋价格作为因变量 # 创建线性回归对象 lr_model = LinearRegression() # 训练模型 lr_model.fit(X, y) # 打印模型参数 print("参数:", lr_model.theta) # 绘制数据散点图 plt.scatter(X, y, color='blue') # 绘制拟合直线 plt.plot(X, lr_model.predict(X), color='red') # 添加标签和标题 plt.xlabel('房间平均数') plt.ylabel('房价') plt.title('波士顿房屋数据集的线性回归') # 显示图形 plt.show()
运行结果: