【机器学习快速入门教程2】Numpy库和线性代数有关的知识

章节2:Numpy库和线性代数有关的知识

在学习回归和分类问题前,我们先来学习下线代和微积分中一些重要的概念。这些基础有助于你理解接下来3章的理论知识,同时,我们也将介绍Numpy库。

Numpy库

我们将经常使用Numpy,它是一个Python库,增加了对大规模向量和矩阵以及对数据进行操作的一些重要数学函数快速有效计算的支持。Numpy是一个非常大的库,具有许多便利的函数。如果对这些函数进行全面介绍,则超出了本章的内容。我们会在以后的章节中,根据我们的需要介绍相关的Numpy库中的函数。在接下来的内容中,我们将简要学习一些最常用的操作。
首先,导入numpy库(常常以np作为缩写)

import numpy as np

Numpy库有许多方便的函数来产生一组数字,例如,生成0到10之间的一串整数

np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

numpy.linspace函数能在两个端点之间线性插入n个数

np.linspace(0, 10, 8)
array([ 0.        ,  1.42857143,  2.85714286,  4.28571429,  5.71428571,
        7.14285714,  8.57142857, 10.        ])

向量

向量可以用numpy.array来创建,如下向量v,
np.array([2, 3, 1])
array([2, 3, 1])

当两个长度相同的向量相加时,对应元素相加,

a = np.array([2, 3, 1])
b = np.array([0, 2, -2])
c = a + b
print(c)
[ 2  5 -1]

向量中的元素能被一个数(标量)依次相乘,如下:

3 * np.array([2,3,1])
array([6, 9, 3])

向量点乘定义为两个长度相同的向量对应元素乘积之和。可以使用numpy.dot函数计算:

a = np.array([1,-2,2])
b = np.array([0,2,3])
c = np.dot(a, b)
print(c)
2

或者更简短的方法:

c = a.dot(b)
print(c)
2

矩阵

矩阵是一组数字的矩形排列,比如,下面是一个2x3的矩阵:

注意,我们经常用行数x列数来表示矩阵的大小,所以,2x3表示矩阵有2行3列。
numpy能通过numpy.matrix函数把列表转成矩阵,比如:

np.matrix([[2,3,1],[0, 4,-2]])
matrix([[ 2,  3,  1],
        [ 0,  4, -2]])

实例化一个元素都是0的矩阵:

np.zeros((3, 3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

实例化一个元素都是1的矩阵:

np.ones((2, 2))
array([[1., 1.],
       [1., 1.]])

在线性代数中,一个矩阵除了对角线上的元素都是1以外,其余元素都是0,该矩阵称为单位矩阵,比如:

是一个3x3的单位矩阵,之所以叫做单位矩阵是因为一个矩阵乘以该矩阵,结果不变,就像乘了一个标量1。
实例化一个单位矩阵,可以使用numpy.eye方法,比如:

np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

注意,当一个矩阵和单位矩阵相乘后,结果还是原来那个矩阵,且与相乘的顺序无关。

M = np.matrix([[9,5,6],[-1,0,5],[-2,4,2]])
I = np.eye(3)
print("original matrix = \n", M)
M2 = I * M
print("I * M = \n", M2)
M3 = M * I
print("M * I = \n", M3)
original matrix = 
 [[ 9  5  6]
 [-1  0  5]
 [-2  4  2]]
I * M = 
 [[ 9.  5.  6.]
 [-1.  0.  5.]
 [-2.  4.  2.]]
M * I = 
 [[ 9.  5.  6.]
 [-1.  0.  5.]
 [-2.  4.  2.]]

实例化一个矩阵,且元素是随机生成的(0和1之间),可以用numpy.random方法:

A = np.random.random((2, 3))
print(A)
[[0.13425988 0.99250082 0.52730459]
 [0.09945505 0.42777824 0.52474797]]

转置是反转矩阵的两个轴,所以矩阵i行j列的元素,转置后就位于j行i列。矩阵A的转置表示为A^T

A_transpose = np.transpose(A)
print(A_transpose)
[[0.13425988 0.09945505]
 [0.99250082 0.42777824]
 [0.52730459 0.52474797]]

也可以用缩写的方法.T:

A_transpose = A.T
print(A_transpose)
[[0.13425988 0.09945505]
 [0.99250082 0.42777824]
 [0.52730459 0.52474797]]

矩阵运算和性质

跟向量一样,矩阵也是对应元素相加,不过要求两个矩阵大小相同,举例来说:

a = np.matrix([[4, 3],[3,-1],[-2,1]])
b = np.matrix([[-2, 1],[5,3],[1,0]])
c = a + b
print(c)
[[ 2  4]
 [ 8  2]
 [-1  1]]

矩阵也可以跟向量一样,乘以一个标量,

a = np.matrix([[1,-2,0],[6,4,-2]])
-2 * a
matrix([[ -2,   4,   0],
        [-12,  -8,   4]])

两矩阵相乘,就是将第一个矩阵的行与第二个矩阵的列进行点乘,如下:

矩阵A和B可相乘,必须满足A的列数与B的行数相同,例如:

a = np.matrix([[1,-2,0],[6,4,-2]])
b = np.matrix([[4,-1],[0,-2],[1,3]])
c = a * b
print(c)
[[  4   3]
 [ 22 -20]]

与一般的乘法不同,两矩阵的hadamard乘积是矩阵对应元素相乘,

使用numpy计算hadamard乘积的话,用numpy.array而不是numpy.matrix方法来实例化矩阵,这样可以用numpy.multiply方法来实现:

a = np.array([[3,1],[0,5]])
b = np.array([[-2,4],[1,-2]])
np.multiply(a,b)
array([[ -6,   4],
       [  0, -10]])

函数

函数是一个等式,计算带有一个或多个变量的表达式的值,例如:

所以在x=2处,f(2)=11,我们将经常遇到函数,一个神经网络就是一个很大的函数。
在机器学习中,经常会碰到变量和参数这两个词,变量是等式的一部分,是可变的,变量决定输出,所以上面这个函数取决于变量x。上式的系数(3,-5,9)有时候又叫做参数,因为他们决定函数的形状,并且是固定的。

def f(x):
    return 3*(x**2)-5*x+9

f(2)
11

导数

函数f(x)的导数是指在给定点的斜率,表示为

多项式求导公式如下,
例如:
那么,
def f(x):
    return -2*(x**3)

def f_deriv(x):
    return -6*(x**2)

print(f(2))
print(f_deriv(2))
-16
-24

常数的导数为0,为什么呢?令:

那么,

导数的性质

导数有交换律,和的导数就是导数的和,例如:

类似的,常数可以提到导数外面,有如下性质:

链式法则

复合函数是多个函数的组合,例如:

可以拆分成:
复合函数求导的链式法则如下:

所以,对上式f(x)求导的结果为:

学习神经网络时,链式法则十分重要,因为由此可以计算网络代价函数的导数。

def h(x):
    return 4*x-5

def g(x):
    return x**3

def f(x):
    return g(h(x))

def h_deriv(x):
    return 4

def g_deriv(x):
    return 3*(x**2)

def f_deriv(x):
    return g_deriv(h(x)) * h_deriv(x)

f(4)
f_deriv(2)
1331
108

多元函数

一个函数可以有一个或多个变量,例如:

使用累加运算符:
简化上面式子更好的方法是将变量转化为向量X,并在向量末尾添加元素1,如下:
系数向量为:

重构上式成:
求多元函数的偏导数就是在把其余变量看作是常数的情况下,对其中一个变量求导数。

梯度

函数的梯度是一个包含每个变量偏导数的向量,

后面当我们在了解神经网络是如何训练时,会更深入了解梯度的作用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342