我正在計算針對正在處理的應用程序的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位小數。有沒有更好的方法來做到這一點數字?
這實際上是一個數學問題 - 你要求的是一個數值*方法*,而不是它的*實現*。在http://math.stackexchange.com/上提問可能會更好。 – 2010-12-12 18:05:17
你實際上是否需要超過6位小數的精度? (我認爲實際上很不錯)。您提到的其他解決方案是否也在python中實現?爲什麼你懷疑別人的解決方案在數值上比你的解決方案更好(據我記憶是這是計算Fisher線性判別分析投影向量的標準方法(http://en.wikipedia.org/wiki/Linear_discriminant_analysis)你也可以在stats.stackexchange.com上詢問 – 2010-12-12 18:15:23
@Sven:我不一定同意,實現細節可能會引入*舍入誤差*,這與*截斷誤差*不同,它本質上是數學的。我認爲在math.stackexchange中對這些人的尊重,我認爲這裏有比這更好的數字。 – 2010-12-12 18:18:53