一、实验目标

在本实验中,你将学习:

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

二、问题陈述

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

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

| 2.0 | 500 |

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

三、环境准备

3.1 安装依赖库

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

pip install numpy matplotlib

3.2 导入库

import numpy as np
import matplotlib.pyplot as plt

四、实验步骤

4.1 创建训练数据集

# 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 查看训练样本数量

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

运行结果:

x_train.shape: (2,)
训练样本数量是: 2

4.3 绘制数据点

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

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,看看这条直线是否适合我们的数据:

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

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千平方英尺)的房价:

w = 200
b = 100
x_i = 1.2
price = w * x_i + b

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

运行结果:

预测价格: $340 千美元

五、实验总结

通过本实验,你学到了:

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

六、完整代码

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

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
模型预测 参数确定后,可以对新数据进行预测

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