我有幾個正態向量。我想把這個二維基礎擴展到一個更大的基礎。在Python中用NumPy做這件事的最快方法是什么?
我的想法是這樣的。生成一個所需大小的隨機向量(new_dimension > 2),通過與前兩個向量的比例點積相減來執行Gram-Schmidt。重復進行。我懷疑這是否是最快的方法......
uj5u.com熱心網友回復:
你沒有指定你的空間的尺寸。如果是3,那么你可以簡單地使用兩個向量的交叉積。如果不是,請看下文。
3-D的例子
# 1.設定:兩個向量a, b的正態基<
np.random.seed(0)
a, b = np.random.uniform(size=(2,3)
a /= np.linalg.norm(a)
b -= a.dot(b)*a
b /= np.linalg.norm(b)
# 2.檢查:。
np.linalg.nov.nov.nov.nov. allclose([1,1,0,[a.dot(a), b.dot(b), a.dot(b), b.dot(a) ] )
True
然后,制作一個新的向量:
# 3.解決
c = np.cross(a, b)
# 4.檢查。
np.allclose([1,0,[c.dot(c), c.dot(a), c.dot(b) ] )
True]。
如果你的向量的維度比較高,那么你可以選擇任何不在a,b定義的平面內的向量,然后減去該投影,即歸一化。
更高維度的例子
# 1.setup。
n = 5
np.random.seed(0)
a, b = np.random.uniform(size=(2, n)
a /= np.linalg.norm(a)
b -= a.dot(b)*a
b /= np.linalg.norm(b)
# 2.檢查。
assert np. allclose([1,1,0,[a.dot(a), b.dot(b), a.dot(b), b.dot(a) ] )
然后:
# 3.解決。
ab = np.c_[a, b] 。
c = np.roll(a b, 1) # 任何矢量都不太可能是0或一些。
# a和b的線性組合。
c -= (c @ ab) @ ab.T
c /= np.linalg.norm(c)
# 4.檢查。
abc = np.c_[a, b, c] 。
>>> np.allclose(np.eye(3), abc.T @ abc)
True
泛化:在一個m-D空間中補充一個m基礎
。
在一個n維空間中,給定一個(n, m)正交基x,其中m s.t. 1 <= m < n(換句話說,m向量在n維空間中作為x的列放在一起):找到n - m向量是正交的,并且都是與x正交。
我們可以使用SVD一次性完成。
# 1. setup
# 為方便起見,我們也使用SVD進行設定,。
# 但這根本不是必須的。只要
# x.T @ x == I
n, m = 6, 2 # 例如
x, _, _ = np.linalg.svd(np.random.uniform(size=(n, m)))
x = x[:, :m]
# 2.檢查。
>>> np.allclose(x.T @ x, np.eye(m))
True
>>> x.shape
(6, 2)
因此,在這一點上,x是正交的,并且形狀是(n, m)。
找到y是一個(可能是許多)正交于x的正交基:
# 3.解。
u, s, v = np.linalg.svd(x)
y = u[:, m:]
# 4.檢查。
>>> np.allclose(y.T @ y, np.eye(n-m))
True
>>> np.allclose(x.T @ y, 0)
True
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/309468.html
標籤:
下一篇:在numpy中用矩陣求和向量
