Pytorch之線性代數(shù)

矩陣

  1. 矩陣初始化
  2. 矩陣元素運算
  3. 矩陣的乘法
  4. 矩陣的轉(zhuǎn)置
  5. 矩陣對應(yīng)列行的最大值,最小值,和
  6. 矩陣的其他操作:行列數(shù)、切片、復(fù)制、非0元素的下標
  7. 矩陣的行列式
  8. 矩陣的逆和偽逆
  9. 矩陣的對稱
  10. 矩陣的秩、跡
  11. 矩陣求解
  12. 矩陣的特征值與特征向量(EVD)

矩陣

1. 矩陣初始化

Tensor的初始化

# 全零矩陣

In [1]: import torch

In [2]: myZero = torch.zeros(3,3)

In [3]: myZero
Out[3]: 
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

In [4]: type(myZero)
Out[4]: torch.Tensor

In [5]: myZero.dtype
Out[5]: torch.float32

# 全一矩陣

In [6]: myOnes = torch.ones(3,3)

In [8]: myOnes
Out[8]: 
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

# 單位矩陣

In [9]: myEye = torch.eye(5)

In [10]: myEye
Out[10]: 
tensor([[1., 0., 0., 0., 0.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0.],
        [0., 0., 0., 0., 1.]])

# 對稱矩陣

In [11]: a1 = [1,2,3,4,5]

In [13]: a1 = torch.tensor(a1)

In [14]: a1
Out[14]: tensor([1, 2, 3, 4, 5])

In [15]: myDiag = torch.diag(a1)

In [16]: myDiag
Out[16]: 
tensor([[1, 0, 0, 0, 0],
        [0, 2, 0, 0, 0],
        [0, 0, 3, 0, 0],
        [0, 0, 0, 4, 0],
        [0, 0, 0, 0, 5]]) 

# 隨機矩陣

In [17]: myRand = torch.rand(3,3)

In [18]: myRand
Out[18]: 
tensor([[0.9588, 0.0139, 0.2303],
        [0.4332, 0.1916, 0.4152],
        [0.4848, 0.3361, 0.9799]])
  • 直接創(chuàng)建tensor
In [19]: a = torch.tensor([[1,2,3],[4,5,6]])

In [20]: a
Out[20]: 
tensor([[1, 2, 3],
        [4, 5, 6]])
  • 通過from_numpy() 函數(shù)將ndarray數(shù)據(jù)類型轉(zhuǎn)化成矩陣(tensor)
In [21]: import numpy as np

In [22]: a = np.arange(12).reshape(3,4)

In [23]: b = torch.from_numpy(a)

In [24]: b
Out[24]: 
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)
2. 矩陣元素運算

矩陣的元素運算是指矩陣在元素級別的加、減、乘、除運算。
(1)元素相加和相減。
條件:矩陣的行數(shù)和列數(shù)必須相同。
數(shù)學公式:(A±B)_i,_j=A_i,_j±B_i,_j

In [27]: myOnes = torch.ones(4,4)

In [28]: myOnes
Out[28]: 
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

In [29]: myEye = torch.eye(4)

In [30]: myEye
Out[30]: 
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])

In [31]: myOnes + myEye
Out[31]: 
tensor([[2., 1., 1., 1.],
        [1., 2., 1., 1.],
        [1., 1., 2., 1.],
        [1., 1., 1., 2.]])

In [32]: myOnes - myEye
Out[32]: 
tensor([[0., 1., 1., 1.],
        [1., 0., 1., 1.],
        [1., 1., 0., 1.],
        [1., 1., 1., 0.]])

(2)矩陣數(shù)乘:一個數(shù)乘以一個矩陣。

數(shù)學公式:(cA)_i,_j=c·A_i,_j

In [37]: b 
Out[37]: 
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)

In [39]: b*10
Out[39]: 
tensor([[  0,  10,  20,  30],
        [ 40,  50,  60,  70],
        [ 80,  90, 100, 110]], dtype=torch.int32)

(3)矩陣所有元素求和。
數(shù)學公式:
\operatorname{sum}(A)=\sum_{i=1}^{m} \sum_{j=1}^{n} A_{i, j}=1 其中, 1<i<m, 1<j<n

In [40]: torch.sum(b)
Out[40]: tensor(66)

(4)矩陣所有元素之積

數(shù)學公式:
\operatorname{product}(A)=\prod_{i=1}^{m} \prod_{j=1}^{n} A_{i, j}=1 其中, 1<i<m, 1<j<n

In [47]: a = torch.arange(4).reshape(2,2)+1

In [48]: a
Out[48]: 
tensor([[1, 2],
        [3, 4]])

In [49]: torch.prod(a)
Out[49]: tensor(24)

(5)矩陣各元素的n次冪:n=3。
數(shù)學公式:
A_{ij}^3=A_{ij}×A_{ij}×A_{ij}

In [50]: a
Out[50]: 
tensor([[1, 2],
        [3, 4]])

In [52]: torch.pow(a,3)
Out[52]: 
tensor([[ 1,  8],
        [27, 64]])
3. 矩陣的乘法

(1)矩陣各元素的積:矩陣的點乘同維對應(yīng)元素的相乘。當矩陣的維度不同時,會根據(jù)一定的廣播規(guī)則將維數(shù)擴充到一致的形式。
數(shù)學公式:
(A×B)_i,_j =A_i,_j×B_i,_j

In [64]: a
Out[64]: 
tensor([[1, 2],
        [3, 4]])

In [65]: b
Out[65]: 
tensor([[0, 1],
        [2, 3]])

In [66]: a*b
Out[66]: 
tensor([[ 0,  2],
        [ 6, 12]])

(2)矩陣內(nèi)積

數(shù)學公式:
[\boldsymbol{A}, \boldsymbol{B}]_{i, j}=\boldsymbol{A}_{i, 1} \boldsymbol{B}_{1, j}+\boldsymbol{A}_{i, 2} \boldsymbol{B}_{2, j}+\cdots+\boldsymbol{A}_{i n} \boldsymbol{B}_{n j}=\sum_{r=1}^{n} \boldsymbol{A}_{i, r} \boldsymbol{B}_{r, j^{\circ}}

In [68]: a
Out[68]: 
tensor([[1, 2],
        [3, 4]])

In [69]: b
Out[69]: 
tensor([[0, 1, 2],
        [3, 4, 5]])

In [70]: torch.dot(a,b)
Traceback (most recent call last):

  File "<ipython-input-70-5682e150e844>", line 1, in <module>
    torch.dot(a,b)
# 報錯,只允許一維的tensor,只適合向量內(nèi)積
RuntimeError: 1D tensors expected, got 2D, 2D tensors at C:\w\1\s\tmp_conda_3.6_045031\conda\conda-bld\pytorch_1565412750030\work\aten\src\TH/generic/THTensorEvenMoreMath.cpp:723

#官方提示此功能不廣播。有關(guān)廣播的矩陣乘法,請參見torch.matmul()
In [71]: torch.mm(a,b)
Out[71]: 
tensor([[ 6,  9, 12],
        [12, 19, 26]])

In [72]: torch.matmul(a,b)
Out[72]: 
tensor([[ 6,  9, 12],
        [12, 19, 26]])

(3)向量內(nèi)積、外積

? x=\left(x_{1}, x_{1}, ...,x_{m}\right) y=\left(y_{1}, y_{2},...,y_{n}\right)

向量內(nèi)積:x y^{T}=\sum_{i=1}^{n} x_{i} y_{i}

向量外積:x ^{T}y=\left(\begin{array}{ccc}{x_{1} y_{1}} & {\cdots} & {x_{1} y_{n}} \\ {\vdots} & {} & {\vdots} \\ {x_{m} y_{1}} & {\cdots} & {x_{m} y_{n}}\end{array}\right)

In [73]: a1  = torch.tensor([2,1,0])

In [74]: a2 = torch.tensor([-1,2,1])

In [75]: a1
Out[75]: tensor([2, 1, 0])

In [76]: a2
Out[76]: tensor([-1,  2,  1])

In [77]: torch.dot(a1,a2)
Out[77]: tensor(0)

In [78]: torch.outer(a1,a2)
Traceback (most recent call last):
# 在pytorch中沒有outer函數(shù)
  File "<ipython-input-78-cc115fea0111>", line 1, in <module>
    torch.outer(a1,a2)

AttributeError: module 'torch' has no attribute 'outer'
# 解決辦法,先將一維的向量轉(zhuǎn)換為二維,再利用矩陣內(nèi)積方法計算
In [86]: a1 = a1.reshape(1,3)

In [87]: a2 = a2.reshape(1,3)
# 轉(zhuǎn)置
In [88]: a1.T
Out[88]: 
tensor([[2],
        [1],
        [0]])

In [89]: torch.mm(a1.T,a2)
Out[89]: 
tensor([[-2,  4,  2],
        [-1,  2,  1],
        [ 0,  0,  0]])

(4)向量叉乘(叉積):運算結(jié)果是一個向量而不是一個標量。并且兩個向量的叉積與這兩個向量組成的坐標平面垂直。

數(shù)學公式:

a=\left(x_{1}, y_{1}, z_{1}\right) b=\left(x_{2}, y_{2}, z_{2}\right)
a \times b=\left|\begin{array}{ccc}{\mathrm{i}} & {\mathrm{j}} & {\mathrm{k}} \\ {x_{1}} & {y_{1}} & {z_{1}} \\ {x_{2}} & {y_{2}} & {z_{2}}\end{array}\right|=\left(y_{1} z_{2}-y_{2} z_{1}\right) i-\left(x_{1} z_{2}-x_{2} z_{1}\right) j+\left(x_{1} y_{2}-x_{2} y_{1}\right) k
其中
i=(1,0,0) \quad j=(0,1,0) \quad \mathrm{k}=(0,0,1)
根據(jù)i、j、k間關(guān)系,有:
a \times b=\left(y_{1} z_{2}-y_{2} z_{1},-\left(x_{1} z_{2}-x_{2} z_{1}\right), x_{1} y_{2}-x_{2} y_{1}\right)

例1、已知,a =(2,1,0),b =(-1,2,1),試求(1)a\times b(2)b\times a
解:(1)a\times b =(1,-2,5):(2)b\times a =(-1,2,5)

In [79]: torch.cross(a1,a2)
Out[79]: tensor([ 1, -2,  5])

In [80]: torch.cross(a2,a1)
Out[80]: tensor([-1,  2, -5])
4. 矩陣的轉(zhuǎn)置

數(shù)學公式:(A^T)_{ij} = A_{ij}

In [90]: a
Out[90]: 
tensor([[1, 2],
        [3, 4]])

In [91]: a.T
Out[91]: 
tensor([[1, 3],
        [2, 4]])

In [92]: a.transpose(1,0)
Out[92]: 
tensor([[1, 3],
        [2, 4]])
5. 矩陣對應(yīng)列行的最大值,最小值,和
In [99]: b 
Out[99]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 計算矩陣中最大值的對應(yīng)索引
In [100]: b.argmax()
Out[100]: tensor(5)
# 計算矩陣列中最大值對應(yīng)的行索引
In [101]: b.argmax(axis=0)
Out[101]: tensor([1, 1, 1])
# 計算矩陣行中最大值對應(yīng)的列索引
In [102]: b.argmax(axis=1)
Out[102]: tensor([2, 2])
# 矩陣中的最大值
In [103]: b.max()
Out[103]: tensor(5)
# 矩陣列中的最小值
In [104]: b.min()
Out[104]: tensor(0)
# 矩陣列求和
In [105]: b.sum(axis=0)
Out[105]: tensor([3, 5, 7])
6. 矩陣的其他操作:行列數(shù)、切片、復(fù)制、非0元素的下標
In [106]: a
Out[106]: 
tensor([[1, 2],
        [3, 4]])
# 行列數(shù)
In [107]: m,n = a.shape

In [108]: m,n
Out[108]: (2, 2)

In [109]: b
Out[109]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 切片
In [111]: b[1:]
Out[111]: tensor([[3, 4, 5]])

In [112]: b[:,1:]
Out[112]: 
tensor([[1, 2],
        [4, 5]])
# 復(fù)制
In [114]: c = torch.clone(b)

In [115]: c
Out[115]: 
tensor([[0, 1, 2],
        [3, 4, 5]])
# 隨機生成0-8,大小4*4
In [116]: d = torch.randint(0,9,(4,4))

In [117]: d
Out[117]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])
# 帥選出大于3的數(shù)
In [118]: d[d>3]
Out[118]: tensor([4, 8, 6, 5, 4, 4, 6, 5])

In [119]: d
Out[119]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])
# 非0元素的下標
In [120]: torch.nonzero(d)
Out[120]: 
tensor([[0, 0],
        [0, 1],
        [0, 2],
        [0, 3],
        [1, 0],
        [1, 1],
        [1, 2],
        [1, 3],
        [2, 0],
        [2, 1],
        [2, 2],
        [2, 3],
        [3, 1],
        [3, 3]])
7. 矩陣的行列式
In [127]: a
Out[127]: 
tensor([[1, 2],
        [3, 4]])

In [128]: a = a.float()

In [129]: a
Out[129]: 
tensor([[1., 2.],
        [3., 4.]])
# a必須為浮點型,否則會報錯
In [130]: torch.det(a)
Out[130]: tensor(-2.0000)
    
In [132]: d
Out[132]: 
tensor([[3, 1, 2, 2],
        [4, 8, 3, 6],
        [5, 4, 4, 6],
        [0, 3, 0, 5]])

In [133]: torch.det(d.float())
Out[133]: tensor(43.0000)
8. 矩陣的逆和偽逆

矩陣的逆

In [134]: a
Out[134]: 
tensor([[1., 2.],
        [3., 4.]])
# 矩陣的逆
In [135]: torch.inverse(a)
Out[135]: 
tensor([[-2.0000,  1.0000],
        [ 1.5000, -0.5000]])

注意:矩陣不滿秩,則會報錯

矩陣的偽逆

In [143]: e = e.double()
# 最好使用float64,
In [144]: e
Out[144]: 
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]], dtype=torch.float64)
# 偽逆
In [145]: torch.pinverse(e)
Out[145]: 
tensor([[0.0370, 0.0370, 0.0370],
        [0.0370, 0.0370, 0.0370],
        [0.0370, 0.0370, 0.0370]], dtype=torch.float64)

In [146]: f = torch.ones((4,4),dtype=torch.float64)+3

In [147]: f
Out[147]: 
tensor([[4., 4., 4., 4.],
        [4., 4., 4., 4.],
        [4., 4., 4., 4.],
        [4., 4., 4., 4.]], dtype=torch.float64)

In [148]: torch.pinverse(f)
Out[148]: 
tensor([[0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156],
        [0.0156, 0.0156, 0.0156, 0.0156]], dtype=torch.float64)
9. 矩陣的對稱
In [149]: a
Out[149]: 
tensor([[1., 2.],
        [3., 4.]])

In [150]: a*a.T
Out[150]: 
tensor([[ 1.,  6.],
        [ 6., 16.]])
10. 矩陣的秩、跡

矩陣的秩

In [151]: a
Out[151]: 
tensor([[1., 2.],
        [3., 4.]])
# 秩
In [152]: torch.matrix_rank(a)
Out[152]: tensor(2)

In [153]: e
Out[153]: 
tensor([[3., 3., 3.],
        [3., 3., 3.],
        [3., 3., 3.]], dtype=torch.float64)

In [154]: torch.matrix_rank(e)
Out[154]: tensor(1)

矩陣的跡

In [156]: a
Out[156]: 
tensor([[1., 2.],
        [3., 4.]])
# 跡
In [157]: torch.trace(a)
Out[157]: tensor(5.)

In [158]: b
Out[158]: 
tensor([[0, 1, 2],
        [3, 4, 5]])

In [159]: torch.trace(b)
Out[159]: tensor(4)
11. 矩陣求解

可逆矩陣的求解
AX=B

In [174]: A = torch.randint(0,10,(4,4),dtype=torch.float64)

In [175]: A
Out[175]: 
tensor([[1., 0., 9., 1.],
        [8., 5., 5., 6.],
        [9., 1., 0., 4.],
        [2., 0., 4., 0.]], dtype=torch.float64)

In [177]: B = torch.tensor([[1,10,0,1]],dtype=torch.float64)

In [178]: B
Out[178]: tensor([[ 1., 10.,  0.,  1.]], dtype=torch.float64)
# 求解
In [180]: (X,LU) = torch.solve(B.T,A)

In [181]: X
Out[181]: 
tensor([[ 0.0989],
        [ 2.7260],
        [ 0.2006],
        [-0.9040]], dtype=torch.float64)
# 驗證
In [182]: torch.mm(A,X)
Out[182]: 
tensor([[ 1.0000],
        [10.0000],
        [ 0.0000],
        [ 1.0000]], dtype=torch.float64)

12. 矩陣的特征值與特征向量(EVD)

矩陣的特征向量和特征值:
Av=\lambda v
這里A是實對稱矩陣,v是特征向量,\lambda是特征值。下面我們使用Pytorch求取矩陣的特征值和特征向量。

In [200]: A = torch.tensor([[-1,1,0],[-4,3,0],[1,0,2]],dtype=torch.float64) 
# 求解特征值與特征向量
In [205]: (evals,evecs) = torch.eig(A,eigenvectors=True)
# 特征值
In [206]: evals
Out[206]: 
tensor([[2., 0.],
        [1., 0.],
        [1., 0.]], dtype=torch.float64)
# 特征向量
In [207]: evecs
Out[207]: 
tensor([[ 0.0000,  0.4082,  0.4082],
        [ 0.0000,  0.8165,  0.8165],
        [ 1.0000, -0.4082, -0.4082]], dtype=torch.float64)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容