Web安全之机器学习入门(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-22 04:48:56

点击下载

作者:刘焱

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Web安全之机器学习入门

Web安全之机器学习入门试读:

前言

近几年,人工智能无疑成为人们口中的热点话题,先是谷歌的AlphaGo,后有百度的度秘、无人车,微软必应搜索推出的小冰。这一系列人工智能产品的推陈出新,令人眼花缭乱,一时间给人的感觉是人工智能遍地开花。无论人们接受还是不接受,人工智能都在迅速渗透各行各业。网络安全相比之下是一个传统行业,基于规则以及黑白名单的检测技术已经发展到了一定的瓶颈,而利益驱动的黑产团伙,其技术的发展已经远远超乎我们的想象。如何借助人工智能的力量,提升安全行业的整体检测与防护能力,成为各大安全厂商研究的课题。在国内安全行业,BAT以及大量新兴的创业公司先后进入企业安全领域,他们凭借着自身数据搜集、处理、积累以及人工智能方面的优势,正在逐渐改变着整个安全行业。安全产品的形态也从硬件盒子逐步走向混合模式以及云端SaaS服务,安全技术从重防御逐步走向数据分析以及智能驱动。传统安全厂商也凭借其强大的安全人才储备,迅速推进人工智能在安全产品的落地。

我在网络安全这个行业搬了好几年砖,前五年做大型互联网公司的企业安全建设,从准入系统到WAF、SIEM、IPS等,基本都开发或者使用过,最近三年一直负责云安全产品,从抗D、WAF产品到、SIEM、入侵检测等,使用的技术从规则、黑白名单、模型、沙箱再到机器学习,从单机的OSSIM到Hadoop、Storm、Spark、ELK,也算目睹了安全技术或者更准确地说是数据分析处理技术的迅猛发展。我深深感到,使用人工智能技术改变这个行业不是我们的选择,而是必经之路。我在真正意义上接触机器学习是2014年年底,当时带领了一个很小的团队尝试使用机器学习算法解决安全问题,磕磕绊绊一直走到现在,变成几十人的一个产品团队。

本书是我机器学习三部曲的第一部,主要以机器学习常见算法为主线,以生活中的例子和具体安全场景介绍机器学习常见算法,定位为机器学习入门书籍,便于大家可以快速上手。全部代码都能在普通PC上运行。第二部将重点介绍深度学习,并以具体的十个案例介绍机器学习的应用,主要面向具有一定机器学习基础或致力于使用机器学习解决工作中问题的读者,全书的重点集中在问题的解决而不是算法的介绍。由于深度学习通常计算量已经超过了PC的能力,部分代码需要在服务器甚至GPU上运行,不过这不影响大家的阅读与学习。第三部将重点介绍强化学习和对抗网络,并以若干虚构安全产品或者项目介绍如何让机器真正具备AlphaGo级别的智能。

本书的第1章概括介绍了机器学习的发展以及互联网目前的安全形势。第2章介绍了如何打造自己的机器学习工具箱。第3章概括介绍机器学习的基本概念。第4章介绍Web安全的基础知识。第5章到第13章介绍浅层机器学习算法,包括常见的K近邻、决策树、朴素贝叶斯、逻辑回归、支持向量机、K-Means、FP-growth、Apriori、隐式马尔可夫、有向图。第14章到第17章介绍神经网络以及深度学习中常用的递归神经网络和卷积神经网络。每章都会以生活中的例子开头,让读者有一个感性的认识,然后简短介绍基础知识,最后以安全领域的2~3个例子讲解如何使用该算法解决问题。全书定位是能让更多的安全爱好者以及信息安全从业者了解机器学习,动手使用简单的机器学习算法解决实际问题。在写作中尽量避免生硬的说教,能用文字描述的尽量不用冷冰冰的公式,能用图和代码说明的尽量不用多余的文字。正如霍金所言“多写1个公式,少一半读者”,希望反之亦然。

机器学习应用于安全领域遇到的最大问题就是缺乏大量的黑样本,即所谓的攻击样本,尤其相对于大量的正常业务访问,攻击行为尤其是成功的攻击行为是非常少的,这就给机器学习带来了很大挑战。本书很少对不同算法进行横向比较,也是因为确实在不同场景下不同算法表现差别很大,很难说深度学习就一定比朴素贝叶斯好,也很难说支持向量机就比不过卷积神经网络,拿某个具体场景进行横向比较意义不大,毕竟选择算法不像购买SUV,可以拿几十个参数评头论足,最后还是需要大家结合实际问题去选择。

这里我要感谢我的家人对我的支持,本来工作就很忙,没有太多时间处理家务,写书以后更是花费了我大量的休息时间,我的妻子无条件承担起了全部家务,尤其是照料孩子等繁杂事务。我很感谢我的女儿,写书这段时间几乎没有时间陪她玩,她也很懂事地自己玩,我想用这本书作为她的生日礼物送给她。我还要感谢吴怡编辑对我的支持和鼓励,让我可以坚持把这本书写完。最后还要感谢各位业内好友尤其是我boss对我的支持,排名不分先后:马杰@百度安全、冯景辉@百度安全、林晓东@百度基础架构、黄颖@百度IT、李振宇@百度AI、Lenx@百度安全、黄正@百度安全、程岩@百度云、郝轶@百度云、云鹏@百度无人车、赵林林@微步在线、张宇平@数盟、谢忱@Freebuf、李新@Freebuf、李琦@清华、徐恪@清华、王宇@蚂蚁金服、王珉然@蚂蚁金服、王龙@蚂蚁金服、周涛@启明星辰、姚志武@借贷宝、刘静@安天、刘袁君@医渡云、廖威@易宝支付、尹毅@sobug、宋文宽@联想、团长@宜人贷、齐鲁@搜狐安全、吴圣@58安全、康宇@新浪安全、幻泉@i春秋、雅驰@i春秋、王庆双@i春秋、张亚同@i春秋、王禾@微软、李臻@paloalto、西瓜@四叶草、郑伟@四叶草、朱利军@四叶草、土夫子@XSRC、英雄马@乐视云、sbilly@360、侯曼@360、高磊@滴滴、高磊@爱加密、高渐离@华为、刘洪善@华为云、宋柏林@一亩田、张昊@一亩田、张开@安恒、李硕@智联、阿杜@优信拍、李斌@房多多、李程@搜狗、Tony@京东安全、简单@京东安全、姚聪@face+、李鸣雷@金山云,最后我还要感谢我的亲密战友陈燕、康亮亮、蔡奇、哲超、新宇、子奇、月升、王磊、碳基体、刘璇、钱华钩、刘超、王胄、吴梅、冯侦探、冯永校。

本书面向信息安全从业人员、高等院校计算机相关专业学生以及信息安全爱好者,机器学习爱好者,对于想了解人工智能的CTO、运维总监、架构师同样也是一本不错的科普书籍。当读者在工作学习中遇到问题时可以想起本书中提到的一两种算法,那么我觉得就达到效果了,如果可以让读者像使用printf一样使用SVM、朴素贝叶斯等算法,那么这本书就相当成功了。

我平时在FreeBuf专栏以及i春秋分享企业安全建设以及人工智能相关经验与最新话题,同时也运营我的微信公众号“兜哥带你学安全”,欢迎大家关注并在线交流。

本书使用的代码和数据均在GitHub上发布,地址为:https://github.com/duoergun0729/1book,代码层面任何疑问可以在GitHub上直接反馈。第1章通向智能安全的旅程

人工智能可以说是目前最热的一个话题,从较早前的谷歌大脑到近期的百度无人车、谷歌AlphaGo大师,一个个人工智能的新应用都在不断刷新人们对机器能力的认知。人们开始关注究竟下一个被机器取代的功能会是什么,甚至下一个被机器取代的职业会是什么呢?

网络安全也是国内外非常热门的一个话题,从大量的大型网站密码泄露到大半个美国网络瘫痪,再到直接影响美国总统大选的结果,一个个安全事件让大家意识到安全的重要性,网络安全已经是国家安全战略层面的问题了。人工智能在网络安全领域是否也可以创造奇迹呢?现状又是怎样呢?

本章将介绍人工智能、机器学习与深度学习的区别与联系,介绍人工智能的发展。近期国内外的网络安全形势,以及人工智能在网络安全领域的应用。1.1 人工智能、机器学习与深度学习

如今,人工智能、机器学习与深度学习几乎成了家喻户晓的名词,究竟这三者之间有什么联系和区别呢?

通常认为,机器学习是实现人工智能的主要方式,人类基于机器学习以及海量的数据,逐步实现人工智能,其中深度学习是机器学习的一个分支。如果用同心圆来表示三者的范围,那么人工智能是最外面的一个圆,深度学习是最里面的圆。人可以在1秒以内做出的判断,都可以用机器来实现,而且机器可以同时完成成百上千人1秒内可以做出的判断,这就是人工智能。1.2 人工智能的发展1.谷歌大脑

谷歌大脑是“Google X实验室”一个主要研究项目,是谷歌在人工智能领域开发出的一款模拟人脑的软件,这个软件具备自我学习功能。Google X部门的科学家们通过将1.6万台电脑的处理器相连接建造出了全球为数不多的最大中枢网络系统,它能自主学习,所以称之为“谷歌大脑”。2012年,谷歌的工程师曾经公布了一个令人激动的研究结果,他们使用了1000台计算机、16000个处理器10天昼夜不停地运转,通过模拟大脑细胞,在Youtube的视频中捕获了1000万张图片学习识别猫、人以及其他事物。2.百度无人车

百度无人驾驶车项目于2013年起步,由百度研究院主导研发,其技术核心是“百度汽车大脑”,包括高精度地图、定位、感知、智能决策与控制4大模块。其中,百度自主采集和制作的高精度地图记录完整的三维道路信息,能在厘米级精度实现车辆定位。同时,百度无人驾驶车依托国际领先的交通场景物体识别技术和环境感知技术,实现高精度车辆探测识别、跟踪、距离和速度估计、路面分割、车道线检测,为自动驾驶的智能决策提供依据。

2015年12月,百度公司宣布,百度无人驾驶车在国内首次实现城市、环路及高速道路混合路况下的全自动驾驶,如图1-1所示。百度公布的路测路线显示,百度无人驾驶车从位于北京中关村软件园的百度大厦附近出发,驶入G7京新高速公路,经五环路,抵达奥林匹克森林公园,并随后按原路线返回。百度无人驾驶车往返全程均实现自动驾驶,并实现了多次跟车减速、变道、超车、上下匝道、调头等复杂驾驶动作,完成了进入高速到驶出高速的不同道路场景的切换。测试时最高速度达到100千米/小时。图1-1 百度无人驾驶车3.AlphaGo

AlphaGo是一款围棋人工智能程序,由谷歌旗下DeepMind公司的戴密斯·哈萨比斯、大卫·席尔瓦、黄士杰与他们的团队开发。其主要工作原理是“深度学习”。

2016年3月,该程序与围棋世界冠军、职业九段选手李世石进行人机大战(如图1-2所示),并以4:1的总比分获胜;2016年末至2017年初,该程序在中国棋类网站上以“大师”(Master)为注册账号与中日韩数十位围棋高手进行快棋对决,连续60局无一败绩。不少职业围棋手认为,AlphaGo的棋力已经达到甚至超过围棋职业九段水平,在世界职业围棋排名中,其等级分曾经超过排名人类第一的棋手柯洁。图1-2 李世石与AlphaGo进行人机大战

就在AlphaGo与柯洁“人机大战”不久前,谷歌I/O 2017大会上,谷歌“移动为先”向“AI优先”再次升级,其中最典型的表现之一就是更新和升级了去年I/O 2017大会上公布的TPU(Tensor Processing Unit)——一款谷歌自己高度定制化的AI(针对AI算法,例如其自己开发的TensorFlow深度学习架构)芯片,也是AlphaGo背后的功臣,即AlphaGo能以超人的熟练度下围棋都要靠训练神经网络来完成,而这又需要计算能力(硬件越强大,得到的结果越快)。TPU比当前的GPU或CPU平均快15~30倍,性能功耗比(TOPS/Watt)高出约30~80倍。此外,在TPU中采用GPU常用的GDDR5存储器能使性能TPOS指标再高3倍,并将能效比指标TOPS/Watt提高到GPU的70倍,CPU的200倍。到目前为止,谷歌的TPU已经应用在各种领域的应用中,例如谷歌图像搜索(Google Image Search)、谷歌照片(Google Photo)、谷歌云视觉API(Google Cloud Vision API)、谷歌翻译以及AlphaGo的围棋系统中。实际上我们上述提到的谷歌I/O 2017大会推出和更新的诸多AI产品和服务背后均有TPU的硬件支持。1.3 国内外网络安全形势1.国内部分网站存在Ramnit恶意代码攻击

2016年4月,CNCERT监测发现一个名为“Ramnit”的网页恶意代码被挂载在境内近600个党政机关、企事业单位网站上(如图1-3所示),一旦用户访问网站就有可能受到挂马攻击,对网站访问用户的PC主机构成安全威胁。Ramnit恶意代码是一个典型的VBScript蠕虫病毒,可通过网页挂马的方式进行传播,当用户浏览含有Ramnit恶意代码的HTML页面时,点击加载ActiveX控件,用户主机就很有可能受到恶意代码的感染。图1-3 国内部分网站存在Ramnit恶意代码攻击2.2.7亿Gmail、雅虎和Hotmail账号遭泄露

2016年5月,俄罗斯黑客成功地进行了一场大规模的数据泄露攻击。在此次网络攻击中,黑客盗取了2.723亿个账号,以俄罗斯最受欢迎的电子邮件服务Mail.ru用户为主,此外还有Gmail地址、雅虎以及微软电邮Hotmail用户,如图1-4所示。路透社称,数以亿计的数据目前正在“俄罗斯的地下黑市”出售。图1-4 2.7亿Gmail、雅虎和Hotmail账号遭泄露3.美国大半个互联网下线事件

2016年10月,提供动态DNS服务的DynDNS遭到了大规模DDoS攻击,攻击主要影响其位于美国东区的服务。此次攻击导致许多使用DynDNS服务的网站遭遇访问问题,其中包括GitHub、Twitter、Airbnb、Reddit、Freshbooks、Heroku、SoundCloud、Spotify和Shopify。攻击导致这些网站一度瘫痪,Twitter甚至出现了近24小时无访问的局面。4.希拉里邮件门影响美国大选

2016年11月,希拉里因“邮件门”最终落败美国总统竞选。希拉里在担任国务卿期间,从未使用域名为“@state.gov”的政府电子邮箱,而是使用域名为“@clintonemail.com”的私人电子邮箱和位于家中的私人服务器收发公务邮件,涉嫌违反美国《联邦档案法》关于保存官方通信记录的规定。希拉里被美国联邦调查局(FBI)调查,民众支持率节节下降,见图1-5。图1-5 希拉里邮件门事件1.4 人工智能在安全领域的应用

人工智能在安全领域的应用还属于起步阶段,各大安全公司以及互联网巨头都投入大量的人力物力,试图使用人工智能的技术来颠覆安全这个行业,目前在黄反鉴定、恶意链接、业务风控领域、病毒分析、APT检测方面都取得了不错的进展,典型案例的就是2015年的一次数据挖掘比赛。

2015年,微软在Kaggle上发起了一个恶意代码分类的比赛,并提供了超过500G的原始数据。有意思的是,取得第一名的队伍三个人都不是搞安全出身的,所采用的方法与我们常见的方法存在很大不同,展现了机器学习在安全领域的巨大潜力。早期的反病毒软件大都单一的采用特征匹配的方法,简单的利用特征串完成检测。随着恶意代码技术的发展,恶意代码开始在传播过程中进行变形以躲避查杀,此时同一个恶意代码的变种数量急剧提升,形态较本体也发生了较大的变化,反病毒软件已经很难提取出一段代码作为恶意代码的特征码。Kaggle比赛中最重要的环节就是特征工程,特征的好坏直接决定了比赛成绩。在这次Kaggle的比赛中冠军队伍选取了三个“黄金”特征:恶意代码图像、OpCode n-gram和Headers个数,其他一些特征包括ByteCode n-gram,指令频数等。机器学习部分采用了随机森林算法,并用到了xgboost和pypy加快训练速度,最终他们检测的效果超过了常见传统检测方式,取得了冠军。1.恶意代码图像

这个概念最早是2011年由加利福尼亚大学的Nataraj和Karthikeyan在他们的论文Malware Images:Visualization and Automatic Classification中提出来的,思路非常新颖,把一个二进制文件以灰度图的形式展现出来,利用图像中的纹理特征对恶意代码进行聚类。此后,有许多研究人员在这个思路基础上进行了改进和探索。就目前发表的文章来看,恶意代码图像的形式并不固定,研究人员可根据实际情况进行调整和创新。2.OpCode n-gram

n-gram是自然语言处理领域的概念,早期的语音识别技术和统计语言模型与它密不可分。n-gram基于一个简单的假设,即认为一个词出现的概率仅与它之前的n-1个词有关,这个概率可从大量语料中统计得到。例如“吃”的后面出现“苹果”或“披萨”的概率就会比“公路”的概率大(正常的语料中基本不会出现“吃公路”这种组合),可以看出n-gram在一定程度上包含了部分语言特征。

将n-gram应用于恶意代码识别的想法最早由Tony等人在2004年的论文N-gram-based Detection of New Malicious Code中提出,不过他们的方法是基于ByteCode的。2008年Moskovitch等人的论文Unknown Malcode Detection Using OPCODE Representation中提出利用OpCode代替ByteCode更加科学,如图1-6所示。图1-6 二进制文件的OpCode n-gram

在移动应用领域,使用类似的思路也取得了不错的成绩,我的同事王磊使用深度学习识别恶意APK,准确率达到99.96%,召回率达到了80%,2016年,反映该研究成果的论文“AI Based Antivirus:Can Alphaav Win The Battle in Which Man Has Failed?”被享誉国内外的Blackhat会议收录并做了相关演讲。

恶意APK伴随移动互联网井喷式的发展,其数量在近几年几何级别增长,如图1-7所示。传统的基于规则的检测技术已经无法覆盖如此大量的恶意程序。图1-7 恶意APK数量猛增

王磊团队在大量的人工分析恶意APK的工作中发现,人工分析的过程很类似图像识别的过程。深度学习在图像识别领域有着成熟的应用,是否可以通过提取APK特征,通过深度学习的方法来自动化识别恶意APK呢?如图1-8所示。图1-8 恶意APK分析与图像识别

王磊团队对APK的特征提取主要分为三大类特征:

·结构化特征,包括APK申请的权限的个数,资源文件中包含的图像文件个数和参数大于20的函数的个数等。

·统计类特征,包括近千条统计特征。

·长期恶意APK检测的经验总结的特征,包括资源文件中是否包含可执行文件,assets文件夹中是否包含APK文件等。

特征提取过程如图1-9所示。图1-9 APK特征提取过程

归一化处理一千多个特征,取值控制在-1和1之间,如图1-10所示。图1-10 归一化APK特征

使用深度学习网络训练,训练过程如图1-11所示。图1-11 APK深度学习训练过程

整个训练过程中使用超过了15万个样本,训练使用了百度开源的深度学习框架Paddle。本书的第二部中关于深度学习的案例也主要使用Paddle和TensorFlow框架编写。

Paddle主页为:http://www.paddlepaddle.org/1.5 算法和数据的辩证关系

算法和数据是机器学习解决实际问题不可或缺的两大因素,缺一不可。早期的机器学习十分依赖特征的提取,提取出关键的特征,往往可以事半功倍。深度学习的快速发展,人们发现通过增加训练数据量,让机器从大量基础特征中可以自动关联出潜在关系,自动学习出更高级的特征,所以有种说法被很多人接受,就是当数据量足够大时,不同的算法对效果的影响不大。但是在实际工作中,很难保证各种场景下都有足够的数据进行训练,这个时候不同算法的检测效果可能会差别很大,在本书后面的例子中,大家可以发现相同的问题和训练集下,使用不同算法结果就会有明显差异。1.6 本章小结

本章重点介绍人工智能发展的现状、互联网安全严峻形势以及当前人工智能在安全领域的一些进展。目前人工智能在安全领域的应用还处于起步和探索阶段,深入研究将大有可为。参考资源

我写作本章时参考了以下网站,读者要想进一步学习,欢迎到这些网站进一步了解更多信息:

·http://www.cnvd.org.cn/webinfo/show/3821

·http://www.ccidnet.com/2016/0805/10162993.shtml

·http://special.csdncms.csdn.net/security/

·http://view.k618.cn/wlgcy/201608/t20160826_8776204.htm

·http://news.21cn.com/hotnews/a/2017/0420/10/32186159.shtml

·http://www.freebuf.com/news/103646.html

·http://www.freebuf.com/articles/database/97212.html

·https://www.fireeye.com/blog/threat-research/2016/02/maimed_ramnit_still.html第2章打造机器学习工具箱

在机器学习领域,Python语言可以大展身手,因为Python的设计哲学是“优雅、明确、简单”。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的影响,Python源代码具备更好的可读性,并且能够支撑大规模的软件开发。几乎在任何涉及软件开发的领域都可以看到Python的身影,在机器学习领域它更是威名远扬,大量的优秀机器学习库都是基于Python开发或者提供Python接口的。所以本章重点介绍Python语言在机器学习领域的优势和应用,包括几个重点库:NumPy、SciPy、NLTK、Scikit-Learn的简介、环境依赖以及安装,最后介绍TensorFlow的简介及安装。为后续的学习准备好工具箱。2.1 Python在机器学习领域的优势

Python在机器学习领域应用广泛(如图2-1所示),我认为主要原因有两个:

·语法简单,功能强大;

·生态完整,具备丰富的第三方库,对应的机器学习库非常丰富。

下面将重点介绍四个库。2.1.1 NumPy

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。图2-1 主流基于Python的机器学习库

NumPy包括:

·一个强大的N维数组对象Array;

·比较成熟的(广播)函数库;

·用于整合C/C++和Fortran代码的工具包;

·实用的线性代数、傅里叶变换和随机数生成函数。

NumPy提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,专为进行严格的数字处理。1.安装方法pip install --user numpy2.用法示例

首先需要创建数组才能对其进行其他操作。

可以通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c):>>> a = np.array([1, 2, 3, 4]) >>> b = np.array((5, 6, 7, 8)) >>> c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) >>> b array([5, 6, 7, 8]) >>> c array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]) >>> c.dtype dtype('int32')

