一、实验目标
在本实验中,你将学习:
- 实现基于单变量的线性回归模型
- 理解模型参数
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
模型预测 参数确定后,可以对新数据进行预测