本书是一本基于OpenCV和Python的机器学习实战手册,既详细介绍机器学习及OpenCV相关的基础知识,又通过具体实例展示如何使用OpenCV和Python实现各种机器学习算法,并提供大量示列代码,可以帮助你掌握机器学习实用技巧,解决各种不同的机器学习和图像处理问题。
全书共12章,第1章简要介绍机器学习基础知识,并讲解如何安装OpenCV和Python工具;第2章展示经典的机器学习处理流程及OpenCV和Python工具的使用;第3章讨论监督学习算法,以及如何使用OpenCV实现这些算法;第4章讨论数据表示和特征工程,并介绍OpenCV中提供的用于处理图像数据的常见特征提取技术;第5章展示如何使用OpenCV构建决策树进行医疗诊断;第6章讨论如何使用OpenCV构建支持向量机检测行人;第7章介绍概率论,并展示如何使用贝叶斯学习实现垃圾邮件过滤;第8章讨论一些非监督学习算法;第9章详细讲解如何构建深度神经网络来识别手写数字;第10章讨论如何高效地集成多个算法来提升性能;第11章讨论如何比较不同分类器的结果,选择合适的工具;第12章给出一些处理实际机器学习问题的提示和技巧。
封面图
目录
- 译者序
- 序
- 前言
- 审校者简介
- 第1章品味机器学习 1
- 1.1初步了解机器学习 1
- 1.2机器学习可以解决的事情 3
- 1.3初步了解 Python 4
- 1.4初步了解 OpenCV 4
- 1.5安装 5
- 1.5.1获取本书最新的代码 5
- 1.5.2掌握 Python Anaconda 6
- 1.5.3在 conda 环境中安装OpenCV 8
- 1.5.4验证安装结果 9
- 1.5.5一睹 OpenCV ML 模块 11
- 1.6总结 11
- 第2章使用 OpenCV 和 Python处理数据 12
- 2.1理解机器学习流程 12
- 2.2使用 OpenCV 和 Python 处理数据 14
- 2.2.1创建一个新的 IPython 或 Jupyter 会话 15
- 2.2.2使用 Python 的 NumPy包处理数据 16
- 2.2.3在 Python 中载入外部数据集 20
- 2.2.4使用 Matplotlib 进行数据可视化 21
- 2.2.5使用C++ 中 OpenCV 的 TrainData 容器处理数据 26
- 2.3总结 27
- 第3章监督学习的第一步 28
- 3.1理解监督学习 28
- 3.1.1了解 OpenCV 中的监督学习 29
- 3.1.2使用评分函数评估模型性能 30
- 3.2使用分类模型预测类别 35
- 3.2.1理解 k-NN 算法 37
- 3.2.2使用 OpenCV实现 k-NN 37
- 3.3使用回归模型预测连续结果 43
- 3.3.1理解线性回归 43
- 3.3.2使用线性回归预测波士顿房价 44
- 3.3.3应用 Lasso 回归和ridge 回归 48
- 3.4使用逻辑回归对鸢尾花种类进行分类 48
- 3.5总结 53
- 第4数据表示与特征工程 54
- 4.1理解特征工程 54
- 4.2数据预处理 55
- 4.2.1特征标准化 56
- 4.2.2特征归一化 57
- 4.2.3特征缩放到一定的范围 57
- 4.2.4特征二值化 58
- 4.2.5缺失数据处理 58
- 4.3理解降维 59
- 4.3.1在OpenCV 中实现主成分分析 61
- 4.3.2实现独立成分分析 64
- 4.3.3实现非负矩阵分解 65
- 4.4类别变量表示 66
- 4.5文本特征表示 68
- 4.6图像表示 69
- 4.6.1使用色彩空间 69
- 4.6.2图像角点检测 71
- 4.6.3使用尺度不变特征变换 72
- 4.6.4使用加速健壮特征 74
- 4.7总结 75
- 第5章使用决策树进行医疗诊断 76
- 5.1理解决策树 76
- 5.1.1构建第一个决策树 79
- 5.1.2可视化训练得到的决策树 85
- 5.1.3深入了解决策树的内部工作机制 87
- 5.1.4特征重要性评分 88
- 5.1.5理解决策规则 89
- 5.1.6控制决策树的复杂度 90
- 5.2使用决策树进行乳腺癌的诊断 90
- 5.2.1载入数据集 91
- 5.2.2构建决策树 92
- 5.3使用决策树进行回归 96
- 5.4总结 99
- 第6章使用支持向量机检测行人 100
- 6.1理解线性支持向量机 100
- 6.1.1学习最优决策边界 101
- 6.1.2实现我们的第一个支持向量机 102
- 6.2处理非线性决策边界 107
- 6.2.1理解核机制 108
- 6.2.2认识我们的核 109
- 6.2.3实现非线性支持向量机 109
- 6.3自然环境下的行人检测 110
- 6.3.1获取数据集 111
- 6.3.2初窥方向梯度直方图 113
- 6.3.3生成负样本 114
- 6.3.4实现支持向量机 116
- 6.3.5模型自举 116
- 6.3.6在更大的图像中检测行人 118
- 6.3.7进一步优化模型 120
- 6.4总结 121
- 第7章使用贝叶斯学习实现垃圾邮件过滤 122
- 7.1理解贝叶斯推断 122
- 7.1.1概率论的短暂之旅 123
- 7.1.2理解贝叶斯定理 124
- 7.1.3理解朴素贝叶斯分类器 126
- 7.2实现第一个贝叶斯分类器 127
- 7.2.1创建一个练习数据集 127
- 7.2.2使用一个正态贝叶斯分类器对数据分类 128
- 7.2.3使用一个朴素贝叶斯分类器对数据分类 131
- 7.2.4条件概率的可视化 132
- 7.3使用朴素贝叶斯分类器对邮件分类 134
- 7.3.1载入数据集 134
- 7.3.2使用Pandas构建数据矩阵 136
- 7.3.3数据预处理 137
- 7.3.4训练正态贝叶斯分类器 138
- 7.3.5使用完整的数据集进行训练 139
- 7.3.6使用n-gram提升结果 139
- 7.3.7使用TD-IDF提升结果 140
- 7.4总结 141
- 第8章使用非监督学习发现隐藏结构 142
- 8.1理解非监督学习 142
- 8.2理解k均值聚类 143
- 8.3理解期望最大化 145
- 8.3.1实现期望最大化解决方案 146
- 8.3.2了解期望最大化的局限 148
- 8.4使用k均值压缩色彩空间 154
- 8.4.1真彩色调色板的可视化 154
- 8.4.2使用k均值减少调色板 157
- 8.5使用k均值对手写数字分类 159
- 8.5.1载入数据集 159
- 8.5.2运行k均值 159
- 8.6把聚类组织成层次树 161
- 8.6.1理解层次聚类 161
- 8.6.2实现凝聚层次聚类 162
- 8.7总结 163
- 第9章使用深度学习对手写数字分类 164
- 9.1理解McCulloch-Pitts神经元 164
- 9.2理解感知器 167
- 9.3实现第一个感知器 169
- 9.3.1生成练习数据集 170
- 9.3.2使用数据拟合感知器 171
- 9.3.3评估感知器分类器 171
- 9.3.4把感知器应用到线性不可分的数据上 173
- 9.4理解多层感知器 174
- 9.4.1理解梯度下降 175
- 9.4.2使用反向传播训练多层感知器 178
- 9.4.3在OpenCV中实现多层感知器 179
- 9.5了解深度学习 183
- 9.6手写数字分类 186
- 9.6.1载入MNIST数据集 187
- 9.6.2MNIST数据集预处理 188
- 9.6.3使用OpenCV训练一个MLP 189
- 9.6.4使用Keras训练一个深度神经网络 190
- 9.7总结 192
- 第10章组合不同算法为一个整体 193
- 10.1理解集成方法 193
- 10.1.1理解平均集成 195
- 10.1.2理解提升集成 197
- 10.1.3理解堆叠集成 200
- 10.2组合决策树为随机森林 200
- 10.2.1理解决策树的不足 200
- 10.2.2实现第一个随机森林 204
- 10.2.3使用scikit-learn实现一个随机森林 205
- 10.2.4实现极端随机树 206
- 10.3使用随机森林进行人脸识别 208
- 10.3.1载入数据集 208
- 10.3.2预处理数据集 209
- 10.3.3训练和测试随机森林 210
- 10.4实现AdaBoost 212
- 10.4.1使用OpenCV实现AdaBoost 212
- 10.4.2使用scikit-learn实现AdaBoost 213
- 10.5组合不同模型为一个投票分类器 214
- 10.5.1理解不同的投票机制 214
- 10.5.2实现一个投票分类器 215
- 10.6总结 217
- 第11章通过超参数调优选择合适的模型 218
- 11.1评估一个模型 218
- 11.1.1评估模型错误的方法 219
- 11.1.2评估模型正确的方法 220
- 11.1.3选择最好的模型 221
- 11.2理解交叉验证 223
- 11.2.1使用OpenCV手动实现交叉验证 225
- 11.2.2使用scikit-learn进行k折交叉验证 226
- 11.2.3实现留一法交叉验证 227
- 11.3使用自举评估鲁棒性 228
- 11.4评估结果的重要性 230
- 11.4.1实现T检验 230
- 11.4.2实现配对卡方检验 232
- 11.5使用网格搜索进行超参数调优 233
- 11.5.1实现一个简单的网格搜索 234
- 11.5.2理解验证集的价值 235
- 11.5.3网格搜索结合交叉验证 236
- 11.5.4网格搜索结合嵌套交叉验证 238
- 11.6使用不同评估指标来对模型评分 239
- 11.6.1选择正确的分类指标 239
- 11.6.2选择正确的回归指标 240
- 11.7链接算法形成一个管道 240
- 11.7.1用 scikit-learn 实现管道 241
- 11.7.2在网格搜索中使用管道 242
- 11.8总结 243
- 第12章综合 244
- 12.1着手处理一个机器学习问题 244
- 12.2构建自己的估计器 245
- 12.2.1使用C++编写自己的基于OpenCV的分类器 245
- 12.2.2使用Python 编写自己的基于scikit-learn的分类器 247
- 12.3今后的方向 249
- 12.4总结 251