非常功利的数学建模准备

注: 本篇为 Mathematica and MultiParadigm Data Science 中和数学建模的一个整理. 主要是为了方便查找和使用对应的算法和程序.

思路是这样的: 因为准备时间有限, 所以尽可能地只使用尽可能少的工具. 所以会尽可能地在 Mathematica 中去找到所有的建模所需的程序和函数.

Optimize

Maximize & Minmize

Wolfram Optimization:

  • LinearOptimization 适用于线性约束问题下的线性函数的最小值的查找.
    LinearOptimization[x + y, {x + 2 * y == 3, x >= 0, y >= 0}, {x, y}]
    

    剩下的两个函数和其语法类似, 代码略.

  • FindMinimum 适用于寻找邻域内的局部最小值, 寻找的方式有点像是贪心算法.
  • Minimize 适用于寻找全局的最小值

    (注: 该函数对于 非常多 的变量的效果并不是很好. 虽然我觉得我也没有可能遇到这种情况就是了…)

一个比较炫酷的例子

可以使用 StepMonitor 配合 SowReap 来捕捉每一步具体的过程, 可以用于计算和绘制查找最小值的过程:

With[{exp = (1 - x)^2 + 100*(-x^2 - y)^2 ,
  xrange = {x, -1.5, 1.5}, yrange = {y, -1.5, 1.5}},
 With[{res = Reap[NMinimize[exp, {x, y}, StepMonitor :> Sow[{x, y}]]]},
  With[{path = res[[2, 1]], minValue = res[[1, 1]]},
   ContourPlot[exp, xrange, yrange,
    Epilog -> {Arrow[path], Point[path]},
    Contours -> Table[10^-i, {i, -2, 10}],
    ColorFunction -> (Hue[(Log[10, #] + 10)/12] &),
    ColorFunctionScaling -> False,
    ImageSize -> Medium]
   ]]]

参考的是官方文档的 StepMonitor 的例子. 可能需要重新修改一下关于着色的函数.

Graph

Graphs & Networks:

Other Optimise

Predict

Interpolation

Interpolation | Wikipedia

  • Interpolation 适用于根据数据来拟合一个函数, 可以用来拟合缺失的值. 不一定适合需要计算连续变化的问题, 适合函数值的一个结果.
  • InterpolatingPolynomial 牛顿多项式插值法.
  • FindFormula 用于根据数据来找一个函数形式, 可以通过 TargetFunctions 来指定用来猜的函数.

Probability

  • FindDistribution 根据数据来找出一个分布的概率函数. 可以用来判断函数的分布可能以及判断是否会有不同的数据分布.
    • RandomVariate 根据概率分布来随机生成数据.
    • AnomalyDetection 得到一个能够用来判断异常数据的一个判断函数, 其核心是根据概率分布的一个解决方式.
  • Finite Markov Processes | Wolfram Doc 有限 Markov 链, 适用于仅和当前状态有关的变化问题.

Gray Model

可参考文档:

AutoRegression

Measure

Ranking

AHP

可参考的文档:

TOPSIS

TOPSIS | Wikipedia 计算正负理想解以距离其距离正负理想解的距离来作为判断因素

  • Max, Min 用于计算正负理想解
  • EuclideanDistance 用于计算距离 (其他的距离函数可以考虑 ?*Distance)
一个可行的代码

设数据的类型类似如下形式:

data = Table[Table[RandomInteger[5], {i, 2}], {j, 3}]
44
40
41
  • 计算正规化 (normalization) 数据的函数:
    normalData[data0_] := With[{ data = Transpose[data0] },
      Transpose[(# / Sqrt[Total[#^2& /@ #]]) & /@ data]];
    
  • 如果需要安排权值 $w_i$, 那么考虑:
    weightAssignData[data_, weight_] := MapThread[#1 * #2&, {#, weight}]& /@ data;
    
  • 计算正负理想解的函数:
    worstAlternative[data0_] := With[{ data = Transpose[data0] }, Min /@ data];
    bestAlternative[data0_] := With[{ data = Transpose[data0] }, Max /@ data];
    
  • 最后使用距离函数, 并通过距离函数来评价:
    rankData[data_] := With[{ worst = worstAlternative[data], best = bestAlternative[data] },
      SortBy[data, {EuclideanDistance[best, #]&, EuclideanDistance[worst, #]&}]];
    

EWM

Entropy Weight Method | Hindawi 使用数据本身的统计分布来作为权值的判断因素.

一些代码及解释

参考 上面 的论文, 直接摘取部分摘要:

Entropy weight method (EWM) is a commonly used weighting method that measures value dispersion in decision-making. The greater the degree of dispersion, the greater the degree of differentiation, and more information can be derived.

假设数据样本有如下的形式:

data = Table[Table[RandomReal[5], {j, 2}], {i, 5}]
  • 首先正规化采样值
    standardData[data0_] := With[{ data = Transpose[data0] },
      Transpose[# / Total[#]& /@ data]];
    
  • 然后计算每组指标对应的熵值并根据熵值来计算权值:
    weightData[data_] := With[{ entropydata = Entropy /@ Transpose[data] },
      With[{ sum = Total[(1 - #)& /@ entropydata] }, ((1 - #) / sum)& /@ entropydata]];
    

    Note: 或者可以考虑 $E = - \frac{∑_j p_{ij} \mathrm{ln} p_{ij}}{\mathrm{ln} n}$.

  • 于是打分函数就变成了一个 MapThread[#1 * #2&, {standarddata, weightData[standarddata]}].

FCE

FCE: Fuzzy Comprehensive Evaluation, 建立在模糊数学上.

可以参考的几个应用:

PageRank

PageRank | Wikipedia 用于衡量网络 (Graph) 中的节点的排序顺序.

Classify

PCA

PCA (Principal Component Analysis) | Wikipedia 主成分分析.

  • PrincipalComponents 将一组数据集中汇聚到中心
    一个例子

    如果有一个数据的分布并不在中心, 而是分散在四周, 想要将其变换并集中在中心:

    data = With[{ dst1 = NormalDistribution[2, .75], dst2 = NormalDistribution[-1, 2] },
      Table[{2 * a + b, a - 4 * b} /. { a -> RandomVariate[dst1], b -> RandomVariate[dst2] }, 10]];
    

    使用 ListPlot[PrincipalComponents[data]] 来输出集中的图片:

    /_img/MMA/pca-example.svg

Correlation Analysis

Correlation | Wikipedia 可以用相关性来对数据进行分类.

Arrange

Queuing Theory

Queueing Theory | Wikipedia 用于安排服务和排队的问题.

Others

MonteCario

How to | Perform a Monte Carlo Simulation

  • RandomVariate 根据概率分布来随机生成
  • randomWalk[n_] := Accumulate[Prepend[RandomVariate[NormalDistribution[0, 1], n], 0]] 随机游走的代码.

Automa

Cellular Automation | Wikipedia 元胞自动机, 可以用于生物, 化学, 物理之类的模拟.

AI

Wolfram Machine Learning

General Functions

Decision Tree & Random Forest

  • DecisionTree Wolfram Machine Learning Method. Wolfram 内置的方法, 可以用于 Predict, Classify, LearnDistribution 函数.
    类似于如下的一个决策树

    比如说有这样的一个决策树:

  • RandomForest Wolfram Machine Learning Method. Wolfram 内置的方法, 可以用于 ClassifyPredict.

Neural Networks

Wolfram Neural Net Repository 官方的一个神经网络库, 可以在已经实现的神经网络的基础上进行修改来用于新的问题.