三种范式各跑一遍:监督学习准确率 1.000,无监督把 180 个点分成 3 簇、惯量 38.341, 强化学习里纯贪心平均收益 0.197,反而低于纯随机的 0.351,ε=0.1 拿到 0.561。
上一节说清机器学习和人工智能的关系,这一节把机器学习本身拆成三类, 并且每类都跑一个能出数的小例子。
一、三个范式,看数据里有没有答案
分类的依据只有一条:你手上的数据带不带标签。 - 监督学习:每条数据都有正确答案,模型学「输入到输出」的映射。 - 无监督学习:没有答案,模型自己找结构,比如分成几堆。 - 强化学习:没有答案,也没有结构,只有一个「做完这步得了多少分」的反馈。 三者的评价指标也因此不同:监督看准确率/F1,无监督看惯量/轮廓系数,强化看累计收益。
二、监督与无监督:一次跑完
Demo 的监督部分用两块二分类数据,解一个最小二乘再取阈值,准确率 1.000。 这个 1.000 不作证据——点是我按两个中心撒的,本来就分得开。 无监督部分用三堆点,跑 K-Means:迭代到中心不再移动为止,得到三簇各 60 个点, 惯量(簇内平方和)38.341。 惯量这个数没有绝对好坏,只能横向比:同一个数据集上,k=4 的惯量一定比 k=3 小,所以不能拿它选 k。 选 k 要另找办法,比如轮廓系数。 注意 K-Means 有个前提:你得先告诉它分几堆。 它不会自己决定 k——这就是「无监督」这个名字容易误导的地方。
三、强化学习:纯贪心反而最差
Demo 造了 10 台老虎机,每台中奖概率不同,最高的是第 8 台(0.60)。玩 1500 次,三种策略: - 纯随机:平均收益 0.351,最常拉的是第 2 台。 - 纯贪心:平均收益 0.197,最常拉的是第 0 台(真实概率只有 0.20)。 - ε=0.1:平均收益 0.561,最常拉的是第 8 台——正好是最好的那台。 纯贪心为什么最差? 它开局随机试了一台,碰巧赢了一次,估计值变成 1.0,之后再也不试别的,永远卡在那台上。 它「利用」得太早,没给「探索」留空间。 这不是程序 bug,是强化学习的核心矛盾:探索(试新的)和利用(用已知的)。 ε 就是留多少比例去探索,本例 10% 就够了。
四、三者的边界并不硬
实际项目里三者经常混用:先用无监督做聚类分桶,再对每桶做监督学习; 推荐系统既用监督学习预估点击率,也用强化学习调长期留存。 但判断一个任务属于哪类,只看一件事:你手里有什么。 有标签就是监督,没标签有结构就是无监督,只有延迟的奖励就是强化。 这一条决定了你第一步该做什么:监督先查标签质量,无监督先定 k,强化先搭好奖励函数。 奖励函数写错,训出来的行为一定是错的——而且模型会非常认真地执行那个错的奖励。
五、动手 Demo:三种范式各跑一遍
监督:两块二分类数据,最小二乘解权重再取 0.5 阈值,算准确率。 无监督:三堆点跑 K-Means,报告簇大小与惯量。 强化:10 臂老虎机,纯随机/纯贪心/ε=0.1 各玩 1500 次,比较平均收益和最常拉的臂。 最后打一张三者对照表。
# 监督:最小二乘
A = np.hstack([Xs, np.ones((len(Xs), 1))])
w = np.linalg.lstsq(A, ys.astype(float), rcond=None)[0]
pred = (A @ w > 0.5).astype(int)
# 无监督:K-Means
for _ in range(60):
d = ((xu[:, None, :] - C[None, :, :]) ** 2).sum(-1)
lab = d.argmin(1)
C = np.array([xu[lab == k].mean(0) for k in range(3)])
# 强化:ε-greedy
if r.uniform() < eps:
a = int(r.integers(0, 10)) # 探索
else:
a = int(np.argmax(est)) # 利用
实跑输出:
--------------------------------------------------------------------
三种范式各跑一遍:有标签、没标签、只有奖励
--------------------------------------------------------------------
策略 平均收益 最常拉的臂 总次数
--------------------------------------
纯随机 0.351 2 1500
纯贪心 0.197 0 1500
ε=0.1 0.561 8 1500
监督学习(有标签) 准确率 1.000,240 条样本,2 类
提醒 这批点是我按两个中心撒的,1.000 不作证据
无监督学习(无标签) 3 簇,惯量(簇内平方和)38.341
三簇大小 [60, 60, 60]
强化学习的目标不是「猜得准」,而是【累计收益最大】。
纯贪心上来抽到哪个臂就死守哪个,结果收益最低——它「利用」得太早。
纯随机一直试、从不利用,收益居中。ε=0.1 一边试一边用,最高。
这就是「探索与利用」的取舍,ε 就是留多少比例去探索。
范式 要标签吗 学什么 怎么评
--------------------------------------------------
监督 要 预测值 准确率/F1
无监督 不要 结构 惯量/轮廓系数
强化 不要(要奖励) 动作序列 累计收益
强化那三行是本节最反直觉的结果:纯贪心 0.197 比纯随机 0.351 还低。 它卡在第 0 台(真实概率 0.20)上再不动了。 ε=0.1 拿到 0.561,最常拉的是第 8 台——真实概率 0.60 的那个。 1500 次里平均收益逼近 0.60,说明它基本锁定了正确的臂。 监督那行准确率 1.000,但我在输出里写明了「这批点是我按两个中心撒的,1.000 不作证据」。 数据太干净时,任何方法都能满分。 无监督三簇各 60 个点、惯量 38.341。 簇大小完全均匀,是因为我造数据时就是均匀撒的——真实数据的簇几乎不会这么整齐。
30 秒实验
- 把 ε 改成 0.01 和 0.5 各跑一次,看平均收益怎么变。
- 把 K-Means 的 k 改成 4,看惯量降到多少(会降,但这不代表更好)。
- 想一想:为什么强化学习的评价指标不能用准确率?
常见误区
- 「无监督就是不用管」——k 还是得人来定。
- 「贪心策略一定不差」——本例它是最差的,卡死在第一个碰上的选项上。
- 「三种范式互不相干」——真实系统里常常混着用。
自测三问(点开对答案)
1. 判断一个任务属于哪类范式,先看什么? —— 看手里有什么:有标签是监督,没标签有结构是无监督,只有奖励是强化。 2. 为什么纯贪心策略收益最低? —— 它过早锁定第一个碰巧赢过的臂,不再探索,永远发现不了更好的。 3. 为什么不能用惯量来选 k? —— k 越大惯量必然越小,它只会单调下降,无法横比。三类分清了,下一节看一个模型从数据到上线要走几步。
- ☐ (本节完,下一节 4.1.3 6个基本流程:看懂机器学习算法的工作方式)