3

从我们离开的地方接...

所以我可以使用 linalg.eig 或 linalg.svd 来计算 PCA。当它们被输入相同的数据时(我目前正在使用 Iris 数据集),每个都返回不同的主成分/特征向量和特征值。

这里或任何其他将 PCA 应用于虹膜数据集的教程,我会发现特征值是[2.9108 0.9212 0.1474 0.0206]. 该eig方法为我提供了一组不同的特征值/向量,我不介意使用,除了这些特征值,一旦相加,就等于维数 (4),并且可以用来找出每个分量对总方差。

linalg.eig我返回的特征值是做不到的。例如,返回的值为[9206.53059607 314.10307292 12.03601935 3.53031167]. 在这种情况下,方差的比例为[0.96542969 0.03293797 0.00126214 0.0003702]另一页说(“一个组件解释的变化比例就是它的特征值除以特征值之和。”)

由于每个维度解释的方差应该是恒定的(我认为),因此这些比例是错误的。所以,如果我使用 的返回值svd(),这是所有教程中使用的值,我可以从每个维度获得正确的变化百分比,但我想知道为什么eig不能这样使用返回的值。

我假设返回的结果仍然是投影变量的有效方法,那么有没有办法转换它们,以便我可以得到每个变量解释的正确比例的方差?换句话说,我可以使用该eig方法并且仍然具有每个变量的方差比例吗?此外,这种映射是否只能在特征值中完成,以便我可以同时拥有真实的特征值和归一化的特征值?

对不起,很长的文章顺便说一句。这是一个(::)已经走到这一步的。假设你不只是阅读这一行。

4

4 回答 4

4

Taking Doug's answer to your previous question and implementing the following two functions, I get the output shown below:

def pca_eig(orig_data):
    data = array(orig_data)
    data = (data - data.mean(axis=0)) / data.std(axis=0)
    C = corrcoef(data, rowvar=0)
    w, v = linalg.eig(C)
    print "Using numpy.linalg.eig"
    print w
    print v

def pca_svd(orig_data):
    data = array(orig_data)
    data = (data - data.mean(axis=0)) / data.std(axis=0)
    C = corrcoef(data, rowvar=0)
    u, s, v = linalg.svd(C)
    print "Using numpy.linalg.svd"
    print u
    print s
    print v

Output:

Using numpy.linalg.eig
[ 2.91081808  0.92122093  0.14735328  0.02060771]
[[ 0.52237162 -0.37231836 -0.72101681  0.26199559]
 [-0.26335492 -0.92555649  0.24203288 -0.12413481]
 [ 0.58125401 -0.02109478  0.14089226 -0.80115427]
 [ 0.56561105 -0.06541577  0.6338014   0.52354627]]

Using numpy.linalg.svd
[[-0.52237162 -0.37231836  0.72101681  0.26199559]
 [ 0.26335492 -0.92555649 -0.24203288 -0.12413481]
 [-0.58125401 -0.02109478 -0.14089226 -0.80115427]
 [-0.56561105 -0.06541577 -0.6338014   0.52354627]]
[ 2.91081808  0.92122093  0.14735328  0.02060771]
[[-0.52237162  0.26335492 -0.58125401 -0.56561105]
 [-0.37231836 -0.92555649 -0.02109478 -0.06541577]
 [ 0.72101681 -0.24203288 -0.14089226 -0.6338014 ]
 [ 0.26199559 -0.12413481 -0.80115427  0.52354627]]

In both cases, I get the desired eigenvalues.

于 2011-01-28T04:47:46.823 回答
0

您确定这两种情况的数据相同并且尺寸顺序正确(您不是在旋转数组中发​​送吗?)?我敢打赌,如果您正确使用它们,您会发现它们都给出相同的结果;)

于 2011-01-28T03:10:51.447 回答
0

我建议对 PCA 使用 SVD(奇异值分解),因为
1)它直接为您提供所需的值和矩阵
2)它很健壮。有关(惊喜)虹膜数据的示例,
请参见SO 上的 principal-component-analysis-in-python 。运行它给出

read iris.csv: (150, 4)
Center -= A.mean: [ 5.84  3.05  3.76  1.2 ]
Center /= A.std: [ 0.83  0.43  1.76  0.76]

SVD: A (150, 4) -> U (150, 4)  x  d diagonal  x  Vt (4, 4)
d^2: 437 138 22.1 3.09
% variance: [  72.77   95.8    99.48  100.  ]
PC 0 weights: [ 0.52 -0.26  0.58  0.57]
PC 1 weights: [-0.37 -0.93 -0.02 -0.07]

您会看到,来自 SVD 的对角矩阵 d 的平方给出了来自 PC 0、PC 1 ... 的总方差的比例。

这有帮助吗?

于 2011-01-29T16:38:00.660 回答
0

我知道进行 PCA 的三种方法:从相关矩阵、协方差矩阵的特征值分解或在未缩放和未居中的数据上派生。听起来您正在传递 linalg.eig 正在处理未缩放的数据。无论如何,这只是一个猜测。您的问题的一个更好的地方是stats.stackexchange.com。math.stackexchange.com 上的人不使用实际数字。:)

于 2011-01-28T03:47:09.433 回答