← 回到课堂练习

解题路线

题目要求:只用客观数值参数,设计可复算的排名算法,评出"世界 Top 10 过山车", 与线上榜单对比,并设计一个给游客推荐过山车的 App。数据就是练习用的那份 1744 台 RCDB 快照。

这份题解按实际解题顺序走:数据检查 → 回归验证 → 评分模型 → 归一化对比 → 敏感性分析 → 与线上榜单对比。 每一步都把图画出来,并写明这一步做了哪些会影响结论的决定:用哪些变量、缺失值怎么办、 用哪种归一化、轴怎么排。练习里"同一份数据画出两张相反的拉票图",根源都在这些决定里。

数据检查:缺失、错误与冗余

拿到数据先检查,再建模。两件事:哪些字段缺数据,哪些字段互相重复。

每个字段缺了多少

1744 台 · 空格子占比

高度、极速、长度、翻滚数全齐(这份数据已预筛过),但落差缺 78%、最大倾角缺 83%、时长缺 41%。缺 8 成的变量,填补出来也基本是编的——第一个决定就在这里。

谁跟谁在重复计分

五个数值字段的相关系数(成对完整样本)

高度和落差相关 0.952——物理上它们本来就是一回事(车爬多高就摔多深)。同时给两者打分,等于让同一个优点投两次票。

检查结论(四个决定):
① 高度 ↔ 落差二选一:留高度(缺 0%),弃落差(缺 78%)——评委原话就点过"height 和 drop 高度相关,应剔除冗余";
② 最大倾角缺 83%,直接弃用;
③ 时长缺 41%,用"长度 ÷ 极速"回归推补——但 $R^2$ 只有 0.29,推补值全程带 * 号示人,不装作真数据;
④ 只排运营中且核心字段齐全的 1207 台——"世界最佳"起码得是买票能坐到的。
顺带一提:这份数据还有错别字级的问题(Thorpe Park 的 Colossus,乐园一栏填成了所在城市 Chertsey)。真实数据总是脏的,论文里交代清楚比装没看见强。

R²=0.29 长什么样:时长推补的可靠程度

702 台有实测时长的车 · 横轴 = 按极速匀速跑完全程需要的时间(秒)

竖着看任何一个位置:全速时间差不多的车,实测时长上下能差 100 秒以上。 橙色带是回归预测的典型误差(±36 秒);对照灰色水平线——不看任何参数、直接猜全库平均 108 秒,典型误差也就 ±43 秒。 回归只把误差从 43 秒缩到 36 秒,这就是 R²=0.29 的全部含义:比瞎猜好,但好得有限。 保留它的理由:大方向没错(又长又慢的车时长确实更长,28 秒和 240 秒不会认错), 而且敏感性分析显示时长权重 ±30% 只换 0–1 席——弱推补翻不动榜单。带 * 交代之后,可以用。

R² 是什么:衡量"模型解释掉了多少波动"。算法分两步—— 先算总波动:每台车的实际值与全体平均值之差(竖直方向的差,不是垂直于曲线的几何距离),平方后加起来,记作 SST; 再算模型没解释掉的部分:每台车的实际值与模型预测值之差,平方后加起来,记作 SSE。 R² = 1 − SSE ÷ SST。R²=1 是完美预测,R²=0 等于无脑猜平均值,甚至可以是负的(比猜平均还差,外推时会发生)。 四个点的完整演算:y = [2, 4, 6, 8],平均 5 → SST = 9+1+1+9 = 20;模型预测 [3, 4, 5, 9] → 残差 [−1, 0, 1, −1] → SSE = 3;R² = 1 − 3/20 = 0.85。 上图的 R²=0.29 就是"回归只消掉了 29% 的平方波动"——和"猜 ±36 秒对瞎猜 ±43 秒"是同一件事: 1 − (36/43)² ≈ 0.29。下一节回归里的 R²=0.815 同理:知道高度,速度的平方波动被消掉 81.5%。 注意 R² 只量"贴得近不近",不检查模型形状对不对——形状问题要靠残差图(下一节的②④)。

不同 R² 长什么样:五档对照

合成数据 · 同一条真实关系(斜线),只改噪声大小 · 每格 80 个点

R²=0.1 时点云几乎看不出方向;0.3(本课时长推补的档位)能看出趋势但预测个体没什么把握; 0.5 是"有用但粗";0.8(本课高度-速度的档位)已经贴得很近;0.95 基本严丝合缝。 经验读法:R² 决定"用 x 猜 y 能猜多准",波动带宽度 ∝ √(1−R²)—— R²=0.3 的剩余波动是 R²=0.95 的约 3.7 倍。

高度和速度:回归与残差图

