查看原文
其他

21 句话入门机器学习!

泳鱼 算法进阶 2023-10-21


【导读】大家好,我是泳鱼,一个乐于探索和分享AI知识的码农。今天介绍一篇关于机器学习的入门级好文。对于程序员来说,机器学习的重要性毋庸赘言。也许你还没有开始,也许曾经失败过,都没有关系,你将在这里找到或者重拾自信。只要粗通Python,略知NumPy,认真读完这21句话,逐行敲完示例代码,就可以由此进入自由的AI王国。

1

机器学习有四种用途:分类、聚类、回归和降维。更严格一点,机器学习的目的只有三个:分类、聚类和回归,降维不过是达成目标的手段之一。


2

分类和聚类都是对个体样本归类,看起来很相似,实则相去甚远——前者属于有监督的学习,后者属于无监督的学习。

分类是基于经验的,而经验来自过往的数据,这意味着分类需要训练;聚类则是基于当前全部样本的特征,不依赖经验,自然也就无需训练。举个例子:让你从一堆水果中挑出苹果、橘子和香蕉,这是分类;让你将画在纸上的若干个图案分组,分组规则由你决定,这是聚类。


3

从字面上看,分类和回归看上去风马牛不相及,其实二者是亲兄弟,使用的算法几乎完全重合。

分类是对个体样本做出定性判定,回归是对个体样本做出定量判定,二者同属于有监督的学习,都是基于经验的。举个例子:有经验的老师预测某学生考试及格或不及格,这是分类;预测某学生能考多少分,这是回归;不管是预测是否及格还是预测考多少分,老师的经验数据和思考方法是相同的,只是最后的表述不同而已。


4

传统的软件开发,代码是重点,而对于机器学习,数据是重点。

在训练机器学习模型时,数据的质量和数量都会影响训练结果的准确性和有效性。因此,无论是学习还是应用机器学习模型解决问题,前提都是要有足够多且足够好的数据集。


5

数据集通常是指由若干个样本数据组成的二维数组,数组的每一行表示一个样本的数据。

举个例子:用性别、年龄、身高(米)、体重(千克)、职业、年薪(万元)、不动产(万元)、有价证券(万元)等信息组成的一维数组表示一位征婚者的数据,下面的二维数组就是一个婚介机构收集到的征婚者数据集。

>>> import numpy as np>>> members = np.array([ ['男', '25', 185, 80, '程序员', 35, 200, 30], ['女', '23', 170, 55, '公务员', 15, 0, 80], ['男', '30', 180, 82, '律师', 60, 260, 300], ['女', '27', 168, 52, '记者', 20, 180, 150]])
6

数据集的列,也被成为特征维或特征列。

上面的征婚者数据集共有性别、年龄、身高(米)、体重(千克)、职业、年薪(万元)、不动产(万元)、有价证券(万元)等8列,也可以说这个数据集有8个特征维或特征列。


7

所谓降维,并非是将数据集从二维变成一维,而是减少数据集的特征维。

征婚者的个人信息远不止上面所列出的这8项,还可以加上生日、业余爱好、喜欢的颜色、爱吃的食物等等。不过,要是将所有的个人信息都加入到数据集中,不但会增加数据保存和处理的难度和成本,对于择偶者来说,也会因为信息量太多而分散了注意力,以至于忽略了最重要的信息。降维就是从数据集中剔除对结果无影响或影响甚微的特征列。


8

标准化是对样本集的每个特征列减去该特征列的平均值进行中心化,再除以标准差进行缩放。

满分为100分的考试中,你如果得了90分,这自然是一个好成绩。不过要是和其他同学比的话,就未必是了:假如其他同学都是满分,那90分就是最差的一个。数据标准化的意义在于反映个体数据偏离所有样本平均值的程度。下面是对征婚者数据集中有价证券特征列标准化后的结果。

>>> security = np.float32((members[:,-1])) # 提取有价证券特征列数据>>> securityarray([ 30., 80., 300., 150.], dtype=float32)>>> (security - security.mean())/security.std() # 减去均值再除以标准差array([-1.081241, -0.5897678, 1.5727142, 0.09829464], dtype=float32)

9
归一化是对样本集的每个特征列减去该特征列的最小值进行中心化,再除以极差(最大值最小值之差)进行缩放。

归一化处理类似于标准化,结果收敛于[0,1]区间内。下面是对征婚者数据集中有价证券特征列归一化后的结果。

>>> security = np.float32((members[:,-1])) # 提取有价证券特征列数据>>> securityarray([ 30., 80., 300., 150.], dtype=float32)>>> (security - security.min())/(security.max() - security.min()) # 减去最小值再除以极差array([0., 0.18518518, 1., 0.44444445], dtype=float32)


10

机器学习模型只能处理数值数据,因此需要将性别、职业等非数值数据变成整数,这个过程被称为特征编码。

征婚者数据集中,对于性别特征列,可以用0表示女性,用1表示男性,或者反过来也没有问题。不过这个方法不适用于职业特征列的编码,因为不同职业之间原本是无序的,如果用这个方法编码,就会产生2比1更接近3的问题。此时通行的做法是使用独热码(one-of-K):若有n个不同的职业,就用n位二进制数字表示,每个数字只有1位为1其余为0。此时,职业特征列将从1个扩展为n个。下面使用Scikit-learn的独热码编码器对性别和职业两列做特征编码,生成6个特征列(性别2列,职业4列)。该编码器位于preprocessing子模块中。

>>> from sklearn import preprocessing as pp>>> X = [ ['男', '程序员'], ['女', '公务员'], ['男', '律师', ], ['女', '记者', ]]>>> ohe = pp.OneHotEncoder().fit(X)>>> ohe.transform(X).toarray()array([[0., 1., 0., 0., 1., 0.], [1., 0., 1., 0., 0., 0.], [0., 1., 0., 1., 0., 0.], [1., 0., 0., 0., 0., 1.]])

11

Scikit-learn的数据集子模块datasets提供了若干数据集:函数名以load 开头的是模块内置的小型数据集;函数名以fetch开头,是需要从外部数据源下载的大型数据集。

datasets.load_boston([return_X_y]) :加载波士顿房价数据集datasets.load_breast_cancer([return_X_y]) :加载威斯康星州乳腺癌数据集datasets.load_diabetes([return_X_y]) :加载糖尿病数据集datasets.load_digits([n_class, return_X_y]) :加载数字数据集datasets.load_iris([return_X_y]) :加载鸢尾花数据集。datasets.load_linnerud([return_X_y]) :加载体能训练数据集datasets.load_wine([return_X_y]) :加载葡萄酒数据集datasets.fetch_20newsgroups([data_home, …]) :加载新闻文本分类数据集datasets.fetch_20newsgroups_vectorized([…]) :加载新闻文本向量化数据集datasets.fetch_california_housing([…]) :加载加利福尼亚住房数据集datasets.fetch_covtype([data_home, …]) :加载森林植被数据集datasets.fetch_kddcup99([subset, data_home, …]) :加载网络入侵检测数据集datasets.fetch_lfw_pairs([subset, …]) :加载人脸(成对)数据集datasets.fetch_lfw_people([data_home, …]) :加载人脸(带标签)数据集datasets.fetch_olivetti_faces([data_home, …]) :加载 Olivetti 人脸数据集datasets.fetch_rcv1([data_home, subset, …]):加载路透社英文新闻文本分类数据集datasets.fetch_species_distributions([…]) :加载物种分布数据集

