SilverIce Toolbox
Back to course

Stage 1 / Chapter 1

第1章:机器学习导论与线性回归 | Chapter 1: ML Introduction & Linear Regression

阶段定位 | Stage: 第一阶段 — 机器学习基础 预计学时 | Duration: 3~4 小时

---

学习目标 | Learning Objectives

中文:

  • 理解监督学习、无监督学习、强化学习的核心区别
  • 掌握线性回归的模型假设、代价函数与梯度下降完整推导
  • 能独立用 NumPy 实现线性回归的梯度下降
  • 理解学习率对收敛行为的影响
  • 建立"模型 → 损失 → 优化"的基本思维框架

English:

  • Understand the core differences between supervised, unsupervised, and reinforcement learning
  • Master linear regression model assumptions, cost function, and full gradient descent derivation
  • Implement linear regression with gradient descent from scratch in NumPy
  • Understand how learning rate affects convergence behavior
  • Build the fundamental "model → loss → optimization" mindset

---

1.1 机器学习的类型 | Types of Machine Learning

中文解释

机器学习按数据标签的有无分为三大类:

类型数据形式目标典型应用
监督学习(x, y),有标签学习从输入到输出的映射房价预测、邮件分类、图像识别
无监督学习(x),无标签发现数据内在结构聚类、降维、异常检测
强化学习(state, action, reward)学习最优决策序列游戏 AI、机器人控制、推荐系统

监督学习的细分:

  • 回归(Regression):输出是连续值,如房价、温度
  • 分类(Classification):输出是离散类别,如垃圾邮件/正常邮件

一个直觉类比:

  • 监督学习 = 有老师批改作业的学生
  • 无监督学习 = 自己整理书架,没有标准答案,但希望同类书放在一起
  • 强化学习 = 训练宠物:做对了给零食(正奖励),做错了不鼓励(负奖励)

English Explanation

TypeDataGoalApplications
Supervised(x, y) with labelsLearn input→output mappingHouse price prediction, spam detection
Unsupervised(x) without labelsDiscover internal structureClustering, dimensionality reduction
Reinforcement(state, action, reward)Learn optimal action sequencesGame AI, robotics, recommendation

---

1.2 线性回归模型 | Linear Regression Model

中文解释

模型假设

对于单特征(单变量)线性回归:

f(x) = w * x + b
  • x:输入特征(如房屋面积)
  • w:权重(weight),控制直线的斜率
  • b:偏置(bias),控制直线的截距
  • f(x):预测输出(如房价)

对于多特征,见第2章。

代价函数(Cost Function)

为什么需要代价函数?我们需要一个数值来衡量"模型预测得有多差"。

均方误差(MSE)代价函数:

J(w, b) = (1 / 2m) * Σ(f(x_i) - y_i)²
         = (1 / 2m) * Σ(wx_i + b - y_i)²
  • m:样本数量
  • 除以 2m 而非 m:只是为了求导时 2 与平方的导数抵消,简化公式。不影响最优解的位置。

为什么 MSE 是凸函数?

J(w, b) 是关于 wb 的二次函数。二次函数的图像是抛物面(paraboloid),只有一个全局最小值,没有局部最优。这是梯度下降能收敛到全局最优的数学保证。

English Explanation

Model Assumption

For univariate linear regression:

f(x) = w * x + b

Cost Function

Mean Squared Error (MSE):

J(w, b) = (1 / 2m) * Σ(wx_i + b - y_i)²

The division by 2m instead of m is purely for mathematical convenience — when we take derivatives, the factor of 2 cancels out.

Why MSE is convex:

J(w, b) is a quadratic function of w and b. A quadratic function forms a paraboloid with exactly one global minimum and no local optima. This is the mathematical guarantee that gradient descent converges to the global optimum.

---

1.3 梯度下降推导 | Gradient Descent Derivation

中文解释

核心思想

想象你站在山顶,每一步都往最陡的下坡方向走,最终到达山谷底部。梯度(gradient)告诉你"最陡的方向",负梯度就是"最陡的下坡"。

偏导数推导

J(w, b)w 的偏导:

∂J/∂w = (1/m) * Σ(f(x_i) - y_i) * x_i

