当前位置: 首页 > web >正文

线性回归原理与进阶

线性回归是机器学习和统计学中的基础工具,能直观呈现变量关系,也是复杂模型的基石,在预测房价、分析股票等场景中应用广泛。

线性回归基础原理

线性关系假设

  • 一元线性回归:y = \beta_0 + \beta_1x + \epsilon,其中y为因变量,x为自变量,\beta_0是截距,\beta_1是斜率,\epsilon是误差项。
  • 多元线性回归:y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n + \epsilonx_1x_n为多个自变量,\beta_1\beta_n是对应系数。

参数估计 - 最小二乘法

最小二乘法旨在最小化残差平方和SSR = \sum_{i=1}^{m} (y_i - \hat{y}_i)^2

一元线性回归参数闭式解:

\hat{\beta}_1 = \frac{\sum_{i=1}^{m} (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{m} (x_i - \bar{x})^2}\hat{\beta}_0 = \bar{y} - \hat{\beta}_1\bar{x}

代码实现:

import numpy as npdef linear_regression(x, y):m = len(x)x_mean, y_mean = np.mean(x), np.mean(y)numerator = np.sum((x - x_mean) * (y - y_mean))denominator = np.sum((x - x_mean) **2)beta1 = numerator / denominatorbeta0 = y_mean - beta1 * x_meanreturn beta0, beta1

模型评估指标

  • MSE:\frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2
  • RMSE:\sqrt{MSE}
  • MAE:\frac{1}{m} \sum_{i=1}^{m} |y_i - \hat{y}_i|
  • \(R^2\):1 - \frac{\sum_{i=1}^{m} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{m} (y_i - \bar{y})^2}

代码实现:

def calculate_metrics(y_true, y_pred):mse = np.mean((y_true - y_pred)** 2)rmse = np.sqrt(mse)mae = np.mean(np.abs(y_true - y_pred))ss_total = np.sum((y_true - np.mean(y_true)) **2)ss_residual = np.sum((y_true - y_pred)** 2)r2 = 1 - (ss_residual / ss_total)return mse, rmse, mae, r2

线性回归进阶

处理多重共线性

  • 检测:计算自变量相关系数或方差膨胀因子VIF_j = \frac{1}{1 - R_j^2}VIF_j > 10时多重共线性严重)。
  • 解决:删除高度相关变量、主成分分析、正则化回归。

VIF 计算代码:

from sklearn.linear_model import LinearRegressiondef calculate_vif(X):vif = []for i in range(X.shape[1]):X_rest = np.delete(X, i, axis=1)X_i = X[:, i]lr = LinearRegression()lr.fit(X_rest, X_i)r2 = lr.score(X_rest, X_i)vif.append(1 / (1 - r2))return np.array(vif)

正则化回归

  • 岭回归:损失函数含\(L_2\)正则化,L(\beta) = \sum (y_i - \hat{y}_i)^2 + \lambda \sum \beta_j^2,缓解过拟合和多重共线性。
from sklearn.linear_model import Ridgeridge = Ridge(alpha=0.1)
  • Lasso 回归:损失函数含\(L_1\)正则化,L(\beta) = \sum (y_i - \hat{y}_i)^2 + \lambda \sum |\beta_j|,可实现特征选择。
from sklearn.linear_model import Lassolasso = Lasso(alpha=0.01)

模型诊断与改进

  • 残差分析:通过残差图检查线性关系、误差独立性和方差齐性。
  • 过拟合与欠拟合:过拟合可通过增加数据、交叉验证解决;欠拟合可增加模型复杂度、进行特征工程。

残差图绘制代码:

import matplotlib.pyplot as pltlr = LinearRegression()lr.fit(X_train, y_train)y_pred = lr.predict(X_test)residuals = y_test - y_predplt.scatter(y_pred, residuals)plt.axhline(y=0, color='r', linestyle='--')plt.show()

交叉验证代码:

from sklearn.model_selection import cross_val_scorelr = LinearRegression()scores = cross_val_score(lr, X, y, cv=5, scoring='neg_mean_squared_error')mse_scores = -scores

http://www.xdnf.cn/news/16736.html

相关文章:

  • Three.js实现银河螺旋星云粒子特效——原理、实现
  • 在 Cloudflare 平台上完整部署 GitHub 项目 MoonTV 实现免费追剧流程
  • 广泛分布于内侧内嗅皮层全层的速度细胞(speed cells)对NLP中的深层语义分析的积极影响和启示
  • 基于springboot/java/VUE的旅游管理系统/旅游网站的设计与实现
  • 枚举中间位置高级篇
  • UE5 打包Windows平台时无法找到SDK的解决方法
  • 远程Qt Creator中文输入解决方案
  • Flex布局面试常考的场景题目
  • python中的 @dataclass
  • 第4章唯一ID生成器——4.5 美团点评开源方案Leaf
  • 【22】C# 窗体应用WinForm ——定时器Timer属性、方法、实例应用,定时切换画面
  • 破解企业无公网 IP 难题:可行路径与实现方法?
  • 【MySQL基础篇】:MySQL表的约束常用类型以及实战示例
  • 【C#获取高精度时间】
  • Prometheus + Grafana + Micrometer 监控方案详解
  • JVM指令集
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)
  • Python与Spark
  • 【深度学习】独热编码(One-Hot Encoding)
  • C++_红黑树树
  • CMake 完全实战指南:从入门到精通
  • 使用redis 作为消息队列时, 如何保证消息的可靠性
  • Leetcode 08 java
  • 鸿蒙Harmony-自定义List组件,解决List组件手势滑动点击卡住问题
  • Apache Ignite 的分布式队列(IgniteQueue)和分布式集合(IgniteSet)的介绍
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解