【问题标题】:R- reduce dimensionality LSAR-降维LSA
【发布时间】:2015-07-12 15:54:45
【问题描述】:

我正在关注一个svd的例子,但我仍然不知道如何减少最终矩阵的维度:

a <- round(runif(10)*100)
dat <- as.matrix(iris[a,-5])
rownames(dat) <- c(1:10)

s <- svd(dat)

pc.use <- 1
recon <- s$u[,pc.use] %*% diag(s$d[pc.use], length(pc.use), length(pc.use)) %*% t(s$v[,pc.use])

recon 仍然具有相同的维度。我需要将其用于语义分析。

【问题讨论】:

    标签: r pca svd dimensionality-reduction lsa


    【解决方案1】:

    您提供的代码不会降低维度。相反,它会从您的数据中提取第一个主成分,然后删除其余的主成分,然后仅使用一台 PC 重建数据。

    您可以通过检查最终矩阵的等级来检查是否发生了这种情况:

    library(Matrix)
    rankMatrix(dat)
    as.numeric(rankMatrix(dat))
    [1] 4
    as.numeric(rankMatrix(recon))
    [1] 1
    

    如果您想减少维度(行数) - 您可以选择一些主要的主成分并计算这些成分的数据分数。

    但首先让我们澄清一下您的数据 - 您似乎有 10 个样本(行)和 4 个特征(列)。降维会将 4 个特征减少为更小的特征集。

    因此,您可以先将矩阵转置为svd()

    dat <- t(dat)
    dat
                   1   2   3   4   5   6   7   8   9  10
    Sepal.Length 6.7 6.1 5.8 5.1 6.1 5.1 4.8 5.2 6.1 5.7
    Sepal.Width  3.1 2.8 4.0 3.8 3.0 3.7 3.0 4.1 2.8 3.8
    Petal.Length 4.4 4.0 1.2 1.5 4.6 1.5 1.4 1.5 4.7 1.7
    Petal.Width  1.4 1.3 0.2 0.3 1.4 0.4 0.1 0.1 1.2 0.3
    

    现在您可以重复 svd。建议在此过程之前将数据居中:

    s <- svd(dat - rowMeans(dat))
    

    可以通过将数据投影到 PC 上来获得主成分。

    PCs <- t(s$u) %*% dat
    

    现在,如果您想通过消除具有低方差的 PC 来降低维度,您可以这样做:

    dat2 <- PCs[1:2,] # would select first two PCs.
    

    【讨论】:

    • 但是原来的类呢?我需要保留一个包含原始类的矩阵,以使用例如 knn 对数据集进行分类。
    • 所以我只是粘贴相同的类?
    • 嗯什么课?我在您发布的代码中没有真正看到任何类标签。但是让我们继续 - 在数据中有 10 个样本和 4 个特征。在 PCA 和选择前 2 台 PC 之后,您将拥有 2 个功能和相同的 10 个样本。所以所有的样本都是一样的,它们的顺序是一样的。如果你有它们,你可以使用相同的类标签。请注意,在我的代码示例中,列和特征位于行中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2013-12-31
    • 1970-01-01
    • 2015-02-28
    • 2023-03-07
    相关资源
    最近更新 更多