吴恩达机器学习课程实验:线性回归模型入门(课后实验)

一、实验目标

在本实验中,你将学习:

  • 实现基于单变量的线性回归模型
  • 理解模型参数 w(权重)和 b(偏置)的作用
  • 使用训练好的模型进行房价预测

二、问题陈述

我们将使用课程中的房价预测例子:

面积 (1000 sqft) 价格 (1000s of dollars)
1.0 300

| 2.0 | 500 |

通过这两个数据点,我们想要拟合一条直线(线性回归模型),然后用它来预测其他面积的房价,比如1200平方英尺的房子。

三、环境准备

3.1 安装依赖库

3.1.1、在PycharmProjects里面创建test.ipynb文件

bash 复制代码
pip install numpy matplotlib

3.2 导入库

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

四、实验步骤

4.1 创建训练数据集

python 复制代码
# x_train: 房屋面积(单位:1000平方英尺)
# y_train: 房屋价格(单位:1000美元)
x_train = np.array([1.0, 2.0])
y_train = np.array([300.0, 500.0])

print(f"x_train = {x_train}")
print(f"y_train = {y_train}")

运行结果:

复制代码
x_train = [1. 2.]
y_train = [300. 500.]

4.2 查看训练样本数量

python 复制代码
print(f"x_train.shape: {x_train.shape}")
m = x_train.shape[0]
print(f"训练样本数量是: {m}")

运行结果:

复制代码
x_train.shape: (2,)
训练样本数量是: 2

4.3 绘制数据点

python 复制代码
plt.scatter(x_train, y_train, marker='x', c='r')
plt.title("房价数据")
plt.ylabel('价格 (千美元)')
plt.xlabel('面积 (千平方英尺)')
plt.show()

输出图像:

图中显示了两个红色的叉号,分别代表(1.0, 300)和(2.0, 500)两个数据点。

4.4 定义线性回归模型函数

线性回归模型公式为:f_wb(x) = w * x + b

python 复制代码
def compute_model_output(x, w, b):
    """
    计算线性模型的预测值
    
    参数:
      x (ndarray (m,)): 包含m个样本的数据
      w, b (scalar)    : 模型参数
    
    返回:
      y (ndarray (m,)): 预测值
    """
    m = x.shape[0]
    f_wb = np.zeros(m)
    for i in range(m):
        f_wb[i] = w * x[i] + b
    return f_wb

4.5 尝试不同的参数

我们先尝试 w = 100, b = 100,看看这条直线是否适合我们的数据:

python 复制代码
w = 100
b = 100
tmp_f_wb = compute_model_output(x_train, w, b)

plt.plot(x_train, tmp_f_wb, c='b', label='我们的预测')
plt.scatter(x_train, y_train, marker='x', c='r', label='实际数据')
plt.title("房价预测 (w=100, b=100)")
plt.ylabel('价格 (千美元)')
plt.xlabel('面积 (千平方英尺)')
plt.legend()
plt.show()

输出图像:

可以看到,蓝色直线并没有穿过两个红色数据点,说明参数 w=100, b=100 不合适。

4.6 找到合适的参数

通过计算斜率:

  • 斜率 = (500 - 300) / (2 - 1) = 200
  • 代入第一个点:300 = 200 × 1 + b → b = 100

所以正确答案是 w = 200, b = 100

python 复制代码
w = 200
b = 100
tmp_f_wb = compute_model_output(x_train, w, b)

plt.plot(x_train, tmp_f_wb, c='b', label='我们的预测')
plt.scatter(x_train, y_train, marker='x', c='r', label='实际数据')
plt.title("房价预测 (w=200, b=100)")
plt.ylabel('价格 (千美元)')
plt.xlabel('面积 (千平方英尺)')
plt.legend()
plt.show()

输出图像:

现在蓝色直线完美地穿过了两个红色数据点,说明我们找到了合适的参数。

4.7 使用模型进行预测

