我有以下代码。我想找到误码率,将簇数据作为训练数据并发送测试数据。我可以用这段代码吗?感谢您的积极支持。
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
答案 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);
这种噪音......让我们说......这是在您通过沟通渠道发送时添加的。现在我们有了实部和虚部,让我们弄清楚这个序列是如何分类的。我们将使用x
和y
并确定每个点所属的群集:
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%......不太好!
这应该足以让你入门。希望这有帮助!