3

次のようなデータセット(テスト用)があります。0.10.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5ビン(ステップサイズ)で最小0.1から最大1.5までの頻度カウントを取得したい0.1です。Matlab、Octave、Origin、およびAWKスクリプトでテストしました。しかし、まったく違う結果になりました。

1.Matlab

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.1:0.1:1.5;
count = histc(data, edge);

結果は次のとおりです。

count = [2 4 0 2 2 0 0 0 0 0 1 1 1 1 1]

2.オクターブ

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.1:0.1:1.5;
count = histc(data, edge);

結果は次のとおりです。

count = [2 2 2 2 2 0 0 0 0 0 1 2 0 1 1]

3.起源

コマンド「周波数カウント」を使用して、、、を設定min=0.1max=1.5ますstep size=0.1.

結果は次のとおりです。

count = [2 4 0 2 2 0 0 0 0 0 2 1 1 1]

4. AWK

{...;count[data/0.1]++;} ...

結果は次のとおりです。

count = [2 4 0 2 2 0 0 0 0 0 2 0 2 0 1]

なぜこれらの異なる結果が得られるのですか?私は何か間違ったことをしているのですか、それとも「頻度カウント」の概念を誤解していますか?上記の結果はどれも正しくないと思います...どうしたらいいですか?

4

1 に答える 1

5

簡単な方法は、エッジをシフトすることです

マトラブ:

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.05:0.1:1.55;
count = histc(data, edge)

結果:

  Columns 1 through 9

     2     2     2     2     2     0     0     0     0

  Columns 10 through 16

     0     1     1     1     1     1     0

注: length(edge) = length(data)+1 として最後にスプリアス ピークがあります。

次に、Paul R が示唆したように、精度と丸めに帰着します。各言語でどのように解釈されるかを確認するには、各頻度カウント関数を調べる必要があります。私があなたなら、すべてを 10 倍して int にします。

data=int8(data.*10)
edge  = 1:15;
count = histc(data, edge)

結果:

  Columns 1 through 9

     2     2     2     2     2     0     0     0     0

  Columns 10 through 15

     0     1     1     1     1     1

重要なのは、機械ではなく、人間がそれをどのように解釈するかです。10 ^(精度) を掛けて int にしたことがわかっている場合は、マシンが実際に何をするかは気にしません。次に、データに無理数が含まれていてもエラーが表示される場合は、浮動小数点数がどのようにコーディングされているかを確認してください (http://en.wikipedia.org/wiki/Floating_point)

乾杯。

于 2012-12-06T16:48:12.503 に答える