尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从2017年数学建模代码看熵权法与TOPSIS的建模本质与工程实践

从2017年数学建模代码看熵权法与TOPSIS的建模本质与工程实践 1. 项目缘起与核心价值为什么今天还要看2017年的建模代码最近在整理硬盘翻到了一个老文件夹名字就叫“2017年数学建模A组练习代码”。点开一看里面是几个MATLAB的.m文件注释写得还算工整但代码风格一看就是学生时代的“作品”。我本来想直接删掉但转念一想这些代码虽然“老”但里面蕴含的建模思路、问题拆解方法以及那些当年踩过的坑对现在无论是准备竞赛的学生还是刚接触数据建模的职场新人可能都还有点价值。很多人可能会觉得2017年的东西技术早就过时了看它干嘛这个想法其实是个误区。数学建模竞赛尤其是像国赛全国大学生数学建模竞赛这种其核心考察的从来不是用了多新的算法库、多炫酷的深度学习框架而是将实际问题抽象为数学模型并利用计算工具求解的能力。2017年A组的题目通常涉及优化、预测、评估等经典问题这些问题的建模内核和求解思路在今天依然通用。看这些“老代码”恰恰是剥离了技术外壳直击建模本质的好机会。这份练习代码的价值我认为主要体现在三个方面 第一它是“解题思路”的代码化呈现。我们看优秀论文看到的是梳理好的文字和图表而看代码看到的是思维从“人脑”到“电脑”的转换过程哪里用了循环哪里定义了矩阵哪里调用了优化函数这些都是建模逻辑最直接的体现。 第二它充满了“初学者”的痕迹。正因为是练习里面会有一些不够优雅的实现、可以优化的算法选择甚至是错误。分析这些不完美的地方比直接学习完美答案更能加深理解知道“坑”在哪里以后才能避开。 第三它提供了一个完整的、可运行的“最小案例”。你可以直接把它跑起来修改参数观察结果变化这种动手的体验是读论文无法替代的。对于学习MATLAB/Python在科学计算中的应用这是一个很好的起点。所以这篇文章我就以这份2017年的老代码为引子和大家一起拆解一下数学建模中几个经典问题的编程实现思路。我会用现在的视角去重构当时的代码补充大量当年可能忽略的原理说明和工程细节目标是让你不仅能看懂这几行代码更能掌握背后一套可复用的建模编程方法论。2. 代码结构总览与核心问题定位首先我们得看看这个练习项目到底包含了什么。通常一个完整的数学建模代码文件夹不会只有一个脚本。它应该是有组织的。在我的这个老文件夹里主要有以下几个文件main.m: 主程序入口负责调度整个流程。data_preprocess.m: 数据预处理函数包括数据读取、清洗、缺失值处理等。model_optimization.m: 核心的优化模型建立与求解函数。model_evaluation.m: 模型评价与验证函数。visualization.m: 结果可视化绘图函数。data.xlsx: 原始的练习数据文件。这种结构本身就体现了一种良好的工程习惯模块化。将数据准备、模型构建、模型评估、结果展示分离使得代码清晰、易于调试和复用。很多新手会把所有代码堆在一个脚本里后期修改起来简直是灾难。通过阅读main.m和注释我回忆起这个练习模拟的是2017年国赛A类题的一种典型情景基于多指标数据的系统优化与综合评价问题。题目通常会提供一批对象比如不同的方案、城市、企业在多个指标上的数据要求你建立模型进行排序、分类或资源分配。这涉及到两个核心环节指标权重的确定如何量化不同指标的重要性综合评价值的计算与排序如何用一个数来代表整体好坏当年的代码主要实现了熵权法确定权重和TOPSIS法进行综合评价。这也是当时非常主流和经典的解法组合。下面我们就深入这两个核心模型看看代码是怎么写的以及如何把它写得更好、更稳。3. 数据预处理被忽略的“地基工程”几乎所有建模失败的原因一半以上都可以追溯到糟糕的数据预处理。我们当年的练习这部分写得相对简单但实际比赛中这里花的时间可能占整个编程时间的40%。data_preprocess.m文件里最初可能只有简单的xlsread和去除缺失值。现在我们来把它充实讲清楚每一步的“为什么”。3.1 数据读取与异常感知首先读取数据不是简单地加载进来就完事。你需要立刻对数据有一个整体的感知。% 原始代码可能这样 % data xlsread(data.xlsx); % 改进后的代码 filename data.xlsx; [raw_num, raw_txt, raw_all] xlsread(filename); % 同时读取数字和文本 % 立即进行基础诊断 fprintf(数据维度%d 行 (样本) × %d 列 (指标)\n, size(raw_num, 1), size(raw_num, 2)); fprintf(缺失值数量%d\n, sum(sum(isnan(raw_num)))); fprintf(数据范围\n); disp([min(raw_num); max(raw_num)]);这一步的关键是使用xlsread的三个输出参数这样可以避免因表头等文本信息导致的数据错位。同时第一时间打印出数据的基本情况就像医生先看体检报告一样对数据的“健康状况”心中有数。3.2 缺失值处理不仅仅是删除练习数据往往是干净的但真实数据常有缺失。直接删除缺失样本行删除是最简单的方法但可能损失大量信息特别是当指标很多时。% 检查缺失值模式 missing_pattern isnan(raw_num); missing_rate_per_col mean(missing_pattern, 1); % 每列的缺失率 missing_rate_per_row mean(missing_pattern, 2); % 每行的缺失率 % 策略1如果某列缺失率太高如30%考虑删除该指标 threshold_col 0.3; cols_to_drop find(missing_rate_per_col threshold_col); if ~isempty(cols_to_drop) fprintf(警告第 %s 列缺失率超过 %.1f%%考虑删除或谨慎处理。\n, num2str(cols_to_drop), threshold_col*100); % raw_num(:, cols_to_drop) []; end % 策略2如果某行缺失率太高删除该样本 threshold_row 0.5; rows_to_drop find(missing_rate_per_row threshold_row); raw_num(rows_to_drop, :) []; % 策略3对于剩余零星缺失使用列均值或中位数填充 for i 1:size(raw_num, 2) col_data raw_num(:, i); nan_indices isnan(col_data); if any(nan_indices) % 使用中位数填充对异常值更稳健 col_median median(col_data, omitnan); raw_num(nan_indices, i) col_median; fprintf(已用中位数填充第%d列的%d个缺失值。\n, i, sum(nan_indices)); end end这里解释了不同缺失值处理策略的适用场景并选择了更稳健的中位数填充。在建模中处理方法的选取需要简要说明理由这是论文和代码都需要体现的。3.3 数据标准化统一量纲的必经之路我们的指标可能单位各异如GDP是亿元人口是万人污染指数是百分比直接相加比较没有意义。标准化就是为了消除量纲影响。最常用的方法是极差标准化也称Min-Max归一化。% 假设 raw_num 现在是清洗后的数据矩阵行是样本列是指标 data_clean raw_num; [n_samples, n_indicators] size(data_clean); % 区分效益型指标越大越好和成本型指标越小越好 % 这里需要根据实际问题背景手动指定假设前3列是效益型后2列是成本型 benefit_cols 1:3; cost_cols 4:5; % 初始化标准化矩阵 Z zeros(size(data_clean)); % 效益型指标标准化 (x - min) / (max - min) for j benefit_cols min_val min(data_clean(:, j)); max_val max(data_clean(:, j)); if max_val min_val % 防止除零 Z(:, j) 1; else Z(:, j) (data_clean(:, j) - min_val) / (max_val - min_val); end end % 成本型指标标准化 (max - x) / (max - min) 或 1 - [(x - min)/(max - min)] % 这样处理后就都转化为“越大越好”的指标 for j cost_cols min_val min(data_clean(:, j)); max_val max(data_clean(:, j)); if max_val min_val Z(:, j) 1; else Z(:, j) (max_val - data_clean(:, j)) / (max_val - min_val); end end % 检查标准化结果 fprintf(标准化后数据范围[%.4f, %.4f]\n, min(Z(:)), max(Z(:)));注意这里有一个关键点标准化必须在同一指标的所有样本数据上进行即按列处理而不是按行或全局处理。另外对于成本型指标的处理公式要保证变换后也是0到1之间且值越大代表越好与效益型指标同向化。这个细节很多新手会忽略导致后续权重计算和综合评价出错。4. 熵权法用数据自身波动定义权重数据准备好后第一个核心问题来了如何确定每个指标的权重主观赋权如专家打分容易有偏差而熵权法是一种客观赋权法其基本思想是某个指标的信息熵越小其值的变异程度越大提供的信息量越多在综合评价中应赋予更大的权重。4.1 熵权法的数学原理与计算步骤很多代码只给出公式我们这里把每一步的“所以然”讲透。步骤1计算第j个指标下第i个样本的比重对于标准化后的矩阵Z假设所有指标已同向化为“效益型”我们计算p_ij Z_ij / sum(Z_ij) 其中求和是对i所有样本进行。 这个p_ij可以理解为在指标j上样本i的贡献度占所有样本总和的比例。% Z 是 n_samples × n_indicators 的标准化矩阵 % 防止除零给Z加上一个极小的偏移量 Z Z 1e-10; p Z ./ sum(Z, 1); % sum(Z,1) 按列求和利用广播机制步骤2计算第j个指标的信息熵e_j信息熵公式e_j -k * sum(p_ij * ln(p_ij)) 其中求和是对i k 1/ln(n_samples) 是归一化常数保证e_j在[0,1]之间。 当某个指标下所有样本的值完全相同时p_ij都等于1/n_samples此时熵值最大e_j1意味着该指标毫无区分度提供的信息量为零。[n, m] size(Z); k 1 / log(n); % 计算归一化常数 e zeros(1, m); for j 1:m p_col p(:, j); % 过滤掉p为0的情况因为0*log(0)在数学上定义为0 p_col_nonzero p_col(p_col 0); e(j) -k * sum(p_col_nonzero .* log(p_col_nonzero)); end步骤3计算信息效用值d_j和权重w_j信息效用值d_j 1 - e_j。熵越小效用值越大。 权重w_j d_j / sum(d_j)。将所有指标的效用值归一化就得到了最终的权重向量。d 1 - e; w d ./ sum(d); % 权重向量长度为 m % 输出结果 fprintf(各指标信息熵\n); disp(e); fprintf(各指标权重\n); disp(w);4.2 熵权法的代码实现陷阱与改进当年的练习代码可能直接套用了公式但有几个陷阱需要指出对数底数问题信息熵公式中的对数理论上应以2、e或10为底结果只差一个常数倍在后续归一化中会被消掉所以不影响最终权重。MATLAB的log函数是自然对数以e为底这没问题。零值处理这是最容易出错的地方。当p_ij为0时0*log(0)在数学上无定义计算会导致NaN。所以我们在计算前给Z加了一个极小值1e-10并在计算熵时只对p0的元素进行操作。这是一种常见的数值稳定技巧。权重为零的情况如果某个指标下所有样本值完全一样其熵e_j1效用d_j0权重w_j0。这从原理上是合理的该指标无区分度但在实际模型中可能需要考虑是否保留一个最小权重这取决于问题背景。可以在计算权重后加入一个平滑处理w w 1e-5; w w / sum(w);。负值或标准化不彻底如果标准化后的Z存在负值计算p_ij时可能得到负的比重这不符合信息熵的定义。因此确保标准化方法能产生非负值如极差标准化至关重要。实操心得熵权法完全由数据驱动所以对异常值非常敏感。一个异常的极大或极小值会严重影响该指标的极差进而影响标准化结果和熵值计算。因此在数据预处理阶段进行异常值检测与处理如用箱线图、3σ原则非常重要这比在熵权法代码里打补丁更根本。5. TOPSIS法逼近理想解的排序方法确定了权重接下来就要对每个样本进行综合评价和排序。TOPSISTechnique for Order Preference by Similarity to Ideal Solution是一种非常直观且常用的多属性决策方法。它的核心思想是找出正理想解所有指标都最优和负理想解所有指标都最劣然后计算每个样本与这两个解的距离离正理想解越近、离负理想解越远的样本综合表现越好。5.1 TOPSIS的详细计算流程结合我们已有的标准化矩阵Z和权重向量w步骤如下步骤1构建加权规范化决策矩阵VV_ij w_j * Z_ij这一步将权重融入标准化后的数据。注意这里是对Z的每一列每个指标乘以对应的权重w_j。% Z: 标准化矩阵 (n x m) % w: 权重向量 (1 x m) V Z .* w; % 利用广播每列乘以对应权重步骤2确定正理想解A和负理想解A-正理想解 A [max(V1), max(V2), ..., max(Vm)]负理想解 A- [min(V1), min(V2), ..., min(Vm)] 因为Z已经是“越大越好”的同向化矩阵所以加权后V也是越大越好直接取每列的最大/最小值即可。A_plus max(V, [], 1); % 每列最大值行向量 A_minus min(V, [], 1); % 每列最小值行向量步骤3计算各样本到正/负理想解的距离通常使用欧氏距离。到正理想解的距离D_i sqrt(sum((V_i - A).^2))到负理想解的距离D_i- sqrt(sum((V_i - A-).^2))这里V_i是矩阵V的第i行代表第i个样本在所有指标上的加权评分向量。D_plus zeros(n_samples, 1); D_minus zeros(n_samples, 1); for i 1:n_samples D_plus(i) sqrt(sum((V(i, :) - A_plus).^2)); D_minus(i) sqrt(sum((V(i, :) - A_minus).^2)); end % 使用向量化运算更高效推荐 % D_plus sqrt(sum((V - A_plus).^2, 2)); % sum(..., 2) 按行求和 % D_minus sqrt(sum((V - A_minus).^2, 2));步骤4计算各样本的相对贴近度C_iC_i D_i- / (D_i D_i-)显然C_i介于0和1之间。C_i越大说明该样本离正理想解越近离负理想解越远综合表现越好。C D_minus ./ (D_plus D_minus);步骤5根据C_i值进行排序C_i值从大到小排序即可得到所有样本的优劣顺序。[score_sorted, sort_idx] sort(C, descend); fprintf(样本排序结果从优到劣:\n); disp(sort_idx); fprintf(对应贴近度得分:\n); disp(score_sorted);5.2 TOPSIS实现中的关键讨论与优化距离公式的选择除了欧氏距离还可以使用曼哈顿距离等。欧氏距离是最常见的它考虑了所有维度上的综合差距。在论文中需要明确说明你的选择。权重的影响TOPSIS的核心在第一步的加权。如果权重分配不合理结果就会有偏差。熵权法为其提供了客观权重这是一个合理的组合。排序并列问题有时两个样本的C_i值非常接近甚至相同。在实际决策中可能需要引入第二、第三准则来区分或者在论文中说明这些样本处于同一梯队。可视化将结果可视化能极大提升论文表现力。可以绘制每个样本的D_i和D_i-的散点图或者绘制样本得分排序的条形图。% 可视化示例绘制样本得分条形图 figure; barh(1:n_samples, score_sorted(end:-1:1)); % 为了让最好的在最上面这里反转了一下 set(gca, yticklabel, cellstr(num2str(sort_idx(end:-1:1)))); % 设置y轴标签为样本原始编号 xlabel(相对贴近度 C_i); ylabel(样本编号); title(基于熵权-TOPSIS的综合评价结果); grid on;踩坑记录有一次练习中我忘记了对成本型指标进行正向化处理即(max - x)/(max-min)直接用了原始的标准化值进行TOPSIS计算。结果导致“成本”指标原本值越小越好但在计算中被当成了越大越好最终排序结果完全错误。这个错误非常隐蔽因为程序不会报错但结论是反的。所以务必在数据预处理后、熵权法之前确认所有指标方向一致一个检查方法打印出标准化矩阵Z的前几行看看那些成本型指标是不是数值大的对应原始数据中小的值。6. 模型集成与主程序逻辑我们把各个模块串起来形成一个完整的、健壮的主程序。当年的main.m可能很简单现在我们可以把它写得更加鲁棒和友好。%% 主程序基于熵权-TOPSIS的综合评价模型 clear; clc; close all; % 清空环境开始新的一次运行 fprintf( 综合评价模型启动 \n); %% 1. 数据准备 fprintf(\n[步骤1] 数据加载与预处理...\n); try [clean_data, indicator_names] data_preprocess(data.xlsx); fprintf(数据预处理完成。样本数%d 指标数%d\n, size(clean_data, 1), size(clean_data, 2)); catch ME fprintf(数据预处理失败错误信息%s\n, ME.message); return; % 终止程序 end %% 2. 熵权法计算权重 fprintf(\n[步骤2] 使用熵权法计算指标权重...\n); try [weights, entropy] calculate_entropy_weight(clean_data); % 显示权重 fprintf(指标权重计算结果\n); for i 1:length(weights) fprintf( 指标%d (%s): %.4f (熵值: %.4f)\n, i, indicator_names{i}, weights(i), entropy(i)); end catch ME fprintf(熵权法计算失败错误信息%s\n, ME.message); return; end %% 3. TOPSIS综合评价 fprintf(\n[步骤3] 使用TOPSIS法进行综合评价...\n); try [score, rank_idx, D_plus, D_minus] topsis_evaluation(clean_data, weights); fprintf(综合评价完成。\n); catch ME fprintf(TOPSIS评价失败错误信息%s\n, ME.message); return; end %% 4. 结果输出与可视化 fprintf(\n[步骤4] 结果输出...\n); fprintf(\n-------- 最终排名 --------\n); fprintf(排名\t样本编号\t贴近度C_i\t正理想距离D\t负理想距离D-\n); for i 1:length(rank_idx) sample_id rank_idx(i); fprintf(%d\t%d\t\t%.4f\t\t%.4f\t\t%.4f\n, ... i, sample_id, score(i), D_plus(sample_id), D_minus(sample_id)); end % 调用可视化函数 visualization(score, rank_idx, clean_data, indicator_names, weights); fprintf(\n 模型运行结束 \n);这里我把data_preprocess,calculate_entropy_weight,topsis_evaluation都封装成了独立的函数主程序只负责流程调度和异常捕获。使用try-catch结构可以防止某个模块出错导致整个程序崩溃并给出友好的错误提示这在调试和演示时非常有用。indicator_names是从Excel表头读取的指标名称让输出结果更易读。7. 从练习到实战模型检验与灵敏度分析一套模型做完得出排名工作就结束了吗远远没有。在正式的数学建模比赛中模型检验与灵敏度分析是拉开论文档次的关键环节。当年的练习代码很可能缺少这部分现在我们把它补上。7.1 排名稳定性检验蒙特卡洛模拟熵权法的权重依赖于数据。如果数据有微小扰动排名会变化吗我们可以通过蒙特卡洛模拟来检验。基本思路在原始数据上加入小的随机噪声例如服从正态分布N(0, σ)σ为噪声强度然后重新运行整个熵权-TOPSIS流程得到新的排名。重复这个过程成百上千次观察每个样本排名的波动情况。function stability_analysis(original_data, weights, n_simulations, noise_level) % original_data: 原始数据矩阵 % weights: 原始权重仅供参考每次模拟会重新计算 % n_simulations: 模拟次数如1000 % noise_level: 噪声标准差如0.01 (假设数据已标准化到0~1附近) [n, m] size(original_data); rank_history zeros(n, n_simulations); fprintf(开始蒙特卡洛稳定性模拟 (%d次)...\n, n_simulations); for sim 1:n_simulations % 添加随机噪声 noisy_data original_data noise_level * randn(n, m); % 确保噪声数据仍在合理范围0~1内可以裁剪 noisy_data max(0, min(1, noisy_data)); % 使用噪声数据重新计算熵权这里简化假设指标类型已知需调用正向化函数 % 注意需要重新进行正向化、标准化流程 % 假设我们有一个集成的函数 entropy_topsis_rank 输入数据输出排名 current_rank entropy_topsis_rank(noisy_data); % 这是一个假设的封装函数 rank_history(:, sim) current_rank; end % 分析结果计算每个样本的平均排名、排名标准差、排名变化范围 mean_rank mean(rank_history, 2); std_rank std(rank_history, 0, 2); min_rank min(rank_history, [], 2); max_rank max(rank_history, [], 2); % 可视化绘制每个样本的排名分布箱线图 figure; boxplot(rank_history, Labels, 1:n); xlabel(样本编号); ylabel(模拟排名); title(sprintf(模型排名稳定性分析 (噪声水平%.3f, %d次模拟), noise_level, n_simulations)); grid on; fprintf(\n稳定性分析摘要\n); fprintf(样本\t平均排名\t排名标准差\t最小排名\t最大排名\n); for i 1:n fprintf(%d\t%.2f\t\t%.2f\t\t%d\t\t%d\n, i, mean_rank(i), std_rank(i), min_rank(i), max_rank(i)); end % 排名标准差越小说明该样本位置越稳定。 end如果某个样本的排名标准差很大比如经常在第2名和第5名之间波动说明模型对该样本的评价不够稳定结论需要谨慎对待。在论文中可以指出这些“敏感点”并分析原因可能该样本在各指标上表现均衡导致对权重变化敏感。7.2 权重灵敏度分析除了数据扰动我们还可以直接分析权重变化对结果的影响。例如我们可以观察某个关键指标的权重上下浮动±10%时最终排名是否会发生显著变化。function weight_sensitivity_analysis(original_data, original_weights, indicator_idx, variation_range) % original_data: 标准化且同向化后的数据 Z % original_weights: 原始权重向量 % indicator_idx: 要分析的指标索引 % variation_range: 变化范围如 [-0.1, 0.1] 表示 -10% 到 10% base_weights original_weights; n_samples size(original_data, 1); % 生成一系列变化的权重 variation_rates variation_range(1):0.02:variation_range(2); % 以2%为步长 n_rates length(variation_rates); rank_changes zeros(n_samples, n_rates); for r 1:n_rates rate variation_rates(r); new_weights base_weights; new_weights(indicator_idx) base_weights(indicator_idx) * (1 rate); % 权重必须重新归一化使其和为1 new_weights new_weights / sum(new_weights); % 使用新权重进行TOPSIS评价 [~, current_rank] topsis_evaluation(original_data, new_weights); rank_changes(:, r) current_rank; end % 可视化绘制特定样本排名随权重变化曲线 figure; plot(variation_rates*100, rank_changes(1, :), b-o, LineWidth, 1.5, DisplayName, 样本1); % 以样本1为例 hold on; plot(variation_rates*100, rank_changes(2, :), r-s, LineWidth, 1.5, DisplayName, 样本2); % 样本2 xlabel(sprintf(指标%d权重变化百分比 (%%%), indicator_idx)); ylabel(样本排名); title(sprintf(指标%d权重灵敏度分析, indicator_idx)); legend(Location, best); grid on; hold off; % 找出引起排名反转的临界点 fprintf(对于指标%d当其权重变化超过以下范围时前两名发生反转\n, indicator_idx); % 这里可以编写逻辑判断排名顺序变化的临界点 end通过灵敏度分析我们可以回答诸如“哪个指标的权重对最终排名影响最大”、“我们的结论在多大程度上依赖于熵权法得到的特定权重”等问题。这极大地增强了模型的说服力和论文的深度。8. 超越练习现代工具链与扩展思路回顾2017年的MATLAB代码虽然核心逻辑依然有效但今天的工具链和思维方式已经更加丰富。作为补充我谈谈如何用现代数据科学视角来看待这个经典问题。1. 语言选择Python的崛起如今Python在数据科学和建模竞赛中几乎成为标配。用Python实现上述流程会更加简洁库生态也更丰富。数据预处理pandas(read_excel,fillna,describe)数值计算numpy熵权法/TOPSIS可以自己实现也有现成库如skcriteria但比赛中自己实现仍是主流以体现理解。可视化matplotlib,seaborn2. 模型扩展不止熵权-TOPSIS权重方法除了熵权法还可以尝试CRITIC法考虑指标间的冲突性、主成分分析PCA降维后以方差贡献率为权重等。在论文中可以进行方法对比说明选择熵权法的理由。评价方法除了TOPSIS还有灰色关联分析、VIKOR法、模糊综合评价等。可以构建组合评价模型例如用几种方法分别评价再对排名结果进行相关性分析或聚类得到更稳健的结论。结合机器学习如果样本有标签例如已知部分样本的等级可以将综合评价结果作为特征尝试使用分类算法如SVM、随机森林来预测新样本的等级或者用聚类算法如K-Means对样本进行自动分档。3. 工程化与部署练习代码是脚本式的。在实际项目中可能需要函数化与模块化就像我们前面做的那样每个功能封装成函数便于单元测试和复用。配置文件将指标类型效益型/成本型、文件路径、算法参数等写入一个配置文件如config.yaml或config.json而不是硬编码在脚本里。简单的GUI或Web界面使用MATLAB的App Designer或Python的Streamlit/Gradio可以快速构建一个交互式工具让非技术人员上传数据、调整参数、查看结果和图表。翻看这些老代码最大的感触不是技术过时而是建模思想历久弥新。数据预处理、指标量化、权重确定、综合排序这一套流程是解决无数评估、选择、排序类问题的通用框架。代码会迭代工具会更新但把现实问题抽象为数学语言并通过计算寻找答案的核心能力永远都是最有价值的。希望这次对“老代码”的深度重访能给你带来一些超越代码本身的启发。下次当你面对一堆数据和复杂的选择时不妨想想是不是可以先做个标准化算个权重排个序这个经典的建模工具箱永远在待命。
返回列表