说我有这个样本数据
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
答案 0 :(得分: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
答案 1 :(得分:2)
这些年来我已经完成了很多类型的工作,但是为了能够判断,更好地与最好的相比,它将有助于了解您希望在数据集或结构中发生什么变化。
否则,如果预计没有变化且硬编码有效,请坚持使用。
答案 2 :(得分: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
它也很有效。