【问题标题】:K-means clustering - with an extra variableK-means 聚类 - 有一个额外的变量
【发布时间】:2020-01-18 17:01:15
【问题描述】:

我正在对几个地理纬度/经度点进行 k-means 聚类,具有固定数量的组。这个基本的聚类工作得很好。

但是我有另一个变量(每个点一个),我希望 k-means 聚类来解释。这有可能吗?

聚类数据可能如下所示:

Lat: [1.23, 2.12, 3.65, 4.32, 5.63, 5.43]
Lon: [1.43, 2.43, 3.76, 4.43, 5.25, 1.75]
Extra variable: [20, 20, 10, 10, 10, 10]

如果我想将上述数据分成 2 组,并且每组的额外变量的总和不能超过 40 的总和,我该怎么做? (如果有可能的话——我对 k-means 的理解非常基础/低端。)

【问题讨论】:

  • 你能分享代码吗?到目前为止你尝试了什么,突出显示你得到的错误?
  • 我没有收到任何错误。我只是无法弄清楚使用哪种方法/方法来获取 k-means 分组中包含的额外变量。既不是软限制(考虑到它)也不是硬限制(截止点为 40 的总和)。如果需要,这是我的 kmeans 启动代码:kmeans = KMeans(n_clusters=2, random_state=0, init="k-means++").fit(lat_lon_numpy_array)

标签: python math scikit-learn k-means


【解决方案1】:

好的,所以只需添加额外的功能并运行它。

data = np.asarray([np.asarray(df['Lat']),np.asarray(df['Lon']),np.asarray(df['Extra variable'])])

有关详细信息,请参阅下面的链接。

https://www.pythonforfinance.net/2018/02/08/stock-clusters-using-k-means-algorithm-in-python/

【讨论】:

    【解决方案2】:

    这似乎不再是一个基本的集群应用,而是一个有约束的优化问题。换句话说,您希望完成:

    最小化分组到集群 1 的点和分组到集群 2 的点之间的总距离(以纬度为单位)

    受制于集群 1 和集群 2 中的 Extra 变量之和对于每个集群小于 40。

    这是一个非线性程序,所以你必须使用非线性优化工具来解决这个问题。

    或者,根据数据的大小,您可以修改 k-means 聚类,使其继续移动聚类质心并重新分配数据点,但检测数据重新分配何时会使聚类超过总和的限制额外变量。在这种情况下,您可以改为随机移动集群的质心。跟踪最佳聚类集(低聚类内距离和高聚类间差异的某种组合),并在一段时间后使用通过该方法获得的最佳聚类集。

    【讨论】:

    • 感谢您的意见 - 您会推荐什么非线性优化工具,或者为我指明方向?
    • 据我所知,pyOpt 将聚类相似的数据,但是(从我上面的示例中)20、20 将被聚类,10、10、10、10 将被聚类。 - 或者我错过了什么? - 我们想要的最好是每个集群中有 20、10、10 个。 (我在看这个例子 [pyopt.org/examples/examples.autorefine.html]
    • 我认为您的最佳解决方案是具有尽可能接近彼此的点的集群(基于纬度和经度的欧几里德距离)满足总和的硬约束,我是否正确集群值?如果是这种情况,我不确定是否有可用的集群包可以解决您想要完成的开箱即用的任务。因此,您必须定义一个自定义非线性程序并使用通用非线性程序求解包来求解。
    猜你喜欢
    • 2014-12-19
    • 2018-08-10
    • 2015-04-11
    • 2017-03-22
    • 2011-08-13
    • 2013-08-08
    • 2013-02-14
    • 2018-01-14
    • 2016-01-01
    相关资源
    最近更新 更多