机器学习小白实战【线性回归——预测房价】

前言

今天跟着吴恩达老师的课学习了线性回归,结合Deepseek做了一个房价预测的实验。此篇主要是记录一下我在运行代码过程中遇到的问题及解决方案,顺便把“成本函数”和“梯度下降”这些概念在代码里对应了一下。希望对同样在入门机器学习的朋友有点参考价值,也是给自己留个日后复习的笔记。

一、工具准备与环境配置

我的核心代码用到了两个基础 Python 库:
NumPy:用来处理矩阵运算,算梯度全靠它。
Matplotlib:用来画图。
另外,因为我们要在图表里显示中文,所以加了 SimHei 字体配置,防止出现方框乱码,下面是相关代码,否则会出现下图这种情况。

import numpy as np
import matplotlib.pyplot as plt
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

如下图所示,x轴和y轴都出现了乱码;在这里插入图片描述
添加上方代码后,如下图所示文字显示正常。在这里插入图片描述

二、生成模拟数据

首先使用 numpy 造了 50 套房子的数据。这其中包含起步价、每平米单价和房屋面积。我所设定的房价规则是:房价 = 3(起步价) + 2.5(每平米单价)* 房屋面积。
为了模拟真实世界的波动,加入随机的**“高斯噪音”**。给机器学习增加点不确定性,更符合实际情况。

np.random.seed(42)  # 固定种子,保证每次运行结果一致
m = 50  # 总共50个样本(房子)
# 生成 50 个房屋面积(x),范围在 0~10(百平米)
x = np.random.uniform(0, 10, m)
# 生成对应的房价(y):真实规律加上随机噪音
y = 3 + 2.5 * x + np.random.normal(0, 1, m)

三、定义核心算法

成本函数:模型现在这条线画得有多歪,用均方误差算出一个数字来衡量。模型的目标就是让这个数字越小越好。
梯度下降:告诉模型,“如果想把成本变小,我的 w 和 b 应该往哪个方向挪动多少距离”。通过循环迭代,一步步把参数修正到最准确的值。

# 1. 成本函数:均方误差
def compute_cost(x, y, w, b):
    m = len(y)
    h = w * x + b  # 当前预测房价
    cost = (1 / (2 * m)) * np.sum((h - y) ** 2)
    return cost
# 2. 梯度下降算法:用来找最优的 w 和 b
def gradient_descent(x, y, w_init, b_init, alpha, iterations):
    w = w_init
    b = b_init
    cost_history = []  # 记录每次迭代的成本
    for i in range(iterations):
        h = w * x + b
        # 计算偏导数(梯度)
        grad_w = (1 / m) * np.sum((h - y) * x)
        grad_b = (1 / m) * np.sum(h - y)
        # 沿着梯度的反方向更新参数
        w = w - alpha * grad_w
        b = b - alpha * grad_b
        # 记录当前的损失
        cost = compute_cost(x, y, w, b)
        cost_history.append(cost)
        return w, b, cost_history

四、训练模型

设定好初始参数(从 0 开始)、给定学习率(0.01)和迭代次数(20),开始让模型**“学习”**。

w_init = 0  # 斜率初始值
b_init = 0  # 截距初始值
alpha = 0.01  # 学习率(步长)
iterations = 20  # 迭代次数
final_w, final_b, cost_history = gradient_descent(x, y, w_init, b_init, alpha, iterations)
print(f"真实规律: b=3.0, w=2.5")
print(f"训练结果: b={final_b:.4f}, w={final_w:.4f}")

五、结果可视化

代码跑通之后,我们可以利用matplotlib库画两张图来看看模型到底学到了什么:

plt.figure(figsize=(10, 5))
# 左图:最终拟合结果
plt.subplot(1, 2, 1)
plt.scatter(x, y, color='blue', alpha=0.6, label='原始数据')
x_line = np.linspace(0, 10, 100)
y_line = final_b + final_w * x_line
plt.plot(x_line, y_line, color='red', linewidth=2, label='拟合直线')
plt.xlabel('房屋面积')
plt.ylabel('房价')
plt.title('最终拟合结果')
plt.legend()
plt.grid(True)
# 右图:成本下降过程
plt.subplot(1, 2, 2)
plt.plot(range(iterations), cost_history, color='green', linewidth=2)
plt.xlabel('迭代次数')
plt.ylabel('成本 J')
plt.title('成本下降过程')
plt.grid(True)
plt.tight_layout()
plt.show()

在这里插入图片描述
左图(最终拟合结果):蓝色的点是真实的数据,红色的线是模型学出来的直线。红线完美地穿过蓝点的中心,说明模型找到了规律。
右图(成本下降过程):绿色的线从高处迅速滑落,变成一条平线。这说明梯度下降非常顺利地找到了最低点。从图中也可以看出这个学习速度还是相当快的,我们可以适当减小其学习率,增大迭代次数看看它的表现,如下图:
在这里插入图片描述

六、预测房价

模型训练好了之后,我们便可以用来预测未知的数据。比如,如果有一套房子面积是 6.5(百平米),那它该卖多少钱呢?
直接用刚才训练好的 final_wfinal_b 代入公式即可:预测房价 = final_b + final_w * 面积。

input_area = 6.5  # 未知的新房子面积
predicted_price = final_b + final_w * input_area
print("\n" + "="*30)
print("🏠 预测系统结果:")
print(f"输入面积: {input_area} 百平米")
print(f"预测房价: {predicted_price:.2f} 万元")
print("="*30)

如下图所示,预测房价为19.29万元。在这里插入图片描述

总结

通过今天这个实验,从中确实可以体会到:原来机器学习的本质,就是通过对应的算法(梯度下降算法)让电脑自己去调整一条直线的方程参数!根据已训练的参数来预测未知的数据。
接下来让我们一起走进可多元线性回归逻辑回归

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