笔言: 推荐AI相关我正在写故事: 我在蒸汽纪元证真理 【AI数学基础】和重生1995:我的数学模型能暴击【数学模型】


故事大纲(25集结构版)
核心设定
主角陆眠,2025年谷歌Brain部门“反内卷”科学家,在演示极简可解释AI工具时遭遇数据回流异常,穿越回2005年2月的斯坦福AI实验室——面前只有Matlab 7.0、CRT显示器和一部诺基亚手机,但脑中装载着未来二十年简洁优雅的算法智慧。

第5集:图书馆座位博弈论

  • 痛点:期末图书馆抢座大战
  • 特征:课程表、天气、考试周标记
  • 模型:多元线性回归+残差分析
  • 可视化创新:用Matlab制作动态热力图,展示“座位空闲概率云”
  • 社会影响:学生们开始科学安排学习时间,意外缓解了焦虑情绪

本集专属旁白播放地址
本集播客播客地址

下面是我个定制:
2005:我在硅谷种AI》两个主题曲(大家评选一下):
在这里插入图片描述
种春天A版: 歌曲地址

种春天B版: 歌曲地址


在这里插入图片描述

第5集:图书馆座位博弈论


期末的座位战争

斯坦福格林图书馆的拱形大厅里,弥漫着一种特殊的紧张气息——不是源于深奥的哲学辩论或艰难的数学证明,而是源于一种更原始的竞争:座位争夺战

每年十二月初,随着期末考试的临近,这座拥有两千个座位的图书馆会变成战场。学生们像侦察兵一样在各楼层巡逻,寻找空座位或即将空出的座位。冲突时有发生:

“我离开去洗手间才十分钟!”经济学系的安娜指着她留下的书包和摊开的书,“你凭什么占我的座位?”

“‘离开超过十五分钟视为放弃’——图书馆规则第7条。”计算机系的丹尼尔不为所动,“而且你的笔记本上写的最后时间是……11:20,现在是11:35。”

这样的争执每天上演几十次。图书馆管理员霍华德先生疲惫不堪:“上周五,两个博士生差点为靠窗的座位打起来。那可是博士啊!”

陆眠目睹了这一幕。他本想在图书馆安静地读几篇论文,但花了四十五分钟才在角落里找到一个摇摇晃晃的凳子——真正的座位早已被占领或被“幽灵物品”(一本旧书、一个空咖啡杯)标记了所有权。

“有没有可能,”他问霍华德,“预测哪些座位会在什么时候空出来?这样学生可以科学安排时间,而不是盲目巡逻。”

霍华德苦笑:“我们试过在入口放‘空位计数器’,但学生抱怨不准确——二楼东区可能满员,但三楼西区有空位。而且,空位瞬间就会被占。”

“不是预测现在哪里有空位,”陆眠说,“而是预测未来一小时内,每个区域有多少概率会出现空位。就像天气预报的降水概率。”

“这怎么可能?”
“用数据。”陆眠望向那些埋头苦读的学生,“每一个坐下、起身、离开的行为,背后都有规律。”


数据收集:观察两千个座位的“呼吸”

陆眠获得了图书馆管理系统的有限访问权限——不是实时监控摄像头(隐私限制),而是刷卡进入记录座位预约系统的匿名日志。

原始数据很粗糙:

  • 学生A,卡号XXXX,进入时间9:07,离开时间14:32
  • 座位预约:区域3B-12,学生B,10:00-13:00
  • 每日总人次:期末周平均每天4800人次

“但我们需要的是区域级别的占用率变化。”陆眠将图书馆划分为16个区域(基于建筑结构和历史数据),每小时统计一次占用率。

他设计了一个简单的数据收集方案:招募十个志愿者,每隔一小时记录一次各区域的空座位数,连续记录两周。

数据集结构
每行代表一个区域在一个小时段内的状态:

  • 区域编号(1-16)
  • 日期和时间(如“12月3日 10:00-11:00”)
  • 星期几(1=周一,…,7=周日)
  • 小时段(8-9, 9-10, …, 21-22)
  • 天气代码(1=晴,2=阴,3=雨,4=雪)
  • 温度区间(1=<10°C,2=10-20°C,3=>20°C)
  • 是否为考试周(0/1)
  • 当天是否有大型考试(0/1)
  • 前一小时的占用率
  • 标签:当前小时段的空闲座位比例(0-1)

最终得到2688条记录(16区域×14天×12小时段)。


多元线性回归:为每个特征分配“发言权”

模型直观比喻

