sklearn kmeans.predict方法dosnt工作正确

时间:2017-05-20 03:49:05

标签: python scikit-learn

我使用sklearn来实现k-means方法。 k-means类有一个名为" predict"的方法。根据训练样本预测新样本。

from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
'''
make sample
'''
X, y=make_blobs(n_samples=100, n_features=2, centers=3)

'''
kmeans
'''
kmeans_obj=KMeans(n_clusters=3)

#train
kmeans_obj.fit(X)

#labels:
labels=kmeans_obj.predict(X)


'''
output
'''
plt.scatter(X[:,0], X[:,1], c=labels)
plt.show()

'''
generate new samples and predict them
'''
while True:
    '''
    perdict kmeans?!?!?!?
    '''
    new_X, new_y=make_blobs(n_samples=50, n_features=2, centers=4)

    perdict_new_sample_lables=kmeans_obj.predict(new_X)

    plt.scatter(X[:,0], X[:,1], c=labels)
    plt.scatter(new_X[:,0], new_X[:,1], c=perdict_new_sample_lables, marker="x")
    plt.show()

有时它运作正常:enter image description here

但有时它并不是:enter image description here

图片中的圆形是经过训练的数据集。图中的十字形是预测的新元素。

这里的问题不是结果的确定性,不确定性。在非确定性算法输出中每次运行都会发生变化。但这里的结果是完全错误的!!  在图片2中紫罗兰十字架必须是绿色

1 个答案:

答案 0 :(得分:1)

K-means不是确定性算法,并且群集分配取决于数据的分布和算法在初始化中的随机性。您可以通过使用k-means中使用random_state参数的random.seed()函数设置种子来解决此问题。有关此内容的更多信息,请参阅以下页面: