关于加载工作器更多详情,请参阅 ipyparallel 上手指南:https://ipyparallel.readthedocs.io/en/latest/
- early finish!
- took 180.91435194015503 seconds
在章一?实现中,我们的重点放在并行化的两个方面。起首,calc_centroids 有一个在每个质心上迭代并将其与我们的时光序列数据进行比较的轮回。我们应用了 map_sync 来将这些迭代中的每一个发送到我们的工作器。
接下来,我们并行化 k-means++ 质心搜刮一一个类似的轮回。留意个中对 v.push 的调用:因为我们的 lambda 引用的数据,我们须要确保它在工作器节点上是可用的。我们经由过程调用 ipyparallel 的 push 办法来将该变量复制到工作器的全局范围中,大年夜而实现了这一目标。
看看代码:
比拟于我们之前的迭代,参加 k-means++ 算法能获得稍微好一点的机能。然则,当我们将其并行化之后,这种优化办法才真正开端带来明显回报。
- def calc_centroids(data, centroids):
- return np.array(v.map_sync(lambda x: np.sqrt(((x - data)**2).sum(axis = 1)), centroids))
- def closest_centroids(points, centroids):
- dist = calc_centroids(points, centroids)
- return np.argmin(dist, axis=0)
- def init_centroids(data, num_clust):
- v.push(dict(data=http://bigdata.51cto.com/art/201711/data))
- centroids = np.zeros([num_clust, data.shape[1]])
- centroids[0,:] = data[np.random.randint(0, data.shape[0], 1)]
- for i in range(1, num_clust):
- D2 = np.min(v.map_sync(lambda c: np.linalg.norm(data - c, axis = 1)**2, centroids[0:i,:]), axis = 0)
- probs = D2/D2.sum()
- cumprobs = probs.cumsum()
- ind = np.where(cumprobs >= np.random.random())[0][0]
- centroids[i, :] = np.expand_dims(data[ind], axis = 0)
- return centroids
- t1 = time.time()
- centroids = k_means(signals, 100, 100)
- t2 = time.time()
- print("Took {} seconds".format(t2 - t1))
- adding 2 centroid(s)
- early finish!
- took 143.49819207191467 seconds
- adding 1 centroid(s)
- early finish!
- took 206.72993397712708 seconds
结不雅只有两分钟多一点,这是我们今朝实现的最快速度!
接下来:更快!
在这些测试中,我们都只应用了中心处理器(CPU)。CPU 能供给便利的并行化,但我们认为再多花点工夫,我们就可以应用图形处理器(GPU)来实现聚类,且速度将获得一个数量级的晋升。我们也许可以应用 TensorFlow 来实现,这是一个用于数值计算和机械进修的开源软件。实际上,TensorFlow 已经包含了 k-均值实现,但我们根本上肯定照样须要对其进行调剂才能将其用于时光序列聚类。不管如何,我们都不会停下寻找更快更高效的聚类算法的办法,以赞助治理我们的用户的数据。
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 固然 git 出生距今已有 12 年之久,网上各类关于 git 的介绍文┞仿数不堪数,然则依然有很多人(包含我本>>>详细阅读
本文标题:如何为时间序列数据优化K-均值聚类速度?
地址:http://www.17bianji.com/lsqh/38787.html
1/2 1