12

每个二维的数据集对应着一个一维的标签集,用于标识每个样本的所属类别或属性值。通常数据集用大写字母X表示,标签集用小写字母y表示。

下面的代码从数据集子模块datasets中提取了鸢尾花数据集——这是用来演示分类模型的最常用的数据集。鸢尾花数据集X共有150个样本,每个样本有4个特征列,分别使花萼的长度和宽度、花瓣的长度和宽度。这些样本共有3种类型,分别用整数0、1、2表示,所有样本的类型标签组成标签集y,这是一个一维数组。

>>> from sklearn.datasets import load_iris>>> X, y = load_iris(return_X_y=True)>>> X.shape # 数据集X有150个样本,4个特征列(150, 4)>>> y.shape # 标签集y的每一个标签和数据集X的每一个样本一一对应(150,)>>> X[0], y[0](array([5.1, 3.5, 1.4, 0.2]), 0)

加载数据时,如果指定return_X_y参数为False(默认值),则可以查看标签的名字。

>>> iris = load_iris()>>> iris.target_names # 查看标签的名字array(['setosa', 'versicolor', 'virginica'], dtype='<U10')>>> X = iris.data>>> y = iris.target

13

模型训练时,通常会将数据集和标签集分成两部分:一部分用于训练,一部分用于测试。

分割数据集是一项非常重要的工作,不同的分割方法对于模型训练的结果有不同的影响。Scikit-learn提供了很多种数据集分割方法,train_test_split是其中最简单的一种,可以根据指定的比例随机抽取测试集。train_test_split函数位于模型选择子模块model_selection中。

>>> from sklearn.datasets import load_iris>>> from sklearn.model_selection import train_test_split as tsplit>>> X, y = load_iris(return_X_y=True)>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1)>>> X_train.shape, X_test.shape((135, 4), (15, 4))>>> y_train.shape, y_test.shape((135,), (15,))

上面的代码按照10%的比例随机从数据集中抽取样本作为测试集,剩余样本作为训练集。分割完成后,训练集有135个样本,测试集有15个样本。


14

近朱者赤,近墨者黑,距离谁最近,就和谁同类——这就是k-近邻分类。

k-近邻分类是最简单、最容易的分类方法。对于待分类的样本,从训练集中找出k个和它距离最近的样本,考察这些样本中哪一个标签最多,就给待分类样本贴上该标签。k值的最佳选择高度依赖数据,较大的k值会抑制噪声的影响,但同时也会使分类界限不明显。通常k值选择不大于20的整数。

>>> from sklearn.datasets import load_iris>>> from sklearn.model_selection import train_test_split as tsplit>>> from sklearn.neighbors import KNeighborsClassifier # 导入k-近邻分类模型>>> X, y = load_iris(return_X_y=True) # 获取鸢尾花数据集,返回样本集和标签集>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1) # 拆分为训练集和测试集>>> m = KNeighborsClassifier(n_neighbors=10) # 模型实例化,n_neighbors参数指定k值,默认k=5>>> m.fit(X_train, y_train) # 模型训练KNeighborsClassifier()>>> m.predict(X_test) # 对测试集分类array([2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 0, 1, 0, 0, 2])>>> y_test # 这是实际的分类情况,上面的预测只错了一个array([2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 0, 1, 0, 0, 2])>>> m.score(X_test, y_test) # 模型测试精度(介于0~1)0.9333333333333333

应用分类模型对15个测试样本分类,结果只有1个是错误的,准确率约为93%。在分类算法中,score是最常用的评估函数,返回分类正确的样本数与测试样本总数之比。


15

一辆开了八年的大切诺基可以卖多少钱?最简单的方法是参考k辆同款车型且使用年限相近的二手车售价的均值——这就是k-近邻回归。

k-近邻算法不仅可以用来解决分类问题,也可以用来解决回归问题。k-近邻回归预测样本的标签由它最近邻标签的均值计算而来。下面的代码以波士顿房价数据集为例,演示了k-近邻回归模型的用法。波士顿房价数据集统计的是20世纪70年代中期波士顿郊区房价的中位数,一共有506条不同的数据,每条数据包含区域的人文环境、自然环境、商业环境、交通状况等13个属性,标签是区域房价的平均值。

>>> from sklearn.datasets import load_boston>>> from sklearn.model_selection import train_test_split as tsplit>>> from sklearn.neighbors import KNeighborsRegressor>>> X, y = load_boston(return_X_y=True) # 加载波士顿房价数据集>>> X.shape, y.shape, y.dtype # 该数据集共有506个样本,13个特征列,标签集为浮点型,适用于回归模型((506, 13), (506,), dtype('float64'))>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.01) # 拆分为训练集和测试集>>> m = KNeighborsRegressor(n_neighbors=10) # 模型实例化,n_neighbors参数指定k值,默认k=5>>> m.fit(X_train, y_train) # 模型训练KNeighborsRegressor(n_neighbors=10)>>> m.predict(X_test) # 预测6个测试样本的房价array([27.15, 31.97, 12.68, 28.52, 20.59, 21.47])>>> y_test # 这是测试样本的实际价格,除了第2个(索引为1)样本偏差较大,其他样本偏差还算差强人意array([29.1, 50. , 12.7, 22.8, 20.4, 21.5])

16

常用的回归模型的评价方法有均方误差、中位数绝对误差和复相关系数等。

评价一个回归结果的优劣,比评价一个分类结果要困难得多——前者需要考虑偏离程度,而后者只考虑对错。常用的回归评价函数是均方误差函数、中位数绝对误差函数和复相关系数函数等,这几个函数均被包含在模型评估指标子模块metrics中。均方误差和中位数绝对误差越小,说明模型精确度越高;复相关系数则相反,越接近1说明模型精确度越高,越接近0说明模型越不可用。

以上一段代码为例,模型评估结果如下。

>>> from sklearn import metrics>>> y_pred = m.predict(X_test)>>> metrics.mean_squared_error(y_test, y_pred) # 均方误差60.27319999999995>>> metrics.median_absolute_error(y_test, y_pred) # 中位数绝对误差1.0700000000000003>>> metrics.r2_score(y_test, y_pred) # 复相关系数0.5612816401629652

复相关系数只有0.56,显然,用k-近邻算法预测波士顿房价不是一个好的选择。下面的代码尝试用决策树算法预测波士顿房价,得到了较好的效果,复相关系数达到0.98,预测房价非常接近实际价格,误差极小。

