当前位置: 首页 > 知识库问答 >
问题:

使用多个大栅格计算PCA

柯易安
2023-03-14

在计算皮尔逊相关性时,下面的脚本对我来说也适用于相同的数据。我最近对其进行了调整,创建了一个协方差矩阵,以输入到pca中。我在论坛上读到,输入预先创建的协方差矩阵可能会避免记忆问题,但我的情况并非如此。运行协方差矩阵时,我会出现以下错误:

Error: cannot allocate vector of size 1.1 Gb
In addition: Warning messages:
1: In na.omit.default(cbind(x, y)) :
  Reached total allocation of 6141Mb: see help(memory.size)
2: In na.omit.default(cbind(x, y)) :
  Reached total allocation of 6141Mb: see help(memory.size)
3: In na.omit.default(cbind(x, y)) :
  Reached total allocation of 6141Mb: see help(memory.size)
4: In na.omit.default(cbind(x, y)) :
  Reached total allocation of 6141Mb: see help(memory.size)

有人能提出一个更有效的方法来做到这一点,这样我就不会遇到内存问题了吗?如果我在计算协方差方面完全偏离了基础,那很好。PCA是我最终唯一需要的东西。我的数据是12,1波段光栅,采用的是ArcGIS的光栅格式,每个都很大,为581.15 mb。非常感谢任何帮助。

library(rgdal)
library(raster)


setwd("K:/Documents/SDSU/Thesis/GIS Data All/GIS Layers/Generated_Layers/GridsForCor")


# List the full path to each raster:
raster_files = c('aspectclp',
                 'lakedistclp',
                 'ocdistclp',
                 'popdenclp',
                 'roaddistclp',
                 'scurveclp',
                 'sdemclp',
                 'solarradclp',
                 'sslopeclp',
                 'vegcatclp',
                 'canopcvrclp',
                 'canophtclp')

cov_matrix <- matrix(NA, length(raster_files), length(raster_files))
for (outer_n in 1:length(raster_files)) {
  outer_raster <- raster(raster_files[outer_n])
  # Start this loop at outer_n rather than 1 so that we don't compute the 
  # same covariance twice. At the end of the loops cov_matrix will be upper 
  # triangular, with the lower triangle all NA, and the diagonal all NA 
  # (since the diagonal would all be 1 anyway).
  for (inner_n in (outer_n):length(raster_files)) {
    # Don't compute correlation of a raster with itself:
    if (inner_n == outer_n) {next}
    inner_raster <- raster(raster_files[inner_n])
    cov_matrix[outer_n, inner_n] <- cov(outer_raster[], inner_raster[], 
                                    use='complete.obs', method = "spearman")
  }
}

pca_matrix <- princomp(raster_files, cor = FALSE, covmat = cov_matrix))

# Writing to a txt file & csv file
write.table(pca_matrix, "PCA.txt", sep="\t", row.names = FALSE)
write.csv(pca_matrix, "PCA.csv") enter code here

共有1个答案

骆文彬
2023-03-14

我在ffdf对象上进行pca时也有类似的困难。尝试在(内部)循环中插入一个gc(),如下所示:

for (inner_n in (outer_n):length(raster_files)) {
  # Don't compute correlation of a raster with itself:
  if (inner_n == outer_n) {next}
  inner_raster <- raster(raster_files[inner_n])
  cov_matrix[outer_n, inner_n] <- cov(outer_raster[], inner_raster[], 
                                use='complete.obs', method = "spearman")
  gc()
}

这会强制立即进行垃圾收集,为循环的继续释放足够的内存-至少对我来说,这足以让它工作。

 类似资料:
  • 我正在使用 : https://github.com/angular-ui/ui-grid.info/tree/gh-pages/release/3.0.0-RC.18 当我硬编码该值时,如上所示,网格展开,一切都按预期工作。 但是,如果我执行以下操作... 高度在div中打印,div会变宽,但内容本身只会变宽到340px左右。剩下的空间是空白的,所以我看到的不是25行,而是8行。我必须向下滚动,

  • 我想计算区域内的分区统计数据,以符合等宽。 得到区段列表后,想法是分配块号,因为栅格::区段函数需要一个带有表示区段代码的栅格层。 当我尝试用分区编号填充范围时,填充的区域与范围不对应(请参见图)。为什么会这样?

  • 我有一个96个分类栅格的列表(每个栅格都有一个相关变量,即rcp、period和month),其值范围为1-16,我想计算每个栅格中每个类别所覆盖的面积,如果栅格中不存在该类别,则返回NA。 这是我现在创建的函数 问题是,它返回的数据帧仅包含现有光栅值,而不包含缺少的值。见下文: 如何返回包含所有类别(1-16)的数据帧?并将所有输出合并为一个?列名应为rcp、period和month。 以下是我

  • 栅格代数运算是运用代数学的观点对地理特征和现象进行空间分析,即对一个或多个栅格数据进行数学运算和函数运算。同时,运算得出的结果栅格数据的像元值是由一个或多个输入栅格数据的同一位置的像元值通过代数运算得到的。 为了更好的实现栅格代数运算功能,SuperMap 提供了丰富的运算符、函数和运算表达式,除了常用的算术运算(如加、减、乘、除和取整等)方法,还支持通过用户自定义的表达式,来进行栅格的算术运算、

  • Framework7 有灵活的布局网格,允许你按需求放置内容: <!-- Each "cells" row should be wrapped with div class="row" --> <div class="row"> <!-- Each "cell" has col-[widht in percents] class --> <div class="col-50">50

  • 我正在使用光栅文件进行一些计算。我特别计算移动平均线。我想知道在任何计算之前热分配值给NA。 但是我有一个错误: 我也试过这个: 没有错误,但当我查看结果时,我发现没有任何变化。