“想象我们要预测一个地区的房价。”陆眠在白板上画图,“影响因素很多:面积、学区、房龄、交通……每个因素都有不同的权重。多元线性回归就是找出每个因素的正确权重。”

模型公式:

空闲比例 = β₀ + β₁×(区域) + β₂×(小时段) + β₃×(星期几) + β₄×(天气) + ... + ε

其中β₀是截距,β₁,β₂,…是特征权重,ε是误差项。

“我们的目标是通过数据‘学习’出这些β值,使得预测值与真实值的差距最小。”

最小二乘法:寻找最佳拟合线

“最小二乘法的思想很简单:找一条直线(在多元中是超平面),使得所有数据点到这条直线的垂直距离的平方和最小。”

陆眠写下目标函数:

最小化 Σ(真实值ᵢ - 预测值ᵢ)²

代码段1:多元线性回归的矩阵解

function [beta, predictions, residuals] = multiple_linear_regression(X, y)
    % X: n×m矩阵,n个样本,m个特征(已添加截距列)
    % y: n×1向量,标签
    
    % 最小二乘解:β = (XᵀX)⁻¹Xᵀy
    beta = (X' * X) \ (X' * y);
    
    % 预测值
    predictions = X * beta;
    
    % 残差 = 真实值 - 预测值
    residuals = y - predictions;
    
    % 计算R²
    SS_total = sum((y - mean(y)).^2);
    SS_residual = sum(residuals.^2);
    R2 = 1 - SS_residual / SS_total;
    
    fprintf('R² = %.4f\n', R2);
    fprintf('均方根误差(RMSE) = %.4f\n', sqrt(mean(residuals.^2)));
end

陆眠将数据预处理后输入模型。特征矩阵X包括:

  • 区域(独热编码,16个区域变成15个二值特征)
  • 小时段(1-12)
  • 星期几(1-7)
  • 天气(3个二值特征)
  • 温度区间(2个二值特征)
  • 考试周(0/1)
  • 大型考试(0/1)
  • 前一小时占用率

模型运行结果:R² = 0.68,RMSE = 0.12。

“这意味着模型解释了68%的方差,”陆眠解释,“平均预测误差在12个百分点。比如预测某区域空闲率40%,实际可能在28%-52%之间。”


残差分析:聆听模型的“沉默之声”

发现模式:残差不应是随机的吗?

陆眠绘制了残差图——残差(真实值-预测值)与预测值的散点图。

“如果模型完美,残差应该随机分布在零线附近,没有明显模式。”他展示图形,“但我们的图显示:当预测空闲率很低(<20%)或很高(>80%)时,残差倾向于正值和负值。”

代码段2:残差分析与诊断图

function analyze_residuals(predictions, residuals, X)
    % 创建4个子图的诊断图
    
    figure('Position', [100, 100, 1200, 800]);
    
    % 子图1:残差 vs 预测值
    subplot(2,2,1);
    scatter(predictions, residuals, 20, 'filled');
    hold on;
    plot([min(predictions), max(predictions)], [0, 0], 'r--', 'LineWidth', 2);
    xlabel('预测值');
    ylabel('残差');
    title('残差 vs 预测值');
    grid on;
    
    % 子图2:残差的正态概率图
    subplot(2,2,2);
    probplot(residuals);
    title('残差正态性检验');
    grid on;
    
    % 子图3:残差 vs 时间序列(按数据顺序)
    subplot(2,2,3);
    plot(1:length(residuals), residuals, 'b-');
    hold on;
    plot([1, length(residuals)], [0, 0], 'r--', 'LineWidth', 2);
    xlabel('样本序号');
    ylabel('残差');
    title('残差序列图');
    grid on;
    
    % 子图4:残差直方图
    subplot(2,2,4);
    histogram(residuals, 30, 'Normalization', 'probability');
    xlabel('残差');
    ylabel('频率');
    title('残差分布');
    grid on;
    
    % 计算自相关(检测时间依赖性)
    [acf, lags] = xcorr(residuals, 20, 'coeff');
    figure;
    stem(lags(21:end), acf(21:end), 'filled');
    xlabel('滞后');
    ylabel('自相关系数');
    title('残差自相关图');
    grid on;
    hold on;
    plot([-20, 20], [0.1, 0.1], 'r--');
    plot([-20, 20], [-0.1, -0.1], 'r--');
end

“残差图告诉我们两件事。”陆眠分析,“第一,模型在极端情况下预测不准——因为人们的行为在座位很满或很空时会有不同:如果座位很满,人们可能更不愿意离开;如果很空,人们可能更随意。”