练习的第一题:过山车越高就越快吗?下面四张图按顺序回答: 线性拟合的表现、它的残差暴露出的问题、换根号模型后的结果、以及新模型的残差。

① 线性拟合

1744 台 · $v = 19.0 + 0.282\,h$ · $R^2=0.815$

散点贴着直线走,$R^2$ 不低。但这张图回答不了"模型形状选对了吗"。

② 线性模型的残差

残差 = 实际速度 − 直线预测 · 橙线为分箱均值

矮车段整体偏负、中段偏正、250 ft 以上平均差 −15 mph。残差有系统模式,说明数据的真实关系是弯的,直线模型形状选错了——这是散点图上看不出来的。

③ 根号模型 $v=a\sqrt{h}+b$

$v = 5.43\sqrt{h} - 4.7$ · $R^2=0.849$

能量守恒 $v=\sqrt{2gh}$ 换算成 mph/ft 后理论系数 5.47,回归拟出 5.43;负截距就是摩擦损耗。模型形状不是猜的,是物理给的。

④ 根号模型的残差

同一批数据 · 同样的分箱均值

分箱均值回到 ±4 mph 内,系统模式消失。剩下的离群点全是弹射型过山车——加速靠电磁弹射而不靠落差,属于另一类机制,不能当噪声删掉。

评分指标与权重

五个指标的权重和理由如下。权重没有客观解——这是第三课讲过的问题——能做的是把数值和理由都写明,接受检验:

指标权重为什么
极速28%"快不快"是多数人对过山车的第一直觉
时长24%28 秒的世界纪录和 4 分钟的旅程,体验完全不同(推补值降权见敏感性)
高度22%落差的代表(两者 0.952 相关,只留一个)
长度16%轨道越长,内容越多
翻滚数10%刺激的另一个维度,但不是人人都爱

合计:刺激类(极速+高度+翻滚)60%,体验类(时长+长度)40%。 不同意这组数字的人,改这张表重跑就能得到自己的榜单——可复算指的就是这个。

归一化:百分位和 min-max 给出两张不同的榜单

权重定了还不够:极速的单位是 mph、长度是英尺,相加之前必须先归一化成无量纲的分数。两种常用做法:

两种做法都常见、都没有算错。下面是同一组权重下它们各自的 Top 12:

同一份数据、同一组权重,两张 Top 10 只重合 1 台

左:百分位榜名次 · 右:min-max 榜名次 · 灰线为其余车

百分位榜(左)偏向六七个翻滚、各项都不差的机型;min-max 榜(右)几乎全是速度和高度的纪录保持者。 Kingda Ka:min-max 第 7,百分位第 321——456 ft 的优势被百分位抹平,28 秒的时长却被百分位放大成硬伤。 两榜都进前十的只有 Steel Dragon 2000。 作为对照:同一组权重下把加权求和换成 TOPSIS,Top 10 只变 1 台。对榜单影响最大的不是算法,是归一化。

交互排名器:自选权重和归一化

原题第三问要求设计一个给游客推荐过山车的 App,这里直接做成网页交互: 1207 台运营中的过山车,权重和归一化都是可调控件,改动即时重排。

归一化:

时长带 * 的是回归推补值(缺失 41%),不是实测。

敏感性分析

权重是人定的,要检验定偏一点会不会翻盘:每个权重单独 ±30%(其余按比例回补), 数一数百分位榜 Top 10 换掉几台车。

单个权重 ±30% 后,Top 10 换人数

基准:百分位归一化 · 权重 28/24/22/16/10

极速、高度、时长、长度怎么扰动都最多换 1 台——但翻滚数权重只有 10%,下调 30% 就换掉 5 台。 原因:全库过半数的车翻滚数是 0,百分位在"0 个"和"1 个"之间有一个巨大的台阶, Top 10 的构成实际主要由这 10% 的权重控制。发现之后应该回去改模型——给翻滚数换平滑的记分方式, 或分成"翻滚榜/疾速榜"两张榜单——而不是下结论说模型稳健。 敏感性分析的作用就是定位这种最容易出错的位置。

Bootstrap:从"一次抽样"讲起

第一步,先看清"抽样"这件事本身。把手里的 1744 台当作全体。假设你只有力气调查 50 台: 随机挑 50 台,拟合 v = a√h + b,得到一个系数。问题是——换一批 50 台,数字就不一样。 下面可以反复做这件事,每做一次画一条线:

还没抽过。

每条蓝线是"只看 50 台"的一个平行世界,线束的宽度就是 50 台抽样的运气成分。 我们手里真有全体 1744 台,所以这个宽度是真实的抽样抖动——记住它有多宽。