>>> from sklearn.datasets import load_boston>>> from sklearn.model_selection import train_test_split as tsplit>>> from sklearn.tree import DecisionTreeRegressor>>> X, y = load_boston(return_X_y=True) # 加载波士顿房价数据集>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.01) # 拆分为训练集和测试集>>> m = DecisionTreeRegressor(max_depth=10) # 实例化模型,决策树深度为10>>> m.fit(X, y) # 训练DecisionTreeRegressor(max_depth=10)>>> y_pred = m.predict(X_test) # 预测>>> y_test # 这是测试样本的实际价格,除了第2个(索引为1)样本偏差略大,其他样本偏差较小array([20.4, 21.9, 13.8, 22.4, 13.1, 7. ])>>> y_pred # 这是6个测试样本的预测房价,非常接近实际价格array([20.14, 22.33, 14.34, 22.4, 14.62, 7. ])>>> metrics.r2_score(y_test, y_pred) # 复相关系数0.9848774474870712>>> metrics.mean_squared_error(y_test, y_pred) # 均方误差0.4744784865112032>>> metrics.median_absolute_error(y_test, y_pred) # 中位数绝对误差0.3462962962962983

17

决策树、支持向量机(SVM)、贝叶斯等算法,既可以解决分类问题,也可以解决回归问题。

应用这些算法解决分类和回归问题的流程,与使用k-近邻算法基本相同,不同之处在于不同的算法提供了不同的参数。我们需要仔细阅读算法文档,搞清楚这些参数的含义,选择正确的参数,才有可能得到正确的结果。比如,支持向量机(SVM)的回归模型参数中,比较重要的有kernel参数和C参数。kernel参数用来选择内核算法;C是误差项的惩罚参数,取值一般为10的整数次幂,如 0.001、0.1、1000 等。通常,C值越大,对误差项的惩罚越大,因此训练集测试时准确率就越高,但泛化能力越弱;C值越小,对误差项的惩罚越小,因此容错能力越强,泛化能力也相对越强。

下面的例子以糖尿病数据集为例,演示了支持向量机(SVM)回归模型中不同的C参数对回归结果的影响。糖尿病数据集收集了442 例糖尿病患者的10 个指标(年龄、性别、体重指数、平均血压和6 个血清测量值),标签是一年后疾病进展的定量测值。需要特别指出,糖尿病数据集并不适用于SVM算法,此处仅是为了演示参数选择如何影响训练结果。

>>> from sklearn.datasets import load_diabetes>>> from sklearn.model_selection import train_test_split as tsplit>>> from sklearn.svm import SVR>>> from sklearn import metrics>>> X, y = load_diabetes(return_X_y=True)>>> X.shape, y.shape, y.dtype((442, 10), (442,), dtype('float64'))>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.02)>>> svr_1 = SVR(kernel='rbf', C=0.1) # 实例化SVR模型,rbf核函数,C=0.1>>> svr_2 = SVR(kernel='rbf', C=100) # 实例化SVR模型,rbf核函数,C=100>>> svr_1.fit(X_train, y_train) # 模型训练SVR(C=0.1)>>> svr_2.fit(X_train, y_train) # 模型训练SVR(C=100)>>> z_1 = svr_1.predict(X_test) # 模型预测>>> z_2 = svr_2.predict(X_test) # 模型预测>>> y_test # 这是测试集的实际值array([ 49., 317., 84., 181., 281., 198., 84., 52., 129.])>>> z_1 # 这是C=0.1的预测值,偏差很大array([138.10720127, 142.1545034 , 141.25165838, 142.28652449, 143.19648143, 143.24670732, 137.57932272, 140.51891989, 143.24486911])>>> z_2 # 这是C=100的预测值,偏差明显变小array([ 54.38891948, 264.1433666 , 169.71195204, 177.28782561, 283.65199575, 196.53405477, 61.31486045, 199.30275061, 184.94923477])>>> metrics.mean_squared_error(y_test, z_1) # C=0.01的均方误差8464.946517460194>>> metrics.mean_squared_error(y_test, z_2) # C=100的均方误差3948.37754995066>>> metrics.r2_score(y_test, z_1) # C=0.01的复相关系数0.013199351909129464>>> metrics.r2_score(y_test, z_2) # C=100的复相关系数0.5397181166871942>>> metrics.median_absolute_error(y_test, z_1) # C=0.01的中位数绝对误差57.25165837797314>>> metrics.median_absolute_error(y_test, z_2) # C=100的中位数绝对误差22.68513954888364

18

随机森林是将多棵分类决策树或者回归决策树集成在一起的算法,是机器学习的一个分支——集成学习的方法。

以随机森林分类为例,随机森林包含的每棵决策树都是一个分类模型,对于一个输入样本,每个分类模型都会产生一个分类结果,类似投票表决。随机森林集成了所有的投票分类结果,并将被投票次数最多的类别指定为最终的输出类别。随机森林每颗决策树的训练样本都是随机的,决策树中训练集的特征列也是随机选择确定的。正是因为这两个随机性的存在,使得随机森林不容易陷入过拟合,并且具有很好的抗噪能力。

考虑到随机森林的每一棵决策树中训练集的特征列是随机选择确定的,更适合处理具有多特征列的数据,这里选择 Scikit-learn内置的威斯康星州乳腺癌数据集来演示随机森林分类模型的使用。该数据集有 569 个乳腺癌样本,每个样本包含半径、纹理、周长、面积、是否平滑、是否紧凑、是否凹凸等 30 个特征列。

>>> from sklearn.datasets import load_breast_cancer # 导入数据加载函数>>> from sklearn.tree import DecisionTreeClassifier # 导入随机树>>> from sklearn.ensemble import RandomForestClassifier # 导入随机森林>>> from sklearn.model_selection import cross_val_score # 导入交叉验证>>> ds = load_breast_cancer() # 加载威斯康星州乳腺癌数据集>>> ds.data.shape # 569个乳腺癌样本,每个样本包含30个特征(569, 30)>>> dtc = DecisionTreeClassifier() # 实例化决策树分类模型>>> rfc = RandomForestClassifier() # 实例化随机森林分类模型>>> dtc_scroe = cross_val_score(dtc, ds.data, ds.target, cv=10) # 交叉验证>>> dtc_scroe # 决策树分类模型交叉验证10次的结果array([0.92982456, 0.85964912, 0.92982456, 0.89473684, 0.92982456, 0.89473684, 0.87719298, 0.94736842, 0.92982456, 0.92857143])>>> dtc_scroe.mean() # 决策树分类模型交叉验证10次的平均精度0.9121553884711779>>> rfc_scroe = cross_val_score(rfc, ds.data, ds.target, cv=10) # 交叉验证>>> rfc_scroe # 随机森林分类模型交叉验证10次的结果array([0.98245614, 0.89473684, 0.94736842, 0.94736842, 0.98245614, 0.98245614, 0.94736842, 0.98245614, 0.94736842, 1. ])>>> rfc_scroe.mean()# 随机森林分类模型交叉验证10次的平均精度0.9614035087719298

上面的代码使用了交叉验证法,其原理是将样本分成n份,每次用其中的n-1份作训练集,剩余1份作测试集,训练n次,返回每次的训练结果。结果显示,同样交叉验证10次,96%对91%,随机森林的分类准确率明显高于随机树。


