2015-07-13 111 views
0

我想弄清楚如何求解一個近似線性方程組(即在解中存在錯誤,並且我希望它最小化)。使用qr.solve的簡單線性方程給出了非常不好的結果

爲了理解/驗證過程,我想出了一個簡單的例子:我給了一堆5x + 4x^2 + 3x^3,答案中有0-5%的錯誤。

> a 
     [,1] [,2] [,3] 
    [1,] 1  1  1 
    [2,] 2  4  8 
    [3,] 3  9  27 
[...] 
[98,] 98 9604 941192 
[99,] 99 9801 970299 
[100,] 100 10000 1000000 

> b 
    [1]  12.04  48.17  130.02  269.93  505.75  838.44 
    [7] 1202.04 1911.69 2590.51 3381.00 4538.80 5846.19 
... 
[97] 2824722.45 2826700.98 3012558.52 2920400.25 

當我嘗試解決這個使用qr.solve,

> qr.solve(a,b) 
[1] 85.2896286 -0.8924785 3.0482766 

的結果是完全關閉(想5,4,3)。我確定我錯過了一些明顯的東西。或者也許我對多項式的實驗本質上是不好的? (?如果是這樣,爲什麼)

+2

你能否讓這個例子重現? – 2015-07-13 03:48:09

+0

這個單字「linear」。我不認爲這意味着你的想法。 (y = 5x + 4x^2 + 3x^3是一個多項式而不是線性的)。 –

+1

@ mathematical.coffee在此上下文中,「線性」是指參數*中的線性*。 – Roland

回答

1

我不能與附加誤差重現此問題:

a <- cbind(1:100, (1:100)^2, (1:100)^3) 
set.seed(42) 
b <- a %*% (5:3) + rnorm(100, sd = 0.1) 
qr.solve(a, b) 
#   [,1] 
#[1,] 4.998209 
#[2,] 4.000056 
#[3,] 3.000000 

我可以用相對誤差再現它,但是這不是真的奇怪,因爲錯誤然後由主導三階積分的大小:

a <- cbind(1:100, (1:100)^2, (1:100)^3) 
set.seed(42) 
b <- a %*% (5:3) * rnorm(100, mean = 1, sd = 0.1) 
qr.solve(a, b) 
#    [,1] 
#[1,] -1686.611970 
#[2,] 68.693368 
#[3,]  2.481742 

請注意,第三個係數是關於你期望的(甚至在你不可重現的例子中更是如此)。

+0

當我添加錯誤時,我可能會有點激動。我添加了5%的錯誤(即如果真實值是1000,我會隨機添加-50 .. + 50,如果它是10000,我會隨機添加-500 .. + 500)。我認爲這是問題(我認爲這是可行的,但不要猜測)。 – Kalle

相關問題