Python 机器学习算法交易实用指南(四)(1)

简介: Python 机器学习算法交易实用指南(四)

第十二章:无监督学习

在第六章,机器学习流程中,我们讨论了无监督学习如何通过发现数据中的结构而增加价值,而无需一个指导搜索过程的结果变量,例如老师。这个任务与我们在过去几章中专注于的监督学习的设置形成对比。

当数据集只包含特征而没有结果的测量值,或者当我们想要提取与结果无关的信息时,无监督学习算法可以很有用。目标不是预测未来的结果,而是研究对解决另一个任务有用的数据的信息表示,包括探索数据集。

例如,识别主题以总结文档(参见第十四章,主题建模)、减少特征数量以减少过度拟合和监督学习的计算成本,或者分组相似的观察,如本章末尾资产配置的聚类使用所示。

降维和聚类是无监督学习的主要任务:

  • 降维将现有特征转换为一个新的、更小的集合,同时尽量减少信息的损失。存在广泛的算法,它们仅在如何衡量信息损失、是否应用线性或非线性变换或对新特征集施加的约束方面有所不同。
  • 聚类算法不是识别新特征,而是识别和分组相似的观察或特征。不同的算法在如何定义观察的相似性以及对结果群组的假设上有所不同。

更具体地说,本章涵盖以下内容:

  • 主成分分析(PCA)和独立成分分析(ICA)如何进行线性降维
  • 如何应用 PCA 来识别资产回报的风险因素和特征组合
  • 如何使用非线性流形学习来总结高维数据以进行有效的可视化
  • 如何使用 t-SNE 和 UMAP 来探索高维替代图像数据
  • 如何使用 k-Means、分层和基于密度的聚类算法
  • 如何使用凝聚聚类构建根据层次风险平衡构建健壮的投资组合

每个部分的代码示例都在本章的在线 GitHub 存储库的目录中,网址为github.com/PacktPublishing/Hands-On-Machine-Learning-for-Algorithmic-Trading

降维

从线性代数的角度来看,数据集的特征创建了一个向量空间,其维数对应于线性独立列的数量(假设观测数量多于特征数量)。当两列线性相关时,它们完全相关,因此可以使用加法和乘法的线性运算从其中一个计算另一个。

换句话说,它们是表示相同而不是不同方向或轴的平行向量,并且只构成一个单一的维度。类似地,如果一个变量是其他几个变量的线性组合,则它是由这些列创建的向量空间的元素,而不是增加自己的新维度。

数据集的维数很重要,因为每个新维度都可以添加关于结果的信号。但是,还存在一个被称为维度诅咒的负面影响:随着独立特征数量的增加,同时保持观测数量不变,数据点之间的平均距离也会增加,并且特征空间的密度呈指数级下降。

对于机器学习而言,当观察结果彼此之间更远、即相异时,预测变得更加困难;下一节将讨论由此产生的挑战。

降维旨在通过使用较少的特征更有效地表示数据中的信息。为此,算法将数据投影到一个低维空间,同时舍弃不具信息性的数据变异,或者通过确定数据所在的或接近的低维子空间或流形。

流形是在局部类似于欧几里得空间的空间。一维流形包括线和圆(但不包括八的截屏,因为存在交点)。流形假设认为高维数据通常位于一个低维空间中,如果确定了这个空间,就可以在这个子空间中对数据进行忠实的表示。

因此,降维通过找到一组不同的、较小的变量来捕获原始特征中最重要的内容,从而最小化信息损失。压缩有助于对抗维度诅咒,节省内存,并允许可视化高维数据的显著特征,否则这些特征很难探索。

线性和非线性算法

降维算法在对新变量施加的约束以及它们如何旨在最小化信息损失方面存在差异:

  • 线性算法,如 PCA 和 ICA,将新变量限制为原始特征的线性组合;也就是说,在较低维度空间中的超平面。而 PCA 要求新特征是不相关的,ICA 进一步要求统计独立性——即线性和非线性关系的缺失。以下截图说明了 PCA 如何将三维特征投影到二维空间中:


  • 非线性算法不局限于超平面,并且可以捕捉数据中更复杂的结构。然而,由于选项的无限数量,算法仍然需要做出假设来得出解决方案。在本节中,我们展示了t-分布随机邻居嵌入t-SNE)和均匀流形近似和投影UMAP)对于可视化高维数据非常有用。以下截图说明了流形学习如何在三维特征空间中识别二维子空间(manifold_learning笔记本展示了使用其他算法的情况,包括局部线性嵌入):


