人工神经网络的反向传播-梯度下降算法

关于人工神经网络 人工神经网络模型判断手写数字 我们首先在Mathematica中徒手打造一个人工神经网络,然后对该神经网络进行训练,最后用训练得到的模型来判断图片上的手写数字是多少。 trainingData = ResourceData["MNIST", "TrainingData"]; testData = ResourceData["MNIST", "TestData"]; net = NetInitialize@NetChain[{ FlattenLayer[], LinearLayer[500], ElementwiseLayer["Sigmoid"], LinearLayer[100], ElementwiseLayer["Sigmoid"], LinearLayer[10], SoftmaxLayer[]}, "Input" -> NetEncoder[{"Image", {12, 12}, "ColorSpace" -> "Grayscale"}], "Output" -> NetDecoder[{"Class", Range[0, 9]}]] NetEncoder告诉我们输入的单通道12*12的图像 NetDecoder告诉我们我们的神经网络模型最后输出的是一个分类,类别分别是0-9中的一个数字 网络层的模型为: FlattenLayer[] 图像中的像素数据即两纬数据排列成一纬数据做为输入 LinearLayer[500] 第一层线性层,输出数据为500个,限定函数为Sigmoid LinearLayer[100] 第二层线性层,输出数据为100个,限定函数为Sigmoid LinearLayer[10] 最后一层输出,因为我们需要有10个分类,所以这里设定是10,限定函数为 Softmax 神经网络层形象的展示如下: 训练数据标记,左边是实际的手写数字,右边是对应标签 RandomSample[trainingData, 10] 在未对模型进行训练前,使用随机的权重来判断图片,我们可以确定错误率接近100% 对模型进行训练 trained = NetTrain[net, trainingData, ValidationSet -> testData, MaxTrainingRounds -> 50 ] 从以上图表中我们大致可以看出正确率已经接近97% 再次预测上述图片,模型已经可以正确预测给出的图片数字为6 measurements = ClassifierMeasurements[trained, testData] 运行 measurements[“Accuracy”] 我们可以得到模型的正确率为98.02% ...

May 9, 2020

Epidemic Modeling

SIR Modeling SIR 经典模型主要是在传染病领域用来预测感染人数的未来趋势。 S[t] 表示susceptible易感人群 I[t] 表示infected已经感染的人群 R[t] 表示recovered已经康复人群 参考: MathWorld: SIR Model Kermack-McKendrick Model Kermack-McKendrick Model Kermack-McKendrick 最初的模型是为了解释像在1665-1666年发生的鼠疫,1865年发生的霍乱,感染人群的数量随着时间的变化。 该模型假定总人口是是固定的,传染病的潜伏期是瞬间的,传染持续时间与疾病的周期相同,并且假定人群都是无差异的,无性别及种族差异。 该模型使用了三个非线性常微分方程: beta 表示 infection rate 感染率 gamma 表示 recovery rate 恢复率 i 表示已感染人群 r 表示已恢复健康的人群 s 表示易感染人群 预设值: beta = 20%, gamma = 15%, i(0) = 0.1, r(0) = 0, s[0] = 10 Modelica 源码 model SIRModel parameter Real beta = 0.2; parameter Real gamma = 0.15; Real i; Real r; Real s; initial equation s = 10; i = 0.1; r = 0; equation der(s) = (-1) * beta * i * s; der(i) = (-1) * gamma * i + beta * i * s; der(r) = gamma * i; end SIRModel; 模型预测图: ...

April 6, 2020

Lotka Volterra Model

Lotka Volterra 方程 维基百科解释: Lotka Volterra 该方程组描述了 捕食系统模型 微分方程为: dx/dt = Axy - Bx dy/dt = Cy - Dxy => dy/dx = (Cy - Dxy) / (Axy - Bx) (1.1) {A, B, C, D} 均为模型系数 对微分方程(1.1)求解为: W 为Lambert W function 当系数为 {A -> 0.1, B -> 2, C -> 4, D -> 0.4, x -> {1,30}} y[x] 由于我们需要获得 x,y 关于自变量时间t,在模型系数{A,B,C,D}下的模型图,所以在Mathematica中对该方程组定义和设置模型系数 求该方程的数值解 创建Modelica模型 在0时刻 x[0] = 10, y[0] = 5 model = CreateSystemMod["Hare", Join[predatorPreyEq, {x[0] == 10, y[0] == 5}], t, Association[{"ParameterValues" -> params}]] 建模 Modelica 模型源码 ...

April 3, 2020

Foundations of Modelica systemmodeler with Mathematica (1)

为什么学习 Modelica 之前看到过一本书《模型思维》, 这段时间正好处在CoVid-2019疾病肆虐全球,偶然之间看到关于传染病学的预测模型SEIR,借着这个机会开始研究数学模型,决定重新捡起大学的时候学习的数学分析,常微分方程,偏微分方程,微分几何学等课程。接触到了Modelica这门语言,由于一直在学习Wolfram Mathematica,对Wolfram产品系列的SystemModeler颇有好感,于是下手购买了SystemModeler家庭版,购买了一本《Modelica多领域物理系统建模入门与提高》书籍,开始了对Modelica的探索,预期希望对数学模型的建立能够有一个较深刻的认识,利用数学模型预测某个事件的未来发展规律和在定量数据分析中获得更多的隐藏信息。 建立模型 - 液压系统 语言采用 Mathematica 液体不可压缩 根据Hagen-Poiseuille关系式首先建立方程组: 预设置参数: 假设两边的管子横截面积相同为1 解上述微分方程 h1, h2 的高度变化图 h1[t], h2[t] 方程组如下所示: 最后创建 SystemModeler 模型 model W8918fcdd72d8462a890fa97776822164 parameter Real g = 9.81; parameter Real mu = 1 / 500; parameter Real pipeDia = 0.2; parameter Real pipeLen = 0.1; parameter Real rho = 0.2; Real h1; Real h2; Real p1; Real p2; initial equation h1 = 1; h2 = 0; equation p1 = g * rho * h1; p2 = g * rho * h2; der(h1) = (-1) / 128 * Modelica.Constants.pi * pipeDia ^ 4 * pipeLen ^ (-1) * mu ^ (-1) * (p1 + (-1) * p2); der(h2) = 1 / 128 * Modelica.Constants.pi * pipeDia ^ 4 * pipeLen ^ (-1) * mu ^ (-1) * (p1 + (-1) * p2); »; end W8918fcdd72d8462a890fa97776822164; 将Modelica源码复制到SystemModeler运行,得到如下h1, h2的高度变化图形 ...

March 30, 2020 · FengChen