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 为数据集中的每个样本分配标签