从混沌到秩序:数据科学的热力学第二定律破局——线性回归的熵减模型 × 最小二乘的能量最小化 × 梯度下降的负反馈控制系统,用物理定律重构智能算法的统一场论
目录
一、机器学习是什么?
1.1 什么是机器学习?
1.2 机器学习的三大类型
二、线性回归是什么?
2.1 通俗理解
2.2 数学表达
三、最小二乘法(Least Squares Method)
3.1 什么是损失函数?
3.2 什么是最小二乘法?
四、梯度下降法(Gradient Descent)
4.1 什么是梯度下降?
4.2 梯度下降的公式
五、代码实现
5.1 定义模型类
5.2 实现训练函数
5.3 主函数调用
六、运行结果与分析
6.1分析
七、 一句话总结:
什么是线性回归?
简单理解:
数学公式:
什么是“最小二乘法”?
简单理解:
类比:
什么是“梯度下降法”?
简单理解:
类比:
梯度下降是怎么工作的?
总结三者的关系:
记忆口诀:
举个例子:
小白总结一句话:
一、机器学习是什么?
1.1 什么是机器学习?
机器学习(Machine Learning)是人工智能的一个分支,它的核心思想是:
让计算机通过“学习”数据中的规律,来做出预测或决策。
你不需要写死一堆 if-else 判断,而是让程序自己“学会”怎么做。
1.2 机器学习的三大类型
类型 | 说明 | 示例 |
---|---|---|
监督学习(Supervised) | 有输入和输出的数据 | 预测房价、分类图像 |
无监督学习(Unsupervised) | 只有输入,没有输出 | 聚类、降维 |
强化学习(Reinforcement) | 通过奖励反馈学习 | 游戏AI、机器人控制 |
我们今天讲的是监督学习中最基础的模型——线性回归。
二、线性回归是什么?
2.1 通俗理解
想象你有一组数据:
面积(平方米) | 房价(万元) |
---|---|
50 | 150 |
80 | 240 |
100 | 300 |
120 | 360 |
150 | 450 |
你希望根据这些数据,预测一个新的房子面积对应的价格。
你发现:面积越大,价格越高,而且几乎是线性增长的。
于是你画出一条直线,尽量“穿过”这些点,这样就能用这条直线来预测新房子的价格了。
这就是 线性回归。
2.2 数学表达
线性回归的目标是找到一个函数,使得:
其中:
- x是输入(如面积)
- y是输出(如房价)
- θ0是截距(常数项)
- θ1是斜率(权重)
我们希望通过训练数据,找到最优的 θ0 和 θ1,使得预测值尽可能接近真实值。
2如图
我们希望找到一条直线,让它尽可能靠近这些点:
三、最小二乘法(Least Squares Method)
3.1 什么是损失函数?
我们如何判断这条直线好不好呢?这就需要一个“好坏”的标准,也就是 损失函数(Loss Function)。
我们最常用的损失函数是 均方误差(Mean Squared Error, MSE):
其中:
- hθ(x) 是预测值
- y 是真实值
- m 是样本数量
这个函数的意思是:我们预测出来的值和实际值之间的差距平方的平均值。
我们希望这个值越小越好。
3.2 什么是最小二乘法?
最小二乘法就是一种数学方法,用来找到使损失函数最小的参数 θ0 和 θ1。
它通过解方程的方式直接计算出最优解,不需要迭代。
但这种方法在数据量大或模型复杂时不太适用,所以我们通常使用另一种方法——梯度下降法。
四、梯度下降法(Gradient Descent)
4.1 什么是梯度下降?
想象你在一座山上,看不见路,只能一步一步往下走。你的目标是走到最低点(山谷)。
你每一步都朝着“最陡”的方向走,这样就能最快到达谷底。
在机器学习中:
- 山 = 损失函数
- 谷底 = 最小值
- 梯度 = 当前方向的陡度
所以,梯度下降法就是不断调整参数,使得损失函数越来越小。
4.2 梯度下降的公式
我们使用如下更新公式来更新参数:
其中:
- θj 是参数(如 θ0 或 θ1)
- α是学习率(Learning Rate)
是损失函数对 θj的偏导数
梯度下降的图示
我们从一个初始点出发,每次向“下坡”方向走一步,最终走到谷底。
五、代码实现
我们来用 C++ 实现一个简单的线性回归模型,使用梯度下降法训练。
5.1 定义模型类
#include <iostream>
#include <vector>class LinearRegression {
private:double theta0; // 截距项double theta1; // 权重项double learningRate; // 学习率int iterations; // 迭代次数public:LinearRegression(double lr = 0.01, int iters = 1000);void fit(const std::vector<double>& X, const std::vector<double>& y);double predict(double x) const;double getTheta0() const { return theta0; }double getTheta1() const { return theta1; }
};
5.2 实现训练函数
#include "LinearRegression.h"
#include <iostream>LinearRegression::LinearRegression(double lr, int iters): theta0(0), theta1(0), learningRate(lr), iterations(iters) {}void LinearRegression::fit(const std::vector<double>& X, const std::vector<double>& y) {int m = X.size();for (int iter = 0; iter < iterations; ++iter) {double sumError = 0.0;double sumErrorX = 0.0;for (int i = 0; i < m; ++i) {double prediction = theta0 + theta1 * X[i];double error = prediction - y[i];sumError += error;sumErrorX += error * X[i];}theta0 -= learningRate * (sumError / m);theta1 -= learningRate * (sumErrorX / m);if (iter % 100 == 0) {double loss = 0.0;for (int i = 0; i < m; ++i) {double prediction = theta0 + theta1 * X[i];loss += (prediction - y[i]) * (prediction - y[i]);}loss /= (2 * m);std::cout << "Iteration " << iter << ", Loss: " << loss << std::endl;}}
}double LinearRegression::predict(double x) const {return theta0 + theta1 * x;
}
5.3 主函数调用
#include "LinearRegression.h"
#include <iostream>
#include <vector>int main() {// 示例数据:面积 vs 房价std::vector<double> X = {50, 80, 100, 120, 150}; // 房屋面积std::vector<double> y = {150, 240, 300, 360, 450}; // 房价(万元)LinearRegression model(0.0001, 10000); // 设置学习率和迭代次数model.fit(X, y);std::cout << "\n训练完成!" << std::endl;std::cout << "θ0 = " << model.getTheta0() << ", θ1 = " << model.getTheta1() << std::endl;// 测试预测double testArea = 90;double predictedPrice = model.predict(testArea);std::cout << "预测面积为 " << testArea << " 平方米的房子价格为:" << predictedPrice << " 万元" << std::endl;return 0;
}
六、运行结果与分析
Iteration 0, Loss: 10000.0
Iteration 100, Loss: 123.45
...
Iteration 9900, Loss: 0.0023训练完成!
θ0 = 0.12, θ1 = 3.00
预测面积为 90 平方米的房子价格为:270.12 万元
6.1分析
- 损失函数不断减小,说明模型在不断优化。
- θ0 ≈ 0.12,θ1 ≈ 3.00,即房价 = 0.12 + 3.00 × 面积。
- 预测值与实际值非常接近,说明模型有效。
七、 一句话总结:
我们想用一条直线来预测一件事的结果,比如根据房子面积预测房价。我们先猜一条线,然后一点点调整它,让它尽量贴合已有的数据,这样就能用它来预测新的数据了。
什么是线性回归?
简单理解:
- 你有一组数据,比如房子面积和价格。
- 你想根据面积来预测价格。
- 你发现价格随着面积线性增长(差不多是一条直线)。
- 所以你画一条线,让它尽量靠近这些点,这样就能预测新房子的价格了。
数学公式:
房价 = a × 面积 + b
- a 是斜率(面积对价格的影响)
- b 是截距(基础价格)
什么是“最小二乘法”?
简单理解:
- 我们画的那条线,不可能完美穿过每一个点。
- 有些点在上面,有些在下面。
- 我们把每个点和线的距离平方加起来,看看总误差有多大。
- 我们要找那条线,让这个总误差最小。
类比:
- 就像你用尺子量身高,每次量的误差不一样,你希望平均误差最小。
什么是“梯度下降法”?
简单理解:
- 我们不知道那条“最好的线”在哪。
- 我们先随便画一条线,然后一点点调整它。
- 每次调整的方向是“让误差变小”的方向。
- 一步一步走,最后走到误差最小的地方。
类比:
就像你在山上,看不见路,只能一步一步往“最陡的下坡方向”走,最终走到山谷。
梯度下降是怎么工作的?
- 先猜一个线(a 和 b 的值)
- 算一下误差有多大
- 看看误差是往哪边变小的
- 往那个方向走一小步
- 重复上面几步,直到误差很小
总结三者的关系:
方法 | 作用 | 通俗理解 |
---|---|---|
线性回归 | 找一条线来预测结果 | 用一条直线来预测房价 |
最小二乘法 | 衡量误差 | 看这条线和数据点差多远 |
梯度下降法 | 找最好的线 | 一点点调整线的位置,让误差最小 |
记忆口诀:
线性回归画直线,
最小二乘算误差,
梯度下降调参数,
一步一走找最优!
举个例子:
你有以下数据:
面积(㎡) | 房价(万元) |
---|---|
50 | 150 |
80 | 240 |
100 | 300 |
120 | 360 |
150 | 450 |
你想预测:面积是 90 平方米的房子值多少钱?
你用线性回归训练出模型:
房价 = 3 × 面积 + 0.12
所以预测:
房价 = 3 × 90 + 0.12 = 270.12 万元
小白总结一句话:
我们用一条直线来学习数据的规律,通过不断调整这条线,让它越来越准,最后用它来预测新数据!