Mathematica and Math Modeling
非常功利的数学建模准备
注: 本篇为 Mathematica and MultiParadigm Data Science 中和数学建模的一个整理. 主要是为了方便查找和使用对应的算法和程序.
思路是这样的: 因为准备时间有限, 所以尽可能地只使用尽可能少的工具. 所以会尽可能地在 Mathematica 中去找到所有的建模所需的程序和函数.
Optimize
Maximize & Minmize
- LinearOptimization 适用于线性约束问题下的线性函数的最小值的查找.
LinearOptimization[x + y, {x + 2 * y == 3, x >= 0, y >= 0}, {x, y}]
剩下的两个函数和其语法类似, 代码略.
- FindMinimum 适用于寻找邻域内的局部最小值, 寻找的方式有点像是贪心算法.
- Minimize 适用于寻找全局的最小值
(注: 该函数对于 非常多 的变量的效果并不是很好.
虽然我觉得我也没有可能遇到这种情况就是了…)
一个比较炫酷的例子
可以使用 StepMonitor 配合 Sow 和 Reap 来捕捉每一步具体的过程, 可以用于计算和绘制查找最小值的过程:
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
- Graph 构建图结构, 适用于存在 “节点-边” 的结构的问题.
- FindShortestPath 寻找两点之间最短路径.
- FindSpanningTree 寻找连接所有节点的最小生成树.
- Ant Conony Optimization 通过模拟蚁群和信息素的行为来尝试解决问题.
- FindMaximumFlow 找到最大流.
Other Optimise
- Dynamic Programming
不熟 - Greedy Algorithm
不熟 - Simulated Annealing 模拟退火, 在贪心算法基础上逐渐减少随机转移的概率.
或者直接调用函数
莽就完事了:NMinimize[f, vars, Method -> "SimulatedAnnealing"]
Predict
Interpolation
- Interpolation 适用于根据数据来拟合一个函数, 可以用来拟合缺失的值. 不一定适合需要计算连续变化的问题, 适合函数值的一个结果.
- InterpolatingPolynomial 牛顿多项式插值法.
- FindFormula 用于根据数据来找一个函数形式,
可以通过
TargetFunctions
来指定用来猜的函数.
Probability
- FindDistribution 根据数据来找出一个分布的概率函数.
可以用来判断函数的分布可能以及判断是否会有不同的数据分布.
- RandomVariate 根据概率分布来随机生成数据.
- AnomalyDetection 得到一个能够用来判断异常数据的一个判断函数, 其核心是根据概率分布的一个解决方式.
- Finite Markov Processes | Wolfram Doc 有限 Markov 链,
适用于仅和当前状态有关的变化问题.
- DiscreteMarkovProcess 可以根据转移矩阵来生成一个 Markov 转移分布. 可以通过 RandomFunction 来对这个结果进行模拟.
Gray Model
可参考文档:
AutoRegression
- ARProcess 模拟 AR 过程 Autoregressive Model | Wikipedia 自动回归模型
- Vector Autogression | Wikipedia 向量 AR 过程
- ARMAProcess 自回归滑动平均模型
- ARIMAProcess 模拟 ARIMA 过程 Autoregressive Inegrated Moving Average | Wikipedia
Measure
Ranking
AHP
可参考的文档:
TOPSIS
TOPSIS | Wikipedia 计算正负理想解以距离其距离正负理想解的距离来作为判断因素
- Max, Min 用于计算正负理想解
- EuclideanDistance 用于计算距离 (其他的距离函数可以考虑
?*Distance
)
一个可行的代码
设数据的类型类似如下形式:
data = Table[Table[RandomInteger[5], {i, 2}], {j, 3}]
4 | 4 |
4 | 0 |
4 | 1 |
- 计算正规化 (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 用于计算数据的熵
一些代码及解释
参考 上面 的论文, 直接摘取部分摘要:
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, 建立在模糊数学上.
可以参考的几个应用:
- Application of fuzzy comprehensive evaluation to evaluate the effect of water flooding development
- Comprehensive evaluation model for health grade of multi-component compound release materials based on fuzzy comprehensive evaluation with grey relational analysis
- The fuzzy comprehensive evaluation (FCE) and the principal component analysis (PCA) model simulation and its applications in water quality assessment of Nansi
- Fuzzy Comprehensive Evaluation Method of Masonry Structure Safety Based on Grey Clustering Theory
PageRank
PageRank | Wikipedia 用于衡量网络 (Graph) 中的节点的排序顺序.
- PageRankCentrality
佩奇算法 - LinkRankCentrality
可以参考的论文: LinkRank: Finding communities in directed networks | arxiv
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]]
来输出集中的图片:
Correlation Analysis
Correlation | Wikipedia 可以用相关性来对数据进行分类.
- Correlation, CorrelationTest 用于检测数据的相关程度
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
General Functions
- Machine Learning Methods Mathematica 中的一些内置的 AI 方法
- Classify 根据样本来生成分类函数
- FeatureExtract 尝试提取输入的样本的特征
- Predict 根据样板来生成预测函数
- FindClusters 根据样本寻找聚类
- DimensionReduction 将样本的维度缩小
- Regression with Uncertainty 回归.
- LearnDistribution 根据样本猜测分布
- AnomalyDetection 用于查找不同的数据
- SynthesizeMissingValues 用于填补
Missing[]
的数值
Decision Tree & Random Forest
- DecisionTree Wolfram Machine Learning Method. Wolfram 内置的方法,
可以用于
Predict
,Classify
,LearnDistribution
函数.类似于如下的一个决策树
比如说有这样的一个决策树:
- RandomForest Wolfram Machine Learning Method. Wolfram 内置的方法,
可以用于
Classify
和Predict
.
Neural Networks
Wolfram Neural Net Repository 官方的一个神经网络库, 可以在已经实现的神经网络的基础上进行修改来用于新的问题.