【问题标题】:k-means / x-means (or other?) clustering in pandas/pythonk-means / x-means(或其他?)在 pandas/python 中的聚类
【发布时间】:2017-01-01 03:41:36
【问题描述】:

我有一个可以从下面的字典重建的数据框。

数据框代表全球各个城市的23 statistics (X1-X23)。每个城市在数据框中占据一行,其中 23 个统计数据作为单独的列。

我的实际 df 有 ~6 million 城市,所以它是一个大数据框。

我想做的是:

步骤#1:根据23 statistics (X1-X23) 识别城市集群。

Step#2:鉴于在Step#1中识别出的集群,我想构建一个城市组合:

a)从任何给定集群中选择的城市数量有限(每个集群的限制可能不同)

b)完全避免某些集群

c) 对组合选择应用额外的标准,以使组合中城市之间恶劣天气的相关性最小化,而城市之间好天气的相关性最大化。

我的问题集是K for a K-means algo 会很大,但我不确定那个值是多少。

我一直在阅读以下关于集群的内容:

Cluster analysis in R: determine the optimal number of clusters

How do I determine k when using k-means clustering?

X-means: Extending K-means...

但是,很多文献对我来说是陌生的,我需要几个月的时间才能理解。我不是数据科学家,也没有时间参加机器学习课程。

此时我有了数据框,现在正在玩弄我的拇指。

如果您能帮助我通过示例数据集在 pandas 中实际实现 Steps#1 to Steps#2,我将不胜感激。

下面的dict可以通过pd.DataFrame(x)重构为数据帧,其中x是下面的dict:

df.head().to_dict('rec') 的输出:

[{'X1': 123.40000000000001,
  'X2': -67.900000000000006,
  'X3': 172.0,
  'X4': -2507.1999999999998,
  'X5': 80.0,
  'X6': 1692.0999999999999,
  'X7': 13.5,
  'X8': 136.30000000000001,
  'X9': -187.09999999999999,
  'X10': 50.0,
  'X11': -822.0,
  'X12': 13.0,
  'X13': 260.80000000000001,
  'X14': 14084.0,
  'X15': -944.89999999999998,
  'X16': 224.59999999999999,
  'X17': -23.100000000000001,
  'X18': -16.199999999999999,
  'X19': 1825.9000000000001,
  'X20': 710.70000000000005,
  'X21': -16.199999999999999,
  'X22': 1825.9000000000001,
  'X23': 66.0,
  'city': 'SFO'},
 {'X1': -359.69999999999999,
  'X2': -84.299999999999997,
  'X3': 86.0,
  'X4': -1894.4000000000001,
  'X5': 166.0,
  'X6': 882.39999999999998,
  'X7': -19.0,
  'X8': -133.30000000000001,
  'X9': -84.799999999999997,
  'X10': 27.0,
  'X11': -587.29999999999995,
  'X12': 36.0,
  'X13': 332.89999999999998,
  'X14': 825.20000000000005,
  'X15': -3182.5,
  'X16': -210.80000000000001,
  'X17': 87.400000000000006,
  'X18': -443.69999999999999,
  'X19': -3182.5,
  'X20': 51.899999999999999,
  'X21': -443.69999999999999,
  'X22': -722.89999999999998,
  'X23': -3182.5,
  'city': 'YYZ'},
 {'X1': -24.800000000000001,
  'X2': -34.299999999999997,
  'X3': 166.0,
  'X4': -2352.6999999999998,
  'X5': 87.0,
  'X6': 1941.3,
  'X7': 56.600000000000001,
  'X8': 120.2,
  'X9': -65.400000000000006,
  'X10': 44.0,
  'X11': -610.89999999999998,
  'X12': 19.0,
  'X13': 414.80000000000001,
  'X14': 4891.1999999999998,
  'X15': -2396.0999999999999,
  'X16': 181.59999999999999,
  'X17': 177.0,
  'X18': -92.900000000000006,
  'X19': -2396.0999999999999,
  'X20': 805.60000000000002,
  'X21': -92.900000000000006,
  'X22': -379.69999999999999,
  'X23': -2396.0999999999999,
  'city': 'DFW'},
 {'X1': -21.300000000000001,
  'X2': -47.399999999999999,
  'X3': 166.0,
  'X4': -2405.5999999999999,
  'X5': 85.0,
  'X6': 1836.8,
  'X7': 55.700000000000003,
  'X8': 130.80000000000001,
  'X9': -131.09999999999999,
  'X10': 47.0,
  'X11': -690.60000000000002,
  'X12': 16.0,
  'X13': 297.30000000000001,
  'X14': 5163.3999999999996,
  'X15': -2446.4000000000001,
  'X16': 182.30000000000001,
  'X17': 83.599999999999994,
  'X18': -36.0,
  'X19': -2446.4000000000001,
  'X20': 771.29999999999995,
  'X21': -36.0,
  'X22': -378.30000000000001,
  'X23': -2446.4000000000001,
  'city': 'PDX'},
 {'X1': -22.399999999999999,
  'X2': -9.0,
  'X3': 167.0,
  'X4': -2405.5999999999999,
  'X5': 86.0,
  'X6': 2297.9000000000001,
  'X7': 41.0,
  'X8': 109.7,
  'X9': 64.900000000000006,
  'X10': 42.0,
  'X11': -558.29999999999995,
  'X12': 21.0,
  'X13': 753.10000000000002,
  'X14': 5979.6999999999998,
  'X15': -2370.1999999999998,
  'X16': 187.40000000000001,
  'X17': 373.10000000000002,
  'X18': -224.30000000000001,
  'X19': -2370.1999999999998,
  'X20': 759.5,
  'X21': -224.30000000000001,
  'X22': -384.39999999999998,
  'X23': -2370.1999999999998,
  'city': 'EWR'}]

【问题讨论】:

  • 您应该在CrossValidated 上发布这个问题,因为这实际上不是关于编程的问题,而是关于如何进行一般集群的问题。当然,请事先进行搜索 --- 我很确定以前有人问过这个问题。
  • 有趣的是,在 CrossValidated 上的搜索会产生一些最终提到 StackOverflow 的帖子 --- 特别是 this answer
  • 您也可以在Data Science SE 上提问。尽管有一些方法可以确定 k 的最佳数量,但它们都有自己的标准,这些标准可能不符合您的需求。在实践中,人们通常会尝试不同的 k 值并自行判断结果。
  • @ayhan:我什至不知道 Data Science SE...谢谢指点!
  • @AlbertoGarcia-Raboso 它仍处于测试阶段,但讨论非常好。

标签: python pandas k-means


【解决方案1】:

我不知道您所说的“用于进一步处理”是什么意思,但这里有一个非常简单的解释,可以帮助您入门。

1) 将数据放入数据框 (pandas) 中,变量 (x1-x23) 位于顶部(列标题),每一行代表一个不同的城市(以便您的 df.head() 显示 x1-x23列标题)。

2) 标准化变量

3)在使用Kmeans之前决定是否使用PCA

4) 使用 kmeans- scikit learn makes this part easy 也检查一下 and this

5) 试试这个silhouette analysis 来选择集群的数量来开始

好的参考:
Hastie and Tibshirani book

Hastie and Tibshirani free course, but use R

Udacity、Coursera、EDX 机器学习课程

编辑:忘了提一下,在测试过程时不要使用整个数据集。使用更小部分的数据(例如 10 万个城市),这样处理时间就会大大缩短,直到您把所有事情都做好。

【讨论】:

  • 我所说的“进一步处理”是基于已识别的集群,我想制定一个选择算法,限制可以从任何集群中选择的城市数量。
  • @codingknob 按照我上面概述的内容进行初始聚类。然后提出具体问题。
猜你喜欢
  • 2016-02-01
  • 2015-04-11
  • 2016-08-14
  • 2011-08-13
  • 2013-08-08
  • 2013-02-14
  • 2018-01-14
  • 2011-04-11
  • 2013-01-11
相关资源
最近更新 更多