作家
登录

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

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

k-均值算法请求每个质心和数据点都查对地进行比较。这意味着在我们之前的迭代中,我们要将 100 个质心和 10000 个时光序列数据分别进行比较,也就是每次迭代都要进行 100 万次比较。请记住每次比较都涉及到两个包含 500 个样本的集合。因为我们迭代了 100 次,那就是说我们总共比较了 1 亿次——对于单个 CPU 而言算是相昔时夜的工作岑岭。尽管 Python 是一种还算高效的说话,但效力还赶不上用 C 说话写的指令。恰是因为这个原因,NumPy 的大年夜部分核心运算都是用 C 说话写的,并且还进行了向量化以最小化由轮回带来的计算开销。

我们来摸索一下我们可以若何向量化我们的代码,大年夜而去掉落尽可能多的轮回。

起首,我们将代码分成不合的功能模块。这能让我们更好地舆解每个部分所负责的工作。接下来,我们修改 calc_centroids 步调以便仅在质心上迭代(而不是在每个时光序列数据上)。如许,我们将所有时光序列数据和一个质心传递给 euclid_dist。我们还可以预先分派 dist 矩阵,而不是将其当成一个词典进行处理并随时光扩大它。NumPy 的 argmin 可以一次性比脚绫强个向量对。

在 move_centroids 中,我们应用向量运算去掉落了另一个 for 轮回,并且我们只在独特的质心集上迭代。如不雅我们损掉了一个质心,我们就经由过程大年夜我们的时光序列数据集中进行随机选择来参加合适的数字(这在实际应用的实践中很罕有)。

最后,我们添加一个提前停止(early stopping)来检查 k_means——如不雅质心不再更新,就停止迭代。

来看看代码:

  1. def euclid_dist(t1, t2): 
  2.    return np.sqrt(((t1-t2)**2).sum(axis = 1)) 
  3. def calc_centroids(data, centroids): 
  4.    dist = np.zeros([data.shape[0], centroids.shape[0]]) 
  5.    for idx, centroid in enumerate(centroids): 
  6.        dist[:, idx] = euclid_dist(centroid, data) 
  7.    return np.array(dist) 
  8. def closest_centroids(data, centroids): 
  9.    dist = calc_centroids(data, centroids) 
  10.    return np.argmin(dist, axis = 1) 
  11. def move_centroids(data, closest, centroids): 
  12.    k = centroids.shape[0] 
  13.    new_centroids = np.array([data[closest == c].mean(axis = 0) for c in np.unique(closest)]) 
  14.    if k - new_centroids.shape[0] > 0: 
  15.       print("adding {} centroid(s)".format(k - new_centroids.shape[0])) 
  16.       additional_centroids = data[np.random.randint(0, data.shape[0], k - new_centroids.shape[0])] 
  17.       new_centroids = np.append(new_centroids, additional_centroids, axis = 0) 
  18.    return new_centroids 
  19. def k_means(data, num_clust, num_iter): 
  20.    centroids = signals[np.random.randint(0, signals.shape[0], num_clust)] 
  21.    last_centroids = centroids 
  22.    for n in range(num_iter): 
  23.        closest = closest_centroids(data, centroids) 
  24.        centroids = move_centroids(data, closest, centroids) 
  25.        if not np.any(last_centroids != centroids): 
  26.           print(

      推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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