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

十分简单。使用合并器。它在文件交换上。

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 回答