如果您不“理解”聚类质心结果,那么您将不理解 k-means 的工作原理。我将在这里做一个小总结。
k-means 的工作原理是,对于您拥有的某些数据,您希望将它们分组到 k 组中。您最初在数据中选择 k 个随机点,这些点将具有来自 1,2,...,k 的标签。这些就是我们所说的质心。然后,您确定其余数据与这些点的接近程度。然后,您将这些点分组,以便无论哪个点最接近这些 k 点中的任何一个,您都将这些点分配给该特定组 (1,2,...,k)。之后,对于每个组的所有点,您更新 质心,它实际上被定义为每个组的代表点。对于每个组,您计算每个 k 组中所有点的平均值。这些成为下一次迭代的新质心。在下一次迭代中,您将确定数据中的每个点与每个质心 的距离。您不断迭代并重复此行为,直到质心不再移动,或者它们移动很少。
现在,让我们一一回答您的问题。
1。复数表示
k-means 在 MATLAB 中没有定义如何处理复杂数据。人们处理复杂编号数据的一种常见方法是像您所做的那样将实部和虚部分成不同的维度。这是将k-means 用于复杂值数据的一种完全有效的方法。
有关详细信息,请参阅 MathWorks MATLAB 论坛上的此帖子:https://www.mathworks.com/matlabcentral/newsreader/view_thread/78306
2。绘制结果
您没有正确构建矩阵X。请注意,A 和 C 都是 150 x 2 矩阵。您需要构造X 使得每个行 是一个点,而每一列都是一个变量。因此,您需要连接您的 A 和 C row-wise。因此:
X = [A; A; A; C; C; A; C; C];
请注意,您有重复积分。就kmeans 而言,这实际上与X = [A; C]; 没有什么不同。也许您应该生成X,然后添加噪声,而不是使用A 和C,添加噪声,然后构建您的信号。
现在,如果您想绘制结果以及质心,您需要做的是使用kmeans 的两个输出版本,如下所示:
[idx, centroids] = kmeans(X, 4);
idx 将包含X 中每个点所属的簇号,centroids 将是一个 4 x 2 矩阵,其中每一行告诉您在数据中找到的每个簇的平均值。如果您想绘制数据以及集群,您只需执行以下操作。我将遍历每个集群成员并将结果绘制在一个图上。我还将在每个集群的平均值所在的位置上着色:
x = X(:,1);
y = X(:,2);
figure;
hold on;
colors = 'rgbk';
for num = 1 : 4
plot(x(idx == num), y(idx == num), [colors(num) '.']);
end
plot(centroids(:,1), centroids(:,2), 'c.', 'MarkerSize', 14);
grid;
上面的代码遍历每个簇,用不同的颜色绘制它们,然后用粗细略大的青色绘制质心,这样你就可以看到图形的样子。
这是我得到的:
3。了解质心结果
这可能是因为您没有正确构造X。这就是我的质心:
centroids =
-1.9176 -2.0759
1.5980 2.8071
2.7486 1.6147
0.8202 0.8025
这是不言自明的,我之前谈到了它的结构。
4。信号的最佳表示
您可以做的是多次重复聚类,然后算法将决定在这些时间中最好的聚类是什么。您只需使用Replicates 标志并表示您希望运行多少次。显然,你运行的次数越多,你的结果可能就越好。因此,请执行以下操作:
[idx, centroids] = kmeans(X, 4, 'Replicates', 5);
这将运行kmeans 5 次,并为您提供这 5 次中最好的质心。
现在,如果您想确定传输的最佳序列,您必须将您的 X 拆分为每行 150 行(因为您的随机序列是 150 个元素),然后运行单独的 kmeans在每个子集上。您可以尝试通过每次使用Replicates 标志来找到序列每个部分的最佳表示......所以您可以执行以下操作:
for num = 1 : 8
%// Look at 150 points at a time
[idx, centroids] = kmeans(X((num-1)*150 + 1 : num*150, :), 4, 'Replicates', 5);
%// Do your analysis
%//...
%//...
end
idx 和 centroids 将是您传输信号的每个部分的结果。您可能希望在每次迭代时查看 centroids 以确定在特定时间传输的符号。
如果您想绘制决策区域,那么您可能正在寻找Voronoi diagram。您所做的只是给定一组在问题域内定义的点,您只需要确定每个点属于哪个集群。鉴于我们的数据跨越-5 <= (x,y) <= 5,让我们遍历网格中的每个点并确定每个点属于哪个集群。然后我们会根据它所属的集群为适当的点着色。
类似:
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)
[~,ind] = min(sum(bsxfun(@minus, [X(idx) Y(idx)], centroids).^2, 2));
plot(X(idx), Y(idx), [colors(ind), '.']);
end
plot(centroids(:,1), centroids(:,2), 'c.', 'MarkerSize', 14);
上面的代码将绘制特定配置的决策区域/Voronoi 图,以及集群中心所在的位置。请注意,代码相当未优化,生成图表需要一段时间,但我想快速写一些东西来说明我的观点。
决策区域如下所示:
希望这会有所帮助!祝你好运!