使用测试数据的误码率

时间:2014-11-30 23:38:13

标签: matlab cluster-analysis k-means

我有以下代码。我想找到误码率,将簇数据作为训练数据并发送测试数据。我可以用这段代码吗?感谢您的积极支持。

clear all;  
clc;

T=[ 2+2*i 2-2*i -2+2*i -2-2*i];

A=randn(150,2)+2*ones(150,2); C=randn(150,2)-2*ones(150,2); B=randn(150,2)+2*ones(150,2); 
F=randn(150,2)-2*ones(150,2); D=randn(150,2)+2*ones(150,2); G=randn(150,2)-2*ones(150,2);     
E=randn(150,2)+2*ones(150,2); H=randn(150,2)-2*ones(150,2);

X = [A; B; D; C; F; E; G; H];

[idx, centroids] = kmeans(X, 4, 'Replicates', 20);

x = X(:,1); y = X(:,2);

figure; 
colors = 'rgbk'; 
[X,Y] = meshgrid(-5:0.05:5, -5:0.05:5);
X = X(:); 
Y = Y(:); 
figure; hold on; 

for idx = 1 : numel(X) 
   [dummy,ind] = min(sum(bsxfun(@minus, [X(idx) Y(idx)], centroids).^2, 2)); 
   plot(X(idx), Y(idx), [colors(ind), '.']); 
end

1 个答案:

答案 0 :(得分:0)

好的,现在你的问题更清楚了。我不明白你在其他帖子中的含义。好吧,看起来你的T是你的传输字母表。请注意,您通过k获得的群集 - 意味着可能与您的传输字母表中的群集不同,因此您必须确定哪些质心最接近您的传输字母表。我们可以使用以下代码执行此操作:

gt = zeros(1,4);
for idx = 1 : 4
    [dummy,gt(idx)] = min(sum(bsxfun(@minus, [real(T(idx)), imag(T(idx))], centroids).^2, 2));
end

gt将包含字母表中的哪个符号与数据中的哪个群集质心相匹配。为了使您的结果具有可重现性,我将随机种子生成器设置为1234(即rng(1234);)然后运行您的代码。它为gt提供了以下内容:

gt =

     4     2     3     1

简而言之,gt中的每个元素都会告诉您T中的哪个符号与centroids中的哪个质心相匹配。因此,gt(1) = 4表示质心#1与传输字母表中的第4个符号匹配,gt(2) = 2表示质心#2与字母表中的第2个符号匹配,依此类推。

因此,鉴于您的测试序列由T中的字母组成,只需创建测试序列,记住gt是什么。因此,您可以这样做:

rng(1234);
rand_ind = randi(4, 10, 1);
test_sequence = T(rand_ind);
gt_labels = gt(rand_ind);

上面的代码将生成一个从1到4的随机整数序列,这些数字中将有10个。然后我使用它来使用T中的字母创建随机测试序列。 gt_labels还将包含每个符号的实际标签相对于群集质心的内容。现在,让我们将其分解为实部和虚部,并添加一些噪音。

x = real(test_sequence).*randn(1, 10);
y = imag(test_sequence).*randn(1, 10);

这种噪音......让我们说......这是在您通过沟通渠道发送时添加的。现在我们有了实部和虚部,让我们弄清楚这个序列是如何分类的。我们将使用xy并确定每个点所属的群集:

labels = zeros(1, 10);
for idx = 1 : 10
    [dummy,labels(idx)] = min(sum(bsxfun(@minus, [x(idx), y(idx)], centroids).^2, 2));
end

labels将包含您的群集机制如何将每个点分类为。我得到了:

labels =

     1     4     3     1     4     1     2     2     2     3

同样,这是在传输之前分配给测试序列的标签:

gt_labels =

     4     3     2     1     1     2     2     1     1     1

因此,BER(误码率)只是计算不匹配的数量并除以总序列。您可以将此乘以100%来得到百分比而不是一定比例。因此:

BER = sum(labels ~= gt_labels) / 10 * 100;

BER = 

80

因此,我们的BER为80%......不太好!


这应该足以让你入门。希望这有帮助!