【问题标题】:MATLAB - How to compare and assign a value to a cluster from a dataset?MATLAB - 如何比较数据集中的集群并将值分配给集群?
【发布时间】:2014-11-05 22:51:52
【问题描述】:

你好 StackOverflow 社区,

我很难解决我在 MATLAB 中遇到的问题。

我有一个如下所示的矩阵:

这是来自一个非常大的数据集的聚集表。

我有一个辅助表,它也非常大,大小为 5000x4。第二个表只包含整数。如何让软件将这个辅助表中的列13 中的值与第一个表中的值进行比较,然后让代码根据哪个组合来决定第二个表中的值属于哪个集群值最接近?

例如,辅助表有一行的值为141, 162, 239, 1。通过查看它,我可以知道它属于集群表的1 行。但我无法手动检查数千行。

4 现在可以忽略,因为它将用于其他目的。如果我对这个问题不清楚,请告诉我,我很难用英语解释。任何建议将不胜感激。

【问题讨论】:

    标签: matlab matrix cluster-analysis fuzzy-logic


    【解决方案1】:

    您可以根据最小 L2 距离进行聚类:

    d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').'
    [~,ic] = min(d,[],1)
    

    变量ic 包含A 每一行的簇号(B 中最近行的索引)。

    (剪掉第 4 列,然后计算上面的内容。)

    4 列示例:

    >> B = randi(255,3,4)
    
    B =
    
       255   164   195   120
        59    27   206    56
       235    69    27   236
    
    >> A = B(randi(3,10,1),:) + randi(20,10,4) - 10
    
    A =
    
       259   163   195   116
       226    61    25   228
       255   160   195   121
        69    29   210    62
       248   167   205   116
       260   173   187   115
        62    37   212    53
       237    61    29   236
       255   168   204   125
       237    72    20   237
    
    >> d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').';
    >> [~,ic] = min(d,[],1)
    ic =
    
         1     3     1     2     1     1     2     3     1     3
    

    您还可以将pdist2 与您喜欢的任何其他距离度量一起使用,或者将 bsxfun 与更熟悉的公式一起使用:

    d = squeeze(sqrt(sum(bsxfun(@minus,A,permute(B,[3 2 1])).^2,2)));
    

    或者kmeans...

    Reference 12

    【讨论】:

    • 这很棒。正如你所展示的那样,我得到了它的工作。但是,我认为从那里拿走它很容易,但我错了。我对提出另一个与此相关的话题感到难过。假设现在我有一个 {ic} 变量,其中的整数范围从 1 到 5。我怎么说如果 {ic} 值等于 1 或 4,则将 +1 添加到变量 N,如果它是1 或 4 看它是否代表数组 A 第 4 列中的值 1?我假设我需要使用 for 循环,但我无法解决。
    • 编辑时间不够了...第 4 列等于 1。
    猜你喜欢
    • 2016-06-07
    • 2013-07-25
    • 2020-02-22
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多