【问题标题】:Separate data points into clusters and taking the mean of each cluster将数据点分成簇并取每个簇的平均值
【发布时间】:2018-12-09 19:14:19
【问题描述】:

假设我在 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 循环。

【问题讨论】:

  • 你能告诉我们给定样本的最终预期输出吗?你能列出一个有效的循环解决方案吗?
  • @Divakar 对不起,你是对的。完毕。我正在寻找一个概念性的答案,而不是一个实际的答案。在这方面,我什至没有费心尝试实施“循环”解决方案。
  • 不应该是[ [4.5 6.5],[6 5 ][3 4 ]]吗?
  • @Divakar 完全正确!谢谢!

标签: python numpy scipy k-means


【解决方案1】:

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

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 中的点是列,我认为将输出的列作为集群的质心更自然。如果您愿意,可以转置结果。

【讨论】:

  • 抱歉:我在这里复制我的解决方案时交换了CX。现在应该修好了。
  • 应该是/ np.sum(C,axis=1)[:,None] stackoverflow.com/questions/19602187/…
  • X @ C.T / np.sum(C, axis=1) 或它的转置C @ X.T / np.sum(C, axis=1)[: None],虽然第二个我更喜欢C @ X.T / np.sum(C, axis=1, keepdims=True)
猜你喜欢
  • 2015-06-23
  • 2012-06-19
  • 1970-01-01
  • 2015-02-18
  • 2021-06-14
  • 2017-10-24
  • 1970-01-01
  • 2023-03-30
  • 2017-09-09
相关资源
最近更新 更多