将数据点分为多个群集,并取每个群集的平均值

时间:2018-07-01 07:27:40

标签: python numpy scipy k-means

假设我在2x4矩阵中有一些数据(4个数据点,2个要素)

X = np.array([[4,3,5,6], = [x1 x2 x3 x4]
              [7,4,6,5]]) 

“最接近”的3x4矩阵,它指示与每个数据点x最接近的簇k。 (3个群集,4个数据点)

C = [[1 0 1 0]
     [0 0 0 1]
     [0 1 0 0]]

我想找到一种有效的方法,使用numpy计算每个聚类中数据点的平均值。

我的想法是构造一个看起来像这样的矩阵:

idea = [[x1 0  x3 0 ]
        [0  0  0  x4]
        [0  x2 0  0 ]]

将其元素汇总到各列中,然后除以np.sum(c,axis=1)中的各个元素,因为均值应仅考虑属于该簇的数据点(即不包括零)。

此示例的最终预期输出应为3x2矩阵:

output = [(x1+x3)/2  = [ [4.5 6.5]
           x4            [6   5  ]
           x2       ]    [3   4  ]]
  1. 我什至无法构建看起来像我的idea矩阵的矩阵。
  2. 我不知道这是解决这个问题的最有效的方法

我想避免使用任何for循环。

1 个答案:

答案 0 :(得分:2)

这是您策略的向量化实施:

X = np.array([[4, 3, 5, 6],[7, 4, 6, 5]])
C = np.array([[1, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0]])
output = X @ C.T / np.sum(C, axis=1)

print(output)
# => [[4.5 6.  3. ]
#    [[6.5 5.  4. ]]

由于您在X中的点是列,所以我认为将输出的列作为聚类的质心更为自然。如果您愿意,可以转置结果。