我将通过将PCA / SVD用于我提取的特征来减少维数。
假设我想使用SIFT作为特征并使用SVM作为分类器进行分类。
我有3张用于训练的图像,我将它们安排在另一排......
第1张图像的第1行,第2张图像的第2行和第3张图像的第3行...... 列代表功能
A=[ 1 2 3 4 5
4 5 6 7 8
0 0 1 9 0]
为了减少维数(从我的3x5矩阵/非方阵),我们必须做 A * EigenVector
现在我必须从我的A矩阵中提取特征向量根据我的理解,SVD用于非方矩阵,所以要执行PCA(eigs函数),我需要通过将它与它的转置相乘来使其成为正方形)
如果我直接进行SVD
[u1,s1,v1] = svd(A);
我得到了
u1 =
-0.4369 0.1426 0.8882
-0.8159 0.3530 -0.4580
-0.3788 -0.9247 -0.0379
v1 =
-0.2229 0.2206 -0.7088 -0.6070 -0.1754
-0.2984 0.2910 -0.3857 0.4705 0.6754
-0.3966 0.2301 -0.0910 0.5382 -0.7012
-0.6547 -0.7495 0.0045 -0.0598 0.0779
-0.5248 0.5020 0.5836 -0.3419 0.1233
当我使用PCA(eigs功能){因为我安排不同行中的图像专长,所以我需要做A * A'},我得到了
c=A*A'
[e1 e2]=eigs(c);
e1 =
0.4369 0.1426 0.8882
0.8159 0.3530 -0.4580
0.3788 -0.9247 -0.0379
我的问题是:
我真的很喜欢任何答案
答案 0 :(得分:1)
假设您有n维样本,并且希望通过PCA将其减少为d维数据
假设您的数据存储在矩阵A nxN 中(N是样本数(此处为图像))。
这里n=3
和N=5
我们定义了一个相关矩阵R = A*A'
(nxn)。您可以使用协方差矩阵
计算R
的eignen向量和相应的特征值:
R = A*A';
[eigVec, eigVal] = eig(R)
eigVec =
0.8882 0.1426 0.4369
-0.4580 0.3530 0.8159
-0.0379 -0.9247 0.3788
eigVal =
1.7728 0 0
0 49.6457 0
0 0 275.5815
请注意eigVec
列是R
的特征向量。
一些特征值将为零,如果不是,则可以采用阈值。所以你可以消除相应的特征向量:
T = eigVec(:, 2:3)
T =
0.1426 0.4369
0.3530 0.8159
-0.9247 0.3788
现在T
是一个nxd
矩阵
对于任何行向量X 1xn ,X 1xn * T nxd 将产生Y 1xd 输出。
最后的答案;
B = A'*T;