19

基于质心的聚类,无论是k均值聚类还是均值漂移聚类,其局限性都是显而易见的:无法处理细长条、环形或者交叉的不规则的样本分布。

k均值(k-means)聚类通常被视为聚类的“入门算法”,其算法原理非常简单。首先从X数据集中选择k个样本作为质心,然后重复以下两个步骤来更新质心,直到质心不再显著移动为止:第一步将每个样本分配到距离最近的质心,第二步根据每个质心所有样本的平均值来创建新的质心。

基于质心的聚类是通过把样本分离成多个具有相同方差的类的方式来聚集数据的,因此总是希望簇是凸(convex)的和各向同性(isotropic)的,但这并非总是能够得到满足。例如,对细长、环形或交叉等具有不规则形状的簇,其聚类效果不佳。

>>> from sklearn import datasets as dss # 导入样本生成器>>> from sklearn.cluster import KMeans # 从聚类子模块导入聚类模型>>> import matplotlib.pyplot as plt>>> plt.rcParams['font.sans-serif'] = ['FangSong']>>> plt.rcParams['axes.unicode_minus'] = False>>> X_blob, y_blob = dss.make_blobs(n_samples=[300,400,300], n_features=2)>>> X_circle, y_circle = dss.make_circles(n_samples=1000, noise=0.05, factor=0.5)>>> X_moon, y_moon = dss.make_moons(n_samples=1000, noise=0.05)>>> y_blob_pred = KMeans(init='k-means++', n_clusters=3).fit_predict(X_blob)>>> y_circle_pred = KMeans(init='k-means++', n_clusters=2).fit_predict(X_circle)>>> y_moon_pred = KMeans(init='k-means++', n_clusters=2).fit_predict(X_moon)>>> plt.subplot(131)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180AFDECB88>>>> plt.title('团状簇')Text(0.5, 1.0, '团状簇')>>> plt.scatter(X_blob[:,0], X_blob[:,1], c=y_blob_pred)<matplotlib.collections.PathCollection object at 0x00000180C495DF08>>>> plt.subplot(132)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180C493FA08>>>> plt.title('环状簇')Text(0.5, 1.0, '环状簇')>>> plt.scatter(X_circle[:,0], X_circle[:,1], c=y_circle_pred)<matplotlib.collections.PathCollection object at 0x00000180C499B888>>>> plt.subplot(133)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4981188>>>> plt.title('新月簇')Text(0.5, 1.0, '新月簇')>>> plt.scatter(X_moon[:,0], X_moon[:,1], c=y_moon_pred)<matplotlib.collections.PathCollection object at 0x00000180C49DD1C8>>>> plt.show()

上面的代码首先使用样本生成器生成团状簇、环状簇和新月簇,然后使用k均值聚类分别对其实施聚类操作。结果表明,k均值聚类仅适用于团状簇,对于环状簇、新月簇无能为力。聚类的最终效果如下图所示。


20

基于密度的空间聚类具有更好的适应性,可以发现任何形状的簇。

基于密度的空间聚类,全称是基于密度的带噪声的空间聚类应用算法(英文简写为DBSCAN)。该聚类算法将簇视为被低密度区域分隔的高密度区域,这与K均值聚类假设簇总是凸的这一条件完全不同,因此可以发现任何形状的簇。

DBSCAN类是Scikit-learn聚类子模块cluster提供的基于密度的空间聚类算法,该类有两个重要参数eps和min_samples。要理解DBSCAN 类的参数,需要先理解核心样本。如果一个样本的eps距离范围内存在不少于min_sample个样本(包括这个样本),则该样本称为核心样本。可见,参数eps和min_samples 定义了簇的稠密度。

>>> from sklearn import datasets as dss>>> from sklearn.cluster import DBSCAN>>> import matplotlib.pyplot as plt>>> plt.rcParams['font.sans-serif'] = ['FangSong']>>> plt.rcParams['axes.unicode_minus'] = False>>> X, y = dss.make_moons(n_samples=1000, noise=0.05)>>> dbs_1 = DBSCAN() # 默认核心样本半径0.5,核心样本邻居5个>>> dbs_2 = DBSCAN(eps=0.2) # 核心样本半径0.2,核心样本邻居5个>>> dbs_3 = DBSCAN(eps=0.1) # 核心样本半径0.1,核心样本邻居5个>>> dbs_1.fit(X)DBSCAN(algorithm='auto', eps=0.5, leaf_size=30, metric='euclidean', metric_params=None, min_samples=5, n_jobs=None, p=None)>>> dbs_2.fit(X)DBSCAN(algorithm='auto', eps=0.2, leaf_size=30, metric='euclidean', metric_params=None, min_samples=5, n_jobs=None, p=None)>>> dbs_3.fit(X)DBSCAN(algorithm='auto', eps=0.1, leaf_size=30, metric='euclidean', metric_params=None, min_samples=5, n_jobs=None, p=None)>>> plt.subplot(131)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4C5D708>>>> plt.title('eps=0.5')Text(0.5, 1.0, 'eps=0.5')>>> plt.scatter(X[:,0], X[:,1], c=dbs_1.labels_)<matplotlib.collections.PathCollection object at 0x00000180C4C46348>>>> plt.subplot(132)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4C462C8>>>> plt.title('eps=0.2')Text(0.5, 1.0, 'eps=0.2')>>> plt.scatter(X[:,0], X[:,1], c=dbs_2.labels_)<matplotlib.collections.PathCollection object at 0x00000180C49FC8C8>>>> plt.subplot(133)<matplotlib.axes._subplots.AxesSubplot object at 0x00000180C49FCC08>>>> plt.title('eps=0.1')Text(0.5, 1.0, 'eps=0.1')>>> plt.scatter(X[:,0], X[:,1], c=dbs_3.labels_)<matplotlib.collections.PathCollection object at 0x00000180C49FC4C8>>>> plt.show()

以上代码使用DBSCAN,配合适当的参数,最终将新月数据集的上弦月和下弦月分开,效果如下图所示。


21

主成分分析(PCA)是一种统计方法,也是最常用的降维方法。

主成分分析通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。显然,主成分分析的降维并不是简单地丢掉一些特征,而是通过正交变换,把具有相关性的高维变量合并为线性无关的低维变量,从而达到降维的目的。

以下代码以鸢尾花数据集为例演示了如何使用 PCA 类来实现主成分分析和降维。已知鸢尾花数据集有 4 个特征列,分别是花萼的长度、宽度和花瓣的长度、宽度。

>>> from sklearn import datasets as dss>>> from sklearn.decomposition import PCA>>> ds = dss.load_iris()>>> ds.data.shape # 150个样本,4个特征维(150, 4)>>> m = PCA() # 使用默认参数实例化PCA类,n_components=None>>> m.fit(ds.data)PCA(copy=True, iterated_power='auto', n_components=None, random_state=None, svd_solver='auto', tol=0.0, whiten=False)>>> m.explained_variance_ # 正交变换后各成分的方差值array([4.22824171, 0.24267075, 0.0782095 , 0.02383509])>>> m.explained_variance_ratio_ # 正交变换后各成分的方差值占总方差值的比例array([0.92461872, 0.05306648, 0.01710261, 0.00521218])

