机器学习小白实战【线性回归——预测房价】
机器学习小白实战【线性回归——预测房价】
前言
今天跟着吴恩达老师的课学习了线性回归,结合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_w 和 final_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万元。
总结
通过今天这个实验,从中确实可以体会到:原来机器学习的本质,就是通过对应的算法(梯度下降算法)让电脑自己去调整一条直线的方程参数!根据已训练的参数来预测未知的数据。
接下来让我们一起走进可多元线性回归和逻辑回归!
更多推荐




所有评论(0)