维度的诅咒

数据集维度的增加意味着表示对应欧几里得空间中每个观测的特征向量中的条目更多。我们使用欧几里得距离,也称为L2 范数,来测量向量空间中的距离,我们将其应用于线性回归系数向量以训练正则化的岭回归模型。

两个具有笛卡尔坐标p = (p[1], p[2], …, p[n])q = (q[1], q[2], …, q[n])n维向量之间的欧几里得距离是用毕达哥拉斯所发展的熟知公式计算的:


因此,每个新的维度都会向总和中添加一个非负项,以使距离随着不同向量的维数增加而增加。换句话说,随着给定观测数量的特征数量增加,特征空间变得越来越稀疏;也就是说,越来越少或者更为空。

下图显示了我们需要多少数据点来维持均匀分布在一条线上的 10 个观测的平均距离。随着数据在每次添加新维度时需要扩展 10 倍,从一维中的 10¹增加到二维中的 10²和三维中的 10³,呈指数增长:


GitHub 存储库文件夹中的curse_of_dimensionality笔记本模拟了随着维度数量增加,数据点之间的平均距离和最小距离如何增加:


该模拟从不相关的均匀分布或相关的正态分布中绘制特征的范围为[0, 1],并逐渐增加特征数量到 2,500。对于从正态分布中绘制的特征,数据点之间的平均距离增加到特征范围的 11 倍以上,对于从不相关的均匀分布中绘制的特征,在(极端)情况下增加到 20 倍以上。

当观察之间的距离增加时,监督机器学习变得更加困难,因为对新样本的预测不太可能是基于对相似训练特征的学习。换句话说,随着特征数量的增加,可能的唯一行数呈指数增长,这使得从空间中高效采样变得更加困难。

同样,由灵活算法学到的函数的复杂度随着维度数量的增加呈指数增长,这些算法对实际关系的假设较少。

灵活算法包括我们在第十章,决策树和随机森林,以及第十一章,梯度提升机 中看到的基于树的模型,以及从第十七章 深度学习 开始我们将介绍的深度神经网络。这些算法的方差随着它们有更多机会在更多维度上过拟合噪声而增加,导致泛化性能较差。

在实践中,特征之间存在相关性,通常相当显著,或者不具有太多变化。出于这些原因,降维有助于压缩数据而几乎不损失信号,并且在节约内存的同时抵消了维数灾难。在这些情况下,它补充了使用正则化来管理由于方差和模型复杂度而产生的预测误差。

接下来我们要解决的关键问题是:找到一种尽可能减少信息损失的数据的低维表示的最佳方法是什么?

线性降维

线性降维算法计算线性组合,将原始特征进行平移、旋转和重新缩放,以捕捉数据中的显著变化,同时受到新特征特性的约束。

主成分分析 (PCA),由卡尔·皮尔逊于 1901 年发明,找到了反映数据中最大方差方向的新特征,同时这些特征相互不相关,或者正交。

独立成分分析 (ICA) 相反,起源于 20 世纪 80 年代的信号处理领域,其目标是在强加统计独立性的更严格约束条件下分离不同的信号。

本节介绍了这两个算法,然后说明了如何将 PCA 应用于资产收益,以从数据中学习风险因素,并构建所谓的特征投资组合来进行系统性交易策略。

主成分分析

PCA 将主成分视为现有特征的线性组合,并使用这些成分来表示原始数据。成分的数量是一个超参数,确定了目标维度,需要等于或小于观测或列的数量,以较小者为准。

PCA 旨在捕捉数据中的大部分方差,以便轻松恢复原始特征,并使每个成分都添加信息。它通过将原始数据投影到主成分空间来降低维度。

PCA 算法通过识别一系列主成分来工作,每个主成分都与数据中最大方差的方向对齐,考虑了先前计算的成分捕获的变化后。顺序优化还确保新成分与现有成分不相关,使得结果集构成向量空间的正交基础。

这个新基础对应于原始基础的旋转版本,使得新轴指向连续减小的方差方向。每个主成分解释的原始数据方差量的下降反映了原始特征之间相关性的程度。

捕获例如 95%的原始变化相对于总特征数的成分数量为原始数据中线性独立信息的洞察提供了一个见解。

在 2D 中可视化 PCA

