绪论 写在前面的话

写在前面的话

  在正文开始之前,还有些必要的内容需要向各位读者进行交代:

1 文章内容

  以清华大学出版社出版的、李航教授主编的《统计学习方法(第二版)》(以下简称为原书)为基准,向读者介绍机器学习算法的理论内容,并用Python代码将书中介绍的算法实现出来。文章的重点不在于理论推导,原理部分只会蜻蜓点水般一带而过,仅保留最基本的说明。文章的重点在于使用Python实现算法的部分,也就是对变量进行分析,将公式进行拆解,将抽象的数学符号对应到实际的数据结构,并进一步映射到代码中。这一过程我会尽量做到详细,力求打通理论到实践之间的思维壁垒。总的来说,文章并不是对原书进行知识总结或内容提炼,反而可以看做是对原书内容的一种补充。

2 读者群体

  该系列的文章并不适宜所有人群进行阅读,最最基本的条件是要能够使用Python编写代码,并对Numpy有一定的使用经验,更具体的,可以划分为以下几类人群:

  • 一等群体:原书学习者。该系列的文章可以作为原书的补充材料进行阅读。
  • 二等群体:未读过原书,但了解机器学习算法原理的人。若懂得算法原理,就能比较快地理解算法的公式,在阅读时也不会有太大的障碍。
  • 三等群体:不了解机器学习,但有一定的数学基础(线性代数等)的人。这类读者群体在阅读公式时不会有太大的障碍,但对于算法逻辑的理解就会有些困难了,因为该系列文章对于这一部分并没有打算着墨太多。
  • 非目标群体:数学基础薄弱且未了解过机器学习算法的人

3 文章愿景

  希望读者在阅读该系列文章之后,能对原书的算法能有更加深入认识,因为算法不再只是一个个奇奇怪怪的数学符号了。同时,对于Python代码本身的使用也会有略微的帮助。该系列文章本身还有一个更加宏大的愿景,就是希望在将算法代码化的过程中,不断积累代码,最终形成一个定制算法的素材库。届时,面对需求各异的实际问题,能够根据痛点定制算法,对症下药,以达到更精准解决问题的效果。愿景不可谓不宏大,但由此开始,才算真正迈出了第一步。

4 阅读说明

4.1 原书的引用

引用符以内,未做特殊说明,均是直接引用原书内容

4.2 向量的公式表示

  在原书第一章第二节中,作者如是说道:

在监督学习中,将输入与输出看作是定义在输入(特征)空间与输出空间上的随机变量的取值。输入输出变量用大写字母表示,习惯上输入变量写作 X X X ,输出变量写作 Y Y Y 。输入输出变量的取值用小写字母表示,输入变量的取值写作 x x x ,输出变量的取值写作 y y y 。变量可以是标量或向量,都用相同类型字母表示。除特别声明外,本书中向量均为列向量。输入实例 x x x 的特征向量记作
x = ( x ( 1 ) x ( 2 ) x ( 3 ) ⋯ x ( i ) ⋯ x ( n ) ) T x = \begin{pmatrix} x^{(1)}&x^{(2)}&x^{(3)}&\cdots&x^{(i)}&\cdots&x^{(n)} \end{pmatrix}^\mathsf{T} x=(x(1)x(2)x(3)x(i)x(n))T
x ( i ) x^{(i)} x(i) 表示 x x x 的第 i i i 个特征。注意 x ( i ) x^{(i)} x(i) x i x_i xi 不同,本书通常用 x i x_i xi 表示多个输入变量中的第 i i i 个变量,即
x i = ( x i ( 1 ) x i ( 2 ) x i ( 3 ) ⋯ x i ( i ) ⋯ x i ( n ) ) T x_i = \begin{pmatrix} x_i^{(1)}&x_i^{(2)}&x_i^{(3)}&\cdots&x_i^{(i)}&\cdots&x_i^{(n)} \end{pmatrix}^\mathsf{T} xi=(xi(1)xi(2)xi(3)xi(i)xi(n))T
监督学习从训练数据(training data)集合中学习模型,对测试数据(test data)进行预测。训练数据由输入(或特征向量)与输出对组成,训练集通常表示为
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),,(xN,yN)}
测试数据也由输入与输出对组成。输入与输出对又称为样本(sample)或样本点。

  问题就在于列向量的表示方式。
  先来将训练集 T T T 展开看一下:
T = ( x 1 ( 1 ) x 1 ( 2 ) x 1 ( 3 ) ⋯ x 1 ( n ) y 1 x 2 ( 1 ) x 2 ( 2 ) x 2 ( 3 ) ⋯ x 2 ( n ) y 2 ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ x N ( 1 ) x N ( 2 ) x N ( 3 ) ⋯ x N ( n ) y N ) T = \begin{pmatrix} x_1^{(1)}&x_1^{(2)}&x_1^{(3)}&\cdots&x_1^{(n)}&y_1\\[2ex] x_2^{(1)}&x_2^{(2)}&x_2^{(3)}&\cdots&x_2^{(n)}&y_2\\[2ex] \vdots&\vdots&\vdots&\ddots&\vdots&\vdots\\[2ex] x_N^{(1)}&x_N^{(2)}&x_N^{(3)}&\cdots&x_N^{(n)}&y_N\\[2ex] \end{pmatrix} T=x1(1)x2(1)xN(1)x1(2)x2(2)xN(2)x1(3)x2(3)xN(3)x1(n)x2(n)xN(n)y1y2yN
  从中可以看到,训练集中,输入变量 x i x_i xi行向量的形式。
  进一步考虑实际的生产环境,在Python中,训练数据通常以ndarray、series、dataframe的形式进行存储,不过不管是哪一种数据类型,输入变量 x i x_i xi 都会是行向量的形式。
  那来简单总结一下:教材中的向量默认并统一用列向量来表示,实际数据环境中行向量列向量都是存在的 。当要将公式中的变量和实际数据环境对应起来的时候,这种不一致的表达方式会增加思考的成本,因为要先判断公式中的变量在实际数据环境中到底是如何存在的。所以,为了方便理解,后续的文章中,除特殊说明以外,向量的表达方式默认和实际数据环境一致

4.3 矩阵的代码表示

  Numpy本身自带一个矩阵库Matrix,它返回的是一个矩阵对象。不过从实质上来说,Matrix的矩阵对象,就是一个二维数组。考虑到这一点,后续的文章中并没有使用矩阵库Matrix,而是简单使用二维数组进行代替。原因有两点,一是代码书写简便;二是,如果使用矩阵对象,后续进行的运算都是矩阵之间的运算,失去了Numpy灵活性的优势。这在二项逻辑斯蒂回归中会有十分具体的体现。

4.4 运算符号的代码表示

  算法中变量所代表的数学对象包括实数、向量和矩阵,这就需要明确不同数学对象之间运算符的表示规则。在这里着重强调内积和乘法运算之间的差异。内积,用显式的 ⋅ \cdot 表示,如 ω ⋅ x \omega \cdot x ωx ,而乘法运算则不使用符号,如 a b ab ab

5 写在绪论最后的话

  考虑到不同教材在算法实现上的差异,为避免观点冲突,这里必须再次强调一遍,该系列文章的主要内容,是用Python代码实现《统计学习方法(第二版)》中的算法。
  最后的最后,还想要多说一句:由于文章的写作,受限于作者本身的水平,文章中难免会有错误和不当之处,又鉴于作者本人脸皮足够厚,所以希望读者能直言不讳,多多批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值