sklearn kmeans.predict 方法不正确

Posted

技术标签:

【中文标题】sklearn kmeans.predict 方法不正确【英文标题】:sklearn kmeans.predict method dosnt work correct 【发布时间】:2017-10-20 06:32:39 【问题描述】:

我使用 sklearn 来实现 k-means 方法。 k-means 类有一个方法,称为“预测”。根据训练样本预测新样本。

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 中的紫十字必须是绿色的

【问题讨论】:

问题出在您的while true 循环中。在里面,您正在使用make_blobs() 生成测试数据。该测试数据与训练数据不匹配,因此不匹配。您需要首先生成所有数据,然后将其分为训练和测试。每次使用make_blobs 方法时,新数据可能与旧数据不匹配。希望这对你有意义。您还需要复习集群基础知识。 【参考方案1】:

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

http://www.datasciencecentral.com/forum/topics/k-means-clustering-effect-of-random-seed Changes of clustering results after each time run in Python scikit-learn https://gist.github.com/naufraghi/457394

【讨论】:

这里的问题不在于结果的确定性、非确定性。在每次运行中的非确定性算法输出变化。但是这里的结果是完全错误的!!在 pic2 紫十字必须是绿色的。 很抱歉之前没有注意到你在问题末尾的注释。但是,经过仔细检查,我认为这不是预测错误,而是标签问题。训练集和测试集的标签不一致。在 Matlab 的 k-means 实现中很常见。我以前从未在 scikit 中遇到过。但是你应该看看 scikit 的 LabelEncoder - (scikit-learn.org/stable/modules/generated/…)。

以上是关于sklearn kmeans.predict 方法不正确的主要内容,如果未能解决你的问题,请参考以下文章

是 kmeans_lables 或 kmeans.predict 为数据集中的每个样本分配标签

Kmeans fit_predict 与 word2vec

如何绘制一维 K 均值集群

调整 sklearn.ensemble.GradientBoostingClassifier 中预测方法阈值的方法

Sklearn标准化和归一化方法汇总:范数归一化

Sklearn标准化和归一化方法汇总:范数归一化