【问题标题】:Is it possible to use the K++ initialization procedure that k-means uses in scikit/sklearn learn?是否可以使用 k-means 在 scikit/sklearn learn 中使用的 K++ 初始化程序?
【发布时间】:2016-11-06 14:40:51
【问题描述】:

我正在阅读k-means 的文档,我看到它使用k++ 作为初始化。 sci-py中实现的k++初始化函数是否可以使用?

阅读他们的文档,我认为唯一的方法是使用 K-means 算法,但不要训练任何数量的迭代,如下所示:

N = 1000 #data set size
D = 2 # dimension
X = np.random.rand(N,D)
kmeans = sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=1, max_iter=0)
ceneters_k_plusplus = kmeans.fit(X)

这会起作用还是有直接的方法可以正确使用他们的库? (在他们的文档中找不到)

经过一番痛苦和流血后,我设法让它运行(认为不是 100% 正确,但它返回一个 numpy 数组):

import sklearn
import sklearn.cluster.k_means_
import numpy as np
#from ..utils.extmath import row_norms, squared_norm
from sklearn.utils.extmath import row_norms, squared_norm
from sklearn.utils import check_random_state

X = np.random.rand(10,3)
n_clusters = 4
random_state = None
random_state = check_random_state(random_state)
x_squared_norms = row_norms(X, squared=True)

centers = sklearn.cluster.k_means_._k_init(X, n_clusters, random_state=random_state,x_squared_norms=x_squared_norms)
print centers

【问题讨论】:

  • 我会在 k_means_.py 文件中查看函数_k_init,例如:github.com/scikit-learn/scikit-learn/blob/master/sklearn/… 或附近,因为我认为您最终会得到 init 的默认值...但是我可能错了,它是一个私有函数......所以“正确”使用会排除它;-)
  • 运行上述不允许我将迭代设置为零。我想这是意料之中的。
  • @Dilettant 大声笑,此时我不在乎,任何让我使用 K++ 的东西都可以:P

标签: python numpy machine-learning scipy scikit-learn


【解决方案1】:

我是从零开始的:

import random
def initialize(X, K):`
    C = [X[0]]
    for k in range(1, K):
        D2 = scipy.array([min([scipy.inner(c-x,c-x) for c in C]) for x in X])
        probs = D2/D2.sum()
        cumprobs = probs.cumsum()
        np.random.seed(20)            # fixxing seeds
        #random.seed(0)               # fixxing seeds
        r = scipy.rand()        
        for j,p in enumerate(cumprobs):
            if r < p:
                i = j
                break
        C.append(X[i])
    return C

centroids = initialize(data,K)

在哪里: “数据”是您的数据点云(n 行点,m 列维度) 并且“K”是想要的质心数(具有 K 行和 m 维的数组)。每行将是一个质心

我修复了种子以获得始终相同的坐标结果(随机初始化,但始终相同)...您可以更改此设置。

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    它没有在 scipy 中实现。有一个拉取请求实现它,但它停滞不前。 https://github.com/scipy/scipy/pull/4119

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-28
      • 2013-10-12
      • 2018-01-29
      • 2017-01-27
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多