-3

私の質問の最初の部分は、標準偏差よりも高速な計算方法はありますか?

mySD = apply(myData,1,sd)

質問の 2 番目の部分は、外れ値 (各行の平均から 3 SD 離れている) を削除し、各行の SD を再計算する方法です。

質問の 3 番目の部分は、各行の SD を計算したら、特定のしきい値 (たとえば 0.05) を超えるものをどのように選択するかです。

私のマトリックスには、3,000 万の行と 50 の列があります。

R よりも高速な方法 (perl や matlab など) があれば、喜んで試してみます。

...

3,000 万行と 50 列のマトリックスがあります。各行について、外れ値を取り除き、標準偏差 (SD) を計算したいと思います。だから私は3000万SDを持っています。次に、SD が最も高い行 (上位 %5) をピックアップしたいと思います。

Rを試してみましたが、データをRにロードするだけでも膨大な時間がかかります。データを *RData として保存することもできました。それでも遅く、時間がかかりすぎます。

これらのことを行うより速い方法はありますか?rまたはperlまたはmatlabのいずれかですか?

4

2 に答える 2

3

あなたの質問には、効率的な計算と大量のデータの処理という 2 つの部分があります。

効率的な計算

3,000 万行と 50 列の 5% を含む、より管理しやすいデータ セットがあるmとします (これは私の 8Gb の約 30% を使用します。メモリが不足するとすべての実行が遅くなるので、このタイプのデータ セットについてお知らせください。情報)。

nrow <- .05 * 30000000
ncol <- 50
m <- matrix(rnorm(nrow * ncol), nrow)

clean行ごとに外れ値を効率的に削除する関数を作成することもあるでしょう。行単位の標準偏差を効率的に計算する別の関数を使用する可能性があります

rowSD <- function(m) {
    ## efficiently calculate row-wise SD
    ## naive: apply(m, 1, sd, na.rm=TRUE)
    ## update via @BenBolker / http://stackoverflow.com/questions/16046820/change-row-values-to-zero-if-less-than-row-standard-deviation
    sqrt(rowSums((m - rowMeans(m, na.rm=TRUE))^2, na.rm=TRUE) / (ncol(m)-1))
}

clean <- function(m) {
    ## efficiently implement your strategy for identifying outliers
    m[abs(m - rowMeans(m)) > 3 * rowSD(m)] <- NA  # fast enough
    m
}

マトリックスmの単純な実装にrowSD(m)は約 56 秒かかりましたが、@BenBolker からの更新には約 1.4 秒かかりました。clean(sd)約5秒かかります。どちらもデータの複数のコピーを作成し、データを通過させますが、これは理想とはほど遠いものです。

大きなデータ

size のチャンクでデータを処理することを考えてくださいnrow。2 つのチャンクm1を消去しm2た場合、それらを結合して上位の値を保持できます。

sd <- c(rowSD(m1), rowSD(m2))
## if sorted, sd[idx] would be the value that separate high and low
idx <- nrow(result) + nrow(m) - nrow 
keep <- sd > sort.int(sd, partial=idx)[idx]  # index correct, or off-by-one?
## replace smallest in m1 with largest in m2
m1[!head(keep, nrow(m1)),] <- m2[tail(keep, nrow(m2)),]

scan行列演算を行っているため、データはすべて数値であり、ファイルをチャンクで読み取ることが適切な入力であるように聞こえます。

conn <- file("myfile", "r")
result <- matrix(0, nrow, ncol)
while (length(x <- scan(con, nmax = nrow * ncol))) {
    m <- clean(matrix(x, nrow, ncol, byrow=TRUE))
    sd <- c(rowSD(result), rowSD(m))
    idx <- nrow(result) + nrow(m) - nrow
    keep <- sd > sort.int(sd, partial=idx)[idx]
    result[!head(keep, nrow),] <- m[tail(keep, nrow(m)),]
}
close(conn)

resultは、標準偏差が最も高いクリーンな行の目的のコレクションです。

于 2013-07-14T19:23:38.907 に答える
1
library(bigmemory)
?read.big.matrix

初心者向け。次にbiganalyticsbigtabulatebiglm、 などを見てください。

于 2013-07-14T17:01:01.337 に答える