“第二,残差自相关图显示滞后1和滞后2有显著相关——这意味着当前小时的预测误差会影响下一小时的预测误差。座位占用有惯性。”


特征工程:捕捉时间的秘密

时间序列特征:比时钟更深刻的节奏

艾米莉指着数据说:“我们应该加入更多时间特征。比如‘是否为一天中的第一个学习时段’‘是否为午餐后时段’。”

陆眠同意,并增加了:

  • 是否上午时段(8-12)
  • 是否下午时段(13-17)
  • 是否晚上时段(18-22)
  • 距离最近考试结束的小时数(考试结束后,大量学生涌向图书馆)

但最关键的发现来自傅里叶级数转换

“时间具有周期性,”陆眠解释,“一周七天,一天二十四小时。我们可以用正弦余弦函数捕捉这种周期性。”

代码段3:时间周期性特征

function X_with_time_features = add_time_features(X_raw, hour_of_day, day_of_week)
    % hour_of_day: 0-23
    % day_of_week: 1-7
    
    % 小时周期性:24小时周期
    X_with_time_features = X_raw;
    X_with_time_features(:, end+1) = sin(2 * pi * hour_of_day / 24);
    X_with_time_features(:, end+1) = cos(2 * pi * hour_of_day / 24);
    
    % 周周期性:7天周期
    X_with_time_features(:, end+1) = sin(2 * pi * day_of_week / 7);
    X_with_time_features(:, end+1) = cos(2 * pi * day_of_week / 7);
    
    % 交互特征:小时和周日的交互
    X_with_time_features(:, end+1) = (hour_of_day / 24) .* (day_of_week / 7);
    
    fprintf('添加了5个时间周期性特征\n');
end

加入这些特征后,R²提升到0.73,RMSE降到0.11。


模型改进:应对“残差的启示”

加权最小二乘法:处理异方差性

残差图显示,当预测空闲率接近0或1时,残差方差较小;在中间值时方差较大。这是异方差性——违反了线性回归的同方差假设。

解决方案:加权最小二乘法(WLS),给不同数据点不同的权重。

代码段4:加权最小二乘回归

function [beta_wls, predictions_wls] = weighted_least_squares(X, y)
    % 先用普通最小二乘得到初始预测
    beta_ols = (X' * X) \ (X' * y);
    predictions_ols = X * beta_ols;
    residuals_ols = y - predictions_ols;
    
    % 估计方差函数:残差绝对值与预测值的关系
    % 假设方差与预测值的某种函数成正比
    abs_residuals = abs(residuals_ols);
    
    % 拟合方差模型(这里用简单的线性关系)
    % 注意:实际应用中可能需要更稳健的估计
    var_weights = 1 ./ (0.1 + 0.5 * abs(predictions_ols - 0.5));  % 中间值权重小,两端权重大
    
    % 加权最小二乘:β = (XᵀWX)⁻¹XᵀWy
    W = diag(var_weights);  % 权重矩阵
    beta_wls = (X' * W * X) \ (X' * W * y);
    predictions_wls = X * beta_wls;
    
    % 计算加权后的R²
    w_residuals = y - predictions_wls;
    w_SS_residual = sum(var_weights .* w_residuals.^2);
    w_SS_total = sum(var_weights .* (y - mean(y)).^2);
    w_R2 = 1 - w_SS_residual / w_SS_total;
    
    fprintf('加权R² = %.4f\n', w_R2);
end

自回归误差校正

针对残差的自相关性,陆眠添加了滞后特征:前一小时的残差作为新特征加入模型。

“这相当于让模型‘记住’前一小时的预测误差,并在下一小时调整。”

改进后,R²达到0.76,RMSE=0.10。


可视化创新:概率云图与动态热力图

从数字到直觉:概率云图

预测值是一堆数字,但学生需要直观指导。陆眠开发了“概率云图”系统:

  1. 图书馆平面图划分为16个彩色区域
  2. 每个区域根据预测空闲率着色:深红(<20%)→ 橙 → 黄 → 浅绿 → 深绿(>80%)
  3. 每个区域显示预测空闲率和“置信区间”(基于模型标准误差)

代码段5:生成图书馆热力图

