机器学习中的Hello World:线性回归(一)

人工智能与世界模型# 系列文章目录

第一章 数学基础(一)导数、偏导数、方向导数与梯度
第二章 数学基础(二)向量、矩阵、行列式与线性变换

第三章 机器学习中的Hello World:线性回归(一)


文章目录


前言

在人工智能与世界模型的宏大叙事中,我们首先要从最基础、最核心的模型开始。如果说编程世界的"Hello World"是打印一句"Hello World",那么在机器学习领域,线性回归(Linear Regression)就是那个入门的基石。

线性回归不仅是理解机器学习流程的起点。它的核心思想是:找到一个最合适的线性函数,来拟合输入数据与输出数据之间的关系。

本文将平衡理论推导与代码实践,带你彻底掌握线性回归的数学原理、求解方法,并用 Python/Numpy 从零实现它。


一、需求引入

现在你收集了一些房屋的平米数和价格数据,你想通过这些数据进行分析,实现给你任意一个平米数对于其价格进行预测

假设其平米数与价格的关系图如下:

下面,我们将通过这批数据对此功能进行拆解分析实现

二、一元线性回归

2.1 假设函数

根据上面的关系图不难看出,数据中房子的平米数与价格基本呈线性关系。

因此我们可以假设:

P r i c e = w ∗ A r e a + b Price = w * Area + b Price=w∗Area+b

其中w和b为未知数,由此,我们只要确定了w和b的值,就可以完成需求的功能。

将其进行通用化处理,就得到了一元线性回归假设函数:

H ( x ) = w ⋅ x + b H(x) = w·x+b H(x)=w⋅x+b

2.2 损失函数

现在的任务是找到最为合适的w和b,最为粗暴的方法其实是,暴力遍历,即挨个试。虽说这种方式的效率低下,但是确实是可以在一定程度上解决的。

但即便是用暴力破解的方法,依旧存在一个问题,即什么样的w和b是好的,如何评估这种好坏?

我们通常说图一的w和b是好的,而图二是一个糟糕的

图一

图二

这很直观,但是这样的东西计算机是看不懂的,我们必须对其进行量化,为什么图一比图二好,好多少,我们需要一个指标进行评估。

如上图所示,每个数据点到回归线的距离是该数据点预测值和真实值的偏差。

e i = ∣ H ( x i ) − y i ∣ e_i = |H(x_i) - y_i| ei=∣H(xi)−yi∣

然而,一个公式或者函数存在绝对值,对于后续的计算是相对麻烦的。绝对值在其中的意义为确保所有数为正数,因此我们可以换一种保证结果为正的计算方式---平方。

平方对比绝对值的优点:

  1. 绝对值会使整个函数变复杂
  2. 绝对值存在一点不可导
  3. 平方会放大偏差较大的项

因此变形后的偏差为

e i = ( H ( x i ) − y i ) 2 e_i = (H(x_i) - y_i)^2 ei=(H(xi)−yi)2

所有数据的平均偏差为:

e = 1 m ∑ i = 1 m ( H ( x i ) − y i ) 2 e = \frac{1}{m}\sum_{i=1}^{m}(H(x_i) - y_i)^2 e=m1∑i=1m(H(xi)−yi)2

e便能用于评估w和b好不好,e越小,w和b越好;反之,则越糟糕。

这种评估一个拟合的好与坏的函数则被称之为损失函数。

而e稍加修饰则是线性回归中最常用的损失函数---均方误差(MSE):

L ( w , b ) = 1 2 m ∑ i = 1 m ( H ( x i ) − y i ) 2 L(w, b) = \frac{1}{2m} \sum_{i=1}^{m} (H(x_i) - y_i)^2 L(w,b)=2m1∑i=1m(H(xi)−yi)2

  • 1 2 \frac{1}{2} 21 是为了在求导时抵消平方项产生的 2,方便计算,不影响最终结果。

  • L ( w , b ) L(w, b) L(w,b) 是关于 w, b 的函数,我们称之为损失函数。

2.3 优化目标

我们的核心任务就是找到一组最优的权重 w , b w, b w,b,使得损失函数 L ( w , b ) L(w, b) L(w,b) 达到最小值:

( w , b ) ∗ = arg ⁡ min ⁡ w , b L ( w , b ) (w, b)^* = \arg \min_{w, b} L(w, b) (w,b)∗=argminw,bL(w,b)

由于 L ( w , b ) L(w, b) L(w,b) 是一个关于 w , b w, b w,b 的凸函数(碗状),它只有一个全局最小值,因此我们可以放心使用优化算法来寻找这个最低点。

优化方式分为两种:一种是计算解析解,一种是计算迭代解(下一章的多元线性回归讲)

最小二乘法(解析解/正规方程)

最小二乘法(Ordinary Least Squares, OLS)是一种解析解方法,它通过直接求解方程来一步到位地找到最优解。

原理: 要找到 L ( w , b ) L(w, b) L(w,b) 的最小值,我们只需要对 w , b w, b w,b 求偏导,并令导数等于零。

∂ L ( w , b ) ∂ w = 1 m ∑ i = 1 m ( ( w x i + b − y i ) x i ) = 0 \frac{\partial L(w, b)}{\partial w} = \frac{1}{m}\sum_{i=1}^{m}((wx_i+b-y_i)x_i) = 0 ∂w∂L(w,b)=m1∑i=1m((wxi+b−yi)xi)=0

∂ L ( w , b ) ∂ b = 1 m ∑ i = 1 m ( w x i + b − y i ) = 0 \frac{\partial L(w, b)}{\partial b} = \frac{1}{m}\sum_{i=1}^{m}(wx_i+b-y_i) = 0 ∂b∂L(w,b)=m1∑i=1m(wxi+b−yi)=0

推导结果(正规方程 Normal Equation): 经过矩阵求导和代数运算,我们可以直接得到最优权重 ( w , b ) ∗ (w, b)^* (w,b)∗ 的表达式:

w ∗ = ∑ i = 1 m x i y i − x i b ∑ i = 1 m x i w^* = \frac{\sum_{i=1}^{m}x_iy_i-x_ib}{\sum_{i=1}^{m}x_i} w∗=∑i=1mxi∑i=1mxiyi−xib

b ∗ = ∑ i = 1 m y i − w x i m b^* = \frac{\sum_{i=1}^{m}y_i - wx_i}{m} b∗=m∑i=1myi−wxi

从零实现正规方程求解线性回归

python 复制代码
def get_data():
    # 设置随机数种子以便结果可复现
    np.random.seed(0)
    
    # 生成房屋面积数据(平米),范围从50到200平米
    area = np.random.uniform(50, 200, 100)
    
    # 假设基础价格为每平米5000元,并且加入一些随机性来模拟真实情况
    # 这里我们给价格添加了一个与面积相关的非线性项和一些随机噪声
    price_per_square_meter = 5000
    nonlinear_effect = area * 0.6 - (area - 125) ** 2 * 0.004  # 添加非线性影响
    noise = np.random.normal(0, 50000, size=area.shape)  # 随机噪声
    price = (area * price_per_square_meter + nonlinear_effect + noise) / 10000
    return area, price

# 正规方程求解线性回归
class LinearRegressionOLS:
    def __init__(self):
        # 初始化随机一个w和b
        self.w = np.random.normal(0, 1)
        self.b = np.random.normal(0, 1)

    def fit(self, x, y):
        # 使用正规方程求得最优的w和b
        self.w = np.sum((x * y) - (x * self.b)) / np.sum(x**2)
        self.b = np.sum(y - (self.w * x)) / len(x)

    def predict(self, x):
        return self.w * x + self.b

    def cal_MSE(self,x, y):
        # 计算当前的mse
        return np.sum((self.predict(x) - y) ** 2) / (2 * len(x))

model = LinearRegressionOLS()
x, y = get_data()
print("优化之前的mse:")
print(model.cal_MSE(x, y))
model.fit(x, y)
print("优化之后的mse:")
print(model.cal_MSE(x, y))

# 绘制散点图以及最佳拟合线
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.7)
plt.title('House Price vs. Area with Best Fit Line and Residuals')
plt.xlabel('Area (square meters)')
plt.ylabel('Price (W)')
plt.grid(True)

# 使用这个最好的模型计算预测值
price_predicted_best = model.predict(x)

# 在图中添加这条"最佳"的拟合线
plt.plot(area, price_predicted_best, color='red', label='Best fit line')

运行结果:


总结

本文对于单元线性回归进行了系统的拆解讲述,由于篇幅问题多元线性回归放在下一个章节。

相关推荐
serve the people1 小时前
机器学习(ML)和人工智能(AI)技术在WAF安防中的应用
人工智能·机器学习
0***K8921 小时前
前端机器学习
人工智能·机器学习
陈天伟教授1 小时前
基于学习的人工智能(5)机器学习基本框架
人工智能·学习·机器学习
m0_650108242 小时前
PaLM-E:具身智能的多模态语言模型新范式
论文阅读·人工智能·机器人·具身智能·多模态大语言模型·palm-e·大模型驱动
zandy10112 小时前
2025年11月AI IDE权深度测榜:深度分析不同场景的落地选型攻略
ide·人工智能·ai编程·ai代码·腾讯云ai代码助手
欢喜躲在眉梢里2 小时前
CANN 异构计算架构实操指南:从环境部署到 AI 任务加速全流程
运维·服务器·人工智能·ai·架构·计算
0***R5152 小时前
人工智能在金融风控中的应用
人工智能
2501_941403762 小时前
人工智能赋能智慧金融互联网应用:智能风控、个性化理财与金融服务优化实践探索》
人工智能
合作小小程序员小小店2 小时前
web网页,在线%抖音,舆情,线性回归%分析系统demo,基于python+web+echart+nlp+线性回归,训练,数据库mysql
python·自然语言处理·回归·nlp·线性回归
youngerwang2 小时前
【字节跳动 AI 原生 IDE TRAE 】
ide·人工智能·trae