现实的处境难得多:你通常只有一份样本,没有全体——上面那个动作根本没法做。 假设手里只有一份 50 台的数据,怎么估计自己那条线的运气成分?1979 年统计学家 Efron 的主意: 既然样本是全体的缩影,就把样本自己当作全体,从中"有放回"地重抽同样多的样本 (有的车被抽到两三次,有的一次都没有),重算一遍;重复几百次。 用数据自己评估自己的不确定度,像拔着自己的鞋带把自己提起来——这就是 bootstrap(拔靴带)这个名字的出处。

深蓝点是你唯一拥有的 50 台样本(灰点只是背景,这一步的计算完全看不见它们); 每条橙线是一次有放回重抽的拟合。对照上一块:bootstrap 只用这 50 台"自举"出来的线束宽度, 和真实抽样抖动的宽度非常接近——这就是它敢被使用的理由, 也是论文里每个系数后面 [区间] 的来历(按"车"重抽 200 次取中间 95%)。 点「换一份 50 台样本」再试几份,宽度依然对得上。

为什么"随机换权重"能量出不确定度:有放回重抽 50 台,数学上等于给这 50 台随机重新分票—— 每次约 36% 的车一票没有((49/50)⁵⁰ ≈ 0.364)、36% 恰好一票、其余两票以上。它没有创造新信息, 但"真实换一批数据"的随机性本质上也是一样的:从总体重新抽样,就是对总体成员随机分票(抽到=1,没抽到=0)。 只要样本是总体的缩影,两种扰动对结果的晃动幅度就相同——上面 A、B 两块宽度吻合就是证据。 换个角度:随机换权重探测的是"结论有没有被少数样本绑架"——每台车影响都小,线束就窄; 被一两台稀有车主导,36% 抽不到它的重抽就会把线甩飞,线束就宽。这正是抽样误差的本质。 两个前提:样本得像总体(重抽变不出你没见过的车);重抽的单位要独立—— 所以论文按"车"整台重抽、不按"对"重抽(2300 个对是同一批车派生的,按对重抽会把区间做假窄)。

雷达图:轴顺序和归一化怎样改变图形

排名有争议时,常见做法是画雷达图"让读者自己比较"。但雷达图的形状取决于两个设置: 轴的排列顺序,和归一化方式。选三台风格极端的车演示:Kingda Ka(最高最快,但全程 28 秒)、 Steel Dragon 2000(轨道 8133 ft、全程 4 分钟)、 Colossus(又矮又慢,但 10 个翻滚)。 前三张图数据完全相同,只改这两个设置。

雷达图 α · min-max 归一化

(值 − 全库最小) / (全库最大 − 全库最小)

Steel Dragon 看起来最全面,Colossus 除了翻滚一项几乎贴在中心。多边形面积比 Kingda Ka : Steel Dragon ≈ 0.66 : 1

雷达图 β · 同一数据,只换轴顺序

把两台车的强项从相邻改为隔开

数值一个没改,面积比变成 0.44 : 1。雷达图的多边形面积由相邻两轴数值的乘积决定,所以轴的排列顺序直接改变面积对比——而读者通常意识不到顺序是可选的。

雷达图 γ · 同一数据,只换归一化(百分位)

打败了全库百分之多少的车

Colossus 的图形从贴近中心变成接近满格——它各项数值虽小,但在全库里都处在中游以上。和排名一样,图形也随归一化方式翻转。

对照 · 分指标条形图

每个指标保留自己的量纲,数值直接标出

每个指标各画各的,不合成总分、不比面积,三台车强在哪弱在哪一目了然。要比总分,就用上面的排名模型,把权重写明。

与线上榜单对比

原题要求把自己的榜单和线上榜单对比。我们两种归一化下的 Top 10:

百分位榜 Top 10 (按名次归一)

    min-max 榜 Top 10 (按数值归一)

      对照游乐业界投票的 Golden Ticket Awards 2018:钢质前三是 Fury 325、Millennium Force、Steel Vengeance,木质第一是 Phoenix。 我们的 min-max 榜命中了 Fury 325 和 Millennium Force,百分位榜命中了 Steel Vengeance—— 两种归一化各命中一部分。

      而 Phoenix(78 ft 高、45 mph 的 1985 年木质车)在我们的百分位榜排第 425、min-max 榜排第 455。 它年年拿奖靠的是失重感和顺滑度——数据库里没有这两列。 数据里没有的维度,模型算不出来;在论文的对比一节写明这个边界,是必要的结论,不是示弱。

      注:数据快照晚于 2018 年比赛(含 2019 年开业的 Yukon Striker),课堂演示不影响;真参赛时要用题目给的数据。

      论文作图检查清单

      这份清单逐条对应评委 commentary 对高分论文的要求。 完整数据和本页所有图的数据文件:rcdb_strict.csv · class05-data.js