假设我们有一个列表list = [1,2,3,4,5,6,7,8,9,10,11,12]
,一组所需的平均值a=[2,5,8,11]
,以及我们想要形成的4个组,每个组的值为2,5,8和11分别。这本质上是一个排序问题吗?有没有办法在不检查每个可能的子列表组合的情况下执行此操作?
如果上述版本实际上不易处理,则假设目标是通过按顺序浏览上面的列表来形成子列表。这怎么能让事情变得更容易?
答案 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个簇(每个数据点都有一个颜色,标识它们所属的簇):
为了了解sklearn
的工作原理,您可以更深入地了解某些方面:
KMeans
的初始化。我只包括相关参数,即来自a
的集群数量,应尝试执行初始化的次数,以及来自a
的初始集群的均值。您可以设置其他参数。fit
函数查找labels
中每个数据的list1
。reshape
用于容纳sklearn
。有关k-means的更多信息,请开始查看related wikipedia page。