code/08-neural-nets/linear_regression.py
48 行 · 1.6 KB程式碼和執行結果保留原樣(簡體中文),與實際執行時完全一致。
"""用一条直线拟合"面积 → 房价":定义模型、定义损失,再用最笨的办法找最好的那条直线。
python linear_regression.py
只用 numpy,不调用任何 API。固定了随机种子,你运行的结果应该和课里完全一样。
"""
import time
import numpy as np
rng = np.random.default_rng(0)
# 造一组数据:房价(万元)= 1.2 × 面积(平方米)+ 20,再加上一些随机的波动
area = rng.uniform(40, 150, size=50)
price = 1.2 * area + 20 + rng.normal(0, 12, size=50)
print("前 5 套房子:")
for a, p in zip(area[:5], price[:5]):
print(f" {a:6.1f} 平方米 {p:6.1f} 万元")
def predict(w, b, x):
"""模型:一条直线。w 是斜率(每平方米多少万),b 是截距。"""
return w * x + b
def mse(w, b):
"""损失:预测值和真实值之差的平方,取平均。"""
errors = predict(w, b, area) - price
return np.mean(errors ** 2)
print("\n随手猜几条直线,看看误差:")
for w, b in [(1.0, 0.0), (1.0, 30.0), (1.5, 0.0), (1.2, 20.0)]:
print(f" w={w:<4} b={b:<5} 均方误差 {mse(w, b):9.1f}")
# 最笨的办法:把 w 和 b 在一个范围里每隔一小格都试一遍
start = time.time()
best = (None, None, float("inf"))
tries = 0
for w in np.arange(0.0, 3.0, 0.01):
for b in np.arange(-50.0, 100.0, 0.5):
tries += 1
loss = mse(w, b)
if loss < best[2]:
best = (w, b, loss)
print(f"\n网格搜索:试了 {tries} 条直线,用了 {time.time() - start:.1f} 秒")
print(f" 最好的一条:w={best[0]:.2f} b={best[1]:.1f},均方误差 {best[2]:.1f}")