2010-12-12 80 views
2

我正在計算針對正在處理的應用程序的LDA(線性判別分析)轉換,並且我一直在關注這些notes(從第36頁開始,尤其是幻燈片47中的綠色)。用於LDA轉換的良好數值解決方案

我在Python(與numpy的和SciPy的)這樣做,這就是我想出了:

import numpy as np 
from scipy.linalg import sqrtm 
... 
sw_inv_sqrt = np.linalg.inv(sqrtm(self.sigma_within)) 
self.d, self.v = np.linalg.eig(
    np.dot(
     np.dot(sw_inv_sqrt, self.sigma_between), 
     sw_inv_sqrt 
     )) 
self.v = np.dot(sw_inv_sqrt, self.v) 

我知道,因爲我已經是比別人這個實現是正確的。我的關注點是解決方案數值意義。在將我的解決方案與其他人進行比較時,他們只匹配約6位小數。有沒有更好的方法來做到這一點數字?

+0

這實際上是一個數學問題 - 你要求的是一個數值*方法*,而不是它的*實現*。在http://math.stackexchange.com/上提問可能會更好。 – 2010-12-12 18:05:17

+0

你實際上是否需要超過6位小數的精度? (我認爲實際上很不錯)。您提到的其他解決方案是否也在python中實現?爲什麼你懷疑別人的解決方案在數值上比你的解決方案更好(據我記憶是這是計算Fisher線性判別分析投影向量的標準方法(http://en.wikipedia.org/wiki/Linear_discriminant_analysis)你也可以在stats.stackexchange.com上詢問 – 2010-12-12 18:15:23

+0

@Sven:我不一定同意,實現細節可能會引入*舍入誤差*,這與*截斷誤差*不同,它本質上是數學的。我認爲在math.stackexchange中對這些人的尊重,我認爲這裏有比這更好的數字。 – 2010-12-12 18:18:53

回答

2

嘗試eigh而不是eig。由於Sigma^{ - 1/2} B_0 Sigma^{1/2}是對稱的,因此使用適應的例程。

此外,請注意在計算B_0時使用正確的算法。有關更簡單的案例,請參閱http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Two-pass_algorithm(您可以在此調整)。

+0

謝謝,這是一個很好的提示,但它並沒有改變我的結果......可能是因爲Andre是對的,並且不同的平臺會產生差異 – Anonymous 2010-12-12 20:18:29

+0

在LAPACK(至少是英特爾MKL版本)中,有一個選項可以高精度地計算對稱矩陣的特徵向量,該方法遠不是t rivial雖然。如果您願意在C或Fortran中重寫您的代碼,則可以使用它。 – 2010-12-12 21:11:30

相關問題