今日目标
- 理解平均值的计算
- 理解平方的含义
- 掌握直线方程 y = wx + b
- 能在纸上画出不同w和b对应的直线
学习内容
1. 平均值
平均值的公式:
平均值 = 所有数之和 ÷ 数的个数
Python实现:
数据 = [1, 3, 5, 7, 9]
总和 = 0
for x in 数据:
总和 += x
平均值 = 总和 / len(数据)
print(平均值) # 输出 5.0
更简洁的写法:
数据 = [1, 3, 5, 7, 9]
平均值 = sum(数据) / len(数据)
print(平均值) # 输出 5.0
2. 平方
平方的含义:一个数乘以它自己。
x = 5
平方 = x * x
print(平方) # 输出 25
为什么模型训练要用平方?
假设真实值是5,模型预测值是3,误差是2。
如果用绝对值:|3 - 5| = 2
如果用平方:(3 - 5)² = (-2)² = 4
平方的好处:
- 负数变正数,不会抵消
- 大误差惩罚更重(误差越大,平方后差距越大)
- 求导方便
举例对比:
| 误差 | 绝对值 | 平方 |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 4 |
| 3 | 3 | 9 |
| 10 | 10 | 100 |
可以看到,平方对大误差的惩罚明显更重。
3. 直线方程 y = wx + b
这是所有线性模型的根基。
- w(权重/斜率):x每增加1,y增加多少
- b(偏置/截距):当x=0时,y的值
示例:
def 直线方程(x, w, b):
"""计算直线上的点"""
return w * x + b
# w=2, b=1 时
for x in range(5):
y = 直线方程(x, 2, 1)
print(f"x={x}, y={y}")
输出:
x=0, y=1
x=1, y=3
x=2, y=5
x=3, y=7
x=4, y=9
4. 可视化理解w和b的作用
import matplotlib.pyplot as plt
x_values = [0, 1, 2, 3, 4, 5]
# 不同的w
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
for w in [0.5, 1, 2, 3]:
y = [w * x for x in x_values]
plt.plot(x_values, y, label=f"w={w}, b=0")
plt.xlabel("x")
plt.ylabel("y")
plt.title("不同w的效果(b=0)")
plt.legend()
plt.grid(True)
# 不同的b
plt.subplot(1, 2, 2)
for b in [-2, 0, 2, 4]:
y = [1 * x + b for x in x_values]
plt.plot(x_values, y, label=f"w=1, b={b}")
plt.xlabel("x")
plt.ylabel("y")
plt.title("不同b的效果(w=1)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("/tmp/w_b_visualization.png")
print("图表已保存到 /tmp/w_b_visualization.png")
今日练习
练习1:计算平均值
scores = [85, 92, 78, 95, 88]
# 方法1:手动计算
total = 0
for s in scores:
total += s
avg1 = total / len(scores)
# 方法2:用sum函数
avg2 = sum(scores) / len(scores)
print(f"平均分:{avg1}")
print(f"验证:{avg2}")
练习2:计算均方误差
真实值 = [1, 3, 5, 7, 9]
预测值 = [1.5, 2.8, 5.2, 6.9, 9.5]
# 计算每个预测的误差平方
误差平方列表 = []
for 真实, 预测 in zip(真实值, 预测值):
误差 = 预测 - 真实
误差平方 = 误差 ** 2
误差平方列表.append(误差平方)
print(f"真实={真实}, 预测={预测}, 误差={误差:.2f}, 误差平方={误差平方:.2f}")
# 计算均方误差
mse = sum(误差平方列表) / len(误差平方列表)
print(f"\n均方误差(MSE):{mse:.4f}")
练习3:画直线
# 在纸上或代码中,画出以下三条直线,观察它们的区别
# 1. y = 0*x + 1 (水平线)
# 2. y = 1*x + 0 (45度斜线)
# 3. y = 2*x + 1 (更陡的斜线)
for w, b in [(0, 1), (1, 0), (2, 1)]:
print(f"\nw={w}, b={b} 时:")
for x in range(5):
y = w * x + b
print(f" x={x}, y={y}")
验收标准
- 能手动计算一组数据的平均值
- 能解释为什么用平方而不是绝对值
- 能说出w和b分别控制直线的什么特性
- 给定w和b,能计算出对应直线上任意点的坐标
下节课预告
下节课将学习数据准备:如何组织训练数据、特征与标签的概念。

8129

被折叠的 条评论
为什么被折叠?