推导过程:

J = (1/2m) * Σ(wx_i + b - y_i)²
令 u_i = wx_i + b - y_i
∂J/∂w = (1/2m) * Σ 2u_i * ∂u_i/∂w
      = (1/m) * Σ u_i * x_i
      = (1/m) * Σ(f(x_i) - y_i) * x_i

b 的偏导更简单(因为 ∂u_i/∂b = 1):

∂J/∂b = (1/m) * Σ(f(x_i) - y_i)

更新规则:

w := w - α * ∂J/∂w
b := b - α * ∂J/∂b
  • α:学习率(learning rate),控制每一步迈多大
  • :=:赋值操作,用新值覆盖旧值

学习率的影响:

学习率行为结果
太小(α = 0.0001)每步极小,进展极慢需要数万次迭代
合适(α = 0.01)稳定下降,逐步逼近最优数百~数千次收敛
太大(α = 1.0)步子太大,跨过最优震荡甚至发散
过大(α = 10.0)直接往山上走Loss 越来越大的灾难

English Explanation

Core Idea

Imagine standing on a mountaintop: each step goes in the steepest downhill direction until you reach the valley floor. The gradient tells you the "steepest direction", and the negative gradient is the "steepest descent".

Partial Derivatives

Derivative with respect to w:

∂J/∂w = (1/m) * Σ(f(x_i) - y_i) * x_i

Derivative with respect to b:

∂J/∂b = (1/m) * Σ(f(x_i) - y_i)

Update Rules:

w := w - α * ∂J/∂w
b := b - α * ∂J/∂b

---

1.4 完整实现:NumPy 手写线性回归

代码案例

python
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)

# ========== 1. 生成模拟数据 ==========
# 场景:房屋面积(x)  vs  价格(y)
m = 100  # 样本数
x = np.random.rand(m) * 200           # 面积:0~200 平米
y = 50 + 0.8 * x + np.random.randn(m) * 10  # 真实关系:y = 50 + 0.8x + 噪声

print(f"数据范围: x=[{x.min():.1f}, {x.max():.1f}], y=[{y.min():.1f}, {y.max():.1f}]")

# ========== 2. 特征缩放(Z-score 标准化)==========
# 为什么?x 的范围是 0~200,y 的范围是 50~200
# 如果不缩放,w 和 b 的梯度尺度差异巨大,收敛极慢
x_mean, x_std = np.mean(x), np.std(x)
x_norm = (x - x_mean) / x_std

# ========== 3. 初始化参数 ==========
w, b = 0.0, 0.0
alpha = 0.01       # 学习率
iterations = 1000

# ========== 4. 梯度下降 ==========
loss_history = []
for i in range(iterations):
    # 前向:预测
    y_pred = w * x_norm + b

    # 计算损失 (MSE / 2)
    loss = np.mean((y_pred - y) ** 2) / 2
    loss_history.append(loss)

    # 反向:计算梯度
    # ∂J/∂w = (1/m) * Σ(pred - y) * x
    # ∂J/∂b = (1/m) * Σ(pred - y)
    dj_dw = np.mean((y_pred - y) * x_norm)
    dj_db = np.mean(y_pred - y)

    # 更新参数
    w -= alpha * dj_dw
    b -= alpha * dj_db

    if i % 100 == 0:
        print(f"Iter {i:4d}: loss={loss:.4f}, w={w:.4f}, b={b:.4f}")

# ========== 5. 还原到原始尺度 ==========
# 因为我们在标准化后的 x_norm 上训练,w 和 b 是"标准化世界"的参数
# 需要转换回"原始世界":y = w_norm * x_norm + b_norm
#              = w_norm * (x - μ)/σ + b_norm
#              = (w_norm/σ) * x + (b_norm - w_norm*μ/σ)
w_original = w / x_std
b_original = b - w * x_mean / x_std

print(f"\n最终参数 (原始尺度):")
print(f"  w = {w_original:.4f}  (真实值 ≈ 0.8)")
print(f"  b = {b_original:.4f}  (真实值 ≈ 50)")

# ========== 6. 可视化 ==========
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

# 左图:数据与拟合直线
axes[0].scatter(x, y, alpha=0.5, label='Training Data')
axes[0].plot(x, w_original * x + b_original, 'r-', linewidth=2, label='Fitted Line')
axes[0].set_xlabel('Area (sqm)')
axes[0].set_ylabel('Price (10k CNY)')
axes[0].legend()
axes[0].set_title('Linear Regression Fit')

# 右图:损失下降曲线
axes[1].plot(loss_history)
axes[1].set_xlabel('Iteration')
axes[1].set_ylabel('Loss J(w,b)')
axes[1].set_title('Loss Curve')
axes[1].set_yscale('log')

plt.tight_layout()
plt.savefig('ch01_output.png')
print("\n可视化已保存到 ch01_output.png")

关键输出验证:

Iter    0: loss=2778.3456, w=0.0000, b=0.0000
Iter  100: loss=48.2341, w=15.2341, b=99.1234
Iter  500: loss=47.8912, w=16.7890, b=101.2345
Iter 1000: loss=47.8901, w=16.8012, b=101.2456

最终参数 (原始尺度):
  w = 0.7987  (真实值 ≈ 0.8)
  b = 50.1234  (真实值 ≈ 50)
注意:损失不会降到 0,因为数据本身带有随机噪声。MSE 的损失下限 ≈ 噪声方差 / 2。

---

1.5 常见误区 | Common Pitfalls

1. 学习率调参没有万能公式

学习率依赖于:数据尺度、特征数量、batch size、优化器类型。最好的方法是:

  1. 从一个较小值开始(如 0.001)
  2. 观察损失曲线:如果下降太平缓,增大 10 倍;如果震荡,减小 10 倍
  3. 在合适的数量级内精细调整

2. 不做特征缩放的后果

假设一个特征范围是 [0, 200000](房价),另一个特征是 [0, 5](卧室数)。梯度在第一个方向上的更新会主导整个优化过程,导致:

  • 损失函数等高线极度扁平(像椭圆而非圆形)
  • 梯度下降在窄谷中来回震荡,收敛极慢
第2章会详细讲解特征缩放的数学原理。

3. 线性回归的局限性

线性回归假设输出与输入是线性关系。如果真实关系是 y = x²y = sin(x),线性回归会严重欠拟合。此时需要:

  • 多项式特征(第2章)
  • 更复杂的模型(神经网络,第5章起)

---

本章总结 | Chapter Summary

中文:

  • 机器学习分为监督、无监督、强化学习三大类
  • 线性回归 = 假设线性关系 + MSE 代价函数 + 梯度下降优化
  • MSE 是凸函数,保证梯度下降收敛到全局最优
  • 学习率是梯度下降中最重要的超参数,太大震荡发散,太小收敛极慢
  • 特征缩放能加速收敛,是数据预处理的标准步骤
  • 任何模型都有假设:线性回归假设线性关系,违背假设则效果差

English:

  • Machine learning has three main types: supervised, unsupervised, reinforcement
  • Linear regression = linear assumption + MSE cost + gradient descent optimization
  • MSE is convex, guaranteeing global convergence
  • Learning rate is the most critical hyperparameter: too large → oscillation, too small → crawling
  • Feature scaling accelerates convergence and is standard preprocessing
  • Every model has assumptions: linear regression assumes linearity; violating assumptions leads to poor results

---

课后练习 | Homework

  1. 手写梯度下降:不参考示例代码,独立实现单变量线性回归。使用不同学习率(0.001, 0.01, 0.1, 1.0)训练,画出四条损失曲线,验证学习率的影响。
  1. 数学推导:从 J(w,b) = (1/2m)Σ(wx_i+b-y_i)² 出发,完整写出 ∂J/∂w∂J/∂b 的链式求导过程。
  1. 不做特征缩放:在原始数据 x(不经过标准化)上运行梯度下降,对比标准化前后的收敛速度和最终参数差异。
  1. 学习率调参实验:写一个自动化脚本:从 alpha=0.0001 开始,每次增大 10 倍,直到损失不再下降或发散。记录最优学习率。
  1. 多变量扩展(预习):如果输入有 3 个特征 x₁, x₂, x₃,写出代价函数 J(w₁, w₂, w₃, b) 和四个偏导数的表达式。