Press "Enter" to skip to content

在更高维度中,数据的令人惊讶的行为

探索高维数据世界的旅程:祝福与挑战

Photo by Guillermo Ferla on Unsplash

著名物理学家理查德·费曼(Richard Feynman)曾经说过:“我可以肯定地说,没有人真正理解量子力学。”在他的采访中,《与理查德·费曼一起想象》,他提到了原子和亚原子粒子水平上的奇怪行为,指出它们经常违背我们的常识。有趣的是,我们在高维数据的层次上也可以注意到类似的行为。虽然它不完全像量子力学,但在从低维度到高维度的过渡中,同样有一种意外和美的元素 – 搭配着一些/很多挑战。

在这篇及以后的文章中,我想提供一些关于这个迷人主题的见解。我的目标是激发对高维数据世界的兴趣,特别是对于那些对此不熟悉的人。

在数据分析和机器学习的背景下,高维数据通常指的是具有大量变量、特征或属性的数据集。每个变量都代表着我们数据中的一个不同“维度”。

让我们从一些基本的例子开始,以突出从低维空间到高维空间时出现的区别。

高维空间的体积集中

首先,让我们探索高维空间中体积集中的概念。考虑在一条边长从0到1的超立方体内生成随机点。随着维度增加,这些点在超立方体的中间区域落下的可能性有多大?

Image by author

在上面的图片中,让我们假设 x 是一个小的值,比如 0.1。我们的目标是确定点随机落入该中间区域(非边缘)的概率如何随着维度的增加而变化。

  1. 一维空间(线)

想象一条从 0 到 1 的线段。中间部分位于 0.1 和 0.9 之间,点随机落在这里的机会简单地是该中间线段的长度除以总长度,即 0.8。

2. 二维空间(正方形)

现在,设想一个在每个边长从 0 到 1 的正方形。中间区域是一个边长从 0.1 到 0.9 的较小正方形。概率的计算涉及将该较小正方形的面积与总面积进行比较,得到 0.64 的概率。

3. 三维空间(立方体)

对于边长为 1 的立方体,中间区域是一个边长从 0.1 到 0.9 的较小立方体。在这里,概率是这个较小立方体的体积除以总体积,得到 0.512。

4. 更高维度(超立方体)

在 n 维超立方体中,中间区域的“体积”随着维度的增加而急剧缩小。例如,在四维空间中,概率为 0.4096;在五维空间中,为 0.32768;在十维空间中,降至约 0.10737。

这一思想的概括是将边缘视为很小的距离 x,如上图所示。对于一条线,点落入中间区域的概率是 1–2x。对于一个正方形,它是 (1–2x)*(1–2x),因为点必须同时落在两个维度的中间。

这种模式在 n 维中继续存在,其中落入中间区域的概率为 (1–2x)^n,在更高维度中变得非常小。

请注意,我们在这里简化了每个边的长度为 1。

在超立方体内刻画一个超球体

为了进一步说明容积集中的概念,我使用 Python 进行了一个简单的模拟。我们在超立方体内刻画一个超球体,并比较随着维度增加,超球体与超立方体的容积比。

到底什么是超立方体呢?

想象一个正方形。现在,将它扩展成一个立方体。这是从二维到三维的跳跃。然后,往第四维及更高维度想象 — 这就是超立方体的存在。超立方体本质上是一个延伸到更高维度的立方体。它是一个边长相等的形状,在我们的模拟中,我们考虑边长为 2 的超立方体。它的体积公式是?只需用 2^n (2 的 n 次方) 表示 n 维超立方体的体积。

那超球体呢?

超球体是一个高维等效的球体,在二维中你可以将一个圆扩展成三维 (形成一个球体),然后继续到更高维度。重点是,计算它的体积并不直接。它涉及到派 (是的,就是那个著名的 3.14159…) 和 gamma 函数,它类似于一个阶乘。简而言之,在 n 维空间中半径为 1 的超球体的体积是:

在更高维度中,数据的令人惊讶的行为 四海 第3张

Gamma 函数 Γ(n) 将阶乘函数扩展到实数和复数。对于正整数 n,Γ(n)=(n−1)!,对于非整数值,它是通过数值计算得出的。

要使用 Python 计算这个比率,我们可以使用以下代码:

import mathimport matplotlib.pyplot as pltdef hypersphere_volume(dim):    """ 计算 'dim' 维度中半径为 1 的超球体的体积。"""    return math.pi ** (dim / 2) / math.gamma(dim / 2 + 1)def hypercube_volume(dim):    """ 计算 'dim' 维度中边长为 2 的超立方体的体积。"""    return 2 ** dim# 要考虑的维度数量max_dim = 20# 用于保存体积和维度值的列表dimensions = range(1, max_dim + 1)sphere_volumes = [hypersphere_volume(dim) for dim in dimensions]cube_volumes = [hypercube_volume(dim) for dim in dimensions]ratios = [sphere_volumes[i] / cube_volumes[i] for i in range(max_dim)]# 绘制结果plt.figure(figsize=(10, 6))plt.plot(dimensions, ratios, marker='o')plt.xlabel('维度数')plt.ylabel('体积比率(超球体/超立方体)')plt.title('高维度中的容积集中')plt.grid(True)plt.show()

以上代码的输出是以下图表:

作者提供的图像

我们可以清楚地看到随着维度的增加,比率迅速减小,使得超立方体的大部分容积集中在角落。

