关于非线性数据的k-NN +维数减少

时间:2017-07-01 01:11:13

标签: numpy machine-learning pca

我正在尝试在棘手的模拟数据集上使用k-NN。 numpy数组是(1000,100),因此很多维度。在我运行k-NN进行训练/分类之前,我需要预处理/转换数据集。 PCA不起作用,因为所有功能的差异几乎相同。作为csv的数据在这里可以作为要点:https://gist.github.com/modqhx/0ab61da16eae8f371a1d6a787f018a64

在绘制数据时,它看起来像一个3d球形结构(这里是使用'hypertools'的截图):  enter image

有关如何进行的任何想法?

编辑并回应评论:是的,我理解如果没有“明显”的聚类,为什么要使用k-nn。我应该用正确的方式措辞。然而,原始数据没有某种形式的维数减少可能揭示集群。有100个维度,PCA没有帮助,因为所有100个功能的差异是相同的。问题变成,当所有特征的方差几乎相同时,我们怎样才能减少维数? ..再次,这是一个练习,重点是使“knn”工作! (如果那有意义的话)。我被告知,在第一和第二时刻,你将找不到任何集群,但在那之后(第三时刻和之后),你可以。

1 个答案:

答案 0 :(得分:1)

我大多赞同with the comment of @javadba:如果你看一下你的数据集没有明显的聚类属性,那么应用k-NN或任何其他聚类算法只能给你产生伪像和可疑信号。我写这个答案的原因是因为我 在你的数据中找到了一些结构。

我所做的是首先加载您的数据。根据我的理解,你的(1000,101)形状的数组对应于100维空间中的1000个点(加上一个零/一的尾随列,现在可能无关紧要)。请注意,如果您考虑它,这听起来像非常稀疏对象。考虑一条有2个点的线,一个有4个点的正方形,一个有8个点的立方体......一个具有相同稀疏度的100维规则网格(每个维度有2个点)将包含2 ^ 100个点。那......超过1000.不幸的是,我很难在100维空间内可视化稀疏点云。

所以我做的是随机选择三个轴,并绘制相应的三维散点图以查看是否有任何模式。我一次多次这样做。代码:

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))

以下是从各个角度看典型情节的样子:

typical plot

如你所见,这是一团糟!或者更科学地说:很难在视觉上将这些散点图与立方体中均匀分布的实例区分开来。如果所有的情节看起来都像这样,那么可能一开始就没有聚类,所以你应该在开始之前就停止。无论您为数据分配什么标签都没有意义。

但是有个好消息:在互动窗口中,我注意到上面的情节从某个角度看起来更有趣:

data are split according to dimension 42!

数据清楚地显示了沿着尺寸42的分离(所有数字!)。现在这个很有希望。请注意,数据集甚至可以真正聚集,但这可能不会从轴对齐的平行投影中显而易见。想象一下2d中的以下示例场景:

example with two non-overlapping diagonal blobs

虽然数据清晰地聚集在一起,但如果我们只关注轴对齐投影,那么这很明显。

因此,我的观点是,在100维数据集中找到聚类存在的证据确实很困难。已经很难在低维子空间中找到聚类的证据,但即使你找不到这方面的证据,也意味着你的数据没有聚集在100d空间的直径配置中

我会沿着这条看低维剪裁的道路开始。事实上你的点在尺寸42上非常好地分开表明这并非不可能。您可以尝试系统地检查每个维度,看看是否有其他维度产生了这样的分离......但是您必须记住,即使对于诸如数字42这样的维度,这种分离也可能只发生在某些维度组合上。

如果尺寸42的特殊之处在于它完全分离了大部分点,您可以尝试沿着这个轴聚类数据,并在缩小的99维空间中处理两个减半的数据集。