2

多くの nan 値を持つ 5000 行のベクトルの zscore を計算しようとしています。これを何度も計算する必要があるため、ループを使用したくないので、ベクトル化されたソリューションを見つけたいと思っていました。

ループソリューション:

for i = 1:end
   vec(i,1) = (val(i,1) - nanmean(:,1))/nanstd(:,1)
end

部分的なベクトル化されたソリューション:

zscore(vec(find(isnan(vec(1:end) == 0))))

ただし、これは元のベクトルの長さから nan 値を引いたベクトルを返します。したがって、元のサイズと同じではありません。

ベクトルの zscore を計算し、単語の後に欠落しているデータを補間したいと考えています。これを何百回も行う必要があるため、高速なベクトル化されたアプローチを探しています。

4

4 に答える 4

1

これはベクトル化されたソリューションです。

NaNsを使用していくつかのサンプルデータを生成します。

val = reshape(magic(4), 16, 1);
val(10) = NaN;
val(17) = NaN;

コードは次のとおりです。

valWithoutNaNs = val(~isnan(val));
valMean = mean(valWithoutNaNs);
valSD = std(valWithoutNaNs);
valZscore = (val-valMean)/valSD;

次に、列ベクトルvalZscoreには偏差(Zスコア)が含まれ、元の測定データのNaN値のNaN値が含まれます。val

于 2012-06-14T06:18:48.293 に答える
1

申し訳ありませんが、この回答は6か月遅れていますが、このスレッドに出くわした他の人のために:

受け入れられた答えは、実数が非常に美しく行うことをしないという点で、完全にベクトル化されていませんzscore。つまり、行列の特定の次元に沿って zscores を実行します。

OPが言っているように、一度に多数のベクトルのzscoreを計算したい場合、最良の解決策は次のとおりです。

Z = bsxfun(@divide, bsxfun(@minus, X, nanmean(X)) , 
                   nanstd(X) );

任意の次元でそれを行うには、その次元をnanmeanandの中に入れるだけnanstdで、残りは bsxfun が処理します。

nanzscore = @(X,DIM) bsxfun(@divide, bsxfun(@minus, X, nanmean(X,DIM)), ...
                                     nanstd(X,DIM));
于 2013-01-30T19:15:44.883 に答える
0

以下の無名関数のベクトル化されたバージョン (観測値が行にあり、変数が列にあると仮定します):

nanZ = @(xIn)(xIn-repmat(nanmean(xIn),size(xIn,1),1))./repmat(nanstd(xIn),size(xIn,1),1);
nanZ(matrixWithNans)
于 2014-04-11T17:11:03.317 に答える
0

無名関数:

nanZ = @(xIn)(xIn-nanmean(xIn))/nanstd(xIn);

nanZ(vectorWithNans)

于 2013-04-23T21:44:58.620 に答える