我正在阅读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
答案 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维的数组)。每行将是一个质心
我修复了种子以获得始终相同的坐标结果(随机初始化,但始终相同)...您可以更改它。
我希望这会有所帮助:)