ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

最小二乘法的解析

2026/8/14 13:45:00 拓冰建站 浏览量
最小二乘法的解析 假设人饭量 X (碗)体重 Y (斤)小明162比预期重了2斤小红268比预期轻了2斤小刚382比预期重了2斤数据1,62、2,68、3,82来手算。第一步写出“总误差平方和”的式子假设我们猜的直线是 YaXb。当 X1预测值是 ab误差是 62−(ab)当 X2预测值是 2ab误差是 68−(2ab)当 X3预测值是 3ab误差是 82−(3ab)总误差平方和记作 SS(62−a−b)2(68−2a−b)2(82−3a−b)2最小二乘法的目标找到合适的 a 和 b让这个 S最小。第二步求偏导等于 0变成两个“普通方程”“求偏导”的数学含义把 S 分别对 a 和 b 求导并令其等于 0。你可以理解为“当误差平方和降到谷底时它再也下不去了”。我们把上面那个复杂的平方式子分别求导化简后神奇地变成了下面这两个简单的二元一次方程组方程①对 b 求导化简6a3b212方程②对 a 求导化简14a6b444如果你好奇怎么变的就是把括号里的常数相加把 aa 和 bb 的系数归类和中学的合并同类项完全一样。第三步解这个“二元一次方程组”我们现在有两个方程6a3b21214a6b444消元法把第一个方程两边同时乘以 2让 b 的系数变成和第二个方程一样方程① × 2 得12a6b424 ……③用方程② 减去 ③(14a−12a)(6b−6b)444−4242a20所以a10斜率出来了把 a10a10 代回最简单的方程①6×103b212603b2123b152所以b152/3≈50.67截距出来了最终结果验证把 a10,b50.6 代回预测公式Y10X50.67X1 时预测 60.67真实 62误差 1.33X2 时预测 70.67真实 68误差 -2.67X3 时预测 80.67真实 82误差 1.33算一下误差平方和1.332(−2.67)21.332≈1.777.131.7710.67这个 10.67完美验证了“最小”二字。我们用协方差可以更快地方式求的a和b的值1,62、2,68、3,82这三个数第 1 步算出 X 和 Y 的平均值小学数学X 的平均值记作 Xˉ(123)÷32(123)÷32Y 的平均值记作 Yˉ(626882)÷370.67第 2 步列一张“三列”小表格这是口算的关键我们算一下每个数离平均值有多远这叫“中心化”数据点X 的离差X - 平均值2Y 的离差Y - 平均值70.67乘积判断步调① × ②X离差的平方① × ①点1 (1,62)1 - 2 -162 - 70.67 -8.67(-1) × (-8.67) 8.67(-1)² 1点2 (2,68)2 - 2 068 - 70.67 -2.670 × (-2.67) 00² 0点3 (3,82)3 - 2 182 - 70.67 11.33(1) × 11.33 11.331² 1求和分子总和 20分母总和 2第 3 步直接套公式两秒出斜率第 4 步口算截距 b附赠一个铁律统计学有个铁律最优直线一定会穿过X的平均值和Y的平均值的那个交叉点即点 (Xˉ,Yˉ)。既然直线是 YaXb把平均值点2, 70.67和刚算的斜率 10 代进去70.6710×2bb70.67−2050.67一定要从最简单的方式去了解他的原理方可举一反三。最小二乘法 ≠ 线性回归最小二乘法是线性回归的“金牌打工人”专门负责帮它算出最优的斜率和截距。最小二乘法编程java实现python更简单方法一public static void main(String[] args) { double[] x {4.6, 5.25, 8.9, 3.4, 1.6, 10.1, 4.8}; double[] y {108, 114, 130, 114, 106, 150, 122}; int n x.length; double sumX 0, sumY 0, sumXY 0, sumX2 0; for (int i 0; i n; i) { sumX x[i]; sumY y[i]; sumXY x[i] * y[i]; sumX2 x[i] * x[i]; } // 极简公式仅适用于一元线性回归 double a (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX); double b (sumY - a * sumX) / n; System.out.printf(拟合直线为Y %.4f X %.4f\n, a, b); // 预测 X 6.2 时的值 double pred a * 6.2 b; System.out.printf(当 X6.2 时预测 Y %.2f\n, pred); }方法二梯度下降法球a和bpublic static void main(String[] args) { double[] x {4.6, 5.25, 8.9, 3.4, 1.6, 10.1, 4.8}; double[] y {108, 114, 130, 114, 106, 150, 122}; double a 0, b 0; double rate 0.0001; // 学习率步长 // 迭代 1000 次让 a,b 自动逼近最优值 for (int iter 0; iter 2000; iter) { double dS_da 0, dS_db 0; for (int i 0; i x.length; i) { double pred a * x[i] b; double error y[i] - pred; dS_da -2 * x[i] * error; // 等价于 2*error*(-x[i]) dS_db -2 * error; } // 更新参数减去梯度 a - rate * dS_da; b - rate * dS_db; } System.out.printf(迭代后a%.4f, b%.4f\n, a, b); System.out.printf(预测 X6.2: Y%.2f\n, a * 6.2 b); }