如何使用KMeans验证数据集存在噪声?
我看到一篇旧论文的摘录,里面随意提到:
如果需要的话,我们可以使用KMeans这个方法来证明这个数据集是有噪声的,从而证明我们的分类器的表现是可以合理预期的。
我在网上找了很久,没找到关于这个方法的任何信息。这个方法到底怎么做呢?怎么把这个通用的KMeans
代码改造成可以证明这个数据集包含噪声的呢?
代码摘自这里
print(__doc__)
# Code source: Gael Varoqueux
# Modified for Documentation merge by Jaques Grobler
# License: BSD 3 clause
import numpy as np
import pylab as pl
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasets
np.random.seed(5)
centers = [[1, 1], [-1, -1], [1, -1]]
iris = datasets.load_iris()
X = iris.data
y = iris.target
estimators = {'k_means_iris_3': KMeans(n_clusters=3),
'k_means_iris_8': KMeans(n_clusters=8),
'k_means_iris_bad_init': KMeans(n_clusters=3, n_init=1,
init='random')}
fignum = 1
for name, est in estimators.iteritems():
fig = pl.figure(fignum, figsize=(4, 3))
pl.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
pl.cla()
est.fit(X)
labels = est.labels_
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float))
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
fignum = fignum + 1
# Plot the ground truth
fig = pl.figure(fignum, figsize=(4, 3))
pl.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
pl.cla()
for name, label in [('Setosa', 0),
('Versicolour', 1),
('Virginica', 2)]:
ax.text3D(X[y == label, 3].mean(),
X[y == label, 0].mean() + 1.5,
X[y == label, 2].mean(), name,
horizontalalignment='center',
bbox=dict(alpha=.5, edgecolor='w', facecolor='w'))
# Reorder the labels to have colors matching the cluster results
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y)
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
pl.show()
1 个回答
3
K-means聚类的核心就是把一组多维向量分成几个紧密的组,然后用一个向量来代表每个组,这个向量叫做中心点。完成这个步骤后,你可以计算一下这些中心点有多好地代表了原来的向量集合,这个好坏程度叫做拟合优度。拟合优度的好坏会受到几个因素的影响,比如你选择了多少个组(中心点)、使用了什么训练算法(比如LBG算法)、初始中心点是怎么选的、计算向量之间距离的方法等等,当然也和你数据的统计特性有关(也就是那些多维向量)。
在进行聚类后,你可以利用拟合优度(或者叫量化失真)来对你的数据做一些判断。举个例子,如果你有两个不同的数据集,它们的拟合优度值差别很大(而且其他因素,比如组的数量都保持一致),那么你可以说拟合优度差的那个数据集更“复杂”,可能更“嘈杂”。我把这些判断放在引号里,因为它们是主观的(比如“嘈杂”怎么定义呢?),而且会受到你的训练算法和其他因素的强烈影响。
再举个例子,你可以用一个“干净”的数据集来训练一个聚类模型。然后,使用同样的模型(也就是同样的中心点)去聚类一个新的数据集。根据新数据集的拟合优度和原来干净训练数据集的拟合优度的差异,你可以对新数据集中的“噪声”做一些判断。