如何使用KMeans验证数据集存在噪声?

3 投票
1 回答
897 浏览
提问于 2025-04-17 21:50

我看到一篇旧论文的摘录,里面随意提到:

如果需要的话,我们可以使用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算法)、初始中心点是怎么选的、计算向量之间距离的方法等等,当然也和你数据的统计特性有关(也就是那些多维向量)。

在进行聚类后,你可以利用拟合优度(或者叫量化失真)来对你的数据做一些判断。举个例子,如果你有两个不同的数据集,它们的拟合优度值差别很大(而且其他因素,比如组的数量都保持一致),那么你可以说拟合优度差的那个数据集更“复杂”,可能更“嘈杂”。我把这些判断放在引号里,因为它们是主观的(比如“嘈杂”怎么定义呢?),而且会受到你的训练算法和其他因素的强烈影响。

再举个例子,你可以用一个“干净”的数据集来训练一个聚类模型。然后,使用同样的模型(也就是同样的中心点)去聚类一个新的数据集。根据新数据集的拟合优度和原来干净训练数据集的拟合优度的差异,你可以对新数据集中的“噪声”做一些判断。

撰写回答