数组的大小可以通过其shape属性获得:>>> a.shape (4,) >>> c.shape (3, 4)

数组元素的存取方法和Python的标准方法相同:>>> a = np.arange(10) >>> a[5] # 用整数作为下标可以获取数组中的某个元素 5 >>> a[3:5] # 用范围作为下标获取数组的一个切片,包括a[3]不包括a[5] array([3, 4]) >>> a[:5] # 省略开始下标,表示从a[0]开始 array([0, 1, 2, 3, 4]) >>> a[:-1] # 下标可以使用负数,表示从数组后往前数 array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> a[2:4] = 100,101 # 下标还可以用来修改元素的值 >>> a array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9]) >>> a[1:-1:2] # 范围中的第三个参数表示步长,2表示隔一个元素取一个元素 array([ 1, 101, 5, 7]) >>> a[::-1] # 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒 array([ 9, 8, 7, 6, 5, 4, 101, 100, 1, 0]) >>> a[5:1:-2] # 步长为负数时,开始下标必须大于结束下标 array([ 5, 101])

和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间:>>> b = a[3:7] # 通过下标范围产生一个新的数组b,b和a共享同一块数据空间 >>> b array([101, 4, 5, 6]) >>> b[2] = -10 # 将b的第2个元素修改为-10 >>> b array([101, 4, -10, 6]) >>> a # a的第5个元素也被修改为10 array([ 0, 1, 100, 101, 4, -10, 6, 7, 8, 9])

