2015-12-04 35 views
3

我試圖圍繞給定數據集創建邊界框。2D中的PCA計算原始數據中的中心點

因此,我的想法是使用PCA。我讀到它不會總是找到最佳解決方案,但這並不重要。

我到目前爲止所做的是我計算協方差矩陣並用它來計算這個矩陣的SVD。

比方說我們有像

[40, 20], [-40, -20],[40, -20],[-40, 20],[30, 30] 

樣本輸入的協方差矩陣將成爲

[1780.0, 180.0] [180.0, 580.0] 

隨着SVD我得到的旋轉矩陣U:

[0.99, 0.15] 

[0.15, -0.99] 

和對角矩陣d:

[1806.41, 0] 

[0, 553.58] 

隨着我的特徵向量我能夠計算表示框中線的斜率。

我現在需要在原始空間中獲取PCA的中心,而不是在以0爲中心的空間中。 而且我還需要找出向量的長度。

有沒有人有一個想法如何讓他們?

回答

0

我找到了解決方案。 這個想法是使用兩個特徵向量來計算所有指向它的最大距離。

最大距離將會是矩形寬度和高度的一半長度。如圖所示在畫面下方

enter image description here

爲了定位矩形我通過

P1計算4分。X = MAX1 * eigenvector1(0)+ MAX2 * eigenvector1(1)

p1.y = MAX1 * eigenvector2(0)+ MAX2 * eigenvector2(1)

所有點。

比我只需要通過meanX和meanY和包圍原始數據集的矩形來轉換頂點和所有數據點。

1

有趣的問題。只是有些想法。

您指的是數據中心的中心嗎? 想想這樣,如果我們可以將(0,0)投影回原始空間,那就是平均值。

要找到長度,假設您試圖在框中包含每個點,可以投影每個主成分方向上的每個點並記錄最大和最小座標。差異將是長度。

順便說一下,我的印象是相關矩陣上的PCA通常是更合適的選擇,我認爲這也適用於您的問題。

0

上述解決方案中的問題是僅使用max並不是最好的想法,因爲它在特徵向量的一個方向上總是會很小。 通過使用min和max,我現在可以在主要組件的兩個方向上創建最小封閉框。

爲了計算我用下面的代碼,其中minDistX是最小距離的絕對值的點:

p1.setX(minDist2 * U[0][0] + maxDist1 * U[0][1]); 
p1.setY(minDist2 * U[1][0] + maxDist1 * U[1][1]); 

p2.setX(minDist2 * U[0][0] - minDist1 * U[0][1]); 
p2.setY(minDist2 * U[1][0] - minDist1 * U[1][1]); 

p3.setX(-(maxDist2 * U[0][0] + minDist1 * U[0][1])); 
p3.setY(-(maxDist2 * U[1][0] + minDist1 * U[1][1])); 

p4.setX(-(maxDist2 * U[0][0] - maxDist1 * U[0][1])); 
p4.setY(-(maxDist2 * U[1][0] - maxDist1 * U[1][1]));