3

このサンプルデータがあるとしましょう

A =
1.0000     6.0000   180.0000    12.0000
1.0000     5.9200   190.0000    11.0000
1.0000     5.5800   170.0000    12.0000
1.0000     5.9200   165.0000    10.0000
2.0000     5.0000   100.0000     6.0000
2.0000     5.5000   150.0000     8.0000
2.0000     5.4200   130.0000     7.0000
2.0000     5.7500   150.0000     9.0000

クラス(最初の列)ごとにグループ化された各列の分散を計算したいと思います。

私はこれを次のコードで動作させていますが、ハードコードされたインデックスを使用しているため、クラスごとのサンプル数の知識が必要であり、特定の順序である必要があります。

これを行うためのより良い方法はありますか?

variances = zeros(2,4);
variances = [1.0 var(A(1:4,2)), var(A(1:4,3)), var(A(1:4,4));
             2.0 var(A(5:8,2)), var(A(5:8,3)), var(A(5:8,4))];

disp(variances);

1.0 3.5033e-02   1.2292e+02   9.1667e-01
2.0 9.7225e-02   5.5833e+02   1.6667e+00
4

3 に答える 3

5

クラスラベルとデータを異なる変数に分けます。

cls = A(:, 1);
data = A(:, 2:end);

クラスラベルのリストを取得する

labels = unique(cls);

分散を計算する

variances = zeros(length(labels), 3);
for i = 1:length(labels)
  variances(i, :) = var(data(cls == labels(i), :)); % note the use of logical indexing
end
于 2012-11-29T01:58:39.453 に答える
2

私は何年にもわたってこの種のことをかなり行ってきましたが、より良いか最良かを判断できるようにするには、データセットまたは構造で何が変わると予想されるかを知ることが役立ちます。

それ以外の場合、変更が予想されず、ハードコードが機能する場合は、それを使用してください。

于 2012-11-29T01:58:31.827 に答える
0

簡単、簡単。consolidatorを使用します。ファイル交換中です。

A = [1.0000     6.0000   180.0000    12.0000
1.0000     5.9200   190.0000    11.0000
1.0000     5.5800   170.0000    12.0000
1.0000     5.9200   165.0000    10.0000
2.0000     5.0000   100.0000     6.0000
2.0000     5.5000   150.0000     8.0000
2.0000     5.4200   130.0000     7.0000
2.0000     5.7500   150.0000     9.0000];

[C1,var234] = consolidator(A(:,1),A(:,2:4),@var)
C1 =
     1
     2
var234 =
     0.035033       122.92      0.91667
     0.097225       558.33       1.6667

グループ化がわかっているので、生成された分散をテストできます。

var(A(1:4,2:4))
ans =
     0.035033       122.92      0.91667

var(A(5:8,2:4))
ans =
     0.097225       558.33       1.6667

それも効率的です。

于 2012-11-29T02:34:59.363 に答える