对鸢尾花数据集的主成分分析结果显示:存在一个明显的成分,其方差值占总方差值的比例超过92% ;存在一个方差值很小的成分,其方差值占总方差值的比例只有0.52% ;前两个成分贡献的方差占比超过97.7%,数据集特征列可以从4个降至2个而不至于损失太多有效信息。

>>> m = PCA(n_components=0.97)>>> m.fit(ds.data)PCA(copy=True, iterated_power='auto', n_components=0.97, random_state=None, svd_solver='auto', tol=0.0, whiten=False)>>> m.explained_variance_array([4.22824171, 0.24267075])>>> m.explained_variance_ratio_array([0.92461872, 0.05306648])>>> d = m.transform(ds.data)>>> d.shape(150, 2)

指定参数n_components不小于0.97,即可得到原数据集的降维结果:同样是150个样本,但特征列只有2个。若将2个特征列视为平面直角坐标系中的x和y坐标,就可以直观地画出全部样本数据。

>>> import matplotlib.pyplot as plt>>> plt.scatter(d[:,0], d[:,1], c=ds.target)<matplotlib.collections.PathCollection object at 0x0000016FBF243CC8>>>> plt.show()

下图显示只用2个特征维也基本可以分辨出鸢尾花的3种类型。

作者 | 天元浪子
责编 | 欧阳姝黎

出品 | CSDN博客

更多精彩内容请点击:机器学习文章精选!

书籍推荐(粉丝限时优惠20元)👇

深度学习是机器学习方法的重要组成,今天推荐李沐大神等人编写的一本Python深度学习的书籍《动手学深度学习》,本书同时覆盖深度学习的方法和实践,主要面向在校大学生、技术人员和研究人员。书中不仅阐述深度学习的算法原理,还演示它们的实现和运行。

更令人暖心的是,这本书不要求读者有任何深度学习或者机器学习的背景知识,书中会从头开始解释每一个概念。读者只需了解基础的数学和编程,如基础的线性代数、微分和概率,以及基础的Python编程,就可以愉快地开始啃这本书了。

书籍目录

