使用不明确的输入值进行聚类

时间:2015-07-20 13:46:51

标签: matlab cluster-analysis

想象一下以下场景:

我有两个4x100矩阵ang1_stabang2_stab。这些包含沿列的四个角度,如下所示:

195.7987   16.2722   14.4171  198.5878  199.2693...
80.2062   86.7363   89.2861   89.5454   89.3411...
68.7998  -83.8318  -80.3138   69.0636  -96.4913...
-5.3262  -23.3030  -20.6823  -18.9915  -16.7224...

95.3450  183.8212  171.0686  151.8887  177.9041...
21.4780   27.2389   23.4016   27.6631   17.2893...
-13.2767 -103.5548 -115.0615   39.6790 -112.3568...
-5.3262  -23.3030  -20.6823  -18.9915  -16.7224...

两个矩阵的第四个角度总是相同,因此可以忽略不计。

问题:ang1_stabang2_stab的某些列是交换的,所以我需要找到更适合其他矩阵的列,然后交换相应的列。

复杂性:给定角度的计算是不明确的,并且可能已经加/减了90°的倍数,例如,角度16°应考虑接近195°而不是95°。

到目前为止我尝试过:

fp1 = []; % define clusters
fp2 = []; 
for j = 1:size(ang1_stab,2) % loop over all columns
    tmp1 = ang1_stab(:,j); % temporary columns
    tmp2 = ang2_stab(:,j);

    if j == 1 % assign first cluster center
        fp1 = [fp1, tmp1];
        fp2 = [fp2, tmp2];
    else
        mns1 = median(fp1(1:3,:),2); % calculate cluster centers
        mns2 = median(fp2(1:3,:),2);

        % calculate distances to cluster centers
        dif11 = sum(abs((mns1-tmp1(1:3))-round((mns1-mp1(1:3))/90)*90)); 
        dif12 = sum(abs((mns1-tmp2(1:3))-round((mns1-tmp2(1:3))/90)*90));
        dif21 = sum(abs((mns2-tmp1(1:3))-round((mns2-tmp1(1:3))/90)*90));
        dif22 = sum(abs((mns2-tmp2(1:3))-round((mns2-tmp2(1:3))/90)*90));

        if min([dif11,dif21])<min([dif12,dif22]) % assign to cluster
            if dif11<dif21
                fp1 = [fp1,tmp1];
                fp2 = [fp2,tmp2];

            else
                fp1 = [fp1,tmp2];
                fp2 = [fp2,tmp1];
            end
        else
            if dif12<dif22
                fp1 = [fp1,tmp2];
                fp2 = [fp2,tmp1];

            else
                fp1 = [fp1,tmp1];
                fp2 = [fp2,tmp2];
            end
        end


    end
end

然而:

  1. 这个appraoch似乎过于复杂,我想知道我是否可以某种方式用适当的算法替换它,例如K均值。但是,在这种情况下,我不知道如何解释角度的模糊性。

  2. 代码正在运行,但群集当前仍会在错误的群集中抛出点。我只是找不到原因。

  3. 如果有人能告诉我如何使用它来处理像kmeans这样的内置例程,我将不胜感激。

    编辑: 一个小玩具示例: 这可能是我得到的输出:

    ang1_stab = [30 10 80 100; 28 15 90 95; 152 93 180 102]; 
    ang2_stab = [150 90 3 100; 145 92 5 95; 32 10 82 102]; 
    

    我想要实现的目标:

    fp1 = [30 10 80 100; 28 15 90 95; 32 10 82 102]; 
    fp2 = [150 90 3 100; 145 92 5 95;  152 93 180 102]; 
    

    请注意,最后一列已被交换。 另请注意,fp2最后一列中的第三个元素大约是该行中其他元素的平均值,但高出180°。我仍然需要能够确定这是正确的集群。

0 个答案:

没有答案