章節(jié)2:Numpy庫和線性代數(shù)有關(guān)的知識
在學習回歸和分類問題前愉棱,我們先來學習下線代和微積分中一些重要的概念。這些基礎有助于你理解接下來3章的理論知識哲戚,同時羽氮,我們也將介紹Numpy庫。
Numpy庫
我們將經(jīng)常使用Numpy惫恼,它是一個Python庫档押,增加了對大規(guī)模向量和矩陣以及對數(shù)據(jù)進行操作的一些重要數(shù)學函數(shù)快速有效計算的支持。Numpy是一個非常大的庫祈纯,具有許多便利的函數(shù)令宿。如果對這些函數(shù)進行全面介紹,則超出了本章的內(nèi)容腕窥。我們會在以后的章節(jié)中粒没,根據(jù)我們的需要介紹相關(guān)的Numpy庫中的函數(shù)。在接下來的內(nèi)容中簇爆,我們將簡要學習一些最常用的操作癞松。
首先,導入numpy庫(常常以np作為縮寫)
import numpy as np
Numpy庫有許多方便的函數(shù)來產(chǎn)生一組數(shù)字入蛆,例如响蓉,生成0到10之間的一串整數(shù)
np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy.linspace函數(shù)能在兩個端點之間線性插入n個數(shù)
np.linspace(0, 10, 8)
array([ 0. , 1.42857143, 2.85714286, 4.28571429, 5.71428571,
7.14285714, 8.57142857, 10. ])
向量
向量可以用numpy.array來創(chuàng)建,如下向量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]
向量中的元素能被一個數(shù)(標量)依次相乘扼褪,如下:
3 * np.array([2,3,1])
array([6, 9, 3])
向量點乘定義為兩個長度相同的向量對應元素乘積之和想幻。可以使用numpy.dot函數(shù)計算:
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
矩陣
矩陣是一組數(shù)字的矩形排列话浇,比如脏毯,下面是一個2x3的矩陣:注意,我們經(jīng)常用行數(shù)x列數(shù)來表示矩陣的大小幔崖,所以食店,2x3表示矩陣有2行3列。
numpy能通過numpy.matrix函數(shù)把列表轉(zhuǎn)成矩陣岖瑰,比如:
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.]])
在線性代數(shù)中叛买,一個矩陣除了對角線上的元素都是1以外,其余元素都是0蹋订,該矩陣稱為單位矩陣率挣,比如:是一個3x3的單位矩陣,之所以叫做單位矩陣是因為一個矩陣乘以該矩陣露戒,結(jié)果不變椒功,就像乘了一個標量1捶箱。
實例化一個單位矩陣,可以使用numpy.eye方法动漾,比如:
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
注意丁屎,當一個矩陣和單位矩陣相乘后,結(jié)果還是原來那個矩陣旱眯,且與相乘的順序無關(guān)晨川。
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]]
轉(zhuǎn)置是反轉(zhuǎn)矩陣的兩個軸共虑,所以矩陣i行j列的元素,轉(zhuǎn)置后就位于j行i列呀页。矩陣A的轉(zhuǎn)置表示為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]]
矩陣運算和性質(zhì)
跟向量一樣妈拌,矩陣也是對應元素相加,不過要求兩個矩陣大小相同蓬蝶,舉例來說:
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的列數(shù)與B的行數(shù)相同雪位,例如:
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方法來實現(xiàn):
a = np.array([[3,1],[0,5]])
b = np.array([[-2,4],[1,-2]])
np.multiply(a,b)
array([[ -6, 4],
[ 0, -10]])
函數(shù)
函數(shù)是一個等式卧波,計算帶有一個或多個變量的表達式的值时肿,例如:所以在x=2處,f(2)=11港粱,我們將經(jīng)常遇到函數(shù)螃成,一個神經(jīng)網(wǎng)絡就是一個很大的函數(shù)。
在機器學習中查坪,經(jīng)常會碰到變量和參數(shù)這兩個詞寸宏,變量是等式的一部分,是可變的偿曙,變量決定輸出氮凝,所以上面這個函數(shù)取決于變量x。上式的系數(shù)(3望忆,-5罩阵,9)有時候又叫做參數(shù)竿秆,因為他們決定函數(shù)的形狀,并且是固定的稿壁。
def f(x):
return 3*(x**2)-5*x+9
f(2)
11
導數(shù)
函數(shù)f(x)的導數(shù)是指在給定點的斜率幽钢,表示為def f(x):
return -2*(x**3)
def f_deriv(x):
return -6*(x**2)
print(f(2))
print(f_deriv(2))
-16
-24
常數(shù)的導數(shù)為0傅是,為什么呢匪燕?令:導數(shù)的性質(zhì)
導數(shù)有交換律喧笔,和的導數(shù)就是導數(shù)的和帽驯,例如:鏈式法則
復合函數(shù)是多個函數(shù)的組合界拦,例如:所以,對上式f(x)求導的結(jié)果為:
學習神經(jīng)網(wǎng)絡時梗劫,鏈式法則十分重要享甸,因為由此可以計算網(wǎng)絡代價函數(shù)的導數(shù)。
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
多元函數(shù)
一個函數(shù)可以有一個或多個變量梳侨,例如:梯度
函數(shù)的梯度是一個包含每個變量偏導數(shù)的向量,后面當我們在了解神經(jīng)網(wǎng)絡是如何訓練時丙躏,會更深入了解梯度的作用择示。