← 返回笔记列表
数学建模 第 2 / 28 篇

数学建模:必备数学与 Python 基础

查看“数学建模”专题目录(2/28)
本文目录 14 个小节

专题学习地图 · 第 2 / 27 篇

学习目标与先修知识

目标是读懂后续公式,而不是背完全部数学名词。你会区分标量、向量和矩阵,理解求和、均值、方差、导数与概率,并能把它们翻译为 NumPy 运算。先修只需要四则运算、一次函数,以及 Python 的变量和列表;下面也解释最常用的代码语法。

问题背景与使用时机

假设要根据面积和卧室数估计租金。一套房有多个属性,多套房又形成一张表。向量和矩阵就是组织这张表的语言;导数描述参数改一点会怎样;概率描述尚未知道的结果;统计量概括已经收集的数据。

遇到公式先问三件事:每个符号是什么、单位是什么、尺寸是否对得上。不要看到矩阵就先寻找求逆函数。

核心概念与符号

从一个数到一张表

标量是一个数,如面积 50。向量是一列或一排数,如一套房的特征 x=(50,2)T\boldsymbol x=(50,2)^T。矩阵按行放样本、按列放特征:

X=[5028031003]∈R3×2.X=\begin{bmatrix}50&2\\80&3\\100&3\end{bmatrix}\in\mathbb R^{3\times2}.

R\mathbb R 表示实数集合,3×23\times2 表示 3 行、2 列,TT 表示转置。XwX\boldsymbol w 要求 w\boldsymbol w 有 2 个分量,结果有 3 个分量。矩阵乘法按“行与列对应相乘再相加”,不是逐元素相乘。

统计量与导数

∑i=1nxi\sum_{i=1}^n x_i 表示把 nn 个数相加;xˉ=1n∑xi\bar x=\frac1n\sum x_i 是样本均值。描述一组数自身的离散程度可用 1n∑(xi−xˉ)2\frac1n\sum(x_i-\bar x)^2;估计总体方差时常用分母 n−1n-1 的样本方差 s2s^2。标准差 ss 与原数据单位一致,方差单位是原单位的平方。

导数 f′(x)f'(x) 是局部变化率,微分 dy=f′(x)dxdy=f'(x)dx 是一阶近似变化量。对多参数损失,每个偏导只改变其中一个参数,所有偏导组成梯度 ∇J\nabla J。最小化时常向负梯度方向走。

概率与条件

P(A)P(A) 是事件 A 的概率,P(A∣B)P(A\mid B) 是已知 B 时 A 的概率。独立意味着 P(A∩B)=P(A)P(B)P(A\cap B)=P(A)P(B);“相关小”一般不能推出独立。期望 E[X]\mathbb E[X] 是按概率加权的平均,不保证每次都出现这个数值。

exp⁡(x)=ex\exp(x)=e^x,ln⁡x\ln x 是它的反函数,只对正数定义。对数把乘积变成加法,这会在概率模型中反复出现。

手算一个最小例子

取两个向量 x=(2,3)T\boldsymbol x=(2,3)^T、w=(4,1)T\boldsymbol w=(4,1)^T,内积为 2×4+3×1=112\times4+3\times1=11,欧氏长度为 22+32=13\sqrt{2^2+3^2}=\sqrt{13}。

对数据 2,4,62,4,6,均值为 4,离均差平方和为 4+0+4=84+0+4=8,总体式方差为 8/38/3,样本方差为 8/(3−1)=48/(3-1)=4,样本标准差为 2。两种分母服务不同目的,不能混着比较结果。

设损失 J(w)=(2w−6)2J(w)=(2w-6)^2。链式法则给出 J′(w)=2(2w−6)×2J'(w)=2(2w-6)\times2。在 w=1w=1 处梯度为 -16,学习率 η=0.1\eta=0.1 时:

wnew=w−ηJ′(w)=1−0.1(−16)=2.6.w_{\mathrm{new}}=w-\eta J'(w)=1-0.1(-16)=2.6.

原损失 16,新损失 (5.2−6)2=0.64(5.2-6)^2=0.64。负梯度不是“参数一定减小”,而是让目标局部下降的方向。

建模步骤与完整案例

用三套房组织一个最小预测模型,暂不从数据学习系数,只验证计算过程。

假设单位统一:面积按平方米、卧室按间、租金按百元/月。模型为 y^=0.4 面积+2 卧室+5\hat y=0.4\,\text{面积}+2\,\text{卧室}+5。面积系数的单位是“百元/月/平方米”,卧室系数是“百元/月/间”,截距为“百元/月”。

将特征组织成 XX,权重组织成长度 2 的向量,再加截距。此时模型参数是人为给定的演示值;后续回归课才学习如何从观测估计它们。

Python 实现与结果解释

配套文件:查看或下载本篇完整脚本。

import numpy as np

X = np.array([[50., 2.], [80., 3.], [100., 3.]])
w = np.array([0.4, 2.0])
prediction = X @ w + 5.0
print("形状:", X.shape, w.shape, prediction.shape)
print("预测租金(百元/月):", prediction)
assert np.allclose(prediction, [29., 43., 51.])

values = np.array([2., 4., 6.])
print("均值、样本方差:", values.mean(), values.var(ddof=1))
weight = 1.0
gradient = 4 * (2*weight - 6)
weight -= 0.1 * gradient
print("更新后的参数:", weight)
assert np.isclose(weight, 2.6)

# 条件概率:总共100人,20人带伞;其中12人遇到下雨。
print("已知带伞时下雨的样本比例:", 12/20)

array 将列表转成数值数组;@ 是矩阵乘法;shape 返回尺寸;allclose 判断浮点结果是否在容差内接近。ddof=1 把方差分母改为 n−1n-1。

Python 的 = 是赋值,== 是比较;for i in range(3) 依次产生 0、1、2。切片 a[:2] 取前两项,a[2:] 从第 3 项取到结尾。def 定义函数,return 返回结果。后续示例中的 random_state 或随机种子用于固定可复现的随机过程,不会使模型自动更准确。

方法选择与常见误区

  • 数组 X * w 按元素广播相乘,结果还是一张表;X @ w 才是每行的加权和。
  • 标准差与标准误不同:前者描述个体差异,后者描述估计量的抽样波动。例如均值的标准误常估计为 s/ns/\sqrt n。
  • 导数是局部量,学习率过大仍可能让损失上升。
  • P(A∣B)P(A\mid B) 通常不等于 P(B∣A)P(B\mid A)。上例不能从“带伞者中 60% 遇雨”推出“下雨者中 60% 带伞”。
  • 随机样本的实际平均数通常不会恰好等于理论期望。出现差异不等于计算错误,必须结合样本量看。
  • 浮点数只保留有限精度,例如0.1加0.2可能不与0.3逐位相等。用合理绝对和相对容差检查数值;约为 10−1510^{-15} 的舍入差别不应解释为有业务意义的变化。

练习

  1. XX 为 5×35\times3、w\boldsymbol w 为长度 3,XwX\boldsymbol w 有几个数?
  2. 求 1,3,51,3,5 的均值、样本方差、样本标准差。
  3. J(w)=(w−4)2J(w)=(w-4)^2,从 w=0w=0、学习率 0.25 更新一步得到多少?
  4. 20 个带伞者中 12 人遇雨。如果不知道下雨者总人数,能否算出“雨天带伞比例”?

参考答案

  1. 5 个,每一行对应一个预测。若权重有 4 项,就无法完成这个矩阵乘法。
  2. 均值 3,离均差平方和 8,样本方差 4,样本标准差 2。
  3. 梯度 2(w−4)=−82(w-4)=-8,更新为 0−0.25(−8)=20-0.25(-8)=2,新损失为 4。
  4. 不能。还缺少“遇雨总人数”这个分母;条件概率必须先明确条件所限定的人群。

复习卡片与下一步

复习时检查:会看 n×dn\times d 的样本表;会按行列完成内积;会区分方差与标准误;会解释导数和条件概率。下一篇把这些量放进真实的数据清理流程,再在回归课中学习参数估计。

上一篇 学习地图与完整流程 · 下一篇 数据预处理与插值

参考资料

继续学习本专题