编辑并回应评论:是的,如果没有“明显”的聚类,我理解为什么使用k-nn。我应该用正确的方式表达。然而,原始数据并没有形成聚类,某种形式的降维可能会揭示聚类。有100个维度,PCA也无法帮助,因为所有100个特征的方差相同。问题变成了当所有特征的方差几乎相同时,我们如何进行降维?..再次强调,这只是一种练习,并且关键是使"knn"能够工作!(如果这有任何意义的话)。我被告知,在第一和第二时刻,您不会找到任何群集,但在此之后(第三时刻及之后),您可能会找到。
编辑并回应评论:是的,如果没有“明显”的聚类,我理解为什么使用k-nn。我应该用正确的方式表达。然而,原始数据并没有形成聚类,某种形式的降维可能会揭示聚类。有100个维度,PCA也无法帮助,因为所有100个特征的方差相同。问题变成了当所有特征的方差几乎相同时,我们如何进行降维?..再次强调,这只是一种练习,并且关键是使"knn"能够工作!(如果这有任何意义的话)。我被告知,在第一和第二时刻,您不会找到任何群集,但在此之后(第三时刻及之后),您可能会找到。
我基本上赞同@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))
虽然数据明显聚类,但如果我们只看轴对齐的投影,则远非显而易见。
我的观点是,在您的100维数据集中找到聚类存在的证据真的很困难。在低维子空间中找到聚类的证据已经很难了,但即使您找不到这样的证据,也不意味着您的数据在100d空间中没有以直径配置聚类。
我会沿着这条寻找低维切割的道路开始。您的点沿第42维非常好地分离表明这并非不可能。您可以尝试系统地检查每个维度,看是否有其他维度产生这样的分离...但您必须记住,即使对于像第42个数字这样的维度,这样的分离也只会发生在某些维度组合上。
如果第42维在完全分离大多数点方面是特殊的,您可以尝试沿着此轴对数据进行聚类,并在降维后的99维空间中使用两个半数据集。
einsum
的快乐用户,但我不认为它现在会对你有所帮助:它可以帮助将100个指数量转换为3个指数量,但你一开始就有20个指数量!而在这种情况下,“矩”是什么意思?我就是不明白!至于hypertools:你向我展示了一个球体,而你的数据是一个立方体,所以我不信任它;) - Andras Deak -- Слава Україні