【问题标题】:Reducing dimensionality on training data with PCA in Matlab在 Matlab 中使用 PCA 降低训练数据的维数
【发布时间】:2014-01-02 06:24:08
【问题描述】:

这是一个后续问题:

PCA Dimensionality Reduction

为了对新的 10 维测试数据进行分类,我是否还必须将训练数据减少到 10 维?

我试过了:

X = bsxfun(@minus, trainingData, mean(trainingData,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtrain = bsxfun(@minus, trainingData, mean(trainingData,1));  
pcatrain = Xtest*V;

但是使用带有这个和 10 维测试数据的分类器会产生非常不可靠的结果?是不是我做错了什么?

编辑:

X = bsxfun(@minus, trainingData, mean(trainingData,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtrain = bsxfun(@minus, trainingData, mean(trainingData,1));  
pcatrain = Xtest*V;

X = bsxfun(@minus, pcatrain, mean(pcatrain,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtest = bsxfun(@minus, test, mean(pcatrain,1));  
pcatest = Xtest*V;

【问题讨论】:

    标签: matlab linear-algebra pca dimensionality-reduction


    【解决方案1】:

    您必须同时减少训练和测试数据,但方式相同。因此,一旦您从 PCA 中获得了关于训练数据的归约矩阵,您就必须使用 此矩阵 来减少测试数据的维数。简而言之,您需要一种适用于训练和测试元素的持续转换。

    使用您的代码

    % first, 0-mean data
    Xtrain = bsxfun(@minus, Xtrain, mean(Xtrain,1));           
    Xtest  = bsxfun(@minus, Xtest, mean(Xtrain,1));           
    
    % Compute PCA
    covariancex = (Xtrain'*Xtrain)./(size(Xtrain,1)-1);                 
    [V D] = eigs(covariancex, 10);   % reduce to 10 dimension
    
    pcatrain = Xtrain*V;
    % here you should train your classifier on pcatrain and ytrain (correct labels)
    
    pcatest = Xtest*V;
    % here you can test your classifier on pcatest using ytest (compare with correct labels)
    

    【讨论】:

    • 不,这是完全错误的。您应该只运行一次 的 PCA。获取矩阵V 并使用它来缩放所有数据,包括训练和测试。
    • 在伪代码中应该是这样的:你有(我假设 0 均值数据)Xtrain, Ytrain, Xtest, Ytest:V = PCA(Xtrain); Xtrain_pca = Xtrain * V; model.fit( Xtrain_pca, Ytrain ); Xtest_pca = Xtest * V; model.test(Xtest_pca);
    • 所以我需要彻底改变它吗?什么是 Ytrain 和 Ytest?
    • 我不知道是否可以将更改 10 行称为“完全更改”,但是可以。 Ytrain 和 Ytest 是标签向量的名称。但它们并不重要,这只是一个向您展示过程的伪代码
    • 唯一没有 Ytest 即测试标签?
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 2017-08-05
    • 2019-01-10
    • 2021-10-17
    • 1970-01-01
    • 2017-08-19
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多