function generate_library_heatmap(predictions, confidence_intervals, time_label)
    % predictions: 16×1向量,每个区域的预测空闲率
    % confidence_intervals: 16×2矩阵,每个区域的置信区间上下界
    % time_label: 时间标签,如"12月5日 14:00-15:00"
    
    % 加载图书馆平面图背景
    library_map = imread('library_floorplan.jpg');
    
    figure('Position', [50, 50, 1400, 800]);
    imshow(library_map);
    hold on;
    
    % 定义16个区域的位置(矩形坐标)
    region_positions = load('region_positions.mat');  % 预定义
    
    % 颜色映射:红-黄-绿
    colormap_custom = [linspace(1,0,100)' linspace(0,1,100)' zeros(100,1);  % 红到黄
                       linspace(0,0,100)' linspace(1,0,100)' zeros(100,1)]; % 黄到绿
    
    for i = 1:16
        pred = predictions(i);
        ci_low = confidence_intervals(i, 1);
        ci_high = confidence_intervals(i, 2);
        
        % 将预测值映射到颜色索引
        color_idx = round(pred * 199) + 1;  % 1-200
        region_color = colormap_custom(color_idx, :);
        
        % 绘制区域矩形
        pos = region_positions(i, :);  % [x, y, width, height]
        rectangle('Position', pos, 'FaceColor', region_color, 'EdgeColor', 'k', 'LineWidth', 2, 'FaceAlpha', 0.6);
        
        % 添加文本:预测值和置信区间
        text_str = sprintf('区域%d\n%.1f%%\n(%.1f-%.1f)', i, pred*100, ci_low*100, ci_high*100);
        text(pos(1)+pos(3)/2, pos(2)+pos(4)/2, text_str, ...
            'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle', ...
            'FontSize', 9, 'FontWeight', 'bold', 'Color', 'k');
    end
    
    % 添加颜色条
    colorbar('Ticks', 0:0.2:1, 'TickLabels', {'0%', '20%', '40%', '60%', '80%', '100%'});
    
    title(sprintf('图书馆座位空闲概率预测 - %s', time_label), 'FontSize', 16);
    
    % 添加图例说明
    annotation('textbox', [0.02, 0.02, 0.3, 0.1], 'String', ...
        '深红: 很满 (<20%空闲)\n深绿: 很空 (>80%空闲)\n数字为预测空闲率及95%置信区间', ...
        'FontSize', 10, 'BackgroundColor', 'w', 'EdgeColor', 'k');
    
    hold off;
end

动态预测系统

陆眠将模型部署到图书馆入口处的一台老旧电脑上,每15分钟更新一次预测,显示未来三小时的热力图。

“你看,”他指着屏幕,“现在下午2点,区域3、7、12显示深绿——这些区域现在就有空位。但更重要的是,区域8现在是红色,但预测3点会变绿,因为有工程系的大课结束。”


实践效果:从博弈到协作

系统上线第一周,发生了几个有趣的变化:

  1. 空间再分配:学生不再聚集在“传统好位置”(靠窗、靠近插座),而是分散到预测空闲率高的区域,即使那些区域原来不受欢迎。

  2. 时间规划:学生开始根据预测安排学习时段。经济系的凯拉说:“我看到区域11在下午4点会变绿,所以我先去健身房,4点再来图书馆——果然有座位。”

  3. 冲突减少:管理员霍华德先生统计,座位纠纷下降了67%。“因为学生们有了更科学的期望,不再盲目争抢。”

  4. 意外发现:模型揭示了被忽视的“黄金时段”——周三上午10-11点,图书馆整体空闲率高达45%。“因为很多系在这个时间有必修课。”陆眠分析。


拉吉的挑战与线性回归的哲学

拉吉当然又来探讨理论了。

“线性回归假设特征与目标是线性关系,但现实世界很多关系是非线性的。为什么不用支持向量机回归?或者神经网络?”

陆眠调出特征权重图:“看,区域8的权重是-0.23,区域12的权重是+0.18——这意味着,在其他条件相同的情况下,区域8比区域12更拥挤。霍华德先生一看就明白:区域8靠近咖啡机和洗手间,自然更受欢迎。”

“但SVM给不出这样清晰的解释。我需要告诉图书馆管理员:‘这个复杂的核函数把这个区域映射到高维空间,然后……’他能听懂吗?”

拉吉反驳:“但准确率呢?我试了带RBF核的SVR,RMSE=0.087,比你的0.10好。”

“好13%。”陆眠点头,“但代价是:我的模型训练用3秒,预测用0.01秒;你的SVR训练用42秒,预测用0.3秒。我们每15分钟要预测16个区域未来3小时的情况——你的模型需要14.4秒,我的只需要0.96秒。”

“在2005年的电脑上,”陆眠补充,“这13%的准确率提升,可能意味着系统无法实时运行。有时候,实时性比完美性更重要。”


