1

100個のデータポイントの時系列があります(たとえば)。一意のデータポイントごとに012のシンボルを割り当てたいと思います。問題は、私が試したが、シンボルを指定しても、プログラムが1と0の確率を上回っているために行き詰まってしまったことです。以下は問題です

  1. ステートメント

s = x(:、1)> 0.5;

バイナリ結果0,1を出力します。では、0.1以外の数字も割り当てることができるように、複数のパーティション/離散化を作成するにはどうすればよいですか。

シンボル化して分割する他の方法はありますか?

4

2 に答える 2

2

これを行う明白な方法は、次のようになります。

s=zeroes(size(x,1), 1);
s(x>=BP(1) & x<BP(2)) = 1;
s(x>=BP(2)) = 2;
etc.

ここで、BP はブレーク ポイント (つまり、パーティションの端) のリストです。これにより、BP(1) 未満のすべてが 0 になり、BP(1) と BP(2) の間のすべてが 1 になり、BP(2) を超えるエントリは 2 になります。

このようなものもうまくいくはずだと思います:

s = zeroes(size(x,1), 1];
for ii=1:length(BP)
   idx = x > BP(ii);
   s(idx) = s(idx) + 1;
end

データやビンのサイズに制約がある場合は、より多くのオプションがあります。乗算、除算、および丸め/切り捨ての巧妙な組み合わせを考えるかもしれません。たとえば、データがすべて [0, 1) の範囲にあり、それを等間隔の 20 個のビンに分割したいとします。次に、次のようなことができます。

s = floor(x(:,1) .* 20);

これにより、s は 0 から 19 の間の値になります。データがまだその間隔内にない場合は、明らかに最初に再スケーリングできます。

data = x(:,1);
data = data - min(data);
data = data ./ (max(data) + eps(max(data))); 
s = floor(data .* 20);

ここで、3 行目の正規化係数は max(data) ではなく、matlab が表現できる次の最大数であることに注意してください。21 ではなく 20 のグループになるようにします。

于 2012-07-11T19:49:05.013 に答える
1

ステートメントx(:,1) > 0.5;は論理インデックスを作成しています。true (1)条件が満たされているfalse (0)場所と満たされていない場所です。この論理インデックスを使用して、条件が満たされた元のベクトルから値を取得できます。

logical_index = x(:,1) > 0.5;
s = x(logical_index,1); %# select the subset of the matrix given by x > 0.5

sxからの値が 0.5 より大きい値を含むようになりました。

これ以上、あなたが何をしようとしているのか理解できません。小さなサンプル データ セットが役立ちます (まだヘルプが必要な場合)。

編集: このように設定を分割するのに適切な値を見つけるには、prctileを見てください。次に、回答のメソッドのいずれかを適用して、どの要素がどのカテゴリに分類されるかを判断できます。

于 2012-07-11T19:39:02.477 に答える