K表示在matlab上使用k表示聚类

时间:2014-11-30 03:48:59

标签: matlab matrix cluster-analysis k-means

我有这个矩阵:

x=[ 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);

在接收器处,我收到了下面的向量,其中组件是根据我最初发送的 x)的组件排序的。

X = [A A A C C A C C];

现在我想应用kmeans(X)来拥有4个群集,所以kmeans(X,4)。我遇到了以下问题:

  1. 我不确定我是否可以代表上面X所示的复数。
  2. 我无法绘制kmeans的结果来显示群集。
  3. 我无法理解群集质心结果。
  4. 如何找到最佳错误率,如果此示例代表通信系统,并且在接收器处使用k-means聚类来确定传输信号是什么?

1 个答案:

答案 0 :(得分:6)

如果你不理解"群集质心结果,然后你不明白k - 如何工作。我将在这里提供一个小摘要。

k -means的工作原理是,对于您拥有的某些数据,您希望将它们分组到 k 组中。您最初在数据中选择 k 随机点,这些点将包含来自1,2,...,k的标签。这些就是我们所说的质心。然后,确定其余数据与这些点之间的接近程度。然后,您将这些点分组,以便无论哪个点最接近这些 k 点中的任何一个,您都可以将这些点指定为属于该特定组(1,2,...,k)。之后,对于每个组的所有点,您更新质心,实际上将其定义为每个组的代表点。对于每个组,您计算每个 k 组中所有点的平均值。这些成为下一次迭代的质心。在下一次迭代中,您可以确定数据中每个点与每个质心的接近程度。你继续迭代并重复这种行为,直到质心不再移动,或者它们移动很少。


现在,让我们一个一个地回答你的问题。

1。复数表示

k - 在MATLAB中意味着没有定义复杂数据的处理方式。人们处理复杂数字数据的常用方法是将实部和虚部分割成单独的维度。这是使用k的一种非常有效的方法 - 用于复杂值数据的方法。

有关详细信息,请参阅MathWorks MATLAB论坛上的这篇文章:https://www.mathworks.com/matlabcentral/newsreader/view_thread/78306

2。绘制结果

您无法正确构建矩阵X。请注意,AC都是150 x 2矩阵。您需要构建X以使每个成为一个点,并且每列都是一个变量。因此,您需要连接AC 行式。因此:

X = [A; A; A; C; C; A; C; C];

请注意,您有重复点。就X = [A; C];而言,这实际上与kmeans无关。也许您应该生成X,然后添加噪音,而不是采用AC,添加噪音,然后构建信号。

现在,如果您想绘制结果以及质心,您需要做的是使用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;

上面的代码遍历每个簇,用不同的颜色绘制它们,然后绘制青色的质心,厚度略大,这样你就可以看到图形的样子。

这就是我得到的:

enter image description here

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

idxcentroids将是您传输信号的每个部分的结果。您可能希望在每次迭代时查看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图,以及集群中心所在的位置。请注意,代码相当未经优化,并且生成图表需要一段时间,但我想快速编写一些内容来说明我的观点。

以下是决策区域的含义:

enter image description here


希望这有帮助!祝你好运!