残差的人文洞察

最深刻的洞见来自对残差的进一步分析。

陆眠发现,模型在某些特定时间持续低估空闲率:周五下午、考试结束后的晚上。

“周五下午,学生们更可能离开校园去放松。考试结束后的晚上,大家去庆祝而不是学习。”艾米莉说,“但我们的特征里没有‘社交倾向’。”

“对,”陆眠说,“这就是模型的局限——它只能从我们给的特征中学习。但残差像模型的‘良心不安’,提醒我们遗漏了什么。”

他修改系统,在显示预测时加上一行小字:

提示:本预测基于历史规律。但你是自由的——可以选择成为打破规律的人。

霍华德先生喜欢这句话:“它提醒学生,数据是工具,不是命运。”


结局:不仅仅是座位预测

期末周结束时,图书馆举行了一个简单的感谢仪式。学生们凑钱给陆眠送了一张礼品卡(他转赠给了志愿者团队),但更重要的是,他们分享了自己的故事:

  • 患有社交焦虑的米娅说:“以前我最怕在图书馆找座位,怕和人对视。现在我可以提前知道哪里有空位,直接走过去,不用四处张望。”
  • 单亲妈妈兼学生萨拉说:“我每天下午4点必须去接女儿。现在我能精准安排时间,4点前完成学习,不再焦虑。”
  • 国际学生阿里说:“语言不通时,这个彩色地图是我的救命稻草。我不需要问人,看颜色就行。”

陆眠在最后的总结中说:

“我们做的不是‘图书馆座位预测系统’,而是‘学生焦虑缓解系统’。技术真正的价值,不是展示预测多准确,而是让人的生活多一份确定,少一份焦虑。”

“好的模型像好的图书馆——不是让你感到自己的渺小,而是让你找到自己的位置。”


片尾彩蛋:算法的涟漪

2010年,斯坦福图书馆升级预约系统时,产品经理坚持要保留“概率热力图”功能,尽管工程师认为“直接显示实时空位更准确”。

“但热力图教会学生规划,而不是。”产品经理说——她是2005年那个患有社交焦虑的米娅。

2020年,当疫情要求图书馆限制人数时,预约系统基于类似的回归模型预测“安全时段”,减少了人群聚集。

而在陆眠离开斯坦福多年后,霍华德先生一直保留着系统界面上的那句话:

提示:本预测基于历史规律。但你是自由的——可以选择成为打破规律的人。

他说,那是他见过的最好的技术伦理声明。


第5集知识点总结

  1. 多元线性回归

    • 用多个自变量预测一个连续因变量
    • 最小二乘法:最小化残差平方和
    • 矩阵解:β = (XᵀX)⁻¹Xᵀy
  2. 模型诊断与改进

    • 残差分析:检查线性、同方差、正态性、独立性假设
    • 异方差性:残差方差随预测值变化 → 加权最小二乘法
    • 自相关:残差存在时间依赖性 → 加入滞后特征
  3. 特征工程

    • 独热编码处理分类变量
    • 傅里叶变换捕捉时间周期性
    • 交互特征、滞后特征
  4. 模型评估

    • R²:解释的方差比例
    • RMSE:均方根误差,衡量预测准确性
    • 置信区间:表达预测的不确定性
  5. 实践智慧

    • 实时性有时比完美性更重要
    • 可解释性促进用户信任
    • 技术的终极目标是服务人,而不仅仅是优化指标

下一集预告
数学系百年手写考试卷急需数字化,但OCR技术还停留在初级阶段。陆眠说:“如果5层神经网络能解决,为什么要等8层的AlexNet?”——第6集:手写数字的5层尊严,将深入神经网络的前向传播、反向传播、梯度消失问题,以及在算力限制下的创新。


在这里插入图片描述

片尾曲:
概率云图A版: 音乐地址
概率云图B版: 音乐地址


版权声明
2005:我在硅谷种AI和主题曲和片尾曲以及相关封面图片等 © [李林] [2025]

本作品采用 知识共享 署名-非商业性使用 4.0 国际许可协议 进行授权。
这意味着您可以:

  • 注明原作者附上原文链接的前提下,免费分享、复制本文档与设计。
  • 个人学习、研究或非营利项目中基于此进行再创作。

这意味着您不可以:

  • 将本作品或衍生作品用于任何商业目的,包括企业培训、商业产品开发、宣传性质等。

如需商业用途或宣传性质授权,请务必事先联系作者。
作者联系方式:[1357759132@qq.com]

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