Python 机器学习 线性回归 正规方程优化损失函数
Python 机器学习中,线性回归模型的参数可以通过正规方程(Normal Equation)直接计算得到,无需使用迭代优化算法如梯度下降。正规方程提供了一种找到成本函数最小值的解析解,从而直接计算出模型参数(系数和截距)。正规方程是一种简单有效的方法,可以用于求解线性回归模型的参数。其优点是计算速度快,并且可以得到解析解。
参考文档:
1、线性回归
线性回归是一种常用的机器学习算法,用于预测一个连续变量的值。其目标是找到一条直线,使预测值与真实值之间的差距最小。
参考文档:
2、损失函数
线性回归模型的性能通常通过损失函数(或成本函数)来衡量,它计算了模型预测值与实际目标值之间的差异。对于线性回归,最常用的损失函数是均方误差(Mean Squared Error, MSE)损失。公式如下,
import numpy as np # 假设 X 是输入特征矩阵,y 是目标值向量 X = np.array([[1, 2], [1, 3], [1, 4], [1, 5]]) # 添加了一列1作为x0,以便处理截距项 y = np.array([5, 7, 9, 11]) # 初始化模型参数,theta0为截距,theta1, theta2为斜率 theta = np.array([0.1, 0.2]) # 线性回归模型的预测函数 def predict(X, theta): return X.dot(theta) # 计算损失函数(MSE) def compute_loss(X, y, theta): m = len(y) y_pred = predict(X, theta) loss = (1 / (2 * m)) * np.sum(np.square(y_pred - y)) return loss # 计算损失值 loss = compute_loss(X, y, theta) print(f"Loss: {loss}")
参考文档:
3、正规方程(Normal Equation)
为了找到最小化损失的模型参数,可以使用多种优化技术,其中一种是正规方程(Normal Equation)。正规方程是一种解析方法,直接计算出最优的模型参数(即权重),而不需要迭代优化过程(如梯度下降)。特别适用于特征数量不是特别大的情况,因为计算矩阵的逆可能在特征数量非常大时变得计算上不可行。对于特征数非常多的情况,使用梯度下降或其他优化算法可能更合适。公式如下,
import numpy as np # 假设X是特征矩阵,y是目标变量向量 # 为X添加一列1,用于计算偏置项(截距) X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) y = np.array([6, 8, 9, 11]) X_b = np.c_[np.ones((4, 1)), X] # 添加一列1 # 使用正规方程计算最佳参数 theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) print("最佳参数 (截距和斜率):", theta_best)
使用示例:
import numpy as np from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 生成一个回归数据集 X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42) # 添加截距项 X_b = np.c_[np.ones((100, 1)), X] # 添加x0 = 1到每个实例 # 使用正规方程计算最佳参数 beta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) # 显示计算出的参数(截距和系数) print("计算出的参数:", beta_best) # 预测 X_new = np.array([[0], [2]]) X_new_b = np.c_[np.ones((2, 1)), X_new] # 同样添加x0 = 1 y_predict = X_new_b.dot(beta_best) print("预测值:", y_predict) # 使用训练集和测试集来评估模型性能 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) X_train_b = np.c_[np.ones((X_train.shape[0], 1)), X_train] X_test_b = np.c_[np.ones((X_test.shape[0], 1)), X_test] beta_best_train = np.linalg.inv(X_train_b.T.dot(X_train_b)).dot(X_train_b.T).dot(y_train) y_test_predict = X_test_b.dot(beta_best_train) mse = mean_squared_error(y_test, y_test_predict) print("测试集上的MSE:", mse)
参考文档: