亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簡單線性相關性

簡單線性相關性

繁花不似錦 2023-10-06 19:36:31
試圖找出兩個向量是否線性相關或獨立。我不斷遇到錯誤“數組的最后兩個維度必須是正方形?有人可以解釋一下嗎?def Indy2Vec(v1, v2):        A = np.array([v1])    B = np.array([v2])    print(A)    #A =np.linalg.matrix_rank(A)    A=np.linalg.solve(A,B)        return Av1 = np.array([0, 5, 0])v2 = np.array([0, -10, 0])v3 = np.array([1, 2, 3])v4 = np.array([-2, -4, -6])Indy2Vec(v1,v2)
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

錯誤的問題陳述

看來你沒有解決正確的問題。正如您所說,它不能像您使用的方法一樣工作:

計算已確定的滿秩線性矩陣方程 ax = b 的“精確”解 x。

如文檔中所定義。

將您的問題寫為 是很誘人的Ax = b。但是,您需要一個 3x3 矩陣來測試向量b=[0,0,0]T,并找到一個非平凡的解決方案x來聲明所有三個向量都不是線性獨立的。但這意味著矩陣沒有滿秩。

在您的代碼中,以下表達式無法滿足函數簽名:

np.linalg.solve(np.array([v1]), v2)

并引發以下錯誤:

LinAlgError: Last 2 dimensions of the array must be square

就矩陣形狀而言,有效的調用numpy.linalg.solve是:

np.linalg.solve(np.array([v1, v2, v3]).T, np.zeros(v1.size))

但在兩個方面失敗了:

LinAlgError: Singular matrix

首先因為矩陣不是滿秩的,因此不可逆。其次,這并不能解決兩個向量的問題。

通用解決方案

import numpy as np
from scipy import linalg

相反,您想要解決有關線性獨立性的更普遍的問題,可以通過評估[v1, v2]T來解決:

在線性代數中,矩陣 A 的秩是由其列生成(或跨越)的向量空間的維數。這對應于 A 的線性獨立列的最大數量。

對于 numpy,您可以使用numpy.linalg.matrix_rank來執行此操作:

np.linalg.matrix_rank(np.array([v1, v2]).T) # Missing dimension: 1
np.linalg.matrix_rank(np.array([v1, v3]).T) # Full rank: 2

此方法對執行SVD 分解計算出的空奇異值進行計數,該算法的實現由scipy.linalg.svd提供:

U, s, V = linalg.svd(np.array([v1, v2]).T) # s = [11.18033989, 0.]
U, s, V = linalg.svd(np.array([v1, v3]).T) # s = [5.55992016, 2.84381571]

或者對其執行高斯消元法(假設使用LU 分解)并檢查結果。scipy 包提供了scipy.linalg.lu

p, l, u = linalg.lu(np.array([v1, v2]).T) # Null pivot: u = [[5., -10.], [0., 0.]]
p, l, u = linalg.lu(np.array([v1, v3]).T) # Full rank:  u = [[5., 2.], [0., 3.]]

所有這些方法都會評估矩陣列所跨越的向量空間的維數。如果矩陣是滿秩的,那么你的向量是線性獨立的。如果不是,則至少有兩個相關向量。

那么解決您的問題的一個簡單方法是:

def indep1(*args):

    A = np.array(args).T

    return np.linalg.matrix_rank(A) == len(args)


indep1(v1, v2) # False

indep1(v1, v3) # True

indep1(v1, v2, v3) # False

indep1(v1, np.zeros(v1.size)) # False

特例

如果您停留在 3D 向量空間中并且只需要檢查兩個向量,您還可以利用numpy.cross提供的叉積

np.cross(v1, v2) # Colinear: [0, 0, 0]
np.cross(v1, v3) # Not colinear: [15,  0, -5]

更具體的替代方案是:

def indep2(a, b):

    return not np.allclose(np.cross(a, b), 0.)


indep2(v1, v2) # False

indep2(v1, v3) # True

# indep2(v1, v2, v3) # TypeError

indep2(v1, np.zeros(v1.size)) # False

它們是一個恒定的系統

正如 所建議的@MadPhycist,我們還可以評估共線向量共享標量比例因子(例如 )的事實a = k*b,那么測試它的非防彈方法是檢查坐標之比是否恒定:


def indep3(a, b):

    r = a/b                                 # Ratio of coordinates

    q = np.isfinite(r)                      # Filter bad ratio (zero division)

    return not np.allclose(r[q], r[q][0])   # Assess all ratio are equal


indep3(v1, v2) # False

indep3(v1, v3) # True

# indep3(v3, np.zeros(v1.size)) # IndexError

如果它比以前的解決方案需要更少的計算并且不依賴于高水平的線性代數,那么它需要處理特定的情況,并且建議的實現是臭的(不要使用它)。


格拉米安法

可以安全地對兩個向量實現公開的方法,@dmuir如下所示:


def indep4(a, b):

    return not np.isclose(np.dot(a,b)*np.dot(b,a), np.dot(a,a)*np.dot(b,b))


indep4(v1, v2) # False

indep4(v1, v3) # True

indep4(v3, v4) # False

indep4(v3, np.zeros(v1.size)) # False


查看完整回答
反對 回復 2023-10-06
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

對兩個向量的簡單測試是:A 和 B 是線性相關的 iff

(A.B)*(A.B) == (A.A) * (B.B)

在哪里 。是點積。

當然,在使用浮點運算時,您必須小心測試相等性。

這可以推廣到更多的向量。V[1] .. V[n] 是線性相關的當且僅當它們的 Gramian G 是奇異的,其中

G[i,j] = V[i].V[j] (i,j=1..N)


查看完整回答
反對 回復 2023-10-06
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

為什么不使用更簡單的算法:


def is_linearly_dependent(a, b):

    non_zero = b != 0

    if len(np.unique(a[non_zero]/b[non_zero])) > 1:

        return False

    else:

        zero = np.logical_not(b)

        if np.any(a[zero] != 0):

            return False

    return True


查看完整回答
反對 回復 2023-10-06
  • 3 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號