下面的屏幕截图说明了一个二维随机数据集的 PCA 的几个方面(请参见pca_key_ideas笔记本):


  • 左侧面板显示了第一和第二主成分如何与最大方差的方向对齐,同时又是正交的。
  • 中心面板显示了第一主成分如何最小化重构误差,重构误差定义为数据点与新轴之间的距离之和。
  • 最后,右侧面板说明了监督 OLS,它通过从(单个)特征计算的(一维)超平面近似结果变量(这里我们选择 x[2])。垂直线突出显示 OLS 如何最小化沿结果轴的距离,与 PCA 相反,后者最小化与超平面正交的距离。

PCA 所做的假设

PCA 做出了几个重要的假设需要牢记。这些包括以下内容:

  • 高方差意味着高信噪比
  • 数据被标准化,使得各个特征的方差可比较
  • 线性变换捕捉了数据的相关方面
  • 超过第一和第二时刻的高阶统计量不重要,这意味着数据具有正态分布

对第一和第二时刻的强调与标准风险/回报度量相一致,但正态性假设可能与市场数据的特征相冲突。

PCA 算法的工作原理

该算法找到向量以创建目标维度的超平面,最小化重构误差,重构误差被测量为数据点到平面的平方距离之和。正如上面所示,这个目标对应于找到一个序列的向量,这些向量与给定其他分量的最大保留方差的方向对齐,同时确保所有主要成分都是相互正交的。

在实践中,该算法通过计算协方差矩阵的特征向量或使用奇异值分解来解决问题。

我们使用一个随机生成的三维椭圆来说明计算过程,其中包含 100 个数据点,显示在以下屏幕截图的左侧面板中,包括由前两个主成分定义的二维超平面(参见the_math_behind_pca笔记本中的以下代码示例):


三维椭圆和二维超平面

基于协方差矩阵的 PCA

我们首先使用特征x[i], x[j]的成对样本协方差作为行i和列j的输入来计算主成分:


对于一个n维的方阵M,我们定义如下的特征向量ω[i]和特征值λ[i]i=1, …, n


因此,我们可以使用特征向量和特征值表示矩阵M,其中W是一个包含特征向量的矩阵,L是一个包含*λ[i]*作为对角元素(其他元素为 0)的矩阵。我们将特征值分解定义如下:


使用 NumPy,我们按如下方式实现这一点,其中 pandas DataFrame 包含椭圆的 100 个数据点:

# compute covariance matrix:
cov = np.cov(data, rowvar=False) # expects variables in rows by default
cov.shape
(3, 3)

接下来,我们计算协方差矩阵的特征向量和特征值。特征向量包含主成分(符号是任意的):

eigen_values, eigen_vectors = eig(cov)
eigen_vectors
array([[ 0.71409739, -0.66929454, -0.20520656],
[-0.70000234, -0.68597301, -0.1985894 ],
[ 0.00785136, -0.28545725, 0.95835928]])

我们可以将结果与从 sklearn 获得的结果进行比较,发现它们在绝对意义上是匹配的:

pca = PCA()
pca.fit(data)
C = pca.components_.T # columns = principal components
C
array([[ 0.71409739, 0.66929454, 0.20520656],
[-0.70000234, 0.68597301, 0.1985894 ],
[ 0.00785136, 0.28545725, -0.95835928]])
np.allclose(np.abs(C), np.abs(eigen_vectors))
True

我们还可以验证特征值分解,从包含特征值的对角矩阵L开始:

# eigenvalue matrix
ev = np.zeros((3, 3))
np.fill_diagonal(ev, eigen_values)
ev # diagonal matrix
array([[1.92923132, 0\. , 0\. ],
[0\. , 0.55811089, 0\. ],
[0\. , 0\. , 0.00581353]])

我们发现结果确实成立:

decomposition = eigen_vectors.dot(ev).dot(inv(eigen_vectors))
np.allclose(cov, decomposition)

使用奇异值分解的 PCA

接下来,我们将看看使用奇异值分解(SVD)进行的备用计算。当观测次数大于特征数时(典型情况),该算法速度较慢,但在一些特征强相关(通常是使用 PCA 的原因)的情况下,可以获得更好的数值稳定性。

SVD 将我们刚刚应用于方形对称协方差矩阵的特征分解推广到更一般的m x n矩形矩阵。其形式如下图中心所示。 Σ 的对角值是奇异值,V 的转置包含主成分作为列向量:


在这种情况下,我们需要确保我们的数据中心化,均值为零(在计算协方差之前已经处理了这一点):

