簡體   English   中英

為 QR 分解執行向量的家庭反射

[英]Performing Householder Reflection of a vector for QR Decomposition

這個問題是在我面前問到的

然而,那里的解決方案對我來說並不令人滿意,我仍然卡在 33% 不匹配,所以我覺得有必要重新打開這個話題(而且那個帖子的作者在解決問題后沒有添加適當的答案為自己)。

我寫的代碼在這里:

def householder(vec):
    vec = np.asarray(vec, dtype=float)
    if vec.ndim != 1:
        raise ValueError("vec.ndim = %s, expected 1" % vec.ndim)

    n = len(vec)
    I = np.eye(n)
    e1 = np.zeros_like(vec).astype(float)
    e1[0] = 1.0
    V1 = e1 * np.linalg.norm(vec)
    print("V1:", V1)
    u = vec
    u[0] = -(np.sum(np.square(u[1:]))) / (vec[0] + np.linalg.norm(vec))
    u = u / np.linalg.norm(u)
    H = I - 2 * (np.outer(u, u))
    return V1 , H

這是此代碼應該通過的測試用例:

v = np.array([1, 2, 3])
v1, h = householder(v)

assert_allclose(np.dot(h, v1), v)
assert_allclose(np.dot(h, v), v1)

第一個斷言成功通過,但是,第二個斷言給了我 33% 的不匹配:

AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0

Mismatch: 33.3%
Max absolute difference: 4.4408921e-16
Max relative difference: 1.18687834e-16
 x: array([3.741657e+00, 2.220446e-16, 0.000000e+00])
 y: array([3.741657, 0.      , 0.      ])

我已經嘗試了大約 5 個小時,我覺得我在這上面浪費了太多時間。 任何使此代碼通過測試的幫助都會受到我的贊賞。

嗯,在我看來是正確的。

問題似乎是assert_allclose函數的參數。 具體來說,它報告是否

absolute(a - b) <= (atol + rtol * absolute(b))

對於每對條目ab 根據文檔,對於普通的allclose函數,絕對容差為1e-8 但是atolassert_allclose參數默認為 0 。

由於您的目標b為零,因此任何值 != 0 與此函數都不接近,即使這兩個值肯定相當接近。

我建議將 atol 設置為 1e-8,即

assert_allclose(np.dot(h, v), v1, atol=1e-8)

我不太確定為什么allclose assert_allclose普通的allcloseassert_allclose選擇了不同的參數...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM