【问题标题】:Find edge points of numpy array for kmeans centroids initialization为kmeans质心初始化查找numpy数组的边缘点
【发布时间】:2018-05-09 07:09:56
【问题描述】:

我正在努力在 python 中实现 kmeans 算法。 我正在测试初始化​​我的质心的新方法,并希望实现它,看看它会对集群产生什么影响。

我的想法是从我的数据集中选择数据点,将质心初始化为数据的边缘点。

简单示例2属性示例:

假设这是我的输入数组

input = array([[3,3], [1,1], [-1,-1], [3,-3], [-1,1], [-3,3], [1,-1], [-3,-3]])

我想从这个数组中选择 [3,3] [-3,-3] [-3,3] [3,-3] 的边缘点。所以如果我的k是4,这些点就会被选中

在我正在处理的数据中,我的数据集中有 4 个和 9 个属性以及大约 300 个数据点

注意:当 k 边缘点时,我没有找到解决方案,但如果 k 是 > 边缘点,我想我会选择这 4 个点,然后尝试将其余的点放在图形的中心点周围

我还考虑为每列找到最大值和最小值,然后尝试从那里找到我的数据集的边缘,但我不知道从这些值中识别边缘的有效方法。

如果您认为这个想法行不通,我很想听听您的意见。

问题

  1. numpy 有没有这样的功能来获取我的数据集边缘的数据点的索引?
  2. 如果没有,我将如何在我的数据集中找到这些边缘点?

【问题讨论】:

  • 边缘点是什么意思?
  • 对不起,如果我不清楚,我所说的边缘点是指数据集中包含属性的最大值/最小值的数据点,使它们离中心最远。我用一张希望能更好地解释这一点的图片更新了问题。

标签: arrays numpy initialization k-means centroid


【解决方案1】:

使用scipy 和成对距离来确定每个人与另一个人的距离:

from scipy.spatial.distance import pdist, squareform
p=pdist(input)

然后,使用sqaureform将p向量变成矩阵形状:

s=squareform(pdist(input))

然后,使用 numpy argwhere 查找最大值或极端值的索引,然后在输入数组中查找这些索引:

input[np.argwhere(s==np.max(p))]

array([[[ 3,  3],
        [-3, -3]],

       [[ 3, -3],
        [-3,  3]],

       [[-3,  3],
        [ 3, -3]],

       [[-3, -3],
        [ 3,  3]]])

完整的代码是:

from scipy.spatial.distance import pdist, squareform
p=pdist(input)
s=squareform(p)
input[np.argwhere(s==np.max(p))]

【讨论】:

  • 谢谢你。这是我想要的方向。我正在尝试您的代码,但收到一些问题,将继续使用这种方法 arr[argwhere(p==max(p))] 导致值错误:| ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
  • arr 是否等于输入?
  • 是:arr = array([[3,3], [1,1], [-1,-1], [3,-3], [-1,1], [ -3,3], [1,-1], [-3,-3]])
  • 用 arr 为我工作。早些时候,错过了 argwhere 的右括号。编辑。现在检查。
  • 希望我有另一种方式来分享这个。这是我正在使用的代码,收到的错误评论如下:shared code
猜你喜欢
  • 2015-09-17
  • 2016-11-16
  • 2021-10-01
  • 2013-07-30
  • 2023-04-09
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多