【问题标题】:Sequential k-means clustering using scikit-learn使用 scikit-learn 的顺序 k 均值聚类
【发布时间】:2012-06-19 23:17:11
【问题描述】:

有没有办法使用 scikit-learn 执行顺序 k-means 聚类?如果不重新拟合所有数据,我似乎找不到添加新数据的正确方法。

谢谢

【问题讨论】:

    标签: python machine-learning cluster-analysis scikit-learn


    【解决方案1】:

    scikit-learn 的 KMeans 类有一个 predict 方法,给定一些(新的)点,确定这些点属于哪个集群。调用此方法不会更改集群质心。

    如果您确实希望通过添加新数据来更改质心,即您希望在在线设置中进行聚类,请使用MiniBatchKMeans 估计器及其partial_fit 方法。

    【讨论】:

      【解决方案2】:

      您可以使用init 参数将质心的初始值传递给sklearn.cluster.kmeans。那么你可以这样做:

      centroids, labels, inertia = k_means(data, k)
      new_data = np.append(data, extra_pts)
      new_centroids, new_labels, new_inertia = k_means(new_data, k, init=centroids)
      

      假设您只是添加数据点而不更改 k

      我认为这有时意味着您得到的结果并不理想,但通常应该更快。您可能想偶尔用 10 个随机种子重新拟合,然后选择最好的一个。

      【讨论】:

        【解决方案3】:

        编写自己的函数来找出哪个质心最接近您正在考虑的点也相对容易。假设您有一些矩阵 X 可以使用 kmeans:

        centroids, labels, inertia = cluster.k_means(X, 5)
        
        def pred(arr):
            return np.argmin([np.linalg.norm(arr-b) for b in centroids])
        

        您可以通过以下方式确认这是否有效:

        [pred(X[i]) == labels[i] for i in range(len(X))]
        

        【讨论】:

          猜你喜欢
          • 2017-04-06
          • 2012-07-16
          • 2021-01-19
          • 2016-03-17
          • 2020-11-25
          • 2015-02-20
          • 2014-07-24
          • 2015-03-22
          • 2012-12-30
          相关资源
          最近更新 更多