n_features = data.shape[1]
data_ = data - data.mean(axis=0
Using the centered data, we compute the singular value decomposition:
U, s, Vt = svd(data_)
U.shape, s.shape, Vt.shape
((100, 100), (3,), (3, 3))
We can convert the vector s that only contains the singular values into an nxm matrix and show that the decomposition works:
S = np.zeros_like(data_)
S[:n_features, :n_features] = np.diag(s)
S.shape
(100, 3)

我们发现,分解确实重新生成了标准化数据:

np.allclose(data_, U.dot(S).dot(Vt))
True

最后,我们确认V的转置的列包含主成分:

np.allclose(np.abs(C), np.abs(Vt.T))
True

在下一节中,我们将展示 sklearn 如何实现 PCA。

sklearn 中的 PCA

sklearn.decomposition.PCA的实现遵循基于fit()transform()方法的标准 API,这些方法分别计算所需数量的主成分并将数据投影到组件空间。便捷方法fit_transform()在一步中完成此操作。

PCA 提供了三种不同的算法,可以使用svd_solver参数指定:

  • Full 使用 SciPy 提供的 LAPACK 求解器计算精确的 SVD
  • Arpack 运行适用于计算不到全部组件的截断版本
  • Randomized 使用基于抽样的算法,当数据集具有 500 个以上观测值和特征,并且目标是计算少于 80%的组件时,效率更高
  • Auto 使用随机化算法在效率最高的地方,否则使用完整的 SVD

有关算法实现细节的参考请参见 GitHub 上的参考资料。

PCA 对象的其他关键配置参数如下:

  • n_components:通过传递None(默认)来计算所有主成分,或者限制数量为int。对于svd_solver=full,还有两个额外的选项:在[0,1]区间内的浮点数计算需要保留数据方差的相应份额的组件数量,mle选项使用最大似然估计来估计维度数量。
  • whiten:如果为True,则将组件向量标准化为单位方差,在某些情况下,这可能对在预测模型中使用有用(默认为False)。

要计算三维椭圆的前两个主成分并将数据投影到新空间中,可以使用fit_transform()如下所示:

pca = PCA(n_components=2)
projected_data = pca.fit_transform(data)
projected_data.shape
(100, 2)

前两个成分的解释方差非常接近 100%:

pca2.explained_variance_ratio_
array([0.77381099, 0.22385721])

本节开始处的截图显示了数据投影到新的二维空间中。

独立成分分析

独立成分分析ICA)是另一种线性算法,它确定了一种新的基础,用于表示原始数据,但追求的目标不同于 PCA。

ICA 起源于信号处理,其旨在解决的问题称为盲源分离。通常将其描述为鸡尾酒会问题,即同时有多位嘉宾讲话,以至于单个麦克风会记录重叠的信号。ICA 假设存在与说话者数量相同的不同麦克风,每个麦克风放置在不同的位置,以记录不同混合信号。然后,ICA 旨在从不同的录音中恢复个别信号。

换句话说,有 n 个原始信号和一个未知的方形混合矩阵 A,产生一个 nm 观测值集合,使得:


目标是找到矩阵W=A^(-1),以解开混合信号以恢复源信号。

唯一确定矩阵 W 的能力取决于数据的非高斯分布。否则,W 可以在多元正态分布在旋转下的对称性的情况下任意旋转。

此外,ICA 假设混合信号是其组成部分的和,并且无法识别高斯分量,因为它们的和也是正态分布的。

ICA 假设

ICA 做出以下关键假设:

  • 信号的来源是统计独立的
  • 线性变换足以捕获相关信息
  • 独立分量没有正态分布
  • 混合矩阵 A 可以被反转

ICA 还要求数据被居中和白化;也就是说,彼此不相关且方差为单位。使用 PCA 对数据进行预处理如上所述可以实现所需的转换。

ICA 算法

sklearn 使用的 FastICA 是一种固定点算法,它使用高阶统计量来恢复独立源。特别是,它最大化了每个分量到正态分布的距离,作为独立性的代理。

名为InfoMax的替代算法最小化组件之间的互信息作为统计独立性的度量。

使用 sklearn 进行 ICA

sklearn 的 ICA 实现使用与 PCA 相同的接口,因此没有什么需要额外添加的。请注意,没有解释方差的度量,因为 ICA 不会逐步计算组件。相反,每个组件旨在捕获数据的独立方面。

用于算法交易的 PCA

PCA 在算法交易中有几方面的用途。这些包括将 PCA 应用于资产收益,通过数据驱动的方法导出风险因素,并基于资产收益的相关矩阵的主成分构建不相关的投资组合。

