python实现岭回归
时间: 2025-08-19 17:29:27 浏览: 2
岭回归(Ridge Regression)是一种用于解决线性回归中多重共线性问题的正则化方法。通过在损失函数中加入L2正则化项,可以有效控制模型复杂度并提升泛化能力。Python 中可以通过多种方式实现 Ridge 回归,包括使用 `scikit-learn` 提供的封装类、标准方程法、梯度下降法,以及基于优化库如 `scipy` 的自定义求解方式。
### 使用 scikit-learn 实现 Ridge 回归
`scikit-learn` 提供了高效的封装接口,适合快速构建和训练模型。以下是一个完整的示例:
```python
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
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)
# 创建岭回归模型
ridge_model = Pipeline([
('scaler', StandardScaler()), # 特征标准化
('ridge', Ridge(alpha=1.0)) # 岭回归模型
])
# 拟合模型
ridge_model.fit(X, y)
# 预测新数据
X_new = np.array([[1.5]])
y_pred = ridge_model.predict(X_new)
print("预测结果:", y_pred[0][0])
# 绘制散点图和拟合的直线
plt.scatter(X, y, color='blue')
plt.plot(X, ridge_model.predict(X), color='red', linewidth=3)
plt.xlabel("自变量")
plt.ylabel("因变量")
plt.title("岭回归")
plt.show()
```
上述代码首先生成一个带有噪声的线性数据集,随后建立了一个包含特征标准化和岭回归的管道模型,并对模型进行训练和预测[^3]。
### 标准方程法实现 Ridge 回归
标准方程法通过解析解直接计算权重向量。对于岭回归而言,其解析解形式为:
$$
w = (X^T X + \alpha I)^{-1} X^T y
$$
其中 $\alpha$ 是正则化系数,$I$ 是单位矩阵。以下是具体实现:
```python
import numpy as np
# 添加偏置项
X_b = np.c_[np.ones((X.shape[0], 1)), X]
# 定义 alpha
alpha = 1.0
n_features = X_b.shape[1]
# 标准方程法求解
I = np.identity(n_features)
w_ridge = np.linalg.inv(X_b.T @ X_b + alpha * I) @ X_b.T @ y
# 输出权重
print("权重系数:", w_ridge)
```
该方法适用于小规模数据集,且无需迭代即可获得最优解。
### 使用 scipy 自定义优化器实现 Ridge 回归
如果希望以更灵活的方式求解岭回归问题,可以利用 `scipy.optimize.minimize` 来构造目标函数并加入 L2 正则化约束。以下是一个基于凸优化的实现示例:
```python
from scipy.optimize import minimize
import numpy as np
# 定义目标函数(均方误差)
def objective(x, X, y, alpha):
return np.mean((X @ x - y) ** 2) + alpha * np.sum(x[1:] ** 2)
# 生成初始参数
X_b = np.c_[np.ones((X.shape[0], 1)), X]
x0 = np.zeros(X_b.shape[1])
# 设置正则化系数
alpha = 1.0
# 求解最优化参数
res = minimize(objective, x0=x0, args=(X_b, y, alpha), method='BFGS')
print("优化后的参数:", res.x)
```
此方法适用于需要高度定制化的场景,例如引入非线性变换或复杂约束条件。
### 总结
Python 提供了多种实现 Ridge 回归的方式,用户可以根据实际需求选择不同方法:对于大多数应用场景,推荐使用 `scikit-learn` 提供的封装类;若需高效求解小型数据集,可采用标准方程法;而对算法结构有特殊要求时,可借助 `scipy.optimize` 进行自定义优化[^3]。
---
阅读全文
相关推荐
