这些例子说明在更高维度中,中间区域的体积逐渐成为总体积的较小一部分,突显了高维度空间的反直觉特性。

问:这种容积集中现象对机器学习算法的性能有什么影响?

纸张和 DVD 的实验

考虑这样一个实验,你试图将一个 DVD 放入一块有方形孔的纸片中。最初,它似乎是不可能的,因为方形的对角线小于 DVD 的直径。然而,将纸张折叠后,DVD 可以通过。

纸张的折叠,这个关于空间维度的微小而有效的调整,是解开这个谜题的关键。在理解高维度空间复杂性时,这个实验是一个有趣的类比。

当纸张首次铺开时,它形成一个二维平面。由于其固定尺寸,正方形的插槽似乎太窄,无法让DVD通过。

这种假设情景与我们在三维环境中的日常体验一致,其中长度、宽度和高度是尺寸和距离的测量单位。但是,一旦我们开始折叠纸张,就会增加另一个维度。这种折叠行为完全改变了孔与DVD的空间连接。

在这个新的三维设置中,距离的概念在二维中非常僵化和明确的情况下变得更加灵活和不直观。纸张被折叠,有效地改变了纸张边缘产生的角度和围绕孔的点之间的距离。

这个新的三维形式中的孔可以容纳DVD,说明引入第三个维度可以使二维空间中看似无望的任务变得可行。魏韦林等人在一项有趣的研究中详细解释了这个实验的数学基础。

一个玩具启发的剪纸图案及其应用机构和机器的动力学性能…

摘要:通过在纸上设置简单的褶皱并沿着这些褶皱折叠,可以形成各种形状的折纸…

ms.copernicus.org

您还可以观看由“The Action Lab”制作的漂亮视频,直观地演示这个思想:

一个小方孔中的圆盘

这种视角转移具有重要意义,特别是在数学、物理和机器学习领域。这个思想体现在机器学习方法中,如支持向量机(SVM)。

SVM和核技巧

支持向量机(SVM)中的核技巧表现出类似的思想。在SVM中,我们经常遇到无法线性分离的数据。核技巧通过将数据转换为一个更高维度的空间来克服这个问题,就像折叠纸张改变其空间特性一样。(实际上,SVM并没有将数据实际转换为更高的维度,因为这在计算方面是昂贵的。相反,它们利用核技巧计算数据点之间的关系,好像它们在更高维度中一样)。

简单来说,SVM通常在较低维度中找到一个分离线(或超平面)。但是对于非线性数据,这是不可能的。就像折叠纸张一样,核技巧添加了维度,使得更容易找到能胜任工作的超平面。

核技巧不仅改变了维度,还简化了复杂的问题。它真正是高维思维如何为低维看似不可能解决的问题提供解决方案的很好例子。

import numpy as npimport matplotlib.pyplot as pltfrom sklearn.svm import SVC# 这里我手动输入了一个不可线性分离的1D数据x = np.array([1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30]).reshape(-1, 1)  # 用您的数据替换YOUR_X_VALUESy = np.array([1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1])                 # 用您的类标签替换YOUR_Y_VALUES# 非线性变换为2D(平方)def transform_to_2d(X):    return np.c_[X, X**2]# 将数据转换为2DX_transformed = transform_to_2d(x)# 用转换后的2D空间中的线性核心拟合SVMsvm = SVC(kernel='linear')svm.fit(X_transformed, y)fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 绘制1D数据图axes[0].scatter(x, np.zeros_like(x), c=y, cmap='bwr', edgecolors='k')axes[0].set_title('原始1D数据')axes[0].set_xlabel('特征')axes[0].set_yticks([])# 绘制转换后的2D数据图axes[1].scatter(X_transformed[:, 0], X_transformed[:, 1], c=y, cmap='bwr', edgecolors='k')axes[1].set_title('转换后的2D数据')axes[1].set_xlabel('原始特征')axes[1].set_ylabel('转换特征(X^2)')# 在2D中绘制决策边界ax = axes[1]xlim = ax.get_xlim()ylim = ax.get_ylim()xx = np.linspace(xlim[0], xlim[1], 30)yy = np.linspace(ylim[0], ylim[1], 30)YY, XX = np.meshgrid(yy, xx)xy = np.vstack([XX.ravel(), YY.ravel()]).T# 获取分离的超平面Z = svm.decision_function(xy).reshape(XX.shape)# 绘制决策边界和间隔ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,           linestyles=['--', '-', '--'])plt.tight_layout()plt.show()

上述代码的结果如下图所示:

作者提供的图片

显然,最初在左侧是非线性可分的数据,在二维空间中变得可分。这个变换如右图所示,有效地解决了我们的问题。这难道不令人惊叹吗?

总结

在本文中,我们探讨了关于高维数据世界的一些思想。我们展示了如何进入更高维度可以大大改变我们的观点和解决问题的方法,从体积集中开始,继而介绍了纸和 DVD 实验的现实世界例子,最后讲解了 SVM 中的核技巧。

在即将发布的文章中,我们将讨论“维度之咒”,这指的是在高维空间中导航时涉及的困难和复杂性。我们将探讨这如何影响机器学习和数据分析,以及减轻其影响的策略。

感谢您的阅读至此!非常感谢您抽出时间阅读本文,我希望您觉得这个主题很有趣。请随时提出任何建议或未来文章的可能修改。

Leave a Reply

Your email address will not be published. Required fields are marked *