我基本同意with the comment of @javadba:如果您的数据集没有明显的聚类属性,那么应用 k-NN 或任何其他聚类算法只会给您带来伪影和可疑信号。我写这个答案的原因是因为我确实在你的数据中找到了一些结构。
我所做的是首先加载您的数据。据我了解,您的(1000,101) 形数组对应于 100 维空间中的 1000 个点(加上一列现在可能无关紧要的零/一的尾随列)。请注意,如果您考虑一下,这听起来像一个 非常 稀疏对象。考虑一条有 2 个点的线、一个有 4 个点的正方形、一个有 8 个点的立方体……一个具有相同稀疏度的 100 维规则网格(每个维度上 2 个点)将包含 2^100 个点。那……比 1000 多得多。不幸的是,我很难在 100 维空间中可视化稀疏点云。
所以我做的是随机选择三个轴,并绘制相应的 3d 散点图,看看是否有任何模式。我一次做了很多次。代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
dat = np.loadtxt('foodat.csv',skiprows=1,delimiter=',')
nums = np.arange(dat.shape[1]-1)
for _ in range(5):
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
np.random.shuffle(nums)
inds = nums[:3]
plotdat = dat[:,inds]
ax.scatter(*plotdat.T)
ax.set_title(str(inds))
从各个角度来看,典型的情节都是这样的:
如您所见,这是一团糟!或者更科学地说:很难在视觉上将这些散点图与立方体中均匀分布的实例区分开来。如果所有的图都像这样,那么可能一开始就绝对没有聚类,所以你应该在开始之前停下来。您可以为数据分配的任何标签都将毫无意义。
但是有一个好消息:在交互式窗口中,我注意到上面的情节从某个角度看起来更有趣:
数据清楚地显示了沿维度 42 的分离(所有数字!)。现在 this 很有希望。请注意,数据集甚至可以真正聚类,但这在轴对齐的平行投影中可能并不明显。在 2d 中想象以下示例场景:
虽然数据清晰地聚集在一起,但如果我们只查看轴对齐的投影,这远非显而易见。
因此,我的观点是,在 100 维数据集中找到集群存在的证据确实很困难。在低维子空间中已经很难找到聚类的证据,但是即使您找不到这方面的证据,这不意味着您的数据没有在 100d 空间中以直径配置聚类.
我会沿着这条路径开始研究低维切割。您的点沿维度 42 很好地分开的事实表明这并非不可能。您可以尝试系统地检查每个维度,看看是否有任何其他维度产生了这种分离……但您必须记住,即使对于 42 号这样的维度,这种分离也可能只发生在某些维度组合中。
如果维度 42 的特殊之处在于它完全分离了您的大部分点,您可以尝试沿该轴对数据进行聚类,并在缩减的 99 维空间中处理两个减半的数据集。