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

【机器学习学习笔记】线性回归实现与应用

零基础学线性回归:从原理到实战

对于零基础的同学来说,“线性回归” 听起来可能很复杂,但其实它是机器学习里最基础、最容易理解的方法之一,核心就是用一条直线(或平面)去 “贴合” 数据,帮我们做预测。下面我们用 “卖房子” 这个生活场景,一步步把线性回归的知识拆明白。

一、先搞懂:线性回归能解决什么问题?

首先要明确:线性回归是用来解决 “预测连续值” 的问题。
比如:根据房屋面积预测房价(房价是连续的,不是 “涨 / 跌” 这种二选一的结果)、根据身高预测体重、根据广告投入预测销售额等。

我们从最常见的 “房屋面积→房价” 例子入手,先看一组真实的对应数据(10 套房子):

房屋面积(平方米)567269881028676799474
房价(万元)9210286110130999610210592

如果把这些数据画在图上(横坐标是面积,纵坐标是房价),会看到 10 个 “散点”—— 这就是我们的原始数据。现在的问题是:如果我有一套 150 平米的房子要卖,怎么根据这些数据预估价格?

二、核心思想:找一条 “最贴合” 数据的直线

线性回归的核心,就是在这些散点中画一条直线,让这条直线尽可能 “靠近” 所有点 —— 这条直线就是 “拟合直线”,用它来做预测最准确。

1. 这条直线怎么表示?

我们上学时学过 “一元一次方程”:y = w₀ + w₁×x,这里的直线就是这个形式:

  • x:自变量(比如房屋面积,是我们已知的)
  • y:因变量(比如房价,是我们要预测的)
  • w₀:截距(直线与 y 轴的交点,不用纠结含义,是计算出来的参数)
  • w₁:斜率(表示 x 每增加 1,y 平均增加多少。比如 w₁=0.8,就是面积每多 1 平米,房价平均多 0.8 万元)

2. 为什么是这条直线,不是别的?

比如下图里,红色直线和两条绿色虚线都能 “大概贴合” 数据,但红色直线是 “最好” 的 —— 怎么判断 “最好”?

答案是:让所有点到直线的 “误差总和最小”
每个点到直线的距离(其实是 “真实房价 - 直线预测的房价”)就是 “误差”,但直接加误差会有正有负(比如有的点在直线上方,误差为正;有的在下方,误差为负),会抵消。所以我们用 “误差的平方和” 来计算(平方后所有误差都是正数,不会抵消)—— 这个 “误差平方和” 就是 “损失函数”,我们要找的就是让这个损失函数最小的直线。

三、怎么算出直线的参数(w₀和 w₁)?

要找 “损失最小” 的直线,本质是计算出 w₀和 w₁的具体数值。这里有两种方法,我们不用纠结复杂公式,重点理解逻辑。

方法 1:最小二乘法(手动计算思路)

“最小二乘” 就是 “最小化误差平方和” 的意思,数学家已经推导出直接计算 w₀和 w₁的公式(不用自己推,直接用):

  • 先算 w₁(斜率):用所有 x、y 的总和、x×y 的总和等代入公式(代码里会自动算)
  • 再算 w₀(截距):用 w₁和 x、y 的平均值代入公式

比如用我们的 10 套房子数据,代入公式后能算出:
w₀≈51.9(截距),w₁≈0.68(斜率)
所以拟合直线就是:房价 = 51.9 + 0.68×面积

方法 2:用代码自动算(不用手动算公式)

实际中我们不会手动算公式,而是用 Python 代码调用工具包,3 步就能出结果:

  1. 导入工具(numpy 用于计算,matplotlib 用于画图)
  2. 输入数据(x 是面积,y 是房价)
  3. 调用函数计算 w₀和 w₁

代码示例(不用纠结细节,知道能出结果就行):

import numpy as np# 1. 输入数据(房屋面积x,房价y)
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])# 2. 定义计算w0和w1的函数(背后就是最小二乘公式)
def calculate_w(x, y):n = len(x)  # 数据总数(10套房子)w1 = (n*sum(x*y) - sum(x)*sum(y)) / (n*sum(x*x) - sum(x)*sum(x))w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y)) / (n*sum(x*x) - sum(x)*sum(x))return w0, w1# 3. 计算并输出结果
w0, w1 = calculate_w(x, y)
print("w0(截距):", w0)  # 输出约51.9
print("w1(斜率):", w1)  # 输出约0.68

四、用直线做预测:150 平米的房子值多少钱?

有了拟合直线房价 = 51.9 + 0.68×面积,预测就很简单了 —— 把 “150 平米” 代入 x:
房价 = 51.9 + 0.68×150 ≈ 154万元

代码里也能直接算:

# 定义直线公式(预测函数)
def predict_price(area, w0, w1):return w0 + w1 * area# 预测150平米的房价
price = predict_price(150, w0, w1)
print("150平米房价预估:", price)  # 输出约154万元

五、更简单的方式:用现成工具包(scikit-learn)

上面是 “手动实现” 线性回归,实际工作中我们会用成熟的工具包(比如 scikit-learn,简称 sklearn),代码更简单,还能处理更复杂的数据(比如多个特征)。

用 sklearn 做线性回归的 3 步:

  1. 导入 sklearn 的线性回归工具
  2. 准备数据(注意:sklearn 要求 x 是 “二维数据”,比如把 [56,72,...] 变成 [[56],[72],...])
  3. 训练模型→得到 w0 和 w1→做预测

代码示例:

from sklearn.linear_model import LinearRegression
import numpy as np# 1. 准备数据(x要改成二维)
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]).reshape(-1, 1)  # 改成10行1列
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])# 2. 训练模型
model = LinearRegression()  # 初始化模型
model.fit(x, y)  # 用数据训练模型(找w0和w1)# 3. 查看参数和预测
print("w0(截距):", model.intercept_)  # 输出约51.9(和之前一致)
print("w1(斜率):", model.coef_[0])   # 输出约0.68(和之前一致)
print("150平米预估房价:", model.predict([[150]]))  # 输出约154万元

六、进阶:用多个特征预测(比如不止看面积)

前面只用到 “房屋面积” 一个特征(叫 “一元线性回归”),但实际预测房价时,还会看 “犯罪率”“平均房间数”“低收入人群比例” 等多个特征(叫 “多元线性回归”)。

比如用 “波士顿房价数据集”(真实的房价数据,包含 13 个特征),我们选 3 个关键特征:

  • CRIM:城镇犯罪率
  • RM:住宅平均房间数
  • LSTAT:低收入人群比例

多元线性回归的步骤:

  1. 加载真实数据集
  2. 拆分数据:70% 用于 “训练模型”(让模型学规律),30% 用于 “测试模型”(看模型准不准)
  3. 用 sklearn 训练模型→预测→评估准确性
关键:怎么评估模型准不准?

用两个常用指标(值越小,模型越准):

  • MAE(平均绝对误差):所有预测值和真实值的 “绝对差值” 的平均值(比如 MAE=2,就是平均每次预测差 2 万元)
  • MSE(均方误差):所有预测值和真实值的 “差值平方” 的平均值(对大误差更敏感,比如差 10 万比差 5 万的影响大很多)

代码示例(核心部分):

import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np# 1. 加载波士顿房价数据集
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")# 2. 选3个特征和目标值(房价)
features = df[['crim', 'rm', 'lstat']]  # 3个特征
target = df['medv']  # 目标值(房价)# 3. 拆分训练集(70%)和测试集(30%)
split_num = int(len(features)*0.7)  # 70%的位置
X_train = features[:split_num]  # 训练集特征
y_train = target[:split_num]    # 训练集房价(真实值)
X_test = features[split_num:]   # 测试集特征
y_test = target[split_num:]     # 测试集房价(真实值)# 4. 训练模型并预测
model = LinearRegression()
model.fit(X_train, y_train)  # 用训练集学习
preds = model.predict(X_test)  # 用测试集预测# 5. 计算MAE和MSE(评估模型)
def mae(y_true, y_pred):return sum(np.abs(y_true - y_pred))/len(y_true)def mse(y_true, y_pred):return sum(np.square(y_true - y_pred))/len(y_true)print("MAE(平均绝对误差):", mae(y_test, preds))  # 比如输出13(平均差13万元)
print("MSE(均方误差):", mse(y_test, preds))     # 比如输出300

这里 MAE=13 看起来有点大,是因为我们没对数据做预处理(比如去除异常值、统一数据范围),但这不影响我们理解线性回归的核心 ——用多个特征的线性组合来预测连续值

七、总结:线性回归的核心逻辑

  1. 问题类型:预测连续值(如房价、销售额)
  2. 核心思想:找一条直线(或平面,对应多个特征),让所有数据点到直线的 “误差平方和最小”
  3. 关键步骤
    • 准备数据(特征 x 和目标值 y)
    • 用最小二乘法(或工具包)计算直线参数(w₀、w₁...)
    • 用直线做预测
    • 用 MAE/MSE 评估模型准确性
  4. 工具:简单场景用 numpy 手动实现,复杂场景用 sklearn

通过 “卖房子” 这个例子,我们从 “找直线” 到 “用工具包”,一步步理解了线性回归。它是机器学习的入门基础,学会了它,再学其他算法(比如决策树、神经网络)会更容易 —— 因为很多算法的核心逻辑(定义损失函数、找最优解)和线性回归是相通的。

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

相关文章:

  • Shell-AWK详解
  • 单片机day2
  • Chapter1—设计模式基础
  • 线性代数基础 | 基底 / 矩阵 / 行列式 / 秩 / 线性方程组
  • 在线性代数里聊聊word embedding
  • Java:跨越时代的编程语言,持续赋能数字化转型
  • java面试:可以讲解一下mysql的索引吗
  • 「数据获取」《吉林企业统计年鉴(2004)》(获取方式看绑定的资源)
  • 基于区块链的商品信息追溯平台(源码+论文+部署+安装)
  • 关于linux软件编程15——数据库编程sqlite3
  • wpf之Border
  • 小程序 NFC 技术IsoDep协议
  • iBeLink BM S1 Max 12T矿机评测:Sia算法、高效算力与优化设计解析
  • AI 重塑就业市场:哪些职业会被替代?又有哪些新岗位正在崛起?
  • 文件处理三大利器之三:awk
  • 3大主流语言web框架写hello world
  • 接口测试之Mock测试方法详解
  • 使用spring-boot-starter-validation常用注释优雅判断类型
  • 小迪安全v2023学习笔记(七十六讲)—— Fuzz模糊测试口令爆破目录爆破参数爆破Payload爆破
  • uniapp 开发上架 iOS App全流程
  • uni-app iOS 文件管理与 itools 配合实战,多工具协作的完整流程
  • 如何选择适合企业的海外智能客服系统:6 大核心维度 + 实战选型指南
  • 集成运算放大器的作用、选型和测量指南-超简单解读
  • 4 款音分轨工具推荐:制片帮领衔,轻松搞定音频分离
  • 实现信号的小波分解和重构
  • 7.5el-tree 组件详解
  • 创建消息队列,完成信息传输
  • MySQL索引分类
  • 英语四级学习指南
  • A*(Astar)算法详解与应用