4

ベクトルに含まれるいくつかの数値から累積分布を作成する必要があります。ベクトルは、与えられたアルゴリズムで内積演算が発生する回数をカウントします。

ベクトルの例は次のようになります。

myVector = [100 102 101 99 98 100 101 110 102 101 100 99]

0 から 120 までの範囲に対して、内積が 99 未満である確率をプロットしたいと思います。組み込み関数

Cumdist(MyVector)

cumdist が現在提供しているよりも広い範囲でプロットする必要があるため、適切ではありません。

使ってみました

plot([0 N],cumsum(myVector))

しかし、私のベクトルには同じ値である複数のエントリがあり、二重にカウントしないようにする方法がわかりません。

ここに私が望むことをするいくつかのpythonコードがあります:

count = [x[0] for x in tests]
found = [x[1] for x in tests]
found.sort()
num = Counter(found)
freqs = [x for x in num.values()]
cumsum = [sum(item for item in freqs[0:rank+1]) for rank in xrange(len(freqs))]
normcumsum  = [float(x)/numtests for x in cumsum]

tests は内積が行われた回数を表す数値のリストです。

これが私が探しているものの例です:

累積分布の例

4

3 に答える 3

3

cumsum累積分布を作成するために、ベクトルで直接使用することはできません。代わりに次の操作を行います。

sortedVector = sort(myVector(:));
indexOfValueChange = [find(diff(sortedVector));true];
relativeCounts = (1:length(sortedVector))/length(sortedVector);

plot(sortedVector(indexOfValueChange),relativeCounts(indexOfValueChange))

編集

プロットの x 範囲を変更するだけの場合は、

xlim([0 120]) 

必要なことをする必要があります。

于 2013-09-05T09:38:21.393 に答える
2

5時間と回答はすでに受け入れられていますが、まだ別の回答に興味がある場合は...

あなたがしようとしているのは、データの経験的 CDFを取得することです。おそらくあなたが持っているMatlabのStatistics Toolboxには、統計的に慎重な方法でこれを正確に行う機能がありますecdf。したがって、実際に行う必要があるのは

myVector = [100 102 101 99 98 100 101 110 102 101 100 99];
[Y,X] = ecdf(myVector);
figure;
plot(X,Y);

stairsの代わりに使用plotして、経験分布の真の形状を表示できます。

于 2013-09-05T15:12:56.933 に答える
1

これが私がそれを行う方法です:

myVector = [100 102 101 99 98 100 101 110 102 101 100 99];
N = numel(myVector);
x = sort(myVector);
y = 1:N;
[xplot , idx] = unique(x,'last')
yplot = y(idx)/N
stairs(xplot,yplot)

%Optionally
xfull = [0 xplot 120]
yfull = [0 yplot 1]
stairs(xfull,yfull)
于 2013-09-05T09:58:45.977 に答える