k-NN在非线性数据上的应用+降维

3
我正在尝试在一个复杂的模拟数据集上使用k-NN。numpy数组是(1000, 100),因此具有许多维度。在运行k-NN进行训练/分类之前,我需要对数据集进行预处理/转换。PCA不起作用,因为所有特征的方差几乎相同。CSV格式的数据可在此处作为gist获取:https://gist.github.com/modqhx/0ab61da16eae8f371a1d6a787f018a64 绘制数据时,它看起来像一个三维球形结构(这里使用'hypertools'的屏幕截图):enter image 你有什么想法如何继续吗?

编辑并回应评论:是的,如果没有“明显”的聚类,我理解为什么使用k-nn。我应该用正确的方式表达。然而,原始数据并没有形成聚类,某种形式的降维可能会揭示聚类。有100个维度,PCA也无法帮助,因为所有100个特征的方差相同。问题变成了当所有特征的方差几乎相同时,我们如何进行降维?..再次强调,这只是一种练习,并且关键是使"knn"能够工作!(如果这有任何意义的话)。我被告知,在第一和第二时刻,您不会找到任何群集,但在此之后(第三时刻及之后),您可能会找到。


3
如果数据没有明显的聚类,那么你希望通过knn算法达到什么样的目的? - WestCoastProjects
1个回答

1

我基本上赞同@javadba的评论: 如果您的数据集在观察时没有明显的聚类属性,应用k-NN或任何其他聚类算法只会给您带来人为的结果和可疑的信号。我写这篇答案的原因是因为我在您的数据中找到了一些结构。

我做的第一件事是加载您的数据。据我所知,您的(1000,101)形状的数组对应于100维空间中的1000个点(加上一个尾随的零/一列,现在可能无关紧要)。请注意,如果您考虑一下,这听起来像是一个非常稀疏的对象。考虑一条有2个点的线,一个有4个点的正方形,一个有8个点的立方体...一个具有相同稀疏度(每个维度上有2个点)的100维规则网格将包含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))

以下是一个典型的情节从各个角度的外观:

typical plot

如您所见,这是一团乱麻!或者更科学地说:很难在视觉上区分这些散点图和立方体中均匀分布的实例。如果所有的图都是这样的话,那么可能根本没有聚类,因此您应该在开始之前停止。无论您为数据分配什么标签都是毫无意义的。
但是有好消息:在交互式窗口中,我注意到从某个角度看,上面的图看起来更有趣。

data are split according to dimension 42!

数据清晰地显示了沿着第42维度(所有数字中的)的分离。现在,这很有希望。请注意,一个数据集甚至可以被真正地聚类,但是这可能不明显地反映在轴对齐平行投影上。想象一下以下的2D示例场景:

example with two non-overlapping diagonal blobs

虽然数据明显聚类,但如果我们只看轴对齐的投影,则远非显而易见。

我的观点是,在您的100维数据集中找到聚类存在的证据真的很困难。在低维子空间中找到聚类的证据已经很难了,但即使您找不到这样的证据,也不意味着您的数据在100d空间中没有以直径配置聚类。

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

如果第42维在完全分离大多数点方面是特殊的,您可以尝试沿着此轴对数据进行聚类,并在降维后的99维空间中使用两个半数据集。


非常好。感谢你的努力并找到这两个聚类。非常感激。首先,我编辑了我的问题以包括“为什么使用k-nn”的部分。是的,想法是让“k-nn工作”。给出的提示是,您可能无法像原样进行聚类,但您可能需要查看三阶或更高阶矩,并进行降维处理,这就是我卡住的地方。我不理解这部分。有一个名为“numpy”的“einsum”函数,但并不完全理解它...其次,为了可视化更高维空间,这个叫做'hypertools'的库很有帮助! :) - Joe
@Joe,恐怕你的大部分更新对我来说都没有意义(可能是我的问题)。在这种情况下,我不理解“降维”:如果你有6个点散布在一个3D盒子里,你怎么能将维度降低到2呢?我是einsum的快乐用户,但我不认为它现在会对你有所帮助:它可以帮助将100个指数量转换为3个指数量,但你一开始就有20个指数量!而在这种情况下,“矩”是什么意思?我就是不明白!至于hypertools:你向我展示了一个球体,而你的数据是一个立方体,所以我不信任它;) - Andras Deak -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接