精华内容
下载资源
问答
  • 2019年第十六届中国研究生数学建模竞赛A题 2019年第十六届中国研究生数学建模竞赛A题思路聚焦 在本届数学建模竞赛中,希望参赛者能够对机器学习的工作方式有一定掌握并站在设备供应商以及无线运营者的角度,通过合理...

    2019年第十六届中国研究生数学建模竞赛A题

    2019年第十六届中国研究生数学建模竞赛A题思路聚焦

    在本届数学建模竞赛中,希望参赛者能够对机器学习的工作方式有一定掌握并站在设备供应商以及无线运营者的角度,通过合理地运用机器学习模型(不限定只使用这种方法)来建立无线传播模型,并利用模型准确预测在新环境下无线信号覆盖强度,从而大大减少网络建设成本,提高网络建设效率。

    集思广益

    在这里插入图片描述

    展开全文
  • ================================================ ...================================================ 目录摘要问题重述背景问题提出问题一的模型建立与求解基于模糊决策的层次分析算法模糊决策模型改进的模糊...

    ================================================
    博主github:https://github.com/MichaelBeechan
    博主CSDN:https://blog.csdn.net/u011344545

    ================================================

    摘要

    • 恐怖袭击是指极端分子或组织人为制造的、针对但不仅限于平民及民用设施的、不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力,能直接造成巨大的人员伤亡和财产损失,而且还给人们带来巨大的心理压力,造成社会一定程度的动荡不安,妨碍正常的工作与生活秩序,进而极大地阻碍经济的发展。恐怖主义是人类的共同威胁,打击恐怖主义是每个国家应该承担的责任。对恐怖袭击事件相关数据的深入分析有助于加深人们对恐怖主义的认识,为反恐防恐提供有价值的信息支持。
    • 问题一使用人员伤亡、财产损失、恐怖袭击持续时间等 19 项因素作为参考,利用层次分析法,列出比较矩阵,通过一致性检验,进行权重分配计算,最后得出图 4.1 模型对恐怖袭击事件进行危害等级评价。
    • 问题二中模型的评价检测标准与问题一相同,系统的性能随参数重量而变化。当位置参数权重大于 2 时,系统的整体性能达到 79.72%。虽然系统的整体性能提高但系统识别小组的性能下降。提出了一个恐怖组织预测模型(TGPM)来预测参与特定攻击的恐怖组织,运用数学建模的方法寻找可能性,将可能是同一个恐怖组织或个人在不同时间、不同地点多次作案的若干案件归为一类,对应
      的未知作案组织或个人标记不同的代号,并按该组织或个人的危害性选出前 5个,再对列出的恐袭事件,按嫌疑度对嫌疑人进行排序。
      问题三选择了训练集样本数据与测试集样本数据之比为 3:1 来进行建模,利用随机森林分类器构建了恐怖袭击事件的预测模型。并针对数据做了可视化的分析以及世界范围内地图分布的分析。研究数据表明,有 75%的恐怖组织仅仅发动了 5 次或者少于 5 次的恐怖袭击,而所有的恐怖组织平均发动的恐怖袭击却达到了 27 次之多,可见前 25%的恐怖组织发动的恐怖袭击数量惊人,对社会危害程度极大。
      问题四针对已给出的恐怖袭击事件,运用数学建模的方法寻找可能性,将其他未给出具体经纬度的恐怖袭击事件的经纬度寻找出来。为了进一步研究,建议采用不同的群体检测人工智能技术,加入更多的参数,如电话、电子邮件数据等,以获得更准确的结果。

    关键词: 层次分析法;TGPM 模型;随机森林;恐怖袭击
    在这里插入图片描述

    问题重述

    背景

    • 恐怖袭击是指极端分子或组织人为制造的、针对但不仅限于平民及民用设施的、不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力,能直接造成巨大的人员伤亡和财产损失,而且还给人们带来巨大的心理压力,造成社会一定程度的动荡不安,妨碍正常的工作与生活秩序,进而极大地阻碍经济的发展。恐怖主义是人类的共同威胁,打击恐怖主义是每个国家应该承担的责任。对恐怖袭击事件相关数据的深入分析有助于加深人们对恐怖主义的认识,为反恐防恐提
      供有价值的信息支持。

    问题提出

    • 问题 1:恐怖袭击事件的危害性不仅取决于人员伤亡和经济损失这两个方面,还与发生的时机、地域、针对的对象等等诸多因素有关,结合附件 1 以及其他有关信息,结合现代信息处理技术,借助数学建模方法建立基于数据分析的量化分级模型,将附件 1 给出的时间按危害程度从高到低分为一至五级,列出近二十年来危害程度最高的十大恐怖袭击事件,并给出表 1 中事件的分级。
      在这里插入图片描述

    • 问题 2:附件 1 中有多起恐怖袭击事件尚未确定作案者。针对在 2015、2016年度发生的、尚未有组织或个人宣称负责的恐怖袭击事件,运用数学建模方法寻找可能是同一个恐怖组织或个人在不同时间、不同地点多次作案的若干案件,并将其归为一类,对应的未知作案组织或个人标记不同的代号,并按该组织或个人的危害性从大到小选出其中的前 5 个,记为 1 号-5 号。再对表 2 列出的恐袭事件,按嫌疑程度对 5 个嫌疑人排序,并将结果填入下表(表中样例的意思是:对事件编号为 XX 的事件,3 号的嫌疑最大,其次是 4 号,最后是 5 号),如果认为某嫌疑人关系不大,也可以保留空格。
      在这里插入图片描述
      在这里插入图片描述

    • 问题 3:对未来反恐态势的分析评估有助于提高反恐斗争的针对性和效率。请你们依据附件 1 并结合因特网上的有关信息,建立适当的数学模型,研究近三年来恐怖袭击事件发生的主要原因、时空特性、蔓延特性、级别分布等规律,进而分析研判下一年全球或某些重点地区的反恐态势,用图/表给出研究结果,提出对反恐斗争的见解和建议。

    • 问题4:通过数学建模还可以发挥附件1 数据的哪些作用?给出模型和方法。

    问题一的模型建立与求解

    • 对灾难性事件比如地震、交通事故、气象灾害等等进行分级是社会管理中的重要工作。通常的分级一般采用主观方法,由权威组织或部门选择若干个主要指标,强制规定分级标准。但恐怖袭击事件的危害性不仅取决于人员伤亡和经济损失这两个方面,还与发生的时机、地域、针对的对象等等诸多因素有关,因而采用上述分级方法难以形成统一标准。而高效、准确的突发事件分级是应急管理实施的重要保证。依据附件 1 以及其它有关信息,结合现代信息处理技术,借助数学建模方法建立基于数据分析的量化分级模型,将附件 1 给出的事件按危害程度从高到低分为一至五级,列出近二十年来危害程度最高的十大恐怖袭击事件,并给出事件的分级。

    基于模糊决策的层次分析算法

    模糊决策模型

    在这里插入图片描述
    在这里插入图片描述

    • 方法,Bass-Kwakernaak,Chen-McInnis,Dubois-Prade 等都分别提出了自己的算法,一般采用的都是α截集,但计算量较大;为了提高计算效率,本文中采用的是 Bonissone 的 L-R 型梯形模糊数近似算法。

    改进的模糊层次分析算法

    • 我们引入了基于模糊决策的模糊分析算法,首先根据机理分析以及以往的案例分析,识别因素、选取因素和确定动态分级要素;为专家赋予权重,再采用多专家打分的方法对各个因素赋三角模糊数。三角模糊数中的左极小值表示专家认为此因素可能的最小值,中间数表示专家认为最有可能的值,右极大值表示可能的最大值;接着根据三角模糊数方法得出各因素的模糊权重,综合模糊权重以及期望值和排序;根据 Kerre 方法计算模糊综合评估最优方案;采用悲观型决策原则,从最优方案的模糊值中选取最悲观的值作为最后的确定值,对应级别归类表确定最后的级别。
    • 在确定了未来时刻的级别后,再计算未来时刻的状态转移概率,以此来验证动态级别判定的准确性。突发事件的发生发展具有随机性,假设突发事件的级别变化具有“无后效性”,而计算事件级别的时间点是离散的,于是各人级别的状态构成了马尔可夫链。依照过去的经验值给出状态转移矩阵,再根据科尔莫戈罗夫——查普曼方程计算任意离散时间点的状态转移概率,最后检验状态转移概率的结果是否与初步评审结果一致,如果不一致,应该进行进一步反馈调整。

    改进后算法的实施

    • 模糊综合评估包括三部分主要内容:确定模糊权重并为因素权重排序,确定最优方案(最符合实际应急需求的方案)和计算状态转移概率。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    问题的求解结果

    • 我们使用人员伤亡、财产损失、恐怖袭击持续时间等 19 项因素作为参考,利用层次分析法,列出比较矩阵,通过一致性检验,进行权重分配计算,最后得出图 4.1 模型对恐怖袭击事件进行危害等级评价。评价结果如表 4.1 所示。
      在这里插入图片描述
      在这里插入图片描述

    问题二模型的建立与求解

    问题描述及分析

    • 在附件 1 中有多起恐怖袭击事件尚未确定作案者。而有一些案件可能是同一个恐怖组织或个人在不同时间、不同地点进行的多次作案,如果能够把这些案件串联起来统一组织侦查,将有助于提高破案效率,有利于尽早发现新生的或者隐藏的恐怖分子。本文提出了一个恐怖组织预测模型(TGPM)来预测参与特定攻击的恐怖组织,运用数学建模的方法寻找可能性,将可能是同一个恐怖组织或个人在不同时间、不同地点多次作案的若干案件归为一类,对应的未知作案组织或个人标记不同的代号,并按该组织或个人的危害性选出前 5 个,再对列出的恐袭事件,按嫌疑度对嫌疑人进行排序。

    模型的建立与求解

    • TGPM 旨在通过使用历史数据来检测负责任的恐怖组织。TGPM 使用犯罪预测模型,组检测模型(GDM)和罪犯组检测模型(OGDM)的概念。TGPM使用各种参数,如攻击类型,位置,目标类型,武器类型,人质/绑架和自杀式攻击等。TGPM 使用恐怖主义语料库,参数值和参数权重作为输入。
    • 数据预处理是一个重要的步骤,其中填充缺失值,删除冗余并执行过滤,以便数据库可以使用。我们利用附件 1 中的数据,在对数据库进行预处理后,根据输入参数计算每组攻击的百分比。每个参数根据其对事件的影响分配权重。通过使用每组的攻击百分比和参数权重来计算组权重。创建不同的集群。执行这些集群之间的关联,并且获得来自这些关联的最高价值。对应于最高值的组织名称是最可能的应该负责任的恐怖组织。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    实验结果与分析

    在这里插入图片描述
    在这里插入图片描述

    • 本文提出了一个恐怖组织预测模型(TGPM),该模型从现有的历史数据中了解恐怖袭击的模式,并将恐怖组织与之前的攻击联系起来。每个恐怖组织都可以根据攻击方式加以区分,因此,通过分析这些模式,TGPM 将预测可能涉及特定事件的群体。我们模型中使用的不同参数是攻击类型,位置,目标类型,武器类型,人质/绑架和自杀攻击。当所有参数的权重相等时,系统的整体性能为65.73%。为了提高性能,不同的参数应具有不同的权重。为了确定不同参数的最佳权重值,已经进行了几个实验。通过改变一个参数的权重并保持所有其他参数的权重等于 1 来绘制图形。图 5.2,图 5.3,图 5.4,图 5.5,图 5.6 和图 5.7中的图表显示了效果参数权重超过系统结果。
    • 建立 TGPM 模型:TGPM: Terrorist Group Prediction Model for Counter Terrorism影响因素:
    'region', 'success', 'suicide', 'crit1', 'crit2', 'crit3', 'attacktype1', 'attacktype2', 'attacktype3','targtype1', 'targtype2', 'targtype3', 'weaptype1', 'weaptype2', 'weaptype3', 'weaptype4', 'nkill','nwound', 'gname'
    
    • 探索性分析:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 分析以上数据结果建立模型:
      在这里插入图片描述
    估计结果

    在这里插入图片描述
    在这里插入图片描述

    模型的评价

    • 本题模型的评价检测标准与问题一相同。系统的性能随参数重量而变化。当位置参数权重大于 2 时,系统的整体性能达到 79.72%。虽然系统的整体性能提高但系统识别小组的性能下降。

    问题三模型建立与求解

    问题描述及分析

    • 经研究发现,恐怖组织不仅会改变方式进行活动,甚至还有可能改变活动方式并加速在全球扩散,乃至形成新一轮恐怖活动浪潮。为应对恐怖活动威胁,国际社会需要科学、理性地认识产生国际恐怖主义的历史根源,加强反恐领域的国际合作。对未来反恐态势的分析评估有助于提高反恐斗争的针对性和效率。可以利用近三年来恐怖袭击事件发生的主要原因、时空特性、蔓延特性、级别分布等规律,进而分析研判下一年全球或某些重点地区的反恐态势。

    模型的建立

    随机森林理论

    • 随机森林(Random Forest,RF)是一种对多棵分类回归树进行集成的模型组合算法,随机森林以随机的形式由众多分类回归树建立一个决策树群。随机森林的决策树群中的各个分类回归树间都是相互独立,每棵分类回归树代表的分类器都独自构建,因此一个待分类样本 S,在经过 K 个分类器之后有 K 个类别标签。
    • 随机森林这个组合模型的任务就是以某种形式将所有分类器的分类结果进行组合,将多数分类器给出的分类类别的众数作为组合模型的最终预测结果。
    • 随机森林预测的理论基础是 Bagging 思想,Bagging 思想是指由于随机森林的分类回归树是相互独立的,绝大多数分类器给出的分类结果很可能涵盖所有的类别,这些类别会互相抵消。只有少部分符合预测场景的决策树的预测结果会脱颖而出,做出高准确率的预测。
    • 随机森林的随机性体现在以下两个方面:
      (1)在训练每棵决策树的时候,从所有的训练样本中(数量为 N)中选取一个大小同样是 N 并且可能重复的数据集进行训练(即 Bootstrap 取样)。
      (2)在每个节点,随机选取所有特征的一个特征子集,以此来确定最佳分割方式。
    • 随机森林分类算法的基本框架可参考图 2.4,图中涉及到的核心概念有 CART学习方法、Bagging 思想、分类器以及多数投票策略等。所以,我们可以对随机森林算法进行如下描述。
    • 随机森林是指利用 Bagging 方法生成训练集,以 CART 作为元学习算法并使用多数投票策略确定模型最终分类结果的一种组合模型算法。

    Bagging算法

    • Bagging 方法是一种基于 Bootstrap 的重采样技术,其核心思想是利用Bootstrap 重采样来构建众多相互独立的分类器,接下来集成这些分类器以充分发挥组合模型的优势。
    • Bagging 算法过程描述如下表:
      在这里插入图片描述

    CART算法

    • CART 算法的决策树构建思想可以归结为以下三点:
      (1)根节点的数据是全部样本的初始数据,每个内部节点的数据则是初始样本集数据采样后的子集。
      (2)非叶子节点在属性分裂时,该算法以在样本属性集的全部属性中寻找最优属性的方法来实现属性分裂;以此类推,后续节点也进行类似操作,直到叶节点终结该步骤。
      (3)使用剪枝法对决策树枝干进行剪枝,达到测试误差最小化的效果。

    随机森林回归模型

    在这里插入图片描述
    在这里插入图片描述

    随机森林对输入变量重要性的测度

    • 随机森林测度输入变量重要性的基本思路是:若某特征变量对预测有重要影响,则在该该特征变量的取值上添加随机噪声,影响预测效果。具体表现为各类别的预测置信度、总体预测精度、节点的异质性测度指标变化明显。中添加随机噪声的方法是随机打乱训练集在该特征变量上的取值顺序。
    • 设随机森林包括 M 棵分类回归树。为测度第 j 个特征变量对结果的重要性,对随机森林中的每棵树进行处理。对第 i(i=1,2,…,M)棵分类回归树并利用测试集进行预测。
      在这里插入图片描述

    预测结果

    • 对于恐怖袭击事件而言,恐怖袭击事件发生的主要原因、时空特性、蔓延特性、级别分布等规律能够体现出恐怖袭击的态势,是对恐怖袭击事件进行管理的重要参考指标。
    • 本文选择了训练集样本数据与测试集样本数据之比为 3:1 来进行建模,利用随机森林法构建了恐怖袭击事件的预测模型。
      在这里插入图片描述
      在这里插入图片描述
    • 如图 6.2 中所示,该数据可视化分别为每年发生的恐怖袭击数量、一星期中每一天发生的恐怖袭击数量(其中 0 为星期一,1 为星期二,以此类推,8 为未知)、各国家发生的恐怖袭击数量、各地区发生的恐怖袭击数量、按攻击类型分类的恐怖袭击数量、按武器分类的恐怖袭击数量、按被攻击目标类型分类的恐怖袭击数量和按恐怖组织分类的恐怖袭击数量。由于恐怖组织数量太多,图中并没有全部出。
    • 由于我国治安状况良好,恐怖袭击较少,所以对恐怖主义相当不熟悉,但仍然能从数据中看出一些情况:自 2012 年以来,恐怖袭击数量大幅度增加。美国排名前 15 位,前 30 位有 3 个欧洲国家,中东和北非以及南亚地区发生的恐怖袭击数量大幅领先于其他地区,而我国和我国所在的东亚地区恐怖袭击数量都比较少。媒体也有报道这些地区的恐怖袭击事件,攻击类型和武器与媒体报道一致,以爆炸袭击为主。在最活跃的恐怖组织之后,其他恐怖组织的攻击数量急剧下降。
    • 样本稀疏性检索:
      在这里插入图片描述
    • 如图 6.3 所示,还进行了恐怖组织的攻击频率分析,图中每个恐怖组织的恐怖袭击中位数为 2,有 75%的恐怖组织仅仅发动了 5 次或者少于 5 次的恐怖袭击,而所有的恐怖组织平均发动的恐怖袭击却达到了 27 次之多,可见前 25%的恐怖组织发动的恐怖袭击数量惊人,对社会危害程度极大。
      在这里插入图片描述
      在这里插入图片描述

    对反恐态势的分析

    • 由数据分析看来,伊拉克和叙利亚周边的中东国家,以及邻近的欧洲国家正在成为“伊斯兰国”进行渗透和发动外围袭击的重灾区。由于在数量上远远超过此前的阿富汗战争和波黑内战,来源地又极为广泛,外籍恐怖分子已经成为我们这个时代最紧迫的跨国安全问题。这些前往叙利亚战区的个体可能会进一步激进化,或是接受战斗技能训练,被灌输极端思想,建立社会关系网,形成共同的忠诚,进而形成未来自主性跨国恐怖组织细胞的基础。
    • 从全球反恐的角度来看,随着伊拉克和叙利亚战事逐渐平息,未来二者在全球反恐战争中的地位和关注度将会有所下降,但其周边地区的中东国家仍将是全球反恐的重点关注所在。其一,伊拉克和叙利亚周边地区不仅是“外籍战士”的主要来源,也是近年来“伊斯兰国”着力渗透的重点区域。其二,“阿拉伯剧变”以来,阿拉伯世界各国大多处于政治、经济和社会发展的转型时期,不少国家还未能从政治与社会震荡中恢复。除了“伊斯兰国”肆虐的伊拉克和叙利亚外,也门、利比亚、突尼斯等也面临着非常严峻的暴力冲突局面。无论是经济发展迟缓、民生凋敝,还是国内政治动荡、暴力活动频发,都将继续为“跨国圣战”势力提供非常有利的外部生存环境。其三,除了中东阿拉伯各国国内政治和社会经济转型影响之外,整个中东地区目前还处在地缘政治均势和地区秩序同步瓦解后的重建时期。一方面,美国因近年来相对实力下降,干预中东事务的能力和意愿开始同步减弱,其在中东反恐和其他国际热点事务中表现得越来越心有余而力不足;另一方面,中东地区各国为了维护自身利益,并在新一轮地缘政治格局变动中获得相对优势,其参与塑造中东地缘政治格局的意愿也明显增强,这也是当前中东地区的代理人战争、教派冲突和“跨国圣战”活动难以平息的重要原因。

    对反恐斗争的见解

    • 我们对于恐怖活动的思考并不能局限于恐怖活动现象本身,而是要在更为宏大的国际背景和历史视野下来认识这一问题。全球“跨国圣战”运动正是我们理解当今国际恐怖活动的一个关键所在。尽管“跨国圣战”并不等同于国际恐怖主义,但它却在客观上为当今国际恐怖活动的发展提供了重要的思想来源和组织基础。未来全球反恐形势或将更为严峻。
    • 为应对国际恐怖活动,第一,我们需要正确地认识国际恐怖主义现象以及造成这一现象的深层根源,进而采取科学的应对之道。面对“跨国圣战”运动所诱发的国际恐怖主义,首先要在意识形态层面开展针锋相对的斗争。。一方面,利用正确的教义阐释与科学理论逐一揭露并批驳极端主义“圣战”理论的荒谬性;另一方面,在全球化大背景下,还要通过深入的文明对话与交流化解不同宗教与文化之间的误读与隔阂。
    • 第二,加强反恐领域的国际合作,建立一个高效、广泛的跨国反恐合作机制。在全球化背景下,一方面,无论是国际恐怖活动,还是“跨国圣战”运动,都具有明显的“洼地效应”,总是会流向社会治理能力低下、安全防范薄弱、极端思想浓厚、同情者和支持者较多的“洼地”。另一方面,部分民族国家、非国家行为体对于“跨国圣战”和国际恐怖势力的工具性利用与支持也是其能够不断发展的重要原因。对大多数现代主权国家而言,在自己领土上打击恐怖犯罪活动是国际法赋予本国政府的基本权利,但对于超越自己边界的恐怖活动则往往无能为力。当代国际恐怖势力正是利用了这一点,以境外为基地开展活动,从而使自己免于被受害国报复的风险。更糟的是,由于交通、通信和信息技术的巨大进步,恐怖分子走向国际化的成本已经大大降低。对此,国际社会不仅要深化对于国际恐怖主义危害的认识,摒弃以邻为壑的侥幸心态,更要加强国际合作,构建一个最广泛的国际反恐合作统一战线,最大限度地减少国际反恐中的“洼地”,使恐怖势力最终无处遁形。
    • 第三,以全球反恐战争为契机,在新一轮国际格局转型过程中建立一个平等、公正、合理的国际政治经济新秩序。未来的国际反恐合作首先要摒弃一些超级大国长期奉行的“双重标准”和单边主义政策,尤其是西方国家在“九·一一”事件后以“反恐战争”名义所建立话语霸权和行为霸权。与此同时,国际社会还要在反恐合作、打击暴力极端主义等国际事务中充分尊重广大发展中国家的意愿和诉求。承担起帮助发展中国家构建并提升反恐能力的国际责任,以调动更多发展中国家参与国际反恐合作的积极性。简言之,通过深化全球反恐合作,在新一轮国际格局转型过程中建立一个更为平等、公正、合理的国际政治经济新秩序,进而消除造成“跨国圣战”运动和滋生恐怖主义的国际土壤。
    • 经纬度信息填补提高准确率,代码如下:
    In: #missing values:
    print('Missing values:')
    check_nan[['longitude','latitude']]
    Out: longitude 4606
    latitude 4606
    dtype: int64
    
    • 对于缺少的经纬度信息,利用随机森林分类器进行计算,我们得到了超过4000 组数据的经纬度信息。
    Missing values:
    longitude 132
    latitude 132
    dtype: int64
    
    • 经过填补之后,缺少的经纬度组数仅为 132 组。
    • 在本研究中,我们可以得出结论,通过使用历史恐怖主义数据,我们可以预测在给定的袭击中涉及的群体。然而,进一步的研究可以利用历史数据来检测恐怖组织。为了进一步研究,建议采用不同的群体检测人工智能技术,加入更多的参数,如电话、电子邮件数据等,以获得更准确的结果。从以上实验结果可以看出,本文,实验取得了预期效果。
    参考文献
    [1] Sachan A, Roy D. TGPM: Terrorist Group Prediction Model for Counter Terrorism[J].
    International Journal of Computer Applications, 2012, 44(10):49-52.
    [2] Gohar F, Butt W H, Qamar U, et al. Terrorist Group Prediction Using Data Classification[C]//
    The International Conference on Artificial Intelligence and Pattern Recognition. 2014.
    [3] Ozgul F, Erdem Z, Bowerman C. Prediction of Unsolved Terrorist Attacks Using Group
    Detection Algorithms[C]// Pacific Asia Workshop on Intelligence and Security Informatics.
    Springer-Verlag, 2009:25-30.
    [4] David, G.,“Globalization and International Security: Have the Rules of the Game Changed?”,
    In Annual meeting of the International Studies Association, California, USA,
    http://www.allacademic.com/meta/p98627_index.html, 2006.
    [5] A. Malathi and Dr. S. Santhosh Baboo, “Evolving Data Mining Algorithms on the Prevailing
    Crime Trend – An Intelligent CrimePrediction Model”, In International Journal of Scientific
    & Engineering Research, June 2011, Vol. 2, Issue 6.
    [6] H. Chen, D. Denning et al., “The Dark Web Forum Portal: From multi-lingual to video”,
    InIntelligence and Security Informatics (ISI), IEEE conference, 2011.
    [7] Nooy, W.d., Mrvar, A., et al.: Exploratory Social Network Analysis with Pajek. Cambridge
    University Press, New York, 2005.
    [8] 韩世莲等.多人多准则模糊层次分析法的物流中心综合评价优选模型.系统工程理论与实
    践, 2004.7
    [9] 姚 登 举 ,杨 静,詹 晓 娟 .基 于 随机 森 林 的 特征 选 择 算 法 [J].吉 林 大学 学 报 (工 学
    版),2014,44(01):137-141.
    [10] Coffman, T.R., Marcus, S.E.: Pattern Classification in Social Network Analysis: A case study.
    In: 2004 IEEE Aerospace Conference, March 6-13, 2004
    

    代码

    问题 1: :
    %层次分析法 by MATLAB
    function ccfx
    A=[1 1.4 7/3 7/2;
    5/7 1 5/3 5/2;
    3/7 3/5 1 3/2;
    2/7 2/5 2/3 1]; %因素对比矩阵 A,只需要改变矩阵 A
    p_level = 0.05;
    [CR, Q] = ccfx_single(A, p_level);
    end
    function [CR, Q] = ccfx_single(A, p_level)
    [m,n]=size(A); %获取指标个数
    RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
    R=rank(A); %求判断矩阵的秩
    [V,D]=eig(A); %求判断矩阵的特征值和特征向量,V 特征值,D 特征向量;
    tz=max(D);
    B=max(tz); %最大特征值
    [row, col]=find(D==B); %最大特征值所在位置
    C=V(:,col); %对应特征向量
    CI=(B-n)/(n-1); %计算一致性检验指标 CI
    CR=CI/RI(1,n);
    if CR < p_level
    disp(['一致性检验指标 CI: ', num2str(CI)]);
    disp(['p 值为: ', num2str(CR)]);
    disp('对比矩阵 A 通过一致性检验,各向量权重向量 Q 为:');
    Q=zeros(n,1);
    for i=1:n
    Q(i,1)=C(i,1)/sum(C(:,1)); %特征向量标准化
    end
    disp(num2str(Q')) %输出权重向量
    else
    disp('对比矩阵 A 未通过一致性检验,需对对比矩阵 A 重新构造');
    end
    end
    
    #terrorist attack rating by python
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from datetime import datetime
    from pandas import Series, DataFrame
    gtd = pd.read_excel('附件 1.xlsx')
    gtd_factor_nan = gtd.iloc[:, [5, 98, 101, 105, 122]]
    gtd_factor = gtd_factor_nan.fillna(0)
    extended = gtd_factor.iloc[:, 0]
    nkill = gtd_factor.iloc[:, 1]
    nwound = gtd_factor.iloc[:, 2]
    propextent = gtd_factor.iloc[:, 3]
    hostkidoutcome = gtd_factor.iloc[:, 4]
    ishostkid = gtd.iloc[:, 109]
    ishostkid.replace(-9, 0)
    ndays_nan = gtd.iloc[:, 113]
    ndays_nan.replace(-99, np.nan)
    ndays = ndays_nan.fillna(ndays_nan.mean())
    nhostkid_nan = gtd.iloc[:, 110]
    nhostkid_nan.replace(-99, np.nan)
    nhostkid = nhostkid_nan.fillna(nhostkid_nan.mean())
    hostkidoutcome.replace({1: 0.10526, 2: 0.052632, 3: 0.052632, 4: 0.36842, 5: 0.10526, 6: 0.21053, 7: 0.10526})
    propextent.replace({1: 0.41176, 2: 0.29412, 3: 0.17647, 4: 0.11765})
    nhost = ishostkid * ndays * 0.2 + hostkidoutcome * 0.8
    personnal = nkill * 0.5 + nwound * 0.2 + nhostkid * 0.3
    points = personnal * 0.467 + propextent * 0.333 + extended * 0.2
    #points.replace({(points >= 0) & (points < 1): 5, (points >= 1) & (points < 2): 4, (points >= 2) & (points < 3): 3,
    (points >= 3) & (points < 5): 2, (points >= 5): 1})
    points.to_csv('rating.csv')
    
    
    问题 2: :
    import time
    import datetime
    import random
    import os
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1.inset_locator import inset_axes
    from IPython.display import Image
    import seaborn as sns #remove?
    from geopy.geocoders import Nominatim
    #different models to compare:
    from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
    from sklearn.neural_network import MLPClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.naive_bayes import GaussianNB
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.svm import LinearSVC
    #modeling tools:
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn.metrics import confusion_matrix,accuracy_score, classification_report
    from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler
    from sklearn.decomposition import PCA
    %matplotlib inline
    #0 make sure that Unknown is consistent
    df = df.replace('unknown', 'Unknown') #this can cause issues in city/country
    #1) known?
    df['known'] =1 #initialize this column assuming group is known
    df.at[df.gname == 'Unknown','known'] = 0 #mark all the unknown
    #2) group number
    y = df['gname'].copy()
    labelencoder_y_1 = LabelEncoder()
    y[:] = labelencoder_y_1.fit_transform(y[:])
    df['gname_num'] = y
    #change year to year since the database started:
    df['abs_year'] = df['iyear']-df['iyear'].min()
    #3) Absolute time from start: year + month + day
    df['year_month_day'] = df['abs_year'] * 365 + df['imonth'] * 30.4 + df['iday']
    df['year_month_day'] = df['year_month_day'].astype(int)
    #4) Day of week:
    days = []
    for y,m,d in zip(df['iyear'].values,df['imonth'].values,df['iday'].values):
    if (m>0) & (d>0):
    day = datetime.datetime(y,m,d).weekday() #Return the day of the week as an integer, where Monday is 0
    and Sunday is 6.
    else:
    day = 8 #unknown day
    days.append(day)
    df['day_of_week'] = days
    if quick == 0: #don't plot if debugging
    quick_groups = ['iyear','day_of_week','country_txt','region_txt','attacktype1_txt','weaptype1_txt',
    'targtype1_txt','gname']
    
    titles = ['year','day of week (0 = M, 8 = unknown)','country','region','attack type','weapon',
    'target type','group name']
    misc_var = 'eventid' #any variable to plot after you run groupby
    nplot = 30 #number of values to plot in quick view plots
    hsp = 0.85 #horiz space between plots
    plots = len(quick_groups)
    fig, axes = plt.subplots((plots/2), 2,figsize=[15,25])
    def bar_plot_labels(ax,title):
    hspace = .9
    ax.set_ylabel('count'), ax.set_title('Attack count by ' + title)
    ax.set_xlabel('')
    plt.subplots_adjust(hspace = hsp)
    #some of these entries are too long. they're aribitrarily truncated
    #for visualization purposes, but the full names can be seen in
    #grpd for that plot.
    #truncate the x-tick labels that are too long:
    labels = [item.get_text() for item in ax.get_xticklabels()]
    labels = [item[:25] for item in labels]
    ax.set_xticklabels(labels)
    def plot_var(var,misc_var,ax, title,df_plot):
    grpd = df_plot[[misc_var,var]].groupby(var).count()
    if (var != 'iyear') & (var != 'day_of_week'):
    #just plot the top (nplot) if there's too many, unless it's year
    grpd = grpd.nlargest(nplot,misc_var)
    grpd[misc_var].plot.bar(ax = ax)
    bar_plot_labels(ax,title)
    return grpd
    for ax, var, title in zip(axes.flat, quick_groups, titles):
    if var == 'gname':
    grpd = plot_var(var,misc_var, ax, title,df_plot = df[df['known']==1])
    else:
    grpd = plot_var(var,misc_var, ax, title,df_plot = df)
    if quick == 0: #don't plot if debugging
    var = 'gname_num'
    grpd = df[df['known']==1][[misc_var,var]].groupby(var).count()
    grpd = grpd.rename(columns={'eventid':'number_attacks'})
    print('Mean attacks per group: ' + str(round(grpd.mean())))
    #plot the ones that don't appear in the bar plot above:
    fig, axes = plt.subplots(1, 2,figsize=[15,5])
    #histogram of groups that have <1000 attacks
    cutoff,ax = 1000, axes[0]
    grpd2 = grpd[grpd['number_attacks']<cutoff] #limit to the ones we can't see above
    grpd2['number_attacks'].plot.hist(bins=100, ax=ax)
    ax.set_ylabel('Log frequency')
    ax.set_xlabel('number attacks by group')
    ax.set_title('Histogram: frequency of attacks by groups responsible for <' + str(cutoff))
    ax.set_yscale('log')
    #the histogram shows a dense distribution for groups that commit <~20 attacks:
    #so we will look at a box plot to get the mean & quartiles for these
    ax = axes[1]
    grpd['number_attacks'].plot.box(ax = ax)
    ax.set_xlabel('by group'), ax.set_ylabel('frequency of attacks')
    ax.set_title('Boxplot: frequency of attacks by group')
    #zoom in on <15 attacks because the outliers are so dispersed:
    inset_axes = inset_axes(ax,
    width="30%", # width = 30% of parent_bbox
    height=2, # height : 1 inch
    loc=5)
    miniax = grpd['number_attacks'].plot.box()
    cutoff = 15
    miniax.set_ylim(0,cutoff), miniax.set_title('zoom: <'+str(cutoff) + ' attacks');
    if quick == 0: #don't plot if debugging
    quick_groups = ['region_txt','attacktype1_txt','weaptype1_txt','targtype1_txt']
    titles = ['region','attack type','weapon','target type']
    misc_var = 'eventid' #any variable to plot after you run groupby
    hsp = 0.8 #horiz space between plots
    plots = len(quick_groups)
    fig, axes = plt.subplots((plots/2), 2,figsize=[12,12])
    def plot_2var(var,misc_var,ax, title,df_plot):
    var2 = 'known'
    grpd = df[[misc_var,var,var2]].groupby([var,var2]).count()
    grpd.unstack().plot.bar(ax=ax)
    bar_plot_labels(ax,title)
    L = ax.legend()
    L.get_texts()[0].set_text('Unattributed groups')
    L.get_texts()[1].set_text('Attributed groups')
    return grpd, L
    for ax, var, title in zip(axes.flat, quick_groups, titles):
    grpd, L = plot_2var(var,misc_var, ax, title,df_plot = df)
    
    if reading == 2: #reading pickle; I highly recommend this option
    df_fix = pd.read_pickle(location_fix_path+'df_fix.p')
    elif reading == 1: #if running this for the first time: very time-consuming
    #This package has a lot of service time outs, so storing some of the country lat/long locally to minimize calls
    toAPI
    #initialize dataframe with the missing values & fix a few entries:
    df_fix = df[['latitude','longitude','city','country','country_txt','region', 'region_txt']][df['longitude'].isnull()]
    #People's Republic of the Congo is no longer a country:
    df_fix.loc[df_fix['country_txt']=="People's Republic of the Congo",'country_txt'] = 'Republic of the
    Congo'
    #Not trying to get political here: this looked like the search term that gave the best average of West Bank
    + Gaza
    df_fix.loc[df_fix['country_txt']=="West Bank and Gaza Strip",'country_txt'] = 'Palestinian territories,
    Israel'
    #There are some NaN values in the city values:
    df_fix.loc[df_fix['city'].isnull(),'city'] = 'Unknown'
    geolocator = Nominatim()
    def country_func(country,df_fix,geolocator):
    if country == 'Unknown':# get lat/long from region
    region = df_fix.loc[i,'region_txt']
    location = geolocator.geocode(region)
    latitude, longitude = location.latitude, location.longitude
    else:
    location = geolocator.geocode(country)
    latitude, longitude = location.latitude, location.longitude
    return latitude, longitude
    # I tried looking up a few cities the package couldn't find. I googled a few to try to figure out what the
    issue
    # is. I ultimately decided to just skip the ones the package couldn't find, but I am including the values I
    was
    # able to find here. I'd ordinarily put these into a separate text file but there's so few I'm just keeping
    them here.
    misc_city = pd.DataFrame([['Tarlas',15.4470,120.4696],['Penghu Islands',22.6158,120.7120],
    ['Mirror Newspaper', 16.8661,96.1951],['Penjwon',35.6239,45.9491]],
    columns=['city','latitude','longitude'])
    count = 0 #this tends to time out, so just put the last count before it crashed to resume
    done = 0
    
    while done == 0:
    for i in df_fix.index[count:]:
    if count == len(df_fix)-1:
    done = 1
    break
    count = count + 1
    city, country = df_fix.loc[i,'city'],df_fix.loc[i,'country_txt']
    try:
    #have we already entered a value for this city, country combo?
    if df_fix[df_fix.index<i]['city'].str.contains(city).any(): #have this city
    #in the same country:
    if df_fix[df_fix.index<i].loc[df_fix[df_fix.index<i]['city'] ==
    city,'country_txt'].str.contains(country).any():
    row = df_fix.loc[(df_fix['city'] == city) & (df_fix['country_txt'] ==
    country)].index[0]
    latitude,longitude = df_fix.loc[row,'latitude'],df_fix.loc[row,'longitude']
    elif city == 'Unknown': #get by country
    latitude,longitude = country_func(country,df_fix,geolocator)
    elif misc_city.city.str.contains(city).any(): #a few cities I looked up manually
    row = misc_city.loc[(misc_city['city'] == city)].index
    latitude = misc_city.loc[row,'latitude'].values
    longitude = misc_city.loc[row,'longitude'].values
    else:
    location = geolocator.geocode(city + ',' + country)
    if location is None: #don't have city, so try country:
    latitude, longitude = country_func(country,df_fix,geolocator)
    else: #store the values
    latitude, longitude = location.latitude, location.longitude
    df_fix.loc[i,'latitude'] = latitude
    df_fix.loc[i,'longitude'] = longitude
    except:
    print(count)
    continue
    #save this dataframe to pickle
    df_fix.to_pickle(location_fix_path + 'df_fix.p')
    def get_accuracy(model,model_name,df_acc,X_train, y_train,X_test,y_test):
    now = time.time()
    mdl = model()
    mdl.fit(X_train, y_train)
    preds_test = mdl.predict(X_test)
    preds_train = mdl.predict(X_train)
    #add to next row:
    nr = len(df_acc)
    
    df_acc.loc[nr,'model'] = model_name
    df_acc.loc[nr,'test_accuracy'] = int(accuracy_score(y_test,preds_test)*100) #multiply by 100 for rough
    plotting
    df_acc.loc[nr,'train_accuracy'] = int(accuracy_score(y_train,preds_train)*100)
    df_acc.loc[nr,'time'] = int(time.time()-now)
    return df_acc
    if quick == 0: #add GBC
    now = time.time()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
    # It is important to train the ensemble of trees on a different subset
    # of the training data than the linear regression model to avoid
    # overfitting, in particular if the total number of leaves is
    # similar to the number of training samples
    X_train, X_train_lr, y_train, y_train_lr = train_test_split(X_train, y_train, test_size=0.2)
    n_estimator =10
    grd = GradientBoostingClassifier(n_estimators=n_estimator)
    grd_enc = OneHotEncoder()
    grd_lm = LogisticRegression()
    grd.fit(X_train, y_train)
    grd_enc.fit(grd.apply(X_train)[:, :, 0])
    grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)
    y_pred_grd_lm = grd_lm.predict_proba(
    grd_enc.transform(grd.apply(X_test)[:, :, 0]))[:, 1]
    # fpr_grd_lm, tpr_grd_lm, _ = roc_curve(y_test, y_pred_grd_lm)
    # The gradient boosted model by itself
    y_pred_grd = grd.predict_proba(X_test)[:, 1]
    # fpr_grd, tpr_grd, _ = roc_curve(y_test, y_pred_grd)
    preds_test = grd.predict(X_test)
    preds_train = grd.predict(X_train)
    nr = len(df_acc)
    df_acc.loc[nr,'model'] = 'GBC'
    df_acc.loc[nr,'test_accuracy'] = int(accuracy_score(y_test,preds_test)*100) #multiply by 100 for rough
    plotting
    df_acc.loc[nr,'train_accuracy'] = int(accuracy_score(y_train,preds_train)*100)
    df_acc.loc[nr,'time'] = int(time.time()-now)
    
    展开全文
  • 作 者 简 介 ...曾2次获全国大学生数学建模竞赛一等奖,1次获全国研究生数学建模竞赛一等奖。 MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工

    作 者 简 介

    卓金武,MathWorks中国高级工程师,教育业务经理,在数据分析、数据挖掘、机器学习、数学建模、量化投资和优化等科学计算方面有多年工作经验,现主要负责MATLAB校园版业务。曾2次获全国大学生数学建模竞赛一等奖,1次获全国研究生数学建模竞赛一等奖。

    MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍中,MATLAB 的使用率几乎 100%。虽然比较知名的数模软件不只 MATLAB,

    为什么 MATLAB 在数学建模中的使用率如此之高?

    作为资深的数模爱好者(从大一到研三每年都参加数模比赛,大学生数学建模大赛 2 次国一,研究生赛 1 次国一),我认为:

    1. MATLAB 的数学函数全,包含人类社会的绝大多数数学知识。

    2. MATLAB 足够灵活,可以按照问题的需要,自主开发程序,解决问题。

    尤其最近几年,国赛中的题目都很开放,灵活度很大,这种情况,MATLAB 的编程灵活的优势越发明显。

    在数学建模中最重要的就是模型的建立和模型的求解,当然两者相辅相成。

    有过比赛经验的数模客们都有这样的一种体会,如果 MATLAB 编程弱的话,在比赛中,根本不敢放开建模,生怕建立的模型求解不出来。要知道,模型如果求解不出来,在比赛中是致命的,所以首先要避免这种问题。所以如果某个参赛队 MATLAB 弱的话,最直接的问题就是还敢建模吗?不敢放开建模,畏手畏脚,思路不敢展开,可想而知,想取得好成绩就很难了。

    其实 MATLAB 编程的弱,并不是真的弱,因为 MATLAB 本身很简单,不存在壁垒,最大的问题是在心里上弱,没有树立正确的 MATLAB 应用理念,没有经历编程成功的经历,当然在比赛中就心里害怕了。这些数模客之所以没有树立对 MATLAB 使用的信心,就是因为在学习 MATLAB 的时候,就一直机械地、被动地学习知识,而没有掌握技巧去搜索知识、运用知识。要知道,MATLAB 各种知识对个人来说,永远是学不完的。如果按照这个方式,也就永远不会用 MATLAB 了。但如果掌握正确的 MATLAB 使用方法和实用的小技巧,在半小时内就可以很快地变成 MATLAB 高手了。高手的区别就只在一点,就是一直有自己的编程思路,需要什么知识就是学习什么知识,然后继续按照自己的思路编程,虽然在过程中,要不断学习,但最高效,也最容易建立强大的对 MATLAB 的使用信心。

    当然数学建模还有自己的特点, 为了帮助大家更有效地备战国赛, 接下来我们将系统地梳理如何备战数学建模竞赛中的 MATLAB 编程。

    1. 认识 MATLAB 在数学建模的地位

    下图是整个数模过程所需要的知识矩阵。第二列是模型的求解,包括编程、算法、函数、技巧。如果说整个技能矩阵的是条蛇,那么求解正是在7寸的位置,正是连接建模与其他板块的枢纽。如果此环节弱的话,导致不敢放开思路建模,那么模型基础就不好,后面的论文什么的就都是浮云了。因此模型的求解必须重视,而 MATLAB 是模型的最有力的求解的工具,所以 MATLAB 的编程水平对数模客来说就尤其重要了。


    如果不考虑时间,只要掌握了 MATLAB 编程技巧和理念,建模中遇到的问题总可以用 MATLAB 解决的。

    但毕竟比赛是有时间限制的,所以还要相应地提高速度、效率。所以为了备战数模比赛,在模型的求解环节,除了要掌握基本的 MATLAB 编程技巧,还要积累一些常用的算法、函数,这样比赛的时候不用花太多的时间去消化算法,也不用花太多时间去摸索函数用法,有效地提高解题速度。数模比赛中常用算法、函数的准备我会在之后详细介绍,基础核心却是 MATLAB 的编程理念。

    2. 正确且高效的 MATLAB 编程理念

    正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。

    而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。

    在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。

    3. 数学建模竞赛中的 MATLAB 水平要求

    要想在全国大学生数学建模竞赛中拿到国奖, MATLAB 技能是必备的。 具体的技能水平应达到:

    1)了解 MATLAB 的基本用法,包括几个常用的命令,如何获取帮助,脚本结构,程序的分节与注释,矩阵的基本操作,快捷绘图方式;

    2)熟悉 MATLAB 的程序结构,编程模式,能自由地创建和引用函数(包括匿名函数);

    3)熟悉常见模型的求解算法和套路,包括连续模型,规划模型,数据建模类的模型;

    4)能够用 MALTAB 程序将机理建模的过程模拟出来,就是能够建立和求解没有套路的数学模型。 

    要想达到如上要求, 不能按照传统的学习方式一步一步地学习, 而要结合上述提到的学习理念制定科学的训练计划。

     4. 有计划地快速提高 MATLAB 实战水平

    如何制定科学的训练计划,快速有效地提高 MATLAB 实战水平呢?首先了解数模建模中常见的模型和求解算法,如下图所示:


    纵观数学建模中的种种问题,可以将这些问题划分为以上 5 类,并匹配常用的方法。只要有针对性地训练这些常用的方法,那么在实际比赛中,遇到类似的问题可就得心应手多了,甚至一些程序框架可以直接套用。因此关键还要注意总结积累常用方法的 MATLAB 程序段

    数学建模是非常开放的问题,对于 5 类问题,只要找 1 个题目,然后将这类问题的常用方法都用一遍,一是拓展建模思路,二是将所有方法都有 MALTAB 实现一遍,自然所得的程序将是印象非常深刻的,自然也就变成自己日后的程序库了。

    详细分析这 5 类题型:

    - 第二类和第四类,方法相对单一,所花的时间不用太多;

    - 第一、三类,是建模竞赛中的主力题型,方法很多,应该多注意积累;

    - 第五类是最近兴起的新题型,没有固定套路,也不要期望直接套用经典模型了。需要认真分析问题,客观地解决问题。这类题型,往往机理建模方法比较有效,及时从事物内部发展的规律入手,模拟事物的发展过程并建立模型,并用程序去实现。我认为机理建模和求解才是数学建模和编程的最高求解,已经达到心中无模型而胜有模型的境界了。所用的 MATLAB 编程也是最基本的程序编写技巧,关键是思想。

    结合这 5 类题型和数学建模竞赛中 MATLAB 应该达到的水准,建议参考如下步骤开始准备,在之后的连载文章中也将详解相应的内容, 总结部分方法供大家借鉴:

    第二讲: 了解MATLAB的基本用法, 包括几个常用的命令, 如何获取帮助, 脚本结构, 程序的分节与注释, 矩阵的基本操作, 快捷绘图方式;熟悉MATLAB的程序结构,编程模式, 能自由地创建和引用函数(包括匿名函数)。

    第三讲至第八讲:熟悉常见模型的求解算法和套路, 包括连续模型, 规划模型, 数据建模类的模型。

    第九讲:能够用MALTAB程序将机理建模的过程模拟出来, 就是能够建立和求解没有套路的数学模型。

    第十讲至第十二讲: 真题训练, 强化实战经验。

    展开全文
  • 曾2次获全国大学生数学建模竞赛一等奖,1次获全国研究生数学建模竞赛一等奖。 MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍...

    作 者 简 介

    卓金武,MathWorks中国高级工程师,教育业务经理,在数据分析、数据挖掘、机器学习、数学建模、量化投资和优化等科学计算方面有多年工作经验,现主要负责MATLAB校园版业务。曾2次获全国大学生数学建模竞赛一等奖,1次获全国研究生数学建模竞赛一等奖。

    MATLAB 是公认的最优秀的数学模型求解工具,在数学建模竞赛中超过 95% 的参赛队使用 MATLAB 作为求解工具,在国家奖队伍中,MATLAB 的使用率几乎 100%。虽然比较知名的数模软件不只 MATLAB,

    为什么 MATLAB 在数学建模中的使用率如此之高?

    作为资深的数模爱好者(从大一到研三每年都参加数模比赛,大学生数学建模大赛 2 次国一,研究生赛 1 次国一),我认为:

    1. MATLAB 的数学函数全,包含人类社会的绝大多数数学知识。

    2. MATLAB 足够灵活,可以按照问题的需要,自主开发程序,解决问题。

    尤其最近几年,国赛中的题目都很开放,灵活度很大,这种情况,MATLAB 的编程灵活的优势越发明显。

    在数学建模中最重要的就是模型的建立和模型的求解,当然两者相辅相成。

    有过比赛经验的数模客们都有这样的一种体会,如果 MATLAB 编程弱的话,在比赛中,根本不敢放开建模,生怕建立的模型求解不出来。要知道,模型如果求解不出来,在比赛中是致命的,所以首先要避免这种问题。所以如果某个参赛队 MATLAB 弱的话,最直接的问题就是还敢建模吗?不敢放开建模,畏手畏脚,思路不敢展开,可想而知,想取得好成绩就很难了。

    其实 MATLAB 编程的弱,并不是真的弱,因为 MATLAB 本身很简单,不存在壁垒,最大的问题是在心里上弱,没有树立正确的 MATLAB 应用理念,没有经历编程成功的经历,当然在比赛中就心里害怕了。这些数模客之所以没有树立对 MATLAB 使用的信心,就是因为在学习 MATLAB 的时候,就一直机械地、被动地学习知识,而没有掌握技巧去搜索知识、运用知识。要知道,MATLAB 各种知识对个人来说,永远是学不完的。如果按照这个方式,也就永远不会用 MATLAB 了。但如果掌握正确的 MATLAB 使用方法和实用的小技巧,在半小时内就可以很快地变成 MATLAB 高手了。高手的区别就只在一点,就是一直有自己的编程思路,需要什么知识就是学习什么知识,然后继续按照自己的思路编程,虽然在过程中,要不断学习,但最高效,也最容易建立强大的对 MATLAB 的使用信心。

    当然数学建模还有自己的特点, 为了帮助大家更有效地备战国赛, 接下来我们将系统地梳理如何备战数学建模竞赛中的 MATLAB 编程。

    1. 认识 MATLAB 在数学建模的地位

    下图是整个数模过程所需要的知识矩阵。第二列是模型的求解,包括编程、算法、函数、技巧。如果说整个技能矩阵的是条蛇,那么求解正是在7寸的位置,正是连接建模与其他板块的枢纽。如果此环节弱的话,导致不敢放开思路建模,那么模型基础就不好,后面的论文什么的就都是浮云了。因此模型的求解必须重视,而 MATLAB 是模型的最有力的求解的工具,所以 MATLAB 的编程水平对数模客来说就尤其重要了。

    在这里插入图片描述

    如果不考虑时间,只要掌握了 MATLAB 编程技巧和理念,建模中遇到的问题总可以用 MATLAB 解决的。

    但毕竟比赛是有时间限制的,所以还要相应地提高速度、效率。所以为了备战数模比赛,在模型的求解环节,除了要掌握基本的 MATLAB 编程技巧,还要积累一些常用的算法、函数,这样比赛的时候不用花太多的时间去消化算法,也不用花太多时间去摸索函数用法,有效地提高解题速度。数模比赛中常用算法、函数的准备我会在之后详细介绍,基础核心却是 MATLAB 的编程理念。

    1. 正确且高效的 MATLAB 编程理念

    正确且高效的 MATLAB 编程理念就是以问题为中心的主动编程。我们传统学习编程的方法是学习变量类型、语法结构、算法以及编程的其他知识,因为学习时候是没有目标的,也不知道学的知识什么时候能用到,收效甚微。

    而以问题为中心的主动编程,则是先找到问题的解决步骤,然后在 MATLAB 中一步一步地去实现。在每步实现的过程中,遇到问题,查找知识(互联网时代查询知识还是很容易的),定位方法,再根据方法,查询 MATLAB 中的对应函数,学习函数用法,回到程序,解决问题。

    在这个过程中,知识的获取都是为了解决问题的,也就是说每次学习的目标都是非常明确的,学完之后的应用就会强化对知识的理解和掌握,这样即学即用的学习方式是效率最高,也是最有效的方式。最重要的是,这种主动的编程方式会让学习者体验到学习的成就感的乐趣,有成就感,自然就强化对编程的自信了。这种内心的自信和强大在建模中会发挥意想不到的力量,所为信念的力量。

    1. 数学建模竞赛中的 MATLAB 水平要求

    要想在全国大学生数学建模竞赛中拿到国奖, MATLAB 技能是必备的。 具体的技能水平应达到:

    1)了解 MATLAB 的基本用法,包括几个常用的命令,如何获取帮助,脚本结构,程序的分节与注释,矩阵的基本操作,快捷绘图方式;

    2)熟悉 MATLAB 的程序结构,编程模式,能自由地创建和引用函数(包括匿名函数);

    3)熟悉常见模型的求解算法和套路,包括连续模型,规划模型,数据建模类的模型;

    4)能够用 MALTAB 程序将机理建模的过程模拟出来,就是能够建立和求解没有套路的数学模型。

    要想达到如上要求, 不能按照传统的学习方式一步一步地学习, 而要结合上述提到的学习理念制定科学的训练计划。

    1. 有计划地快速提高 MATLAB 实战水平

    如何制定科学的训练计划,快速有效地提高 MATLAB 实战水平呢?首先了解数模建模中常见的模型和求解算法,如下图所示:
    在这里插入图片描述

    纵观数学建模中的种种问题,可以将这些问题划分为以上 5 类,并匹配常用的方法。只要有针对性地训练这些常用的方法,那么在实际比赛中,遇到类似的问题可就得心应手多了,甚至一些程序框架可以直接套用。因此关键还要注意总结积累常用方法的 MATLAB 程序段。

    数学建模是非常开放的问题,对于 5 类问题,只要找 1 个题目,然后将这类问题的常用方法都用一遍,一是拓展建模思路,二是将所有方法都有 MALTAB 实现一遍,自然所得的程序将是印象非常深刻的,自然也就变成自己日后的程序库了。

    详细分析这 5 类题型:

    • 第二类和第四类,方法相对单一,所花的时间不用太多;

    • 第一、三类,是建模竞赛中的主力题型,方法很多,应该多注意积累;

    • 第五类是最近兴起的新题型,没有固定套路,也不要期望直接套用经典模型了。需要认真分析问题,客观地解决问题。这类题型,往往机理建模方法比较有效,及时从事物内部发展的规律入手,模拟事物的发展过程并建立模型,并用程序去实现。我认为机理建模和求解才是数学建模和编程的最高求解,已经达到心中无模型而胜有模型的境界了。所用的 MATLAB 编程也是最基本的程序编写技巧,关键是思想。

    结合这 5 类题型和数学建模竞赛中 MATLAB 应该达到的水准,建议参考如下步骤开始准备,在之后的连载文章中也将详解相应的内容, 总结部分方法供大家借鉴:

    第二讲: 了解MATLAB的基本用法, 包括几个常用的命令, 如何获取帮助, 脚本结构, 程序的分节与注释, 矩阵的基本操作, 快捷绘图方式;熟悉MATLAB的程序结构,编程模式, 能自由地创建和引用函数(包括匿名函数)。

    第三讲至第八讲:熟悉常见模型的求解算法和套路, 包括连续模型, 规划模型, 数据建模类的模型。

    第九讲:能够用MALTAB程序将机理建模的过程模拟出来, 就是能够建立和求解没有套路的数学模型。

    第十讲至第十二讲: 真题训练, 强化实战经验。

    展开全文
  • 《 20XX 年全国大学生数学建模竞赛广西赛区经验交流及优秀论文选》吕跃进 著 阅读人群:写作(最为重要)建模(参考) 编程(参考) 13 作为广西赛区优秀论文集,写作的同学尤其需要注意,广西赛区的优秀论文 ...
  • 8 一谈建模工具-机器学习... 比如本科生的『全国大 学生数学建模竞赛』, 『美国大学生数学建模竞赛』, 或者『中国研究生数学建模竞赛』。 组队人数一般为三人, 分工上一般来说分为数学+编程+论文三部分。 每个人...
  • 这本教科书将机器学习,工程数学数学物理学结合在一起,将动力学系统的建模和控制与数据科学中的现代方法集成在一起。它重点介绍了科学计算领域的最新进展,这些进展使数据驱动的方法可以应用于各种复杂系统,例如...
  • 全称也叫做深度学习AI圣经(深度学习) ,由三位全球知名专家Ian Goodfellow,YoshuaBengio,AaronCourville编着,全书囊括了数学及相关概念的背景知识,包括线性代数,概率论,信息论,数值优化以及机器学习中的...
  • 数学建模专栏 | 第三篇:MATLAB数据建模方法(上) —常用方法 2017-07-21卓金武MATLAB 作 者 简 介 ...卓金武,MathWorks中国高级工程师,...曾2次获全国大学生数学建模竞赛一等奖,1次获全国研究生数学建模竞...
  • 本课程旨在使研究生具备神经科学研究(以及进一步的计算神经科学课程)所必需的定量建模和数据分析方面的基本数学技能。该课程基本上分为三个部分:一个关于线性代数,一个关于概率与统计学,以及一个关于机器学习的...
  • 博主最近在弄研究生数学建模,题目中给出了几万条数据,多个参数(X1,X2,X3,X4,X5,X6)影响着最终我们的恒定量Y。这就促使我们走向机器学习里的一元或者多元线性回归问题。 博主对机器学习也是刚刚入门,对...

空空如也

空空如也

1 2 3 4 5 6
收藏数 103
精华内容 41
关键字:

机器学习研究生数学建模