收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 45953|回复: 38

[开发] 分享《机器学习算法原理与编程实践》电子版

[复制链接]
发表于 2015-12-4 10:57:48 | 显示全部楼层 |阅读模式

内容简介:从结构上阐明了研究机器学习理论和算法的方法。最重要的不是数学,也不是这些算法本身,而是思想的发展过程,这与之前所有的书籍都有所不同。全书分为三条主线:第一条主线:从第一代神经网络(线性分类器)、第二代神经网络(非线性)及其在预测领域的应用,到支持向量机,最后是深度学习。第二条主线是贝叶斯理论,从朴素贝叶斯算法到贝叶斯网,最后是隐马尔科夫模型,这部分属于智能推理的范畴。最后矩阵降维,奇异值分解(svd)和PCA算法,构成第三条主线,因为算法简单,本书都使用真实案例进行讲解。目前机器学习主要由这三条主线贯穿始终,本书着力于讲解三条主线的理论发展、思想变迁、数学原理。而具体算法就是在其上的一颗颗明珠。读者在看完之后,能够将机器学习各种理论融会贯通,成为一体。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2016-1-13 10:02:17 | 显示全部楼层

1.3  机器学习的数学基础
上一节,我们建立了矩阵的概念,并介绍了矩阵基本运算的Python实现。从本节开始,我们学习有关机器学习的一些最基本的数学概念。一谈到数学,大多数人的感觉就一个字:晕。其实,数学让人觉得难的地方不外乎两点:一是语言符号非常简练,二是理论描述比较抽象。长久以来数学研究的是客观世界的空间形式与数量性质,即事物在时空中的普遍存在与运动的规律。因为反映本质,所以才精炼,因为应用普遍,所有才抽象。
现代数学有三个重要的基石:概率论、数值分析、线性代数。概率论说明了事物可能会是什么样;数值分析揭示了它们为什么这样,以及如何变成这样;线性代数则告诉我们事物从来不只有一个样子,使我们能从多个角度来观察事物。
1.3.1  相似性的度量
继续以第一节的表1.5为例,我们做出如下的精简(如表1.7):
表1.7  精简的大型动物和水果表
实例
重量
生命周期/保质期
大象
5000
70*365
鲨鱼
3200
70*365
苹果
0.25
15

0.3
10
其中每个对象都是一个特征向量,从直觉上,我们可将其分为两大类:
q  大型动物:大象、鲨鱼
q  水果:苹果、梨
因为大象和鲨鱼都很大,生命周期也都很长,相比之下苹果和梨要小得多,保质期也都很短。很大、很长对很小、很短是在量上的比较,因此,利用初等数学的知识,这些给定数值的对象就可以看作一个n维坐标系下的点,并通过点与点之间的距离来度量。
两个向量之间的距离(此时向量作为n维坐标系中的点)计算,在数学上称为向量的距离(Distance),也称为样本之间的相似性度量(Similarity Measurement)。 它反映为某类事物在距离上接近或远离的程度,直觉上,距离越近的就越相似,越容易归为一类,距离越远就越不同,但这个直觉的标准是什么呢? 换句话说,这么划分的依据是什么呢?由此,我们引出向量间的各类距离公式,下面这些距离公式从不同角度对向量间的距离定义了衡量标准。
在引入距离公式之前,我们先看一个概念:
范数(来自百度百科): 向量的范数可以简单形象的理解为向量的长度,或者向量到坐标系原点的距离,或者相应空间内的两个点之间的距离。
向量的范数定义:向量的范数是一个函数||x||,满足非负性||x|| >= 0,齐次性||cx|| = |c| ||x|| ,三角不等式||x+y|| <= ||x|| + ||y||
L1范数: ||x||为x向量各个元素绝对值之和。
L2范数: ||x||为x向量各个元素平方和的开方,L2范数又称Euclidean范数或者Frobenius范数
Lp范数: ||x||为x向量各个元素绝对值p次方和的1/p次方
L∞范数: ||x||为x向量各个元素绝对值最大那个元素,如下:

向量范数的运算:
A = [8,1,6]
# 手工计算
modA = sqrt(sum(power(A,2)))
print "modA:",modA
# 库函数
normA = linalg.norm(A)
print "norm(A):",normA
结果:
modA: 10.0498756211
norm(A): 10.0498756211
1.3.2  各类距离的意义与Python实现
本节所列的距离公式列表和代码如下:
q  闵可夫斯基距离(Minkowski Distance)
q  欧氏距离(Euclidean Distance)
q  曼哈顿距离(Manhattan Distance)
q  切比雪夫距离(Chebyshev Distance)
q  夹角余弦(Cosine)
q  汉明距离(Hamming distance)
q  杰卡德相似系数(Jaccard similarity coefficient)
读者可根据自己需求有选择的学习。因使用矢量编程的方法,距离计算得到了较大的简化。
1. 闵可夫斯基距离(Minkowski Distance)
严格意义上,闵氏距离不是一种距离,而是一组距离的定义。
(1)闵氏距离的定义:
两个n维变量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

  
其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
根据变参数的不同,闵氏距离可以表示一类的距离。
2.欧氏距离(Euclidean Distance)
欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式(如图1.9)。

图1.9  AB间的欧式距离dist(A,B)
(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

(2)三维空间两点A (x1,y1,z1)与B(x2,y2,z2)间的欧氏距离:

(3)两个n维向量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的欧氏距离:

表示成向量运算的形式:
表示成向量运算的形式:

(4) python实现欧式距离公式的:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt((vector1-vector2)*((vector1-vector2).T))
输出:
[[ 5.19615242]]
3.曼哈顿距离(Manhattan Distance)
从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数)。而这也是曼哈顿距离名称的来源,曼哈顿距离也称为城市街区距离(City Block distance)(如图1.10)。

图1.10  AB间的曼哈顿距离为红色、蓝色、黄色线条
(1)二维平面两点A(x1,y1)与B(x2,y2)间的曼哈顿距离


(2)两个n维向量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的曼哈顿距离



(3)python实现曼哈顿距离:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sum(abs(vector1-vector2))
输出:
9
4.切比雪夫距离(Chebyshev Distance)
国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个(如图1.11)。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max(| x2-x1| , |y2-y1| ) 步。有一种类似的一种距离度量方法叫切比雪夫距离(L∞范数)。

图1.11  国际象棋与切比雪夫距离
(1)二维平面两点A(x1,y1)与B(x2,y2)间的切比雪夫距离:


(2)两个n维向量A (x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的切比雪夫距离:


这个公式的另一种等价形式是:


(3) Python实现切比雪夫距离:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,7,5])
print abs(vector1-vector2).max()
输出:
5
5. 夹角余弦(Cosine)
几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异(如图1.12)。

图1.12  AB间的夹角余弦cos(θ)
(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:



(2) 两个n维样本点A (x11,x12,…,x1n)与 B(x21,x22,…,x2n)的夹角余弦
类似的,对于两个n维样本点A(x11,x12,…,x1n)与 B(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。


即:




夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。
(3)python实现夹角余弦
from numpy import *
cosV12 = dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
print cosV12
输出:
0.92966968
6. 汉明距离(Hamming distance)
(1)汉明距离的定义
两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。
应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。
(2) python实现汉明距离:
from numpy import *
matV = mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
smstr = nonzero(matV[0]-matV[1]);
print shape(smstr[0])[1]
输出:
6
7. 杰卡德相似系数(Jaccard similarity coefficient)
(1) 杰卡德相似系数
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

杰卡德相似系数是衡量两个集合的相似度一种指标。
(2) 杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:


杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
(3) 杰卡德相似系数与杰卡德距离的应用
可将杰卡德相似系数用在衡量样本的相似度上。
样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。
P:样本A与B都是1的维度的个数
q:样本A是1,样本B是0的维度的个数
r:样本A是0,样本B是1的维度的个数
s:样本A与B都是0的维度的个数
那么样本A与B的杰卡德相似系数可以表示为:
这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。
而样本A与B的杰卡德距离表示为:

(4) Python实现杰卡德距离:
from numpy import *
import scipy.spatial.distance as dist  # 导入scipy距离公式
matV = mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
print "dist.jaccard:", dist.pdist(matV,'jaccard')
输出:
dist.jaccard: [ 0.75]
现在,我们有能力为矩阵中对象间的相似程度(接近与远离)提供各种度量方法,以及编码实现。通过计算对象间的距离,我们就可以轻松地得到表2.8中的四个对象所属的类别:以克、天为单位的苹果是水果类别的一个实例; 以吨、年为单位鲨鱼是大型动物的一个实例。这种区别是明显的,
但是,如果我们考察颜色这个特征,情况可能会有所不同,苹果和梨都有黄色这个特征,像这种情况我们如何区分呢?
1.3.3  理解随机性
让我们改变一下视角,从整体上观察矩阵(集合)中的对象分布与矩阵整体的关系。这需要引入一个新的概念:概率论。概率论是整个数学大厦中比较难理解的一门学科。这多少与直觉有点差异,人们常把概率简单理解为事件发生的可能性。其实这只是概率的表面现象。想要真正理解概率需要弄清楚两个问题:
q  确定性与随机性
q  统计规律
《自然哲学之数学原理》是牛顿最重要的著作,书中构建了科学有史以来第一个完整的、科学的宇宙论和科学理论体系,并试图用统一的力学原因解释宇宙所有的运动和现象,它所造成的影响极其深远。
1986年,这部划时代巨著出版整整三百周年,英国皇家学会专门举办了隆重的纪念大会。在这次大会上,著名的流体力学权威詹姆士.莱特希尔爵士却发表了令人震惊的道歉宣言。
“今天,我们深深意识到,我们的前辈对牛顿力学惊人成就的崇拜,促使他们认为世界具有可预见性,的确,我们在1960年以前大都倾向于相信这个说法,但现在我们知道这是错误的。我们曾经误导了公众,向他们宣传说满足牛顿运动定律的系统是决定论的,可在1960年后这已被证明不是真的,为此,我们愿意向公众表示道歉。”
从认识论角度来看,这是一个划时代的进步,但从常识性的角度而言,这的确让人困惑。如果世界不是确定的,规律从哪里来,我们应该按照何种法则生活?
1963年,美国气象学家洛仑兹建立了一个描述大气对流状况的数学模型,叫洛仑兹动力学方程。这是个简单确定性方程。因为它只有三个变量用来分别代表大气中的风速、温度和气压;说它是确定性的,因为不含任何随机项,初始值也可以给定。但就是由这个方程所描述的只有三个变量的简单确定性系统里,却让我们出乎意料地见到了随机性的一个典型特征:混沌,见识了混沌非比寻常的特性。
洛仑兹动力学方程描绘出的运动轨迹,它具有一种奇特的形状,像一只展开了双翼的蝴蝶,所以又称为蝴蝶效应(如图1.13)。在这个奇妙精巧的蝴蝶上,确定性和随机性被统一在一起:一方面,运动的轨迹必然落在“蝴蝶”上,绝不会远离它们而去,这是确定性的表现,表明系统未来的所有运动都被限制在一个明确的范围之内。另一方面,运动轨迹变化缠绕的规则却是随机性的,任何时候你都无法准确判定下一次运动的轨迹将落在“蝴蝶”的哪一侧翅膀上的哪一点上。也就是说,这个系统运动大的范围是确定的,可预测的;但是运动的细节是随机的,不可预测的。

图1.13  洛仑兹吸引子——蝴蝶效应的理论基础
如果从统计学的角度来看,蝴蝶效应说明了两方面的意义:一方面,样本总体(特征向量)的取值范围一般是确定的,所有样本对象(包括已经存在的和未出现的)的取值都位于此空间范围内。另一方面,无论搜集再多的样本对象,也不能使这种随机性降低或者消失。因此,随机性是事物的一种根本的、内在的、无法根除的性质,也是一切事物(概率)的本质属性。
世界中,绝大多数的规律都来源于统计学。地球围绕太阳旋转的周期大约是365天,但每次都有微小差别,否则为什么要制订历法;车辆每次停车的位置都在站台附近,但具体的位置都不一样;抛出硬币落下后不是正面就是反面,但每次实验的结果都很难预期。随机性是隐藏在我们生活中最普遍规律。
1.3.4  回顾概率论
对事物运动这种不确定性(随机性)的度量就是概率论,接下来我们考察一下概率的基本概念。衡量事物运动的随机性,必须从整体而不是局部来认知事物, 因为从每个局部,事物可能看起来都是不同的(或相同的)。不像其他的数学体系,这需要概率论架构在一套完整的数学模型之上。
为了更好的理解,我们修改一下上面的例子,假设我们的集合中只有苹果和梨两大类的对象,苹果有10个,梨也有10个,这次我们仅考察颜色特征。苹果有两种颜色:红色或黄色,其中红色占了8个;梨也有两种颜色:黄色或绿色,其中黄色占9个,假如从这堆水果中挑出一个黄色水果,问这个水果属于梨的可能性。
概率论基础概念:
q  样本(样本点):原指随机实验一个结果,可以理解为矩阵中的一个对象:苹果或梨;
q  样本空间:原指随机实验所有结果的集合,可以理解为矩阵的所有对象,引申为对象特征的取值范围:10个苹果,10个梨;
q  随机事件:是指样本空间的一个子集,可以理解为某个分类,它实际指向一种概率分布:苹果为红色;梨为黄色;
q  随机变量:可以理解为指向某个事件的一个变量:X{x=黄色}
q  随机变量的概率分布:给定随机变量的取值范围,导致某种随机事件出现的可能性,从机器学习的角度来看,就是符合随机变量取值范围的某个对象属于某个类别或服从某种趋势的可能性。
概率论妙处在于,由于随机性的存在,有时候无法直接讨论随机变量如何从样本空间映射到事件空间,因为随机变量的取值范围允许它可以映射到事件空间中的任一事件。此时,只有通过研究随机变量映射为每个事件的可能性,也就是说某个对象属于每个类别的可能性,才能做出合理的判断。理解了这一层也就理解了概率论的数学本质。
结合本例,我们不去研究黄色的苹果与黄色的梨有什么差别。而承认其统计规律:苹果是红色的概率是0.8,苹果是黄色的概率就是1-0.8=0.2,而梨是黄色的概率是0.9,将其作为先验概率。有了这个先验概率,就可以利用抽样,即任取一个水果,前提是抽样对总体的概率分布没有影响,通过它的某个特征来划分其所属的类别。黄色是苹果和梨共有的特征,因此,既有可能是苹果也有可能是梨,概率计算的意义在于得到这个水果更有可能的那一种。
这个问题的求解过程就是著名的贝叶斯公式:

用数学的语言来表达,就是已知P(苹果)=10/(10+10),P(梨)=10/(10+10),P(黄色|苹果)=20%,P(黄色|梨)=90%,求P(梨|黄色)
可得:P(梨|黄色)=P(黄色,梨)/P(黄色)
=P(黄色|梨)P(梨)/P(黄色)
=81.8%
贝叶斯公式贯穿了机器学习中随机问题分析的全过程。从文本分类到概率图模型,其基本原理都是贝叶斯公式,是机器学习领域最重要的基础概念。
1.3.5  多元统计基础
理解了随机性和概率基础,下一步我们与之前介绍的矩阵结合起来,将它扩展到多维的情况。
矩阵是具有相同特征和维度的对象集合,其中每个对象,也称为行向量,都具有一个以上特征。如果,每个特征都用一个随机变量来表示,那么从概率论的角度,一个对象就可以表示为n个随机变量的整体,其中X=(X1,X2, …,Xn)为n维随机变量或随机向量。每个对象就是随机向量的一组取值,矩阵中的所有对象构成了随机向量的联合和边缘概率分布。
继续上一节的例子,我们把水果的种类和颜色都看作对象的两个特征,那么这个随机向量的联合概率分布可以写为(如表1.8):
表1.8  水果联合概率分布
颜色
种类
红色
(0)
黄色
(1)
绿色
(2)
颜色
苹果(0)
0.4
0.1
0
0.5
梨(1)
0
0.45
0.05
0.5
水果
0.4
0.55
0.05
1.0
表中间白色部分是水果和颜色两个特征的联合概率分布,灰色部分是两个特征各自取值的边缘概率分布。形式上,以二维随机变量为例,X,Y的联合概率分布为:


P{X=苹果, Y=红色} =p00=0.4;
P{X=苹果, Y=黄色} =p01=0.1;
P{X=苹果, Y=绿色} =p02=0;
P{X=梨, Y=红色}=p10=0;
P{X=梨, Y=黄色} =p20=0.45;
P{X=梨, Y=绿色} =p30=0.05。
相应对象的边缘分布表示为:
上例中,X=苹果的边缘概率分布为:; Y=绿色的边缘概率分布为:

随机向量的联合概率分布和边缘概率分布描述了对象特征间的概率关系。机器学习中,对象以及对象构成的矩阵都是多元数据,因此,所有与概率相关的算法都以对象的联合概率分布和边缘概率分布为运算基础,本书中的多元统计算法有:朴素贝叶斯分析、回归分析、统计学习理论、聚类分析、主成分分析和概率图模型等等。
1.3.6  特征间的相关性
前面各章节,我们的分析着重于对矩阵行向量的划分,也就是分类过程。本节侧重于对特征列的研究,特征列的研究主要应用于预测活动,例如,在金融分析中,通过做两支股票价格波动的相关,来判断它们之间的关系,以期达到最大化收益同时最小化风险的目的。抽象一点说,就是在一个时间序列上观察两列数据之间的相关性。
关于预测,概率论提供了一套完整和有效的数学方法。我们继续讲解随机变量的一些重要特征。随机变量,一般是一个向量,可以包含不同取值范围的多个变量,有必要研究一下这些变量的分布情况,也就是随机变量的数字特征,从中发掘出一定的规律性:
q  期望:衡量样本某个特征列取值范围的平均值
q  方差:衡量样本某个特征列取值范围的离散程度
q  协方差矩阵和相关系数:衡量样本特征列之间线性相关性
1相关系数 ( Correlation coefficient )与相关距离(Correlation distance)
(1) 相关系数的定义

相关系数是衡量两个特征列之间相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明特征列X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。
(2)相关距离的定义

(3)Python实现相关系数:数据来源于表2.6  2-18岁正常男生体重身高对照表
from numpy import *
featuremat =
mat([[88.5,96.8,104.1,111.3,117.7,124.0,130.0,135.4,140.2,145.3,151.9,159.5,165.9,169.8,171.6,172.3,172.7], [12.54,14.65,16.64,18.98,21.26,24.06,27.33,30.46,33.74,37.69,42.49,48.08,53.37,57.08,59.35,60.68,61.40]])
# 计算均值
mv1 = mean(featuremat[0]) # 第一列的均值
mv2 = mean(featuremat[1]) # 第二列的均值
# 计算两列标准差
dv1 = std(featuremat[0])
dv2 = std(featuremat[1])
corref = mean(multiply(featuremat[0]-mv1,featuremat[1]-mv2))/(dv1*dv2)
print corref
# 使用numpy相关系数得到相关系数矩阵
print corrcoef(featuremat)
输出:
0.98160142576
[[ 1.          0.98160143]
[ 0.98160143  1.        ]]
相关系数矩阵的含义是,如果把第一个特征列作为参照数据(自己与自己的相关程度为1),那么第二个与第一个的相关程度是98%。
有了数字特征,下面我们可以发展欧氏距离公式为马氏距离公式:
2.马氏距离(Mahalanobis Distance)
(1)马氏距离定义
有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:

而其中向量Xi与Xj之间的马氏距离定义为:
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:


也就是欧氏距离了。
若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。
(2)马氏距离的优点:量纲无关,排除变量之间的相关性的干扰。
(3)马氏距离的Python计算:数据来源于表2.6  2-18岁正常男生体重身高对照表
from numpy import *
featuremat =
mat([[88.5,96.8,104.1,111.3,117.7,124.0,130.0,135.4,140.2,145.3,151.9,159.5,165.9,169.8,171.6,172.3,172.7], [12.54,14.65,16.64,18.98,21.26,24.06,27.33,30.46,33.74,37.69,42.49,48.08,53.37,57.08,59.35,60.68,61.40]])
covinv = linalg.inv(cov(featuremat))
tp = featuremat.T[0]-featuremat.T[1]
distma = sqrt(dot(dot(tp,covinv),tp.T))
print distma
输出:
[[ 0.92966634]]
回复 支持 2 反对 1

使用道具 举报

 楼主| 发表于 2015-12-8 09:26:06 | 显示全部楼层
1.2  对象、矩阵与矢量化编程
有了工具,很多事情就变得方便了。现在,我们正式进入机器学习的基础知识。简单回忆一下绪论部分所提出的三种对象类型:文本、表格、图。乍一看,有点眼花缭乱,仔细分析下来,三种结构虽各有千秋,却存在着共性。
1.2.1  对象与维度
对于大多数程序员而言,对象应该不是个陌生的概念。在面向对象的程序设计思想中,对象就是一个类的实例。机器学习中的对象与之很相似,在机器学习中,对象是指含有一组特征的行向量。而行向量的集合最容易构造的结构就是表。下面我们来观察一张表(如表1.1),此表来源于现实中真实的统计数据:
表1.1  大型动物与水果
实例        种属        重量(平均)        颜色(主)        生命周期/保质期
非洲象        动物        5吨        土灰色        70年
大白鲨        动物        3.2吨        灰白色        70年
苹果        植物        250克        红色        5~15天
梨        植物        300克        黄色        5~10天
表中第一行黑体字:种属、重量(平均)、颜色(主)、生命周期/保质期表示为特征名称。所有特征组合在一起构成一组行向量,也称为特征向量,我们为了区别线性代数中的特征值和特征向量引入对象这个名称。以非洲象、大白鲨等开头的数据行就是一组行向量,也是一个对象。对象的维度就是行向量的列数,上述数据集的维度为5。
在实际计算中,除非特殊情况,特征名称不需列明;含有字符串的对象名称因无法直接参与运算,一般情况下可以编码为数字,我们将种属特征转换为是否动物(用布尔值0,1替代),颜色特征转换为十六进制。各列的特征值为了计算方便,应统一单位,区间值可以选择中间值。为了方便量化,表1.1删除第一列,大型动物与水果表就转换为(如表1.2):
表1.2  大型动物与水果表
1        5000        #DCDCDC        70*365
1        3200        #9D9D9D        70*365
0        0.25        #FF0000        10
0        0.3        #FFFF00        7
此时,该表被转换为4行、4列的数据表,维度为4。有过一些线性代数知识的朋友可以很简单的将此表转换为下面的矩阵(如表1.3):
表1.3  大型动物与水果矩阵



1        5000        #DCDCDC        70*365
1        3200        #9D9D9D        70*365
0        0.25        #FF0000        10
0        0.3        #FFFF00        7
一般而言一个对象应被视作完整的个体,代表现实中有意义的事物,不能轻易拆分。它的表现形式可能多种多样,例如在图像识别中它可能是一张图片(如图1.8):

图1.8  手写体识别中的“0”
上图是向量化的手写体图片。注意,上图的维度,即行向量的个数是32*32个,整张图被当作一行或者一个对象。因为,整张图仅代表一个完整的事物,表达了一个完整的意义。一般来说,图片数据集的维度都比较高。
文本类数据集有点特殊,需要首先生成词袋列表,再根据每个词出现的词频数值化,不过仔细想想也万变不离其宗。例如,如下文本数据集:
文本1:My dog ate my homework。
文本2:My cat ate the sandwich。
文本3:A dolphin ate the homework。
根据上述三段短文本中出现的词汇,生成词袋列表,该列表记录了上述文本中出现的每个不重复的词:
[a, ate, cat, dolphin, dog, homework, my, sandwich, the]
各段文本根据生成的词袋列表转换为对象,其维度就是词袋列表的长度,计算结果是32维。向量化后的文本称为词向量。
各段文本向量化后的词向量,其中0表示词袋中对应的词未出现在文本中,1表示该词出现在文本中1次,如果多次出现,则累加(如表1.4):
表1.4  词向量空间
   词袋
文本       
a, ate, cat, dolphin, dog, homework, my, sandwich, the
文本1        0,1,0,0,1,1,2,0,0
文本2        0,1,1,0,0,0,1,1,1
文本3        1,1,0,1,0,1,0,0,1
1.2.2  初识矩阵
在线性代数中我们学过,矩阵是由m×n个数组成的一个m行n列的矩形表格,或者更深一点的定义,表示由方程组的系数及常数所构成的二维数据表。从机器学习的角度来看,这两个定义都合适,又都不合适。
现在,我们重新考察一下矩阵。上一节,我们有了表和对象的概念。对象是被特征化的客观事物,而表是容纳这些对象的容器。换句话说,对象是表中的元素,表是对象的集合。但这个集合有点特殊,即表中的每个对象都有相同的特征和维度,对象对于每个特征都有一定的取值。这里矩阵可以理解为,具有相同特征和维度的对象集合。
总结一下:
        矩阵是具有相同特征和维度的对象集合,表现为一张二维数据表;
        一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值;
        特征相同、取值相异的对象集合所构成的矩阵,使对象之间既相互独立,又相互联系;
        由特征列的取值范围所有构成的矩阵空间,应具有完整性,即能够反映出事物的空间形式或变化。(再谈矩阵一节中详细说明)
关于第三点,我们再观察表1.4:动物种属和植物种属是两个风马牛不相及的概念,但如果放到一张表中,我们必须使用一组特征向量来衡量它们,比如:种属、重量、颜色、生命周期(年龄有点牵强)等等。但不能用味道这个特征来衡量,因为大象和鲨鱼很难讲是酸是甜。这就是各类对象之间的联系。
如果不看实例名称,我们从是否动物、重量、颜色、生命周期几个特征也能很容易的分辨出两类对象的差异性。例如,大象重量和苹果重量的悬殊差异,或生命周期/保质期的悬殊差异。这反映了对象间的相互独立。
我们再扩展一下这个例子(如表1.5):
表1.5  扩展表1.2
实例        是否动物        重量        颜色        生命周期/保质期
大象        1        5000        #DCDCDC        70*365
鲨鱼        1        3200        #9D9D9D        70*365
苹果        0        0.25        #FF0000        10
梨        0        0.3        #FFFF00        7
除差异性之外,表1.5中还有一类情况,苹果和梨、大象和鲨鱼。在是否动物、重量和生命周期三个特征中,苹果和梨具有相似性,大象和鲨鱼具有相似性。很明显,大象与鲨鱼的重量较之苹果(或梨)的重量更相似;或者大象与鲨鱼的寿命较之苹果(或梨)的保质期更相似;由于这种相似性,我们很自然地可以将苹果和梨分为一类:水果(区别于植物);大象和鲨鱼分为一类:大型动物(区别于动物)。
由此可见,分类或聚类可以看作是根据对象特征的相似性与差异性,对矩阵空间的一种划分。
下面,我们再看另一个例子(如表1.6):
表1.6  2-18岁正常男生体重身高对照表
年龄(岁)        身高(cm)        体重(kg)
2        88.5        12.54
3        96.8        14.65
4        104.1        16.64
5        111.3        18.98
6        117.7        21.26
7        124.0        24.06
8        130.0        27.33
9        135.4        30.46
10        140.2        33.74
11        145.3        37.69
12        151.9        42.49
13        159.5        48.08
14        165.9        53.37
15        169.8        57.08
16        171.6        59.35
17        172.3        60.68
18        172.7        61.40
这个表列举了2~18岁男生的正常体重、身高的变化。数值上呈现一种递增的趋势,每个对象都与上一行或下一行的对象在时间上相关,并且时间间隔相等,都为1年。这种时间上的相关性使矩阵反映出某一事物在时间上连续变化的过程。
由此可见,预测或回归可以看作根据对象在某种序列(时间)上的相关性,表现为特征取值变化的一种趋势。
分类、聚类和回归是机器学习最基本的主题。通过矩阵,可以构建客观事物的多维度数学模型,并通过条件概率分布、梯度、神经网络、协方差等等运算方式,多角度认识和分析事物。
具体来讲,矩阵有三个重要用途,第一是解线性方程组,比如二维矩阵可以理解为一个平面直角坐标系内的点集,通过计算点与点之间的距离,完成聚类、分类或预测,类似的运算完全可以扩展到多维的情况。第二个用途是方程降次,也就是利用矩阵的二次型,通过升维将线性不可分的数据集映射到高维中,转换为线性可分的情形,这是支持向量机的基本原理之一。第三个用途是变换,矩阵可以通过特征值和特征向量,完成维度约简,简化类似图片这种高维数据集的运算,主成分分析使用的就是这个原理。
在程序设计中,我们可以从形式上把矩阵理解为一个二维数组。以Python语言为例,矩阵就是嵌套着若干个list的一个大list。内部的每个list都是等长的,其中每个元素都是整型或浮点型的数值。内部的list就是行向量,即一个对象。
Numpy数据包提供了专门的矩阵数据结构和线性代数库。从下一节开始,我们将详细介绍Numpy的矩阵运算。
1.2.3  矢量化编程与GPU运算
传统的计算机设计语言,例如C语言,是针对标量的,虽然也提供诸如数组、二维数组的数据结构,但这些结构的赋值、加法、数乘、转置、矩阵相乘还是要通过循环语句完成,十分麻烦,导致程序设计的复杂度也比较高。
mylist = [1,2,3,4,5]
length = len(mylist)
a = 10
for indx in xrange(length):
        mylist[indx] = a*mylist[indx]
print mylist
输出结果:
[10, 20, 30, 40, 50]
而基于矩阵的算法都是针对向量的,这里也称为矢量。为了简化程序的逻辑,就需要一种新的编程方法,处理基于矩阵的基本运算,这就是所谓的矢量化编程。
随着程序设计的发展,使用计算机实现矩阵运算越来越方便。最早实现矢量化编程的语言是Matlab的脚本语言,它极大的降低了数学领域程序设计的复杂度。因此大量的人工智能算法最早都是用Matlab语言写的。
Python自带的List结构,提供切片的功能可以部分实现矢量化编程。其扩展包Numpy提供了专门的矩阵数据结构和线性代数库,完全实现了矢量化编程。
import numpy as np

mylist = [1,2,3,4,5]
a = 10
mymatrix = np.mat(mylist)
print a*mymatrix
输出结果:
[[10 20 30 40 50]]
矢量化编程的一个重要特点就是可以直接将数学公式转换为相应的程序代码,极大方便了程序的阅读和调试,使复杂数学公式的实现变得简单和方便,本节和下一节所用的矢量化程序的代码一般只有一两行,即可完成复杂的数学运算。
无论是Matlab还是Python的矢量化编程都可以无缝的调用底层的C函数,还可以提高算法速度。为了提升特定数值运算操作,例如矩阵相乘、矩阵相加、矩阵-向量乘法、浮点运算的速度,数值计算和并行计算的研究人员已经努力了几十年。这个领域最出色的技术就是使用图形处理器的GPU运算。
英伟达(nVidia)公司在1999年发布GeForce256图形处理芯片时首先提出了GPU运算的概念。十几年的发展使单个GPU芯片在浮点运算、大规模并行计算方面,可以提供数十倍乃至上百倍于CPU的性能。GPU的流处理器也由几十个增加到最新的三千多个,浮点运算TFlops值也达到5以上。本书的第十章的深度学习部分专门讲解了GPU运算的Python框架 Theano。
对GPU运算比较熟悉的读者也可以将本书中较大规模的矩阵运算交由GPU完成。
1.2.4  理解数学公式与Numpy矩阵运算
为了便于理解后续章节算法部分的讲解,本节将常用的矩阵数学公式和程序代码对应出来,读者可根据自己需求有选择的学习。因使用矢量编程的方法,矩阵的基本运算得到了较大的简化。
1.矩阵的初始化:
import numpy as np  # 导入numpy包
1.1创建一个3*5的全零矩阵和全1矩阵
myZero = np.zeros([3,5]) # 3*5的全零矩阵
print myZero
myOnes = np.ones([3,5]) # 3*5的全1矩阵
print myOnes
输出结果:
[[ 0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.]]
[[ 1.  1.  1.  1.  1.]
[ 1.  1.  1.  1.  1.]
[ 1.  1.  1.  1.  1.]]
1.2生成随机矩阵:
myRand = np.random.rand(3,4) # 3行4列的0~1之间的随机数矩阵
print myRand
输出结果:
[[ 0.79473503  0.4682515   0.53933591  0.94568244]
[ 0.52199975  0.81190881  0.41920671  0.16756969]
[ 0.57211218  0.53727222  0.83488426  0.30227915]]
1.3单位阵:
myEye = np.eye(3) # 3*3的单位阵
print myEye
输出结果:
[[ 1.  0.  0.]
[ 0.  1.  0.]
[ 0.  0.  1.]]
2.矩阵的元素运算:是指矩阵在元素级别的加、减、乘、除运算
from numpy import *  #导入numpy包
2.1元素相加和相减:条件,矩阵的行数和列数必须相同
数学公式:(A ± B)i,j  Ai,j ± Bi,j,
myOnes = ones([3,3])  # 3*3的全1矩阵
myEye = eye(3)       # 3*3的单位阵
print myOnes+myEye  # 矩阵相加
print myOnes-myEye   # 矩阵相减
输出结果:
[[ 2.  1.  1.]
[ 1.  2.  1.]
[ 1.  1.  2.]]
[[ 0.  1.  1.]
[ 1.  0.  1.]
[ 1.  1.  0.]]
2.2矩阵数乘:一个数乘以一个矩阵
数学公式:(cA)i,j = c • Ai,j.
mymatrix = mat( [[1,2,3],[4,5,6],[7,8,9]])
a = 10
print a*mymatrix
输出结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
2.3矩阵所有元素求和:
数学公式:
mymatrix = mat([[1,2,3],[4,5,6],[7,8,9]] )
print sum(mymatrix)
输出结果:
45
2.4矩阵各元素的积:矩阵的点乘同维对应元素的相乘。当矩阵的维度不相同时,会根据一定的广播规则将维数扩充到一致的形式,
数学公式:(A.*B)ij = Aij* Bij
mymatrix = mat( [[1,2,3],[4,5,6],[7,8,9]])
mymatrix2 = 1.5*ones([3,3])
print multiply(mymatrix,mymatrix2)
输出结果:
[[  1.5   3.    4.5]
[  6.    7.5   9. ]
[ 10.5  12.   13.5]]
2.5 矩阵各元素的n次幂:n=2
数学公式:Aij2 = Aij* Aij
mylist = mat( [[1,2,3],[4,5,6],[7,8,9]])
print power(mymatrix,2)
输出结果:
[[ 1  4  9]
[16 25 36]
[49 64 81]]
4.        矩阵的乘法:矩阵乘矩阵
数学公式:
from numpy import *

mymatrix = mat([[1,2,3],[4,5,6],[7,8,9]])
mymatrix2 = mat([[1],[2],[3]])
print mymatrix*mymatrix2
输出结果:
[[14]
[32]
[50]]
5.        矩阵的转置:
数学公式:(AT)i,j = Aj,i.
from numpy import *

mymatrix = mat([[1,2,3],[4,5,6],[7,8,9]])
print mymatrix.T   # 矩阵的转置
mymatrix.transpose()  # 矩阵的转置
print mymatrix
输出结果:
[[1 4 7]
[2 5 8]
[3 6 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
5. 矩阵的其他操作:行列数、切片、复制、比较
from numpy import *

mymatrix = mat([[1,2,3],[4,5,6],[7,8,9]])
[m,n]=shape(mymatrix)   # 矩阵的行列数
print "矩阵的行数和列数:",m,n

myscl1 = mymatrix[0] # 按行切片
print "按行切片:",myscl1

myscl2 = mymatrix.T[0]  # 按列切片
print "按列切片:",myscl2

mycpmat = mymatrix.copy() # 矩阵的复制
print "复制矩阵:\n",mycpmat

#比较
print "矩阵元素的比较:\n",mymatrix < mymatrix.T
输出结果:
矩阵的行数和列数: 3 3
按行切片: [[1 2 3]]
按列切片: [[1 4 7]]
复制矩阵:
[[1 2 3]
[4 5 6]
[7 8 9]]
矩阵元素的比较:
[[False  True  True]
[False False  True]
[False False False]]
1.2.5  Linalg线性代数库
在矩阵基本运算的基础之上,Numpy的linalg库可以满足大多数的线性代数运算,本节所列的矩阵公式列表和代码如下:
        矩阵的行列式
        矩阵的逆
        矩阵的对称
        矩阵的秩
        可逆矩阵求解线性方程组
读者可根据自己需求有选择的学习。因使用矢量编程的方法,矩阵的基本运算得到了较大的简化。
1.矩阵的行列式:
from numpy import *

# n阶方阵的行列式运算
A = mat( [[1,2,4,5,7,],[9,12,11,8,2,],[6,4,3,2,1,],[9,1,3,4,5],[0,2,3,4,1]])
print "det(A):",linalg.det(A);  # 方阵的行列式
输出结果:
det(A): -812.0
2.矩阵的逆:
from numpy import *

A = mat( [[1,2,4,5,7,],[9,12,11,8,2,],[6,4,3,2,1,],[9,1,3,4,5],[0,2,3,4,1]])
invA = linalg.inv(A) # 矩阵的逆
print "inv(A):",invA
输出结果:
inv(A): [[ -7.14285714e-02  -1.23152709e-02   5.29556650e-02   9.60591133e-02
   -8.62068966e-03]
[  2.14285714e-01  -3.76847291e-01   1.22044335e+00  -4.60591133e-01
    3.36206897e-01]
[ -2.14285714e-01   8.25123153e-01  -2.04802956e+00   5.64039409e-01
   -9.22413793e-01]
[  1.66901077e-16  -4.13793103e-01   8.79310345e-01  -1.72413793e-01
    8.10344828e-01]
[  2.14285714e-01  -6.65024631e-02   1.85960591e-01  -8.12807882e-02
   -1.46551724e-01]]
3.矩阵的对称:
from numpy import *

A = mat([[1,2,4,5,7,],[9,12,11,8,2,],[6,4,3,2,1,],[9,1,3,4,5],[0,2,3,4,1]])
AT = A.T   #矩阵的对称
print A*AT
输出结果:
[[ 95 131  43  78  43]
[131 414 153 168  91]
[ 43 153  66  80  26]
[ 78 168  80 132  32]
[ 43  91  26  32  30]]
4.矩阵的秩:
from numpy import *

A = mat([[1,2,4,5,7,],[9,12,11,8,2,],[6,4,3,2,1,],[9,1,3,4,5],[0,2,3,4,1]])
print linalg.matrix_rank(A)  #矩阵的秩
输出结果:
5
5.可逆矩阵求解:
from numpy import *

A = mat([[1,2,4,5,7,],[9,12,11,8,2,],[6,4,3,2,1,],[9,1,3,4,5],[0,2,3,4,1]])
b = [1,0,1,0,1]
S = linalg.solve(A,T(b))
print S
输出结果:
[-0.0270936   1.77093596 -3.18472906  1.68965517  0.25369458]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2015-12-7 13:25:41 | 显示全部楼层

第一章  机器学习的基础
“基础决定高度,而不是高度决定基础。”
机器学习脱胎于人工智能,自诞生开始,就充满了挑战,这个领域从来都吸引了全世界最顶尖的科学家,本书所讲述的正是他们多年的研究成果。对于普通读者而言,快速而全面的掌握各类算法技术并不是一件容易的事情。机器学习应用的领域方方面面:从交通运输、医疗诊断到自然语言处理等几乎各行各业都有。为了简化,多数书籍都偏重于数学理论,但即便完全形式化为数学概念,不仅不便于理解,所涉及到的知识也很庞杂。毕竟几十年来,机器学习这座大厦是靠一砖一瓦坚实的构筑起来的。
本章是全书的第一章,主要从程序编码、数据结构、数学理论、数据处理与可视化等几个方面阐述了机器学习相关的理论和技术实现。初看涉及内容比较多,为了避免混乱,我们以矩阵为中心贯穿本章各部分的知识讲解,然后扩展到概率论,数值分析,矩阵分析等知识来逐步引导读者进入机器学习的数学世界。
对大多数读者而言,理解数学原理和推导过程起初会存在一些障碍,这也是初学者们的一大壁垒,很多人虽有兴趣,但每到此处只能望而却步。因此,在数学理论方面,我们并没有罗列大量的公式和晦涩的术语,而是力求结合人们的日常生活,通过深入浅出的案例,使读者由浅入深、循序渐进地接触概念,最终真正领悟内涵。对象与维度、初识矩阵、理解随机性等章节完全不需要高等数学的基础,但是它们所阐述的方法和概念是整个机器学习大厦的基础。
而且幸运的是,由于软件编程方法的日新月异,矢量化编程方式(在第二节将详细介绍)能够将数学公式直观的转换为程序代码,这极大降低了程序设计的难度,多数公式的程序代码仅有1~2行。读者可以从Numpy矩阵运算和Linalg线性代数库两节逐步熟悉矢量化编程的风格,各类距离公式是矢量化编程的应用。除程序设计的之外,这两节也可看作是对线性代数中一些重要概念的回顾,如果读者对线性代数的概念生疏了,可以借此重温一下。总体而言,机器学习对程序设计的要求不高,除去矢量化编程,一般而言都是一些最基本的指令,只要掌握一定的编程技术和高等数学的基本概念,学好本书还是不难的。
各类距离公式、矩阵空间变换对于某些读者而言可能属于新知识。本章涉及的距离公式比较多,但总的来讲都不难,本书也都提供了程序代码。矩阵的空间变换是个重点,后续章节中多有涉及,需要读者认真领会。如果理解上有困难,具体算法上我们还会详细讲解。
总之,我们的目标是使程序设计变为一件轻松、快乐的事情。常言道:“千里之行,始于足下”。现在,就让我们开始激动人心的机器学习之旅吧!
1.1  编程语言与开发环境1.1.1  搭建python开发环境
“工欲善其事,必先利其器”,还好Python语言还算锋利,一般具有程序设计基础的读者,几周就可掌握本书中所需的语言技术。因此,书中绝大多数程序代码都使用Python语言编写,原因有以下几点:
q  免费、开源:Python语言是免费开源的脚本语言。这两个词几乎成为流行编程语言必不可少的特征
q  Python编程更简单,相比于编译语言(C,C++)而言,Python是一种跨平台脚本语言,编写好的代码可以直接部署在各类操作系统上(例如,Linux、Windows、MAC OS X);
q  开发和执行效率高,其各种库大多数都是基于C语言编写的(相对于Java而言),并适用于32位和64位系统,性能损失小,适合大规模数据处理;
q  丰富的程序库,支持矢量编程,Python在机器学习和自然语言处理方面提供了完备程序库,包括:机器学习、数学分析、可视化库、GPU并行库等等;
q  Python支持网络编程,写好的代码可以直接发布到Internet上。
Python 开发环境可以搭建在Linux下,也可以搭建在Windows下,可以是32位的,也可以是64位的。这为开发者提供了很大的灵活性。为了便于初学者学习,本书在Windows7下部署64位的Python开发环境,同时在附录中也提供Linux下的部署方式。
Python可在官方网站直接下载本书使用的是2.7-64位版本,所装的库和代码也是以2.7版本为基础的,如果读者使用其他版本,需要做相应的修改。
下面给出在Windows 下简要的安装步骤:
1.双击下载的安装程序:python-2.7.9.amd64.msi,执行安装(如图1.1),如果其他用户不需要python的话,可以使用第二个,不过我们一般都是单用户,所以没差别。
  
图1.1  python安装步骤1
2.选择安装路径,可按默认路径安装,也可自己新建路径,新建路径一般用英文名比较好,方便命令行访问,本书使用的是C:\python64点击Next(如
图1.2)。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.jpg
  
图1.2  python安装步骤2
3.其他界面都一路Next,程序开始复制安装文件,复制完文件后点击finish,完成安装(如图1.3)。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg
  
图1.3  python安装步骤3
该界面出现,指示安装完成。
1.1.2  安装python算法库
最初,Python社区仿照Matlab开发了类似的数学分析库,主要包括 NumPy和SciPy来处理数据,Matplotlib实现数据可视化。大多数Python数学和算法领域的应用都广泛地将其作为基本的程序库。很快,为了适应处理大规模数据的需求,Python在此基础上开发了Scikit-Learn机器学习算法库;同时,还提供了深度学习算法库 Theano,并支持GPU运算。迄今为止,Python已经可以完整地提供基于C/C++的全部机器学习开发包,而且都是开源版的,有兴趣的朋友还可以下载源码包学习。后面的章节将详细讲解这些库的使用,这里就不再赘述了。
除此之外,Python也提供了大量的常用程序库,例如数据库API(MysqlDB)、GUI图形界面库(WxPython)、高并发协程库(gevent)、中文分词库(jieba)等外部库。所有这些库可以从下面两个网址查询到:
q  官方下载地址:

q  非官方下载地址:

最值得称道的是,这些算法库不仅安装非常简便,而且均提供32位和64位两个版本,并分别支持2.6,2.7,3.3,3.4不同版本的Python应用。
安装顺序与步骤:
q  Python算法库的安装非常简单:
执行C:\Python64\Scripts\pipinstall库名(小写字母不加后缀)
q  Python 算法库的安装顺序:
1.      Numpy
2.      Scipy
3.      Matplotlib
4.      Scikit-Learn
上述每个库安装完成后,都会提示如下信息:
Successfullyinstalled xxx(库名)

Cleaningup..
表示此库安装成功。
1.1.3  IDE配置及其安装测试
Python的各类算法库安装完成之后,一般需要选个开发平台(IDE)编写代码。本书的核心内容偏重算法设计,对IDE要求不高,推荐使用Ultraedit高级文本编辑器。主要考虑资源占用较小,功能较强,支持多种文件编码转换,并有支持远程开发等优势(本地可同步远程Linux上的源代码,本地编写,远程上运行)。网上可以下载安装绿色版的软件。下载完成之后,需要进行如下配置:
1.       在点击“高级”选项卡,点开“工具栏配置”(如图1.4):
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg
  
图1.4  配置Ultraedit步骤1
2.       按下图界面输入,并“应用”(如图1.5):
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.jpg
  
图1.5  配置Ultraedit步骤2
3.       按下图界面输入,并点击“确定”(如图1.6):
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image012.jpg
  
图1.6  配置Ultraedit步骤3
这样Ultraedit就算配置完成了。下面我们开始编写一些测试代码。因为安装的模块比较多,简单的Hello World测试不能说明问题, 过于复杂的程序又容易使人费解。为此,我们简单编写一个应用程序用于测试,运行下面的测试代码,可以检验安装的效果。
代码文件mytest1.py:
# -*- coding: utf-8 -*-
# Filename : mytest1.py

import numpy as np          #导入numpy库
from numpy import *          #导入numpy库
import matplotlib.pyplot as plt   # 导入matplotlib库

# 测试数据集-二维list
dataSet = [[-0.017612,14.053064],[-1.395634   ,4.662541],[-0.752157       ,6.538620],[-1.322371       ,7.152853],[0.423363         ,11.054677],[0.406704      ,7.067335],[0.667394        ,12.741452], [-2.460150   ,6.866805],[0.569411        ,9.548755],[-0.026632         ,10.427743],[0.850433      ,6.920334],[1.347183        ,13.175500],[1.176813      ,3.167020],[-1.781871       ,9.097953]]

dataMat = mat(dataSet).T            # 将数据集转换为numpy矩阵,并转置
plt.scatter(dataMat[0],dataMat[1],c='red',marker='o')   # 绘制数据集散点图

# 绘制直线图形
X = np.linspace(-2,2,100) # 产生直线数据集
# 建立线性方程
Y = 2.8*X+9

plt.plot(X,Y) # 绘制直线图
plt.show()   # 显示绘制后的结果
输出结果(如图1.7):
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image014.png
  
图1.7  显示执行结果
说明主要模块安装成功。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2015-12-4 11:10:05 | 显示全部楼层
如果想要电子版请留邮箱,附件太大上传不了。
回复 支持 2 反对 0

使用道具 举报

发表于 2016-3-16 19:10:35 | 显示全部楼层
邮箱2803873907@qq.com,谢谢
回复 支持 反对

使用道具 举报

发表于 2016-3-21 17:13:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-3-23 10:37:40 | 显示全部楼层
554816867@qq.com  谢谢了
回复 支持 反对

使用道具 举报

发表于 2016-3-30 12:31:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-3-30 17:58:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-4-10 22:40:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-4-10 22:40:54 | 显示全部楼层
谢谢!楼主
回复 支持 反对

使用道具 举报

发表于 2016-4-21 14:56:31 | 显示全部楼层
735005214@qq.com   谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2016-4-22 10:51:23 | 显示全部楼层
如果大家有电子档,可否发一下到我邮箱:973073848@qq.com
感谢!
回复 支持 反对

使用道具 举报

发表于 2016-4-22 13:04:32 来自手机 | 显示全部楼层
925949252@qq.com。谢谢了~~
回复 支持 反对

使用道具 举报

发表于 2016-4-30 19:34:47 | 显示全部楼层
也给我传份啦 2891565713@qq.com
回复 支持 反对

使用道具 举报

发表于 2016-5-3 11:30:15 | 显示全部楼层
楼主传一份给我呗,坐标长沙!邮箱:zhangsha1999@163.com。多谢了!
回复 支持 反对

使用道具 举报

发表于 2016-6-4 20:39:37 | 显示全部楼层
找这本书找了很久了,一直找不到完整版,非常感谢楼主的分享,能否邮箱发一份:1076709179@qq.com,感激不尽!
回复 支持 反对

使用道具 举报

发表于 2016-6-8 22:08:00 | 显示全部楼层
1136741748@qq.com  谢楼主!!
回复 支持 反对

使用道具 举报

发表于 2016-6-18 09:17:24 | 显示全部楼层
膜拜下楼主,顺便也发一份给我,谢谢!346780107@qq.com
回复 支持 反对

使用道具 举报

发表于 2016-6-21 18:48:19 | 显示全部楼层
fengbohello@qq.com

谢谢啊^_^
回复 支持 反对

使用道具 举报

发表于 2016-6-23 11:02:49 | 显示全部楼层
BUWENJIUMENG12 发表于 2015-12-7 13:25
第一章  机器学习的基础
“基础决定高度,而不是高度决定基础。”
机器学习脱胎于人工智能,自诞生开始 ...

邮箱2422780637@qq.com,谢谢
回复 支持 反对

使用道具 举报

发表于 2016-7-7 14:06:20 来自手机 | 显示全部楼层
chenxiang221@126.com,谢谢
回复 支持 反对

使用道具 举报

发表于 2016-7-23 09:22:09 | 显示全部楼层
找这本书找了很久了,一直找不到完整版,非常感谢楼主的分享,能否邮箱发一份:437354713@qq.com,感激不尽!
回复 支持 反对

使用道具 举报

发表于 2016-8-13 10:30:40 来自手机 | 显示全部楼层
2029782185@qq.com 谢谢了
回复 支持 反对

使用道具 举报

发表于 2016-9-5 19:59:13 来自手机 | 显示全部楼层
wgq206@163.com  谢谢
回复 支持 反对

使用道具 举报

发表于 2016-9-8 09:21:38 | 显示全部楼层
我想要一份,谢谢啦,楼主~307609546@qq.com
回复 支持 反对

使用道具 举报

发表于 2016-9-9 10:49:34 | 显示全部楼层
527078767@qq.com  谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2016-10-14 15:05:08 | 显示全部楼层
1115668764@qq.com,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2016-10-22 20:51:29 | 显示全部楼层
844154912@qq.com,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2019-10-18 20:07 , Processed in 0.187025 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表