《Web安全之机器学习入门》一 2.1 Python在机器学习领域的优势

简介: 本节书摘来自华章出版社《Web安全之机器学习入门》一 书中的第2章,第2.1节,作者:刘焱,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.1 Python在机器学习领域的优势

Python在机器学习领域应用广泛(如图2-1所示),我认为主要原因有两个:
语法简单,功能强大;
生态完整,具备丰富的第三方库,对应的机器学习库非常丰富。
下面将重点介绍四个库。

2.1.1 NumPy

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。

screenshot

NumPy包括:
一个强大的N维数组对象Array;
比较成熟的(广播)函数库;
用于整合C/C++和Fortran代码的工具包;
实用的线性代数、傅里叶变换和随机数生成函数。
NumPy提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,专为进行严格的数字处理。
1.安装方法
pip install --user numpy
2.用法示例
首先需要创建数组才能对其进行其他操作。
可以通过给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的最后一维的长度必须相同。

inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:]) 

下面是inner乘积的演示:

>>> a = np.arange(12).reshape(2,3,2) 
>>> b = np.arange(12,24).reshape(2,3,2) 
>>> c = np.inner(a,b) 
>>> c.shape (2, 3, 2, 3) 
>>> c[0,0,0,0] == np.inner(a[0,0],b[0,0]) 
True 
>>> c[0,1,1,0] == np.inner(a[0,1],b[1,0]) 
True 
>>> c[1,2,1,2] == np.inner(a[1,2],b[1,2]) 
True 

outer:只按照一维数组进行计算,如果传入参数是多维数组,则先将此数组展平为一维数组,之后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积:

>>> np.outer([1,2,3],[4,5,6,7]) 
array([[ 4,  5,  6,  7],        [ 8, 10, 12, 14],        [12, 15, 18, 21]]) 

矩阵中更高级的一些运算可以在NumPy的线性代数子库linalg中找到。例如inv函数计算逆矩阵,solve函数可以求解多元一次方程组。下面是solve函数的一个例子:

>>> a = np.random.rand(10,10) 
>>> b = np.random.rand(10) 
>>> x = np.linalg.solve(a,b) 
>>> np.sum(np.abs(np.dot(a,x) - b)) 
3.1433189384699745e-15 

solve函数有两个参数a和b。a是一个N×N的二维数组,而b是一个长度为N的一维数组,solve函数找到一个长度为N的一维数组x,使得a和x的矩阵乘积正好等于b,数组x就是多元一次方程组的解。

2.1.2 SciPy

SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包,如图2-2所示。它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等等。

screenshot

安装方法:
pip install --user numpy scipy matplotlib iPython jupyter pandas sympy nose

2.1.3 NLTK

NLTK在NLP领域中是最常使用的一个Python库,包括图形演示和示例数据,其提供的教程解释了工具包支持的语言处理任务背后的基本概念。
安装程序如下:

pip install -U nltk

加载数据如下:

>>> import nltk 
>>> nltk.download()

用法示例如下。
分词与标识:

>>> import nltk 
>>> sentence = """At eight o'clock on Thursday morning 
... Arthur didn't feel very good.""" 
>>> tokens = nltk.word_tokenize(sentence)
>>> tokens 
['At', 'eight', "o'clock", 'on', 'Thursday', 'morning', 'Arthur', 'did', "n't", 'feel', 'very', 'good', '.'] 
>>> tagged = nltk.pos_tag(tokens) 
>>> tagged[0:6] 
[('At', 'IN'), ('eight', 'CD'), ("o'clock", 'JJ'), ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN')]

标识名词实体:

>>> entities = nltk.chunk.ne_chunk(tagged) 
>>> entities 
Tree('S', [('At', 'IN'), ('eight', 'CD'), ("o'clock", 'JJ'),            ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN'),        
    Tree('PERSON', [('Arthur', 'NNP')]),            
        ('did', 'VBD'), ("n't", 'RB'), ('feel', 'VB'),    
        ('very', 'RB'), ('good', 'JJ'), ('.', '.')])

展现语法树(如图2-3):

>>> from nltk.corpus import treebank 
>>> t = treebank.parsed_sents('wsj_0001.mrg')[0] 
>>> t.draw()

screenshot

2.1.4 Scikit-Learn

Scikit-Learn是基于Python的机器学习模块,基于BSD开源许可证。这个项目最早于2007 年发起,目前也是由社区自愿者进行维护的。Scikit-Learn官方网站上可以找到相关的Scikit-Learn的资源、模块下载、文档、例程等等。Scikit-Learn的基本功能主要分为6个部分:分类,回归,聚类,数据降维,模型选择,数据预处理。具体可以参考官方网站上的文档,见图2-4。
依赖的环境:

Python (>= 2.6 or >= 3.3)
NumPy (>= 1.6.1)
SciPy (>= 0.9)

screenshot

安装方法:

pip install -U scikit-learn
相关文章
|
7月前
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
573 8
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
496 7
|
11月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1282 12
Scikit-learn:Python机器学习的瑞士军刀
|
10月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
536 2
|
12月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
617 14
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
数据采集 Web App开发 存储
打造高效的Web Scraper:Python与Selenium的完美结合
本文介绍如何使用Python结合Selenium,通过代理IP、设置Cookie和User-Agent抓取BOSS直聘的招聘信息,包括公司名称、岗位、要求和薪资。这些数据可用于行业趋势、人才需求、企业动态及区域经济分析,为求职者、企业和分析师提供宝贵信息。文中详细说明了环境准备、代理配置、登录操作及数据抓取步骤,并提醒注意反爬虫机制和验证码处理等问题。
483 1
打造高效的Web Scraper:Python与Selenium的完美结合
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。

推荐镜像

更多