2012-01-25 50 views
2

我有點雲,我需要最適合的線。我正在使用JAMA,但我不知道爲什麼,有些東西不起作用。可能是我不知道它是如何工作的。我有一個Nx3矩陣(這是JAMA svd支持的),我從Svd獲得正確的Matrix V。我需要的向量是對應於最大奇異值的右奇異向量(行或列)。這個矢量應該代表主要方向。Java猶太人與JAMA或其他

每個矢量應該有Y作爲最大正值,X可以是兩個正或負和z被認爲是負的。但有時候我得到的矢量有一個負的y值,或者它指向錯誤的方向。

我的點雲是相當普通的都postioned幾乎沿y軸(帶z小負)。所以主要方向應該很容易找到。但它仍然無法正常工作。

在這種情況下,我得到的行向量(我試過coloumn矢量太)權矩陣V.我已經從「點集」中減去質心。

public static Matrix bestDirection(Matrix pointSet){ 

    Matrix bestFittingLine = new Matrix(3,1); 
    SingularValueDecomposition svd = pointSet.svd(); 

    bestFittingLine.set(0, 0, svd.getV().get(0, 0)); 
    bestFittingLine.set(1, 0, svd.getV().get(0, 1)); 
    bestFittingLine.set(2, 0, svd.getV().get(0, 2)); 

    return bestFittingLine; 
} 

我想也許我沒有考慮一些東西。 Idk也許我應該使用另一種技術或其他庫。

+0

你爲什麼不做簡單的線性迴歸?最小二乘擬合應該很好地做到這一點。 – duffymo

+0

@duffymo因爲我不知道該怎麼做,以及它如何在3D中工作,其中z與x和y無關。我會喜歡它的一些幫助。 – G4bri3l

+0

我得到了一份可以解釋它的scribd文檔,但我現在無法發送給您。谷歌「線性迴歸多變量」;你會得到這樣的東西:http://www.stat.yale.edu/Courses/1997-98/101/linmult.htm。 SVD是偉大的,但它不會是我的第一選擇。 – duffymo

回答

1

維基百科上SVD:

非退化奇異值總是具有獨特的左右奇異向量,增長一個單位相位因子相乘(對於實際情況高達簽署)。

簡而言之,你不能依賴輸出奇異向量的符號。

您可能還需要SVD前居中數據。

爲什麼你不執行迴歸?

+0

這是不可能的問題。我發現它很難,但無論如何感謝。這是我的問題的答案。我沒有使用迴歸,因爲我的項目中也需要SVD來處理其他事情,所以我不用寫新行,而只是使用已有的東西。現在一切正常。 – G4bri3l

0

如果公式採用這種形式:

z = a0 + a1*x + a2*y 

你的矩陣式看起來像這樣的N個點:

z(i) = a0 + a1*x(i) + a2*y(i) i = 1, N 

左手邊是一個NX1向量;右邊是乘以3x1的未知矢量的N×3矩陣。

乘兩側由A(轉置),你結束了一個3×3矩陣乘以未知係數的3×1向量這等於3×1向量。使用標準矩陣解來求解未知係數。即使是封閉形式,也很容易做到。

這簡化了線性最小二乘解。這是一個scribd document,詳細說明了它。

+0

非常感謝。你一直很有幫助,我在其他答案中評論了我仍然在使用SVD的原因。 – G4bri3l