第1 章 深度学习简介… ………………… 1
1.1 起源…………………………………………… 2
1.2 发展…………………………………………… 4
1.3 成功案例……………………………………… 6
1.4 特点………………………………………… 7
小结…………………………………………… 8
练习…………………………………………… 8
第2 章 预备知识… ……………………… 9
2.1 获取和运行本书的代码……………………… 9
2.1.1 获取代码并安装运行环境 … ……… 9
2.1.2 更新代码和运行环境 … …………… 11
2.1.3 使用GPU版的MXNet … ………… 11
小结……………………………………………12
练习……………………………………………12
2.2 数据操作… ……………………………… 12
2.2.1 创建NDArray ………………………12
2.2.2 运算 …………………………………14
2.2.3 广播机制 ……………………………16
2.2.4 索引 …………………………………17
2.2.5 运算的内存开销 ……………………17
2.2.6 NDArray和NumPy相互变换………18
小结……………………………………………19
练习……………………………………………19
2.3 自动求梯度… …………………………… 19
2.3.1 简单例子 … …………………………19
2.3.2 训练模式和预测模式 …………… 20
2.3.3 对Python控制流求梯度 … …… 20
小结……………………………………………21
练习……………………………………………21
2.4 查阅文档… ……………………………… 21
2.4.1 查找模块里的所有函数和类 … ……21
2.4.2 查找特定函数和类的使用 ……… 22
2.4.3 在MXNet网站上查阅 …………… 23
小结………………………………………… 24
练习………………………………………… 24
第3 章 深度学习基础… ……………… 25
3.1 线性回归…………………………………… 25
3.1.1 线性回归的基本要素 … ………… 25
3.1.2 线性回归的表示方法 … ………… 28
小结………………………………………… 30
练习………………………………………… 30
3.2 线性回归的从零开始实现… …………… 30
3.2.1 生成数据集 … …………………… 30
3.2.2 读取数据集 ……………………… 32
3.2.3 初始化模型参数 ………………… 32
3.2.4 定义模型 ………………………… 33
3.2.5 定义损失函数 …………………… 33
3.2.6 定义优化算法 …………………… 33
3.2.7 训练模型 ………………………… 33
小结………………………………………… 34
练习………………………………………… 34
3.3 线性回归的简洁实现… ………………… 35
3.3.1 生成数据集 … …………………… 35
3.3.2 读取数据集 ……………………… 35
3.3.3 定义模型 ………………………… 36
3.3.4 初始化模型参数 ………………… 36
3.3.5 定义损失函数 …………………… 37
3.3.6 定义优化算法 …………………… 37
3.3.7 训练模型 ………………………… 37
小结………………………………………… 38
练习………………………………………… 38
3.4 softmax回归… ………………………… 38
3.4.1 分类问题 … ……………………… 38
3.4.2 softmax回归模型… …………… 39
3.4.3 单样本分类的矢量计算表达式…… 40
3.4.4 小批量样本分类的矢量计算表达式 …………………………… 40
3.4.5 交叉熵损失函数 ……………………41
3.4.6 模型预测及评价 ………………… 42
小结………………………………………… 42
练习………………………………………… 42
3.5 图像分类数据集(Fashion-MNIST)… ……………… 42
3.5.1 获取数据集 … …………………… 42
3.5.2 读取小批量 ……………………… 44
小结………………………………………… 45
练习………………………………………… 45
3.6 softmax回归的从零开始实现… ……… 45
3.6.1 读取数据集 … …………………… 45
3.6.2 初始化模型参数 ………………… 45
3.6.3 实现softmax运算 … …………… 46
3.6.4 定义模型 ………………………… 46
3.6.5 定义损失函数 …………………… 47
3.6.6 计算分类准确率 ………………… 47
3.6.7 训练模型 ………………………… 48
3.6.8 预测… …………………………… 48
小结………………………………………… 49
练习………………………………………… 49
3.7 softmax回归的简洁实现… …………… 49
3.7.1 读取数据集 … …………………… 49
3.7.2 定义和初始化模型 ……………… 50
3.7.3 softmax和交叉熵损失函数 … … 50
3.7.4 定义优化算法 …………………… 50
3.7.5 训练模型 ………………………… 50
小结………………………………………… 50
练习………………………………………… 50
3.8 多层感知机… …………………………… 51
3.8.1 隐藏层 … ……………………………51
3.8.2 激活函数 ………………………… 52
3.8.3 多层感知机 ……………………… 55
小结………………………………………… 55
练习………………………………………… 55
3.9 多层感知机的从零开始实现… ………… 56
3.9.1 读取数据集 … …………………… 56
3.9.2 定义模型参数 …………………… 56
3.9.3 定义激活函数 …………………… 56
3.9.4 定义模型 ………………………… 56
3.9.5 定义损失函数 …………………… 57
3.9.6 训练模型 ………………………… 57
小结………………………………………… 57
练习………………………………………… 57
3.10 多层感知机的简洁实现………………… 57
3.10.1 定义模型 ………………………… 58
3.10.2 训练模型 … …………………… 58
小结………………………………………… 58
练习………………………………………… 58
3.11 模型选择、欠拟合和过拟合… ………… 58
3.11.1 训练误差和泛化误差 …………… 59
3.11.2 模型选择 ………………………… 59
3.11.3 欠拟合和过拟合 ………………… 60
3.11.4 多项式函数拟合实验 ……………61
小结………………………………………… 65
练习………………………………………… 65
3.12 权重衰减………………………………… 65
3.12.1 方法 ……………………………… 65
3.12.2 高维线性回归实验 … ………… 66
3.12.3 从零开始实现 … ……………… 66
3.12.4 简洁实现 … …………………… 68
小结………………………………………… 70
练习………………………………………… 70
3.13 丢弃法…………………………………… 70
3.13.1 方法 ……………………………… 70
3.13.2 从零开始实现 … …………………71
3.13.3 简洁实现 … …………………… 73
小结………………………………………… 74
练习………………………………………… 74
3.14 正向传播、反向传播和计算图………… 74
3.14.1 正向传播 ……………………… 74
3.14.2 正向传播的计算图 … ………… 75
3.14.3 反向传播 … …………………… 75
3.14.4 训练深度学习模型 … ………… 76
小结………………………………………… 77
练习………………………………………… 77
3.15 数值稳定性和模型初始化……………… 77
3.15.1 衰减和爆炸 ……………………… 77
3.15.2 随机初始化模型参数 … ……… 78
小结………………………………………… 78
练习………………………………………… 79
3.16 实战Kaggle比赛:房价预测… ……… 79
3.16.1 Kaggle比赛 … ………………… 79
3.16.2 读取数据集 … ………………… 80
3.16.3 预处理数据集 … …………………81
3.16.4 训练模型 … …………………… 82
3.16.5 k 折交叉验证 …………………… 82
3.16.6 模型选择 … …………………… 83
3.16.7 预测并在Kaggle提交结果… … 84
小结………………………………………… 85
练习………………………………………… 85
第4 章 深度学习计算… ……………… 86
4.1 模型构造………………………………… 86
4.1.1 继承Block类来构造模型 … …… 86
4.1.2 Sequential类继承自Block类…………………………… 87
4.1.3 构造复杂的模型… ……………… 88
小结………………………………………… 89
练习………………………………………… 90
4.2 模型参数的访问、初始化和共享… …… 90
4.2.1 访问模型参数 … ………………… 90
4.2.2 初始化模型参数 ………………… 92
4.2.3 自定义初始化方法 ……………… 93
4.2.4 共享模型参数 …………………… 94
小结………………………………………… 94
练习………………………………………… 94
4.3 模型参数的延后初始化… ……………… 95
4.3.1 延后初始化 … …………………… 95
4.3.2 避免延后初始化 ………………… 96
小结………………………………………… 96
练习………………………………………… 97
4.4 自定义层… ……………………………… 97
4.4.1 不含模型参数的自定义层 … …… 97
4.4.2 含模型参数的自定义层 ………… 98
小结………………………………………… 99
练习………………………………………… 99
4.5 读取和存储… …………………………… 99
4.5.1 读写NDArray… ………………… 99
4.5.2 读写Gluon模型的参数… ……… 100
小结………………………………………… 101
练习………………………………………… 101
4.6 GPU计算………………………………… 101
4.6.1 计算设备 … ……………………… 102
4.6.2 NDArray的GPU计算…………… 102
4.6.3 Gluon的GPU计算 ……………… 104
小结………………………………………… 105
练习………………………………………… 105
第5 章 卷积神经网络… ……………… 106
5.1 二维卷积层………………………………… 106
5.1.1 二维互相关运算 … ……………… 106
5.1.2 二维卷积层 … …………………… 107
5.1.3 图像中物体边缘检测 … ………… 108
5.1.4 通过数据学习核数组 … ………… 109
5.1.5 互相关运算和卷积运算 … ……… 109
5.1.6 特征图和感受野… ……………… 110
小结………………………………………… 110
练习………………………………………… 110
5.2 填充和步幅… …………………………… 111
5.2.1 填充 … …………………………… 111
5.2.2 步幅 ……………………………… 112
小结………………………………………… 113
练习………………………………………… 113
5.3 多输入通道和多输出通道… …………… 114
5.3.1 多输入通道 … …………………… 114
5.3.2 多输出通道… …………………… 115
5.3.3 1×1卷积层 ……………………… 116
小结………………………………………… 117
练习………………………………………… 117
5.4 池化层… ………………………………… 117
5.4.1 二维最大池化层和平均池化层 … ………………………… 117
5.4.2 填充和步幅 ……………………… 119
5.4.3 多通道 …………………………… 120
小结………………………………………… 120
练习………………………………………… 121
5.5 卷积神经网络(LeNet)… …………… 121
5.5.1 LeNet模型 … …………………… 121
5.5.2 训练模型… ……………………… 122
小结………………………………………… 124
练习………………………………………… 124
5.6 深度卷积神经网络(AlexNet)… …… 124
5.6.1 学习特征表示 … ………………… 125
5.6.2 AlexNet… ……………………… 126
5.6.3 读取数据集 ……………………… 127
5.6.4 训练模型 ………………………… 128
小结………………………………………… 128
练习………………………………………… 129
5.7 使用重复元素的网络(VGG)………… 129
5.7.1 VGG块 …………………………… 129
5.7.2 VGG网络 … …………………… 129
5.7.3 训练模型… ……………………… 130
小结………………………………………… 131
练习………………………………………… 131
5.8 网络中的网络(NiN)… ……………… 131
5.8.1 NiN块 … ………………………… 131
5.8.2 NiN模型 … ……………………… 132
5.8.3 训练模型… ……………………… 133
小结………………………………………… 134
练习………………………………………… 134
5.9 含并行连结的网络(GoogLeNet)…… 134
5.9.1 Inception块 ……………………… 134
5.9.2 GoogLeNet模型 … …………… 135
5.9.3 训练模型 ………………………… 137
小结………………………………………… 137
练习………………………………………… 137
5.10 批量归一化……………………………… 138
5.10.1 批量归一化层 ………………… 138
5.10.2 从零开始实现 … ……………… 139
5.10.3 使用批量归一化层的LeNet … … 140
5.10.4 简洁实现 … …………………… 141
小结………………………………………… 142
练习………………………………………… 142
5.11 残差网络(ResNet) ……………… 143
5.11.1 残差块 …………………………… 143
5.11.2 ResNet模型… ………………… 145
5.11.3 训练模型………………………… 146
小结………………………………………… 146
练习………………………………………… 146
5.12 稠密连接网络(DenseNet)………… 147
5.12.1 稠密块 …………………………… 147
5.12.2 过渡层 … ……………………… 148
5.12.3 DenseNet模型 ………………… 148
5.12.4 训练模型 … …………………… 149
小结………………………………………… 149
练习………………………………………… 149
第6 章 循环神经网络… ……………… 150
6.1 语言模型………………………………… 150
6.1.1 语言模型的计算 … ……………… 151
6.1.2 n 元语法 … ……………………… 151
小结………………………………………… 152
练习………………………………………… 152
6.2 循环神经网络… ………………………… 152
6.2.1 不含隐藏状态的神经网络 … …… 152
6.2.2 含隐藏状态的循环神经网络… … 152
6.2.3 应用:基于字符级循环神经网络的语言模型 … ……………………… 154
小结………………………………………… 155
练习………………………………………… 155
6.3 语言模型数据集(歌词)…… 155
6.3.1 读取数据集 … …………………… 155
6.3.2 建立字符索引 …………………… 156
6.3.3 时序数据的采样 ………………… 156
小结………………………………………… 158
练习………………………………………… 159
6.4 循环神经网络的从零开始实现… ……… 159
6.4.1 one-hot向量 … ………………… 159
6.4.2 初始化模型参数 ………………… 160
6.4.3 定义模型 ………………………… 160
6.4.4 定义预测函数 …………………… 161
6.4.5 裁剪梯度 ………………………… 161
6.4.6 困惑度 …………………………… 162
6.4.7 定义模型训练函数 ……………… 162
6.4.8 训练模型并创作歌词 …………… 163
小结………………………………………… 164
练习………………………………………… 164
6.5 循环神经网络的简洁实现… …………… 165
6.5.1 定义模型 … ……………………… 165
6.5.2 训练模型 ………………………… 166
小结………………………………………… 168
练习………………………………………… 168
6.6 通过时间反向传播… …………………… 168
6.6.1 定义模型 … ……………………… 168
6.6.2 模型计算图 ……………………… 169
6.6.3 方法 ……………………………… 169
小结………………………………………… 170
练习………………………………………… 170
6.7 门控循环单元(GRU)………………… 170
6.7.1 门控循环单元 … ………………… 171
6.7.2 读取数据集 ……………………… 173
6.7.3 从零开始实现 …………………… 173
6.7.4 简洁实现 ………………………… 175
小结………………………………………… 176
练习………………………………………… 176
6.8 长短期记忆(LSTM)… ……………… 176
6.8.1 长短期记忆 … …………………… 176
6.8.2 读取数据集 ……………………… 179
6.8.3 从零开始实现 …………………… 179
6.8.4 简洁实现 ………………………… 181
小结………………………………………… 181
练习………………………………………… 182
6.9 深度循环神经网络… …………………… 182
小结………………………………………… 183
练习………………………………………… 183
6.10 双向循环神经网络……………………… 183
小结………………………………………… 184
练习………………………………………… 184
第7 章 优化算法… …………………… 185
7.1 优化与深度学习…………………………… 185
7.1.1 优化与深度学习的关系 … ……… 185
7.1.2 优化在深度学习中的挑战 … …… 186
小结………………………………………… 188
练习………………………………………… 189
7.2 梯度下降和随机梯度下降… …………… 189
7.2.1 一维梯度下降 … ………………… 189
7.2.2 学习率 …………………………… 190
7.2.3 多维梯度下降 …………………… 191
7.2.4 随机梯度下降 …………………… 193
小结………………………………………… 194
练习………………………………………… 194
7.3 小批量随机梯度下降… ………………… 194
7.3.1 读取数据集 … …………………… 195
7.3.2 从零开始实现 …………………… 196
7.3.3 简洁实现 ………………………… 198
小结………………………………………… 199
练习………………………………………… 199
7.4 动量法… …………………………………200
7.4.1 梯度下降的问题 … ……………… 200
7.4.2 动量法 …………………………… 201
·6· 目  录
7.4.3 从零开始实现 …………………… 203
7.4.4 简洁实现 ………………………… 205
小结………………………………………… 205
练习………………………………………… 205
7.5 AdaGrad算法……………………………206
7.5.1 算法 … …………………………… 206
7.5.2 特点 ……………………………… 206
7.5.3 从零开始实现 …………………… 208
7.5.4 简洁实现 ………………………… 209
小结………………………………………… 209
练习………………………………………… 209
7.6 RMSProp算法… ………………………209
7.6.1 算法 … …………………………… 210
7.6.2 从零开始实现 …………………… 211
7.6.3 简洁实现 ………………………… 212
小结………………………………………… 212
练习………………………………………… 212
7.7 AdaDelta算法… ……………………… 212
7.7.1 算法… …………………………… 212
7.7.2 从零开始实现 …………………… 213
7.7.3 简洁实现 ………………………… 214
小结………………………………………… 214
练习………………………………………… 214
7.8 Adam算法… …………………………… 215
7.8.1 算法 … …………………………… 215
7.8.2 从零开始实现 …………………… 216
7.8.3 简洁实现 ………………………… 216
小结………………………………………… 217
练习………………………………………… 217
第8 章 计算性能… …………………… 218
8.1 命令式和符号式混合编程… …………… 218
8.1.1 混合式编程取两者之长 … ……… 220
8.1.2 使用HybridSequential类构造模型 … …………………………… 220
8.1.3 使用HybridBlock类构造模型… …………………………… 222
小结………………………………………… 224
练习………………………………………… 224
8.2 异步计算… ………………………………224
8.2.1 MXNet中的异步计算 …………… 224
8.2.2 用同步函数让前端等待计算结果 … …………………………… 226
8.2.3 使用异步计算提升计算性能 …… 226
8.2.4 异步计算对内存的影响 ………… 227
小结………………………………………… 229
练习………………………………………… 229
8.3 自动并行计算… …………………………229
8.3.1 CPU和GPU的并行计算 … …… 230
8.3.2 计算和通信的并行计算 ………… 231
小结………………………………………… 231
练习………………………………………… 231
8.4 多GPU计算……………………………… 232
8.4.1 数据并行 … ……………………… 232
8.4.2 定义模型 ………………………… 233
8.4.3 多GPU之间同步数据 … ……… 234
8.4.4 单个小批量上的多GPU训练 … …………………………… 236
8.4.5 定义训练函数 …………………… 236
8.4.6 多GPU训练实验 … …………… 237
小结………………………………………… 237
练习………………………………………… 237
8.5 多GPU计算的简洁实现………………… 237
8.5.1 多GPU上初始化模型参数……… 238
8.5.2 多GPU训练模型 … …………… 239
小结………………………………………… 241
练习………………………………………… 241
第9 章 计算机视觉… ………………… 242
9.1 图像增广…………………………………242
9.1.1 常用的图像增广方法 … ………… 243
9.1.2 使用图像增广训练模型 … ……… 246
小结………………………………………… 250
练习………………………………………… 250
9.2 微调… ……………………………………250
热狗识别 … ……………………………… 251
小结………………………………………… 255
练习………………………………………… 255
目  录 ·7·
9.3 目标检测和边界框… ……………………255
边界框 … ………………………………… 256
小结………………………………………… 257
练习………………………………………… 257
9.4 锚框… …………………………………… 257
9.4.1 生成多个锚框… ………………… 257
9.4.2 交并比 …………………………… 259
9.4.3 标注训练集的锚框 ……………… 260
9.4.4 输出预测边界框… ……………… 263
小结………………………………………… 265
练习………………………………………… 265
9.5 多尺度目标检测… ………………………265
小结………………………………………… 268
练习………………………………………… 268
9.6 目标检测数据集(皮卡丘)… …………268
9.6.1 获取数据集 … …………………… 269
9.6.2 读取数据集… …………………… 269
9.6.3 图示数据 ………………………… 270
小结………………………………………… 270
练习………………………………………… 271
9.7 单发多框检测(SSD)… ……………… 271
9.7.1 定义模型… ……………………… 271
9.7.2 训练模型 ………………………… 275
9.7.3 预测目标 ………………………… 277
小结………………………………………… 278
练习………………………………………… 278
9.8 区域卷积神经网络(R-CNN)系列……280
9.8.1 R-CNN … ……………………… 280
9.8.2 Fast R-CNN …………………… 281
9.8.3 Faster R-CNN ………………… 283
9.8.4 Mask R-CNN … ……………… 284
小结………………………………………… 285
练习………………………………………… 285
9.9 语义分割和数据集… ……………………285
9.9.1 图像分割和实例分割 … ………… 285
9.9.2 Pascal VOC2012语义分割数据集 … ………………………… 286
小结………………………………………… 290
练习………………………………………… 290
9.10 全卷积网络(FCN)… ………………290
9.10.1 转置卷积层 …………………… 291
9.10.2 构造模型 … …………………… 292
9.10.3 初始化转置卷积层……………… 294
9.10.4 读取数据集 … ………………… 295
9.10.5 训练模型………………………… 296
9.10.6 预测像素类别…………………… 296
小结………………………………………… 297
练习………………………………………… 297
9.11 样式迁移… ………………………………298
9.11.1 方法 ……………………………… 298
9.11.2 读取内容图像和样式图像……… 299
9.11.3 预处理和后处理图像 ………… 300
9.11.4 抽取特征 ……………………… 301
9.11.5 定义损失函数 ………………… 302
9.11.6 创建和初始化合成图像 ……… 303
9.11.7 训练模型………………………… 304
小结………………………………………… 306
练习………………………………………… 306
9.12 实战Kaggle比赛:图像
分类(CIFAR-10)……………………306
9.12.1 获取和整理数据集 ……………… 307
9.12.2 图像增广 … …………………… 310
9.12.3 读取数据集 … ………………… 310
9.12.4 定义模型………………………… 311
9.12.5 定义训练函数 … ……………… 312
9.12.6 训练模型 … …………………… 312
9.12.7 对测试集分类并在Kaggle
提交结果 … …………………… 313
小结………………………………………… 313
练习………………………………………… 313
9.13 实战Kaggle比赛:狗的品种
识别(ImageNet Dogs)…………… 314
9.13.1 获取和整理数据集 …………… 315
9.13.2 图像增广 … …………………… 316
9.13.3 读取数据集 … ………………… 317
9.13.4 定义模型 … …………………… 318
9.13.5 定义训练函数 … ……………… 318
9.13.6 训练模型 … …………………… 319
·8· 目  录
9.13.7 对测试集分类并在Kaggle提交结果 … …………………… 319
小结………………………………………… 320
练习………………………………………… 320
第10 章 自然语言处理………………… 321
10.1 词嵌入(word2vec)………………… 321
10.1.1 为何不采用one-hot向量… …… 321
10.1.2 跳字模型 ………………………… 322
10.1.3 连续词袋模型 …………………… 323
小结………………………………………… 325
练习………………………………………… 325
10.2 近似训练…………………………………325
10.2.1 负采样 …………………………… 325
10.2.2 层序softmax …………………… 326
小结………………………………………… 327
练习………………………………………… 328
10.3 word2vec的实现………………………328
10.3.1 预处理数据集 …………………… 328
10.3.2 负采样 … ……………………… 331
10.3.3 读取数据集 … ………………… 331
10.3.4 跳字模型 … …………………… 332
10.3.5 训练模型 … …………………… 333
10.3.6 应用词嵌入模型 … …………… 335
小结………………………………………… 336
练习………………………………………… 336
10.4 子词嵌入(fastText)… ……………336
小结………………………………………… 337
练习………………………………………… 337
10.5 全局向量的词嵌入(GloVe)…………337
10.5.1 GloVe模型 …………………… 338
10.5.2 从条件概率比值理解GloVe模型……………………… 339
小结………………………………………… 340
练习………………………………………… 340
10.6 求近义词和类比词………………………340
10.6.1 使用预训练的词向量 ………… 340
10.6.2 应用预训练词向量 … ………… 341
小结………………………………………… 343
练习………………………………………… 343
10.7 文本情感分类:使用循环神经网络…… 343
10.7.1 文本情感分类数据集 ………… 343
10.7.2 使用循环神经网络的模型……… 345
小结………………………………………… 347
练习………………………………………… 347
10.8 文本情感分类:使用卷积神经网络(textCNN)… …………………347
10.8.1 一维卷积层 … ………………… 348
10.8.2 时序最大池化层 … …………… 349
10.8.3 读取和预处理IMDb数据集 … ……………………… 350
10.8.4 textCNN模型 … ……………… 350
小结………………………………………… 353
练习………………………………………… 353
10.9 编码器-解码器(seq2seq)…………353
10.9.1 编码器 ………………………… 354
10.9.2 解码器 … ……………………… 354
10.9.3 训练模型………………………… 355
小结………………………………………… 355
练习………………………………………… 355
10.10  束搜索… ………………………………355
10.10.1 贪婪搜索 … …………………… 356
10.10.2 穷举搜索 ……………………… 357
10.10.3 束搜索 ………………………… 357
小结………………………………………… 358
练习………………………………………… 358
10.11 注意力机制… …………………………358
10.11.1 计算背景变量 … ……………… 359
10.11.2 更新隐藏状态 … ……………… 360
10.11.3 发展… ………………………… 361
小结………………………………………… 361
练习………………………………………… 361
10.12 机器翻译… …………………………… 361
10.12.1 读取和预处理数据集… ……… 361
10.12.2 含注意力机制的编码器-解码器 … …………… 363
10.12.3 训练模型 ……………………… 365
10.12.4 预测不定长的序列… ………… 367
10.12.5 评价翻译结果 ………………… 367
小结………………………………………… 369
练习………………………………………… 369
附录A 数学基础… …………………… 370
附录B 使用 Jupyter 记事本… ……… 376
附录C 使用 AWS 运行代码…………… 381
附录D GPU 购买指南………………… 388
附录E 如何为本书做贡献… ………… 391
附录F d2lzh 包索引…………………… 395
附录G 中英文术语对照表… ………… 397
参考文献………………………………… 402
索引……………………………………… 407

目录上下滑动☝


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存