除了使用下标范围存取元素之外,NumPy还提供了两种存取元素的高级方法。

NumPy和MatLab不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,如果你希望对数组进行矩阵运算的话,可以调用相应的函数。

NumPy库提供了matrix类,使用matrix类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和MatLab十分类似。但是由于NumPy中同时存在ndarray和matrix对象,用户很容易将两者弄混。这有违Python的“显式优于隐式”的原则,因此并不推荐在较复杂的程序中使用matrix。下面是使用matrix的一个例子:>>> a = np.matrix([[1,2,3],[5,5,6],[7,9,9]]) >>> a*a**-1 matrix([[ 1.00000000e+00, 1.66533454e-16, -8.32667268e-17],[ -2.77555756e-16, 1.00000000e+00, -2.77555756e-17],[ 1.66533454e-16, 5.55111512e-17, 1.00000000e+00]])

因为a是用matrix创建的矩阵对象,因此乘法和幂运算符都变成了矩阵运算,于是上面计算的是矩阵a和其逆矩阵的乘积,结果是一个单位矩阵。

矩阵的乘积可以使用dot函数进行计算。对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是点积。当需要将一维数组当作列矢量或者行矢量进行矩阵运算时,推荐先使用reshape函数将一维数组转换为二维数组:>>> a = array([1, 2, 3]) >>> a.reshape((-1,1)) array([[1], [2], [3]])>>> a.reshape((1,-1)) array([[1, 2, 3]])

除了dot计算乘积之外,NumPy还提供了inner和outer等多种计算乘积的函数。这些函数计算乘积的方式不同,尤其是当处理多维数组的时候,更容易搞混。下面分别介绍这几个函数。

·dot:对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为“内积”);对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是——数组a的最后一维上的所有元素与数组b的倒数第二位上的所有元素的乘积和。dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

下面以两个三维数组的乘积演示一下dot乘积的计算结果。

首先创建两个三维数组,这两个数组的最后两维满足矩阵乘积的条件:>>> a = np.arange(12).reshape(2,3,2) >>> b = np.arange(12,24).reshape(2,2,3) >>> c = np.dot(a,b)

dot乘积的结果c可以看作是数组a,b的多个子矩阵的乘积:>>> np.alltrue( c[0,:,0,:] == np.dot(a[0],b[0]) ) True >>> np.alltrue( c[1,:,0,:] == np.dot(a[1],b[0]) ) True >>> np.alltrue( c[0,:,1,:] == np.dot(a[0],b[1]) ) True >>> np.alltrue( c[1,:,1,:] == np.dot(a[1],b[1]) ) True

·inner:和dot乘积一样,对于两个一维数组,计算的是这两个数组对应下标元素的乘积和;对于多维数组,它计算的结果数组中的每个元素都是——数组a和b的最后一维的内积,因此数组a和b的最后一维的长度必须相同。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载