是否可以使用k-means在scikit / sklearn中使用的K ++初始化过程学习?

时间:2016-07-04 20:37:30

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

我正在阅读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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经从头开始:

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维的数组)。每行将是一个质心

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

我希望这会有所帮助:)