numpy.linalg學習

1、矩陣和向量積

  • 兩個數組點積:numpy.dot(a, b, out=None)
①a、b都是常量或一維數組,則返回標量
In [1]: import numpy as np

In [2]: np.dot(3,4)
Out[2]: 12

In [3]: np.dot([1,2,3],[4,5,6])
Out[3]: 32
知識點:對於一維數組,其結果等於兩向量的內積:設向量 a=(x1,y1),向量b=(x2,y2),結果等於x1*x2+y1*y2
②a、b都是二維數組,相當於矩陣的乘法
In [5]: a = np.array([[1,2],[3,4],[2,5]])
   ...: b = np.array([[2,3,1],[4,5,2]])
   ...: np.dot(a,b)
   ...:
Out[5]:
array([[10, 13,  5],
       [22, 29, 11],
       [24, 31, 12]])
知識點:矩陣乘法,第一矩陣A的行數必須等於第二個矩陣B的列數;矩陣A乘以矩陣B得到的結果C,其第m行n列元素等於矩陣A的第m行元素乘以矩陣B第n列對應元素之和
③a、b都是N維,其結果等於a的最後一軸和b的倒數第二軸積之和
In [3]: import numpy as np

In [4]: a = np.array(range(12)).reshape(2,3,1,2)
   ...: b = np.array(range(12)).reshape(3,2,2)
   ...:

In [5]: a
Out[5]:
array([[[[ 0,  1]],

        [[ 2,  3]],

        [[ 4,  5]]],


       [[[ 6,  7]],

        [[ 8,  9]],

        [[10, 11]]]])

In [6]: b
Out[6]:
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

In [7]: np.dot(a,b)
Out[7]:
array([[[[[  2,   3],
          [  6,   7],
          [ 10,  11]]],


        [[[  6,  11],
          [ 26,  31],
          [ 46,  51]]],


        [[[ 10,  19],
          [ 46,  55],
          [ 82,  91]]]],



       [[[[ 14,  27],
          [ 66,  79],
          [118, 131]]],


        [[[ 18,  35],
          [ 86, 103],
          [154, 171]]],


        [[[ 22,  43],
          [106, 127],
          [190, 211]]]]])

In [8]: np.dot(a,b).shape
Out[8]: (2, 3, 1, 3, 2)
計算過程:
In [9]: np.dot(np.array([[[[0,1]]]]),np.array([[[0,1],[2,3]]]))
Out[9]: array([[[[[2, 3]]]]])

In [10]: np.dot(np.array([[[[0,1]]]]),np.array([[[4,5],[6,7]]]))
Out[10]: array([[[[[6, 7]]]]])

In [11]: np.dot(np.array([[[[0,1]]]]),np.array([[[8,9],[10,11]]]))
Out[11]: array([[[[[10, 11]]]]])
  • 兩向量點積:numpy.vdot(a, b)
①參數a、b都是高維數組,vdot處理多維數組和dot處理方式不同,不是執行矩陣乘積,只能執行向量點積,則需將數組先扁平化,然後再計算

In [1]: import numpy as np
   ...: a = np.array([[1, 4], [5, 6]])
   ...: b = np.array([[4, 1], [2, 2]])
   ...: np.vdot(a,b)
   ...:
Out[1]: 30
a、b數組扁平化即將多維數組轉換成一維數組,可以使用ravel函數處理
In [2]: np.vdot(a.ravel(), b.ravel())
Out[2]: 30
②參數a、b爲複數
In [3]: a = np.array([1+2j,3+4j])
   ...: b = np.array([5+6j,7+8j])
   ...: np.vdot(a,b)
   ...:
Out[3]: (70-8j)

In [4]: np.vdot(b,a)
Out[4]: (70+8j)
通過上述結果可知:np.vdot(a,b)和np.vdot(b,a)計算出來的結果剛好互爲共軛複數關係(實部相同,虛部互爲相反數),其計算結果爲取vdot函數中的第一個參數的共軛複數與另外一個參數點積。
以np.vdot(a,b)計算爲例:
第一步:計算a的共軛複數c=np.array([1-2j,3-4j])
第二步:計算c與b的點積
In [5]: import numpy as np
   ...: a = np.array([1+2j,3+4j])
   ...: b = np.array([5+6j,7+8j])
   ...: c = np.array([1-2j,3-4j])
   ...: d = np.array([5-6j,7-8j])
   ...: np.dot(c,b)
   ...:
Out[5]: (70-8j)

In [6]: np.dot(a,d)
Out[6]: (70+8j)
2、求解方程與求逆矩陣

  • 逆矩陣:numpy.linalg.inv(a)
In [1]: import numpy as np
   ...: from numpy.linalg import inv
   ...: a = np.array([[1., 2.], [3., 4.]])
   ...: inv(a)
   ...:
Out[1]:
array([[-2. ,  1. ],
       [ 1.5, -0.5]])
知識點:矩陣與其逆矩陣點積等於同階單位矩陣,求解逆矩陣的方法有:待定係數法、伴隨矩陣法、初等變換法
In [2]: np.dot(a,inv(a))
Out[2]:
array([[  1.00000000e+00,   1.11022302e-16],
       [  0.00000000e+00,   1.00000000e+00]])
比較兩數組:numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
In [3]: np.allclose(np.dot(a,inv(a)),np.eye(2))
Out[3]: True
  • 最小二乘法:numpy.linalg.lstsq(a, b, rcond=-1)
1、b爲一維數組
In [13]: import numpy as np
    ...: from numpy.linalg import lstsq
    ...: X1 = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0
    ...: ]])
    ...: y1= np.array([[7], [9], [13], [17.5], [18]])
    ...: np.linalg.lstsq(X1, y1)
    ...:
Out[13]:
(array([[ 1.1875    ],
        [ 1.01041667],
        [ 0.39583333]]),
 array([ 8.22916667]),
 3,
 array([ 26.97402951,   2.46027806,   0.59056212]))
從上述結果可知:返回元組,元組中四個元素,第一元素表示所求的最小二乘解,第二個元素表示殘差總和,第三個元素表示X1矩陣秩,第四個元素表示X1的奇異值
2、b爲多維數組
In [14]: import numpy as np
    ...: from numpy.linalg import lstsq
    ...: X1 = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0
    ...: ]])
    ...: y1= np.array([[7,8], [9,7], [13,10], [17.5,16], [18,17]])
    ...: np.linalg.lstsq(X1, y1)
    ...:
Out[14]:
(array([[ 1.1875    , -1.125     ],
        [ 1.01041667,  1.02083333],
        [ 0.39583333,  1.29166667]]),
 array([ 8.22916667,  2.91666667]),
 3,
 array([ 26.97402951,   2.46027806,   0.59056212]))
通過上面兩個結果對比分析:參數b維度增加,第一個、第二個元素數組維度也變化,其對應的第K列分別表示對b數組中第k列的最小二乘法求解、殘差總和












發佈了31 篇原創文章 · 獲贊 122 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章