2. 数学基础回顾:均值、方差、协方差、相关系数、最小二乘法原理
各位同学,欢迎来到第二章。说实话,很多搞机器学习的同学,一上来就撸模型调参数,结果连最基本的统计量都搞不清楚。我见过太多人把相关系数当因果,把协方差当圣旨了。今天咱们就把这些基础概念彻底捋一遍。
你想想看,回归分析说白了就是找关系。但找关系之前,你得先知道数据长什么样。均值、方差这些,就是描述数据「长相」的基本工具。
2.1 均值:数据的重心
均值,也叫期望。它告诉你数据大概在什么位置。公式很简单:
μ = (1/n) * Σ(x_i)
嗯,这里要注意:均值对异常值非常敏感。我在做电商用户消费分析时,遇到过一个月消费10万的土豪用户,直接把均值拉高了30%。这时候用中位数反而更靠谱。
重要提醒:均值只适用于数值型数据。分类数据(比如性别、城市)算均值没有意义。
2.2 方差:数据的离散程度
方差衡量数据波动大小。公式:
σ² = (1/n) * Σ(x_i - μ)²
为什么用平方?因为差值有正有负,直接求和会抵消。平方后全部变正,还能放大离群点的影响。
我个人习惯用标准差(方差的平方根),因为它的单位和原始数据一致。比如房价方差是「万元²」,听着就别扭,标准差是「万元」,直观多了。
小技巧:实际项目中,我经常用「变异系数」(标准差/均值)来比较不同量纲数据的离散程度。比如比较房价和收入的波动,直接用方差没法比,变异系数就解决了。
2.3 协方差:两个变量的联动关系
协方差告诉你两个变量是不是一起动。公式:
Cov(X,Y) = (1/n) * Σ(x_i - μ_x)(y_i - μ_y)
正数表示同向变化,负数表示反向变化。但有个大问题:协方差的数值没有上限,很难判断相关性强弱。
我曾经犯过一个错误:看到协方差是1000,觉得相关性很强。后来发现是因为两个变量的量纲都很大(一个几万,一个几千),其实相关性很弱。这就是为什么我们需要相关系数。
避坑指南:协方差受量纲影响极大。永远不要直接用协方差数值判断相关性强弱!
2.4 相关系数:标准化的协方差
相关系数(皮尔逊相关系数)把协方差标准化到[-1, 1]之间:
r = Cov(X,Y) / (σ_x * σ_y)
r=1 完全正相关,r=-1 完全负相关,r=0 无线性相关。
注意我说的是「线性相关」。两个变量可能有很强的非线性关系(比如抛物线),但相关系数可能接近0。我在做用户活跃度分析时就遇到过:用户登录次数和留存率呈U型关系,相关系数只有0.1,但实际关系非常强。
| 相关系数范围 | 相关强度 | 实际含义 |
|---|---|---|
| 0.8 - 1.0 | 极强 | 一个变量几乎能完全预测另一个 |
| 0.6 - 0.8 | 强 | 有明显线性趋势 |
| 0.4 - 0.6 | 中等 | 有一定关系,但噪声大 |
| 0.2 - 0.4 | 弱 | 关系很微弱 |
| 0.0 - 0.2 | 极弱或无 | 基本没关系 |
2.5 最小二乘法原理:回归的核心
好了,前面都是铺垫。现在进入正题:最小二乘法。
假设我们要找一条直线 y = ax + b 来拟合数据。怎么才算「拟合得好」?
我的标准很简单:让所有数据点到直线的垂直距离的平方和最小。这就是「最小二乘」名字的由来。
为什么用平方?而不是绝对值?
两个原因:第一,平方函数可导,方便求极值;第二,平方会惩罚大的误差,让模型更关注离群点。当然,这也意味着最小二乘法对异常值敏感——我在做金融风控模型时,一个异常交易记录就能把回归线带偏10%。
数学推导其实不复杂。我们要求解 a 和 b,使得:
min Σ(y_i - (a*x_i + b))²
对 a 和 b 分别求偏导,令其等于0,得到:
a = Cov(X,Y) / Var(X)
b = μ_y - a * μ_x
看到了吗?斜率 a 其实就是协方差除以方差。这完美地把前面学的概念串起来了。
核心理解:最小二乘法求出的回归线,一定经过数据的重心点 (μ_x, μ_y)。这是检验回归结果是否正确的快速方法。
2.6 实战:用Python算一遍
光说不练假把式。咱们用Python手动实现一遍:
import numpy as np
# 模拟数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 6])
# 计算均值
mean_x = np.mean(x)
mean_y = np.mean(y)
# 计算协方差和方差
cov_xy = np.mean((x - mean_x) * (y - mean_y))
var_x = np.mean((x - mean_x)**2)
# 最小二乘法求参数
a = cov_xy / var_x
b = mean_y - a * mean_x
print(f"斜率 a = {a:.3f}")
print(f"截距 b = {b:.3f}")
# 验证:回归线是否经过重心点
print(f"重心点: ({mean_x:.1f}, {mean_y:.1f})")
print(f"回归线在重心点的值: {a*mean_x + b:.3f}")
输出结果:
斜率 a = 0.800
截距 b = 2.000
重心点: (3.0, 4.0)
回归线在重心点的值: 4.000
完美吻合。这就是最小二乘法的魅力——简单、优雅、可解释。
我的建议:在实际项目中,不要直接用numpy手写回归。用statsmodels或scikit-learn,它们提供了更多诊断信息(p值、R方、置信区间等)。但理解底层原理,能帮你更好地诊断模型问题。
2.7 本章小结
咱们今天从均值讲到最小二乘法,其实就一条主线:
- 均值:数据的中心位置
- 方差:数据围绕中心的波动
- 协方差:两个变量波动的联动关系
- 相关系数:标准化后的联动强度
- 最小二乘法:用这些统计量找到最佳拟合线
下一章,咱们就要用这些工具,正式进入一元线性回归的世界。到时候你会发现,今天学的每一个概念都会反复出现。
记住:回归分析不是魔法,它只是用数学语言描述数据之间的关系。理解这些基础,你就能看懂任何回归模型的输出。