【问题标题】:k-NN on non linear data + Dimensionality reduction非线性数据上的 k-NN + 降维
【发布时间】:2017-12-05 00:11:10
【问题描述】:

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

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

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

编辑并回应评论:是的,我明白如果没有“明显”聚类,为什么要使用 k-nn。我应该用正确的方式表达出来。然而,原始数据并没有,某种形式的降维可能会揭示集群。有 100 个维度,PCA 没有帮助,因为所有 100 个特征的方差都相同。问题变成了,当所有特征的方差几乎相同时,我们如何进行降维? ..再次,这是一个练习,重点是让“knn”工作! (如果那有意义的话)。有人告诉我,直到第一和第二时刻你都找不到任何集群,但在那之后(第三时刻和之后)你可能会找到。

【问题讨论】:

  • 如果数据没有明显的聚类,那么您希望用 knn 完成什么?

标签: python numpy machine-learning pca


【解决方案1】:

我基本同意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 维空间中处理两个减半的数据集。

【讨论】:

  • 优秀。感谢您的努力并在此处找到 2 个集群。非常感激。首先,我编辑了我的问题以包括“为什么 k-nn”部分。是的,这个想法是让“k-nn 工作”。给出的提示是您可能无法按原样进行聚类,但您可能必须研究 3 阶或更高阶的矩并进行降维才能继续,这就是我坚持的地方。我不明白这部分。 numpy 中有这个“einsum”函数,但并不完全理解。其次,为了可视化更高维度的空间,这个名为“hypertools”的库有帮助! :)
  • @Joe 恐怕您的大部分更新对我来说毫无意义(可能是我的错)。我不明白这种情况下的“降维”:如果你有 6 个点分散在一个 3d 盒子里,你怎么能把维数降到 2?我是einsum 的快乐用户,但我认为它现在对您没有帮助:它可以帮助将 100 指数数量转换为 3 指数数量,但您从 20 指数数量开始!在这种情况下,什么是“时刻”?我就是不明白!至于超级工具:您向我展示了一个球体,而您的数据是一个立方体,所以我不相信它;)
猜你喜欢
  • 2017-11-20
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2020-04-06
  • 2015-09-03
  • 2018-03-17
相关资源
最近更新 更多