作家
登录

如何为时间序列数据优化K-均值聚类速度?

作者: 来源: 2017-11-13 14:02:07 阅读 我要评论

  • c = ipp.Client() 
  • v = c[:] 
  • v.use_cloudpickle() 
  • with v.sync_imports(): 
  •    import numpy as np 
  • 关于加载工作器更多详情,请参阅 ipyparallel 上手指南:https://ipyparallel.readthedocs.io/en/latest/

    1. early finish! 
    2. took 180.91435194015503 seconds 

    在章一?实现中,我们的重点放在并行化的两个方面。起首,calc_centroids 有一个在每个质心上迭代并将其与我们的时光序列数据进行比较的轮回。我们应用了 map_sync 来将这些迭代中的每一个发送到我们的工作器。

    接下来,我们并行化 k-means++ 质心搜刮一一个类似的轮回。留意个中对 v.push 的调用:因为我们的 lambda 引用的数据,我们须要确保它在工作器节点上是可用的。我们经由过程调用 ipyparallel 的 push 办法来将该变量复制到工作器的全局范围中,大年夜而实现了这一目标。

    看看代码:

    比拟于我们之前的迭代,参加 k-means++ 算法能获得稍微好一点的机能。然则,当我们将其并行化之后,这种优化办法才真正开端带来明显回报。

    1. def calc_centroids(data, centroids): 
    2.         return np.array(v.map_sync(lambda x: np.sqrt(((x - data)**2).sum(axis = 1)), centroids)) 
    3. def closest_centroids(points, centroids): 
    4.    dist = calc_centroids(points, centroids) 
    5.    return np.argmin(dist, axis=0) 
    6. def init_centroids(data, num_clust): 
    7.    v.push(dict(data=http://bigdata.51cto.com/art/201711/data))
    8.    centroids = np.zeros([num_clust, data.shape[1]]) 
    9.    centroids[0,:] = data[np.random.randint(0, data.shape[0], 1)] 
    10.    for i in range(1, num_clust): 
    11.        D2 = np.min(v.map_sync(lambda c: np.linalg.norm(data - c, axis = 1)**2, centroids[0:i,:]), axis = 0) 
    12.        probs = D2/D2.sum() 
    13.        cumprobs = probs.cumsum() 
    14.        ind = np.where(cumprobs >= np.random.random())[0][0] 
    15.        centroids[i, :] = np.expand_dims(data[ind], axis = 0) 
    16.    return centroids 
    1. t1 = time.time() 
    2. centroids = k_means(signals, 100, 100) 
    3. t2 = time.time() 
    4. print("Took {} seconds".format(t2 - t1)) 
    1. adding 2 centroid(s) 
    2. early finish! 
    3. took 143.49819207191467 seconds 
    1. adding 1 centroid(s) 
    2. early finish! 
    3. took 206.72993397712708 seconds 

    结不雅只有两分钟多一点,这是我们今朝实现的最快速度!

    接下来:更快!

    在这些测试中,我们都只应用了中心处理器(CPU)。CPU 能供给便利的并行化,但我们认为再多花点工夫,我们就可以应用图形处理器(GPU)来实现聚类,且速度将获得一个数量级的晋升。我们也许可以应用 TensorFlow 来实现,这是一个用于数值计算和机械进修的开源软件。实际上,TensorFlow 已经包含了 k-均值实现,但我们根本上肯定照样须要对其进行调剂才能将其用于时光序列聚类。不管如何,我们都不会停下寻找更快更高效的聚类算法的办法,以赞助治理我们的用户的数据。


      推荐阅读

      Git的4个阶段的撤销更改命令分析

    Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 固然 git 出生距今已有 12 年之久,网上各类关于 git 的介绍文┞仿数不堪数,然则依然有很多人(包含我本>>>详细阅读


    本文标题:如何为时间序列数据优化K-均值聚类速度?

    地址:http://www.17bianji.com/lsqh/38787.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)