orth is obtained from u in the singular value decomposition, [u,s] = svd(a,『econ』). if r = rank(a),the first r columns of uform an orthonormal basis for the range of a.
**
from scipy import linalg as la
import torch
# step 1: 建立相關矩陣
print('step 1: 建立相關矩陣')
a = np.array([[1.,0,1],[0,1,0],[1,0,1]])
b = torch.tensor(a)
print(b)
print('\n')
# step 2: 求矩陣的秩
print('step 2: 求矩陣的秩')
r = torch.matrix_rank(b)
print(r)
print('\n')
# step 3: 矩陣的svd分解
print('step 3: 矩陣的svd分解及正交基索引')
u,s,v = torch.svd(b)
torchresult = u[:,:r]
print('u:\n',u)
print('s:\n',s)
print('v:\n',v)
print('\n')
# step 4: 對比scipy直接計算與pytorch間接計算結果
print('step 4: 對比scipy直接計算與pytorch間接計算結果')
scipyresult = la.orth(b)
print('scipy.la.orth():\n',scipyresult)
scipyresult.dtype
print('scipyresult - torchresult\n',torch.dist(torch.tensor(scipyresult), torchresult,2))
step 1: 建立相關矩陣
tensor([[1., 0., 1.],
[0., 1., 0.],
[1., 0., 1.]])
step 2: 求矩陣的秩
tensor(2)
step 3: 矩陣的svd分解及正交基索引
u: tensor([[-0.7071, 0.0000, 0.7071],
[ 0.0000, -1.0000, 0.0000],
[-0.7071, 0.0000, -0.7071]])
s: tensor([2.0000e+00, 1.0000e+00, 1.3491e-08])
v: tensor([[-7.0711e-01, -0.0000e+00, 7.0711e-01],
[ 0.0000e+00, -1.0000e+00, 0.0000e+00],
[-7.0711e-01, -1.1921e-07, -7.0711e-01]])
step 4: 對比scipy直接計算與pytorch間接計算結果
scipy.la.orth():
[[-0.7071068 0. ]
[ 0. -1. ]
[-0.70710677 0. ]]
scipyresult - torchresult
tensor(0.)
def torchorth(a):
r = torch.matrix_rank(a)
u,s,v = torch.svd(a)
return u[:,:r]
a = np.array([[1.,0,1],[0,1,0],[1,0,1]])
b = torch.tensor(a)
torchorth(b)
當引數過大的時候,仍舊存在一定的誤差, 此時可設定64位精度
torch.set_default_dtype(torch.float64)
def torchorth(a):
r = torch.matrix_rank(a)
u,s,v = torch.svd(a)
return u[:,:r]
nfea = 10
nwin = 10
nort = 500
randomoth = random.randn(nwin * nfea + 1, nort)
if nfea * nwin >= nort:
wenh1 = la.orth(2 * randomoth)-1
else:
wenh1 = la.orth(2 * randomoth.t-1).t
randomoth = torch.tensor(randomoth)
if nfea * nwin >= nort:
wenh2 = torchorth(2 * randomoth)-1
else:
wenh2 = torchorth(2 * randomoth.t-1).t
torch.dist(torch.tensor(wenh1),wenh2,2)
Pytorch自動求解梯度
要理解pytorch求解梯度,首先需要理解pytorch當中的計算圖的概念,在計算圖當中每乙個variable都代表的乙個節點,每乙個節點就可以代表乙個神經元,我們只有將變數放入節點當中才可以對節點當中的變數求解梯度,假設我們有乙個矩陣 1.2.3.4.5.6.我們將這個矩陣 二維張量 首先在pyt...
PyTorch 矩陣乘法總結
torch.mm mat1,mat2,out none 其中mat1 n times m mat2 m times d 輸出out的維度是 n times d 該函式一般只用來計算兩個二維矩陣的矩陣乘法,並且不支援broadcast操作。由於神經網路訓練一般採用mini batch,經常輸入的時三維...
《演算法》蛇形矩陣求解
蛇形矩陣 右下,下左,左上,上右,迴圈往復 如果每次迴圈都計算x,y當前的極限值會很耗費效能,不如讓x和y直接越界,當越界的點不存在時,再回退一步,並按照 對方 上次的極限值 最大或最小 去確定 正確的轉向方向 左或右 import time import sys x變化或y變化 x和y只能有乙個工...