如何在Python中使用PCA/SVD进行特征选择和识别?

3
我正在跟随 Python中的主成分分析 使用PCA,但是我不知道如何确定要选择哪些特征(即我的列/特征中哪些具有最佳差异性)。
当我使用scipy.linalg.svd时,它会自动对奇异值进行排序,因此我无法确定它们所属的列。
示例代码:
import numpy as np
from scipy.linalg import svd
M = [
     [1, 1, 1, 1, 1, 1],
     [3, 3, 3, 3, 3, 3],
     [2, 2, 2, 2, 2, 2],
     [9, 9, 9, 9, 9, 9]
]
M = np.transpose(np.array(M))
U,s,Vt = svd(M, full_matrices=False)
print s

有没有不排序奇异值的其他方法来完成这个任务?

更新:看起来这可能是不可能的,至少根据 Matlab 论坛上的这篇帖子: http://www.mathworks.com/matlabcentral/newsreader/view_thread/241607。如果有人知道不同的方法,请告诉我 :)


不确定我是否理解问题。M = U S V^T。因此,最大的奇异值s[0]对应于左奇异向量U[:,0]和右奇异向量Vt[0,:] - Steve Tjoa
@SteveTjoa - 我想知道哪个 s[i] 值映射到哪个 M[j] 向量,假设存在一对一的映射关系。我的目标是进行特征选择,但我也想知道我选择了哪些特征。 - Dolan Antenucci
我现在意识到PCA的输入和输出之间没有一对一的映射关系。我已经在下面的答案中澄清了这一点。 - Dolan Antenucci
1个回答

2
我曾经错误地认为PCA进行的是特征选择,但实际上它进行的是特征提取。
相反,PCA创建了一系列新特征,每个特征都是输入特征的组合。
如果你真的想要进行特征选择,可以查看PCA创建特征上输入特征的权重。例如,matplotlib.mlab.PCA库在一个属性中提供了这些权重(有关该库的更多信息请参见链接)。
from matplotlib.mlab import PCA
res = PCA(data)
print "weights of input vectors: %s" % res.Wt

听起来使用特征提取路线是使用PCA的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接