【问题标题】:Kmeans Clustering using kmeans on matlab在matlab上使用kmeans进行Kmeans聚类
【发布时间】:2014-11-30 03:48:59
【问题描述】:

我有这个矩阵:

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 聚类来确定传输的信号是什么?

【问题讨论】:

    标签: matlab matrix cluster-analysis k-means


    【解决方案1】:

    如果您不“理解”聚类质心结果,那么您将不理解 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。请注意,AC 都是 150 x 2 矩阵。您需要构造X 使得每个 是一个点,而每一列都是一个变量。因此,您需要连接您的 AC row-wise。因此:

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

    请注意,您有重复积分。就kmeans 而言,这实际上与X = [A; C]; 没有什么不同。也许您应该生成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;
    

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

    这是我得到的:

    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 图,以及集群中心所在的位置。请注意,代码相当未优化,生成图表需要一段时间,但我想快速写一些东西来说明我的观点。

    决策区域如下所示:


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

    【讨论】:

    • 谢谢Rayryeng。如何从该图中确定决策区域,以及如何找到下注错误率?
    • 我可以将最初发送的数据视为训练数据并重新发送数据并考虑它和测试数据并使用它们来找到下注错误率吗?
    • @KawtherHamad - 决策区域可能是特定集群配置的 Voronoi 图。 BIT 错误率是您想要找到的吗?您所要做的就是提取重建的序列是什么,然后在重建的信号和原始数据之间进行逐点匹配,将不匹配相加并除以序列的总长度。我不会做 BER,因为它很简单,但我会为你做 Voronoi 图。
    • 非常感谢您的支持 :) 运行代码时,我遇到此错误:表达式或语句不正确 -- 可能不平衡 (、{ 或 [. 语句:[~,ind ] = min(sum(bsxfun(@minus, [X(idx) Y(idx)], centroids).^2, 2));
    • @KawtherHamad 忘记添加结束括号。我最后做了,但忘了在这里添加。我会更新
    猜你喜欢
    • 2015-02-05
    • 2019-11-27
    • 2019-01-06
    • 2017-11-23
    • 2014-03-07
    • 2021-11-27
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多