Python 机器学习中,线性回归模型的参数可以通过正规方程(Normal Equation)直接计算得到,无需使用迭代优化算法如梯度下降。正规方程提供了一种找到成本函数最小值的解析解,从而直接计算出模型参数(系数和截距)。正规方程是一种简单有效的方法,可以用于求解线性回归模型的参数。其优点是计算速度快,并且可以得到解析解。

1、线性回归

线性回归是一种常用的机器学习算法,用于预测一个连续变量的值。其目标是找到一条直线,使预测值与真实值之间的差距最小。

参考文档:Python 机器学习 线性回归算法

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}")

参考文档:Python 机器学习 线性回归算法

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)

推荐文档