我執行臉部識別Principal Component Analysis
在Python
未做的已使用numpy
或OpenCV
定義PCA
方法。但我的結果是字面上的垃圾。主成分分析在Python:解析錯誤
我在OpenCV
的doc上閱讀文檔和算法描述。但有些事情並不清楚。
- 如果
X = {x1, x2, ..., xn}
那麼我相信它不是計算協方差矩陣時使用的X矩陣嗎?但是,你必須減去平均值等,如前兩步所述。 - 特徵向量必須按照降序排列的特徵值排序。您是否需要在查看相應特徵值的絕對值時進行排序?無論如何,順序不是主要問題,因爲我繪製了所有的特徵向量,所以我可以相應地重新排列它們。我想我犯了一個分析錯誤。
我實現了以下內容:
MU = X.mean(axis=0)
for i in range(n):
X[i,:] -= MU
S = (np.dot(X, X.T)/float(n))
#Hermitian (or symmetric) matrix.
eigenvalues, eigenvectors = numpy.linalg.eigh(S)
eigenvectors = numpy.dot(X.T, eigenvectors)
for i in range(n):
eigenvectors[:,i] = normalize_vector(eigenvectors[:,i])
注意,採樣值存儲在行而不是列。所以X
的形狀nxd
與n
樣本的數量和d
樣本的尺寸。
上述圖像爲基準。首先是平均值,以下三個是最大的特徵向量。 下面的圖片是我的結果。首先是平均值,以下是所有特徵向量的順序。但他們似乎不符合結果。
cv2.PCACompute(X, 6)
仍然會產生更好的結果。
確定的第一個問題是很好的解釋,但現在我對n或n-1的劃分有點困惑,因爲它們似乎都在某些站點上使用。對於排序,我仍然有負特徵值的問題。我認爲300,-100和1是按300,-100,1排序的,還是按300,1,-100排序?我將嘗試用X.T乘以後得到的特徵向量。 – Matthias
協方差矩陣的計算除以'n',我也看到了一些使用'n-1'的實現,但我無法說出一個理由(我一直使用'n'很長一段時間,結果很好) 。關於負特徵值,你不應該有任何協方差矩陣[Positive Semi-defined](http://en.wikipedia.org/wiki/Covariance_matrix#Properties),那些矩陣只有[positive eigenvalues](http:///www.math.ucsd.edu/~njw/Teaching/Math271C/Lecture_03.pdf)。如果你找不到原因發佈鏈接到你的測試img,我可以嘗試找到更多的東西。 –
https://dl.dropboxusercontent.com/u/69633291/face_recognition.zip你必須把數據文件夾放在你的用戶文件夾中 – Matthias