预测1200平方英尺(即1.2千平方英尺)的房价:

python 复制代码
w = 200
b = 100
x_i = 1.2
price = w * x_i + b

print(f"预测价格: ${price:.0f} 千美元")

运行结果:

复制代码
预测价格: $340 千美元

五、实验总结

通过本实验,你学到了:

知识点 说明
线性回归模型 建立特征(面积)与目标(价格)之间的线性关系
模型参数 w(权重)和 b(偏置),通过训练数据来拟合
模型预测 参数确定后,可以用模型对新数据进行预测

六、完整代码

以下是本实验的完整代码(可直接复制运行):

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# 1. 创建训练数据
x_train = np.array([1.0, 2.0])
y_train = np.array([300.0, 500.0])

# 2. 定义模型函数
def compute_model_output(x, w, b):
    m = x.shape[0]
    f_wb = np.zeros(m)
    for i in range(m):
        f_wb[i] = w * x[i] + b
    return f_wb

# 3. 找到合适的参数 w=200, b=100
w = 200
b = 100

# 4. 计算预测值并绘图
tmp_f_wb = compute_model_output(x_train, w, b)

plt.plot(x_train, tmp_f_wb, c='b', label='预测')
plt.scatter(x_train, y_train, marker='x', c='r', label='实际数据')
plt.title("房价预测")
plt.ylabel('价格 (千美元)')
plt.xlabel('面积 (千平方英尺)')
plt.legend()
plt.show()

# 5. 预测1200平方英尺的房价
x_i = 1.2
price = w * x_i + b
print(f"预测价格: ${price:.0f} 千美元")

七、思考题

问题:三个数据点 (1,300)、(2,500)、(3,700) 时,w 和 b 应该是多少?

计算斜率(任选两点):

用 (1,300) 和 (2,500):

w = (500-300)/(2-1) = 200

代入求 b:

300 = 200×1 + b → b = 100

验证第三个点:

x=3:200×3+100 = 700 ✅

答案:w=200, b=100

结论:这三个点恰好在同一条直线上,所以存在一条直线同时穿过三个点。

如果三个点不在同一条直线上怎么办?

例如 (1,300)、(2,500)、(3,650):

用前两个点算出 w=200, b=100

但 x=3 时预测值为 700,实际为 650,误差为 50

这时没有任何一条直线能同时穿过三个点。机器学习要做的就是找到一条误差最小的直线,这正是梯度下降算法要解决的问题。

八、实验结论

知识点 说明

线性回归模型 建立特征与目标之间的线性关系:f(x) = w×x + b

w(权重) 控制直线的斜率,决定每单位特征变化对预测值的影响

b(偏置) 控制直线的截距,决定特征为0时的基准预测值

模型拟合 两个数据点可以唯一确定一条直线,需要找到正确的 w 和 b

模型预测 参数确定后,可以对新数据进行预测

相关推荐
Raink老师1 小时前
【AI面试临阵磨枪-99】纯浏览器 Agent:记忆、工具、RAG、流式、安全如何实现?
人工智能·安全·面试
ChillCoding1 小时前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
jimi11261 小时前
从零理解 Transformer
人工智能·深度学习·nlp
Ada's1 小时前
【解决方案设计】001:类型
人工智能
段一凡-华北理工大学1 小时前
工业领域的Hadoop架构学习~系列文章18:制造业Hadoop应用实践 - 从数据到智能的完整闭环
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
用户938515635071 小时前
从模块化到 Prompt 工程:我用 Node.js + LLM 复刻了传统 NLP 的流程
javascript·人工智能·node.js
智者知已应修善业1 小时前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
贵慜_Derek1 小时前
《从零实现 Agent 系统》连载 20|MCP 与 Code Execution:协议、档位与 Sidecar
人工智能·设计模式·架构
冬奇Lab1 小时前
AI Agent 找代码:多仓库多技术栈下的代码定位工程
人工智能·agent·代码规范