加权求和
神经网络每天做的事,其实和老师算总分差不多: 把几个数乘上各自的份量,再全部加起来。 这一课我们从一张成绩单出发,把这件事彻底玩明白。
一张成绩表
先认识十位同学。点任意一行,看看他的总分和平均分。
| 姓名 | 语文 | 数学 | 英语 |
|---|---|---|---|
| 小明 | 85 | 92 | 88 |
| 小红 | 90 | 78 | 95 |
| 乐乐 | 72 | 88 | 70 |
| 甜甜 | 95 | 82 | 90 |
| 阿强 | 68 | 99 | 65 |
| 朵朵 | 88 | 90 | 92 |
| 浩浩 | 76 | 85 | 80 |
| 小美 | 93 | 70 | 86 |
| 天天 | 80 | 94 | 78 |
| 果果 | 98 | 88 | 91 |
小提示:点表格里的名字,或者用键盘 Tab 选中后按 Enter。
总分和平均分
加法大家都熟。平均分,就是先加再平分。
总分
总分 = 语文 + 数学 + 英语平均分
平均分 = 总分3 = 语文 + 数学 + 英语3三门课一样重要,所以直接除以 3。可以理解成:每门课各占 1/3 的份量。
让分数走一遍
框图里的箭头,就是数据流动的方向。
用 Python 写出来
score1 = float(input("语文成绩:"))
score2 = float(input("数学成绩:"))
score3 = float(input("英语成绩:"))
score_sum = score1 + score2 + score3
score_avg = score_sum / 3
print("总分:", score_sum)
print("平均分:", score_avg)
不能了。这就轮到下一节的权重出场。
加权平均分
每门课不再一样重要。份量大的科目,对结果影响更大——这个份量就叫权重。
权重表
| 学科 | 百分比 | 小数 |
|---|---|---|
| 语文 | 35% | 0.35 |
| 数学 | 40% | 0.40 |
| 英语 | 25% | 0.25 |
35% 就是 35/100,也就是 0.35。三个权重加起来 = 100% = 1。
加权分 =语文×0.35 + 数学×0.40 + 英语×0.25
🧪 权重复验室
权重合计 100%当前同学:小明(回到上面点别的名字可以换人)。分数和权重都可以改。
⚠️ 权重合计不是 100%,这样算出来的不是“平均分”哦。
算出来的式子
两种算法只差 0.22 分——现在的权重还挺均衡的。
比一比
百分比版本
加权分 = 85×35 + 92×40 + 88×25100 = 88.55记号版本
加权分 = Σi=1n xi × wiΣ 读作“西格玛”,意思就是“把后面这些东西全部加起来”。神经网络里到处是它。
用循环,一步一步加上去
科目变多时,一项一项手写太累。让循环替我们做:每转一圈,就把一项乘积累加进总和。
weights = [0.35, 0.40, 0.25]scores = [85, 92, 88] weighted_sum = 0for i in range(len(scores)): weighted_sum = weighted_sum + scores[i] * weights[i] print("加权平均成绩:", weighted_sum)
高亮的那一行,就是这一轮正在执行的代码。
点「下一步」,开始第一轮循环。
注意:代码里的 scores[0] 是第 1 项。Python 从 0 开始编号,Scratch 从 1 开始。
生活里的加权
成绩单只是开始。只要一件事由几部分组成,而它们的重要性不一样,就会用到加权。
例 1:期末总评
作业 30% · 期中 30% · 期末 40%
期末占 40%,所以期末考得好,总评更占便宜。拖动期末分数试试。
例 2:面试打分
简历 20% · 笔试 30% · 面试 50%。面试权重最高,最能决定结果。
Scratch 和 Python 对照
课上的例子,两种语言都能写。左边看 Scratch,右边看 Python。
基本运算
| Scratch | Python | |
|---|---|---|
| 加法 | ◖( ) + ( )◗ | a + b |
| 减法 | ◖( ) − ( )◗ | a - b |
| 乘法 | ◖( ) × ( )◗ | a * b |
| 除法 | ◖( ) ÷ ( )◗ | a / b |
Python 里乘号是 *,除号是 /,和数学课上写的不一样。
列表操作
| 做什么 | Python |
|---|---|
| 新建列表 | list = [] |
| 加到末尾 | list.append(123) |
| 删除某一项 | del list[0] |
| 全部删除 | list.clear() |
| 插入 | list.insert(0, 123) |
| 替换 | list[0] = 123 |
| 取出某一项 | list[0] |
| 查编号 | list.index(123) |
| 有多少项 | len(list) |
| 包含吗 | 123 in list |
最容易搞错的地方:编号从几开始?
Scratch 说“第 1 项”,Python 里却写作 [0]。点一点,看看对应关系:
| 第1项 | 第2项 | 第3项 | |
|---|---|---|---|
| Scratch | 1 | 2 | 3 |
| Python | 0 | 1 | 2 |
所以“删除第 1 项”是 del list[0],“第 3 项”是 list[2]。