1.从熟悉的y=kx+b到线性回归模型
在初中数学学习中,一次函数是数学中的基础,对于理解直线的性质和函数的变化规律至关重要. 一次函数是指数学中的一种函数形式,其中 x 的最高次数为1。它通常表示为 y=kx+b,其中 k 是斜率, b 是 y 轴截距。这个函数描述了一条直线的特性,斜率决定了直线的倾斜程度,而截距则是直线与y 轴的交点在 y 轴上的坐标。
线性回归模型y=wx+b 是统计学和机器学习领域中最基础、最常用的模型之一。它同样描述了自变量 x 和因变量 y 之间的线性关系。
在线性回归模型中,w 表示权重(或系数),b 表示偏置(或截距)。
与初中数学课程中直接给定斜率和截距不同,机器学习中的线性回归模型需要通过训练来确定权重 w 和偏置 b 的值。这一过程通常通过最小化损失函数来实现,例如均方误差(MSE)或平均绝对误差(MAE),使用梯度下降等优化算法来调整参数,使得模型预测值与实际观测值之间的差异最小化。
2.通过回归模型预测房屋价格
房地产市场是一个复杂而庞大的市场,房屋价格的准确预测涉及到多方利益相关者的利益和福祉。线性回归模型y=wx+b 作为一种简单而有效的预测方法,为房地产市场的参与者提供了一种重要的工具。
考虑到房地产市场的复杂性和不确定性,需要结合多种方法和因素进行综合分析,以提高预测的准确性和可靠性。这里我们只参考房屋面积和房屋价格的关系(决定房屋价格的因素有很多,地段,房间个数等等)
3.成本函数
我们的最终目的是通过历史数据的学习,来找到一个最佳拟合的w和b。这里引入一个新的概念,成本函数(Cost function)。
回归模型的成本函数,也称为损失函数或目标函数,是回归模型中的关键组成部分。它量化了回归模型生成的预测值与数据集中实际观察值之间的差异。回归模型的目标是最小化这个成本函数,从而优化模型的性能。
简单来说,成本函数衡量了模型拟合数据的好坏程度。它计算了预测值与实际值之间的误差或差异。成本函数越低,模型对数据的拟合效果越好。
不同类型的回归模型可以使用各种成本函数,具体取决于所解决的特定问题。常用的成本函数包括:
1.均方误差(MSE):MSE是回归任务中最常用的成本函数。它计算了预测值与实际值之间的平均平方差异。在数学上,MSE 定义为预测值和实际值之间平方差的平均值:
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1∑i=1n(yi−y^i)2
- n 是数据点的数量。
- y i y_i yi 是第i 个数据点的目标变量的实际值。
- y ^ i \hat{y}_i y^i 是第i 个数据点的目标变量的预测值。
2.平均绝对误差(MAE):MAE 计算了预测值与实际值之间的平均绝对差异。与 MSE 相比,MAE 对异常值的敏感性较低,其定义为:
M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| MAE=n1∑i=1n∣yi−y^i∣
3.均方根误差(RMSE):RMSE 是 MSE 的平方根,它提供了预测值误差的平均幅度的度量。RMSE 的计算方式是:
R M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} RMSE=n1∑i=1n(yi−y^i)2
4.成本函数的可视化
对于y=wx,成本函数可以在二维坐标系表示
代码:
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 * X + np.random.randn(100, 1)
# 定义均方误差(MSE)成本函数
def mse_cost(X, y, w):
predictions = np.dot(X, w)
cost = np.mean((y - predictions) ** 2)
return cost
# 创建参数空间
w_vals = np.linspace(0, 8, 100)
cost_vals = np.zeros(len(w_vals))
# 计算每个参数值的成本
for i in range(len(w_vals)):
cost_vals[i] = mse_cost(X, y, w_vals[i])
# 可视化成本函数
plt.figure(figsize=(10, 6))
plt.plot(w_vals, cost_vals, color='blue')
plt.xlabel('w')
plt.ylabel('Cost')
plt.title('Cost Function Visualization for Linear Regression (MSE)')
plt.grid(True)
plt.show()
对于y=wx+b,成本函数在二维平面表示
代码:
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 定义均方误差(MSE)成本函数
def mse_cost(X, y, w, b):
predictions = np.dot(X, w) + b
cost = np.mean((y - predictions) ** 2)
return cost
# 创建参数空间
w_vals = np.linspace(0, 5, 100)
b_vals = np.linspace(0, 6, 100)
w, b = np.meshgrid(w_vals, b_vals)
cost_vals = np.zeros((len(w_vals), len(b_vals)))
# 计算每个参数组合的成本
for i in range(len(w_vals)):
for j in range(len(b_vals)):
cost_vals[i, j] = mse_cost(X, y, w_vals[i], b_vals[j])
# 可视化成本函数
plt.figure(figsize=(10, 6))
contour_plot = plt.contour(w, b, cost_vals.T, levels=20)
plt.clabel(contour_plot, inline=True, fontsize=8)
plt.xlabel('w')
plt.ylabel('b')
plt.title('Cost Function Contour Plot for Linear Regression (MSE)')
plt.show()
对于y=wx+b,成本函数也可以在三维空间表示
代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 6 * X + np.random.randn(100, 1)
# 定义均方误差(MSE)成本函数
def mse_cost(X, y, w, b):
predictions = np.dot(X, w) + b
cost = np.mean((y - predictions) ** 2)
return cost
# 创建参数空间
w_vals = np.linspace(0, 6, 100)
b_vals = np.linspace(0, 6, 100)
w, b = np.meshgrid(w_vals, b_vals)
cost_vals = np.zeros((len(w_vals), len(b_vals)))
# 计算每个参数组合的成本
for i in range(len(w_vals)):
for j in range(len(b_vals)):
cost_vals[i, j] = mse_cost(X, y, w_vals[i], b_vals[j])
# 可视化成本函数
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(w, b, cost_vals.T, cmap='viridis', edgecolor='none')
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('Cost')
ax.set_title('Cost Function Visualization for Linear Regression (MSE)')
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5)
plt.show()