从初始列表中形成具有预定义平均值的子列表

时间:2016-03-22 19:43:46

标签: python

假设我们有一个列表list = [1,2,3,4,5,6,7,8,9,10,11,12],一组所需的平均值a=[2,5,8,11],以及我们想要形成的4个组,每个组的值为2,5,8和11分别。这本质上是一个排序问题吗?有没有办法在不检查每个可能的子列表组合的情况下执行此操作?

如果上述版本实际上不易处理,则假设目标是通过按顺序浏览上面的列表来形成子列表。这怎么能让事情变得更容易?

1 个答案:

答案 0 :(得分:1)

鉴于这个问题,正如评论中所建议的那样,k-means似乎是算法的合适选择。

您可以实现自己的k-means版本,也可以从scikit-learn中提供的实现开始,这是一个提供机器学习技术的软件包,特别是KMeans

使用scikit-learn从您的示例开始并使用图表的可能实现是:

import matplotlib.pyplot as plt
import numpy as np
import sklearn.cluster

list1 = np.arange(1,13)
list1_y = np.array([1]*12)
a = np.array([2,5,8,11])
kmeans = sklearn.cluster.KMeans(n_clusters=a.shape[0],n_init=1,init=a.reshape((a.shape[0],1)))
kmeans.fit(list1.reshape((list1.shape[0],1)))
labels = kmeans.labels_
plt.scatter(list1, list1_y, c=labels.astype(np.float))
plt.show()

和k-means的结果显示在下图中显示了4个簇(每个数据点都有一个颜色,标识它们所属的簇):

enter image description here

为了了解sklearn的工作原理,您可以更深入地了解某些方面:

  • KMeans的初始化。我只包括相关参数,即来自a的集群数量,应尝试执行初始化的次数,以及来自a的初始集群的均值。您可以设置其他参数。
  • 调用fit函数查找labels中每个数据的list1
  • reshape用于容纳sklearn
  • 的数据集

有关k-means的更多信息,请开始查看related wikipedia page