数据驱动的风险因素

在第七章 Linear Models 中,我们探讨了量化金融中用于捕捉回报主要驱动因素的风险因素模型。这些模型根据资产暴露于系统性风险因素的程度以及与这些因素相关的回报来解释资产回报的差异。

特别地,我们探索了法玛-法 rench 方法,该方法根据有关平均收益的经验行为的先验知识指定因素,将这些因素视为可观察的,然后使用线性回归估计风险模型系数。另一种方法将风险因素视为潜在变量,并使用因子分析技术(如 PCA)同时估计因素以及它们如何从历史回报中驱动回报。

在本节中,我们将审查这种方法如何以纯粹的统计或数据驱动方式推导因素,其优势在于不需要对资产回报行为的 ex-ante 知识(有关详细信息,请参见pcarisk_factor 笔记本模型)。

我们将使用 Quandl 股价数据,并选择市值最大的 500 支股票在 2010-18 期间的每日调整收盘价。然后,我们按以下方式计算每日回报:

idx = pd.IndexSlice
with pd.HDFStore('../../data/assets.h5') as store:
stocks = store['us_equities/stocks'].marketcap.nlargest(500)
returns = (store['quandl/wiki/prices']
.loc[idx['2010': '2018', stocks.index], 'adj_close']
.unstack('ticker')
.pct_change())

我们获得了 351 支股票和超过 2000 个交易日的收益:

returns.info()
DatetimeIndex: 2072 entries, 2010-01-04 to 2018-03-27
Columns: 351 entries, A to ZTS

PCA 对异常值很敏感,因此我们将数据在 2.5% 和 97.5% 分位数处进行了 winsorize 处理:

returns = returns.clip(lower=returns.quantile(q=.025),
upper=returns.quantile(q=.975),
axis=1)

PCA 不允许缺失数据,因此我们将删除至少在 95% 的时间段内没有数据的股票,并在第二步中删除至少在剩余股票中至少 95% 的交易日没有观察到的日子:

returns = returns.dropna(thresh=int(returns.shape[0] * .95), axis=1)
returns = returns.dropna(thresh=int(returns.shape[1] * .95))

我们剩下了覆盖类似时间段的 314 个股票收益系列:

returns.info()
DatetimeIndex: 2070 entries, 2010-01-05 to 2018-03-27
Columns: 314 entries, A to ZBH

我们使用给定交易日的平均收益来填补任何剩余的缺失值:

daily_avg = returns.mean(1)
returns = returns.apply(lambda x: x.fillna(daily_avg))

现在我们准备使用默认参数将主成分模型拟合到资产回报上,以使用全 SVD 算法计算所有成分:

pca = PCA()
pca.fit(returns)
PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)

我们发现最重要的因素解释了大约 40% 的日收益变化。主要因素通常被解释为市场,而剩余的因素可以被解释为行业或风格因素,符合我们在第五章 Strategy Evaluation 和第七章 Linear Models 中的讨论,具体取决于更近距离观察的结果(见下一个示例)。

右侧的图显示了累积解释方差,并表明大约 10 个因素解释了这一大型股票横截面的 60% 的回报:


笔记本包含对更广泛的股票横截面和更长的 2000-18 时间段的模拟。它发现,平均而言,500 支随机选择的股票的前三个成分解释了 25%,10% 和 5%。

累积图显示了典型的拐点模式,可以帮助确定适当的目标维度,因为它表明附加组件增加的解释价值较少。

我们可以选择前两个主成分来验证它们确实是不相关的:

risk_factors = pd.DataFrame(pca.transform(returns)[:, :2],
columns=['Principal Component 1', 'Principal Component 2'],
index=returns.index)
risk_factors['Principal Component 1'].corr(risk_factors['Principal Component 2'])
7.773256996252084e-15

此外,我们可以绘制时间序列以突出每个因子捕捉不同波动性模式的方式:


风险因子模型将采用主成分的子集作为特征来预测未来的回报,类似于我们在第七章线性模型 - 回归与分类 中的方法。

特征组合

PCA 的另一个应用涉及归一化回报的协方差矩阵。相关矩阵的主要成分以降序捕获资产之间的大部分协变异,并且彼此不相关。此外,我们可以使用标准化的主成分作为投资组合权重。

让我们使用 2010 年至 2018 年期间具有数据的 30 个最大股票来便于表述:

idx = pd.IndexSlice
with pd.HDFStore('../../data/assets.h5') as store:
stocks = store['us_equities/stocks'].marketcap.nlargest(30)
returns = (store['quandl/wiki/prices']
.loc[idx['2010': '2018', stocks.index], 'adj_close']
.unstack('ticker')
.pct_change())

我们再次修剪并对回报进行归一化:

normed_returns = scale(returns
       .clip(lower=returns.quantile(q=.025),
        upper=returns.quantile(q=.975),
        axis=1)
.apply(lambda x: x.sub(x.mean()).div(x.std())))

与前面的例子一样,删除资产和交易日后,我们剩下 23 个资产和超过 2,000 个交易日。我们估计所有主成分,并发现前两个分别解释了 55.9%和 15.5%的协变异:

pca.fit(cov)
pd.Series(pca.explained_variance_ratio_).head()
0 55.91%
1 15.52%
2 5.36%
3 4.85%
4 3.32%

接下来,我们选择并归一化四个最大的组件,使它们总和为1,我们可以将它们用作与由所有股票形成的等权重投资组合进行比较的投资组合的权重:

top4 = pd.DataFrame(pca.components_[:4], columns=cov.columns)
eigen_portfolios = top4.div(top4.sum(1), axis=0)
eigen_portfolios.index = [f'Portfolio {i}' for i in range(1, 5)]

权重显示出明显的重点 - 例如,投资组合 3 重点关注样本中的两个支付处理器 Mastercard 和 Visa,而 投资组合 2 则更多地暴露于科技公司:


将每个投资组合在样本期间的表现与我们的小样本组成的市场进行比较时,我们发现投资组合 1 的表现非常相似,而其他投资组合捕捉到不同的回报模式:


比较每个投资组合的表现

流形学习

线性维度降低将原始数据投影到与数据中的信息方向一致的低维超平面上。专注于线性变换简化了计算,并呼应了常见的财务指标,例如 PCA 旨在捕获最大的方差。

然而,线性方法自然会忽略数据中非线性关系反映的信号。在包含图像或文本数据的替代数据集中,这样的关系非常重要。在探索性分析期间检测到这样的关系可以提供关于数据潜在信号内容的重要线索。

相比之下,流形假设强调高维数据通常位于或接近嵌入在高维空间中的低维非线性流形上。本节开头的屏幕截图中显示的二维瑞士卷就是这样一种拓扑结构的示例。

流形学习旨在找到内在维度的流形,然后在这个子空间中表示数据。一个简化的例子是将道路视为三维空间中的一维流形,并使用房子编号作为局部坐标来标识数据点。

几种技术近似一个较低维度的流形。一个例子是局部线性嵌入LLE),它是由 Sam Roweis 和 Lawrence Saul 于 2000 年开发的,用于展开上一个屏幕截图中的瑞士卷(参见manifold_learning_lle笔记本中的示例)。

对于每个数据点,LLE 确定一定数量的最近邻居,并计算代表每个点的权重,使其表示为其邻居的线性组合。它通过将每个邻域线性投影到较低维度流形上的全局内部坐标上来找到较低维度的嵌入,并且可以被认为是一系列 PCA 应用。

可视化需要降至至少三个维度,可能低于内在维度,并且面临着忠实地表示局部和全局结构的挑战。这个挑战与与维度诅咒相关。虽然球体的体积随着维度数量的增加而呈指数级增长,但用于表示高维数据的较低维度空间却受到了极大的限制。

例如,在 12 维中,可能有 13 个等距离点,但在两个维度中只有三个点可以形成边长相等的三角形。因此,在较低维度准确反映一个点与其高维邻居的距离的情况下,可能会扭曲所有其他点之间的关系。结果就是拥挤问题:为了保持全局距离,局部点可能需要被放置得太近,反之亦然。

接下来的两个部分介绍了一些技术,这些技术在解决复杂数据集的可视化拥挤问题方面取得了进展。我们将使用时尚MNIST数据集,这是经典手写数字 MNIST 基准数据的一个更复杂的替代方案,用于计算机视觉。它包含了 60,000 张训练图像和 10,000 张测试图像,涵盖了 10 个类别的时尚物品(见下面的示例):


这些数据的流形学习算法的目标是检测类别是否位于不同的流形上,以便促进它们的识别和区分。

Python 机器学习算法交易实用指南(四)(2)https://developer.aliyun.com/article/1523384

相关文章
|
21天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
220 55
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
124 4
|
9天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
2天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
31 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
140 67
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
128 61
|
30天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
157 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
6天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
11天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
42 5