Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn kmeans.predict方法不正确_Python_Scikit Learn - Fatal编程技术网

Python sklearn kmeans.predict方法不正确

Python sklearn kmeans.predict方法不正确,python,scikit-learn,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_b

我使用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()
有时它可以正常工作:

但有时情况并非如此:

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


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

K-means不是一个确定性算法,聚类分配取决于数据的分布和初始化时算法的随机性。您可以通过使用k-means中的random_state参数的random.seed函数设置种子来解决此问题。有关这方面的更多信息,请参阅以下页面:


这里的问题不在于结果的确定性和不确定性。在非确定性算法中,每次运行的输出都会发生变化。但是这里的结果是完全错误的!!在图2中,紫罗兰十字必须是绿色的。很抱歉,我以前没有注意到你在问题末尾的笔记。然而,经过仔细检查,我认为这不是预测的错误,而是标签的问题。培训集和测试集之间的标签不一致。这在Matlab的k-means实现中非常常见。我以前从未在scikit中遇到过它。但是您应该看看scikit的LabelEncoder-。问题在于while true循环。在内部,您正在使用make_blob生成测试数据。此测试数据与训练数据不匹配,因此不匹配。您需要首先生成所有数据,然后将其划分为训练和测试。每次使用make_blobs方法时,新数据可能与旧数据不匹配。希望这对你有意义。您还需要复习集群的基础知识。