一种基于树莓派使用Mathematica的低成本多标签分类算法实现
摘要
在当前数据大规模增长的世界中,低成本实现数据挖掘算法是一项具有挑战性的任务。本文的核心思想是利用可在树莓派上免费获取的Mathematica的功能,以低成本实现多标签分类算法。通过树莓派上Mathematica软件提供的功能,实现数据挖掘算法所需的代码行数可以显著减少。使用随机厨房水槽算法可提高多标签分类的准确率,并在处理大规模数据集时改善内存使用情况。
关键词
多-标签分类;Mathematica;树莓派;随机厨房水槽方法;数据挖掘。
1. 引言
由斯蒂芬·沃尔夫勒姆于1988年开发的Mathematica如今已成为一款功能强大的计算软件,在数据挖掘、图像处理以及许多其他领域提供了多种应用。Mathematica已被证明是全球范围内广受欢迎且享有盛誉的教育工具。该计算机语言可以处理数论问题、微分方程、绘图、可视化、3-D建模、图像处理、股票市场预测、蛋白质结构分析、环境研究等。自发布以来,Mathematica在许多重要发现以及金融建模的发展中发挥了关键作用。它已成为大量技术论文的基础。目前,Mathematica已被数百万人使用,并被全球众多大型大学采用。最近,Mathematica已免费提供给树莓派,这是一种微型计算机。树莓派价格非常低廉,在计算爱好者市场中起着至关重要的作用。极低的功耗、固态存储、可扩展性以及无噪声运行使其成为强大的计算工具。这标志着一个全新计算时代的开始。
近年来,多-标签分类在诸如人口统计分类(用于对数字面部图像进行分类)、音乐分类,以及语义场景分类等应用中变得非常重要。在多标签-分类中,样本与多个标签相关联。在语义场景分类的情况下,一张照片可以同时属于多个类别,例如日落和海滩。同一首歌曲在音乐分类中也可以属于多个类别。早期,多-标签分类主要应用于医疗诊断和文本分类领域。文本文档可以同时属于多个类别。
通过使用随机厨房水槽算法,可以提高多-标签分类的效率。随机厨房水槽方法非常适合径向基函数(RBF)核。RBF核是一种高斯函数,并且具有若干有趣的性质。高斯函数的一个重要性质是其傅里叶变换是另一个高斯函数。其次,该核具有平移不变性。随机厨房水槽可加速一大类核函数的计算。随机厨房水槽方法的速度快100倍,内存使用减少1000倍。这些改进,特别是内存使用的减少,使得核方法在需要实时预测和/或拥有大规模训练集的应用中更加实用。
尽管目前存在多种用于多标签分类的软件实现方法,本文则重点探讨在树莓派上使用Mathematica实现该算法的低成本方案。多标签分类和随机厨房水槽方法的数学基础在第2节中进行说明。第3节提供硬件和软件细节。第4节介绍在Mathematica中的实现步骤。第5节解释结果。第6节对全文进行总结。
2. 数学基础
2.1. 多标签-分类
符号说明 :设 $ n $ 表示训练数据中的样本数量,$ k $ 表示标签数量,$ d $ 表示数据的维度。$ x_i \in \mathbb{R}^d $ 表示第 $ i $ 个观测值,$ y_i \in \mathbb{R}^k $ 表示其标签信息。令 $ X = [x_1, x_2, …, x_n] \in \mathbb{R}^{d \times n} $ 对应训练数据矩阵,$ Y = [y_1, y_2, …, y_n] \in \mathbb{R}^{k \times n} $ 表示类别标签矩阵。我们假设 ${x_i} {i=1}^n$ 和 ${y_i} {i=1}^n$ 均为中心化数据,即 $\sum_{i=1}^n x_i = 0$ 和 $\sum_{i=1}^n y_i = 0$。单位矩阵用 $ I $ 表示,$ e $ 表示全1向量。矩阵 $ A $ 的弗罗贝尼乌斯范数记为 $ |A|_F $。
这里的目标是找到一个未知矩阵 $ W $,将其数据矩阵 $ X $ 映射到标签矩阵 $ Y $,其中 $ W \in \mathbb{R}^{k \times d} $。该问题的拉格朗日形式可表示为:
$$
L(W, \lambda) = \arg\min_W |Y - WX|_F^2 + \lambda |W|_F^2
$$
其中 $ \lambda $ 是正则化参数,用于避免 $ X^T X $ 的奇异性并防止过拟合。第一项表明 $ W $ 应使得 $ Y $ 尽可能接近 $ WX $,第二项表明 $ W $ 的元素应尽可能小。
展开后得:
$$
L(W, \lambda) = \arg\min_W (Y - WX)^T(Y - WX) + \lambda W^T W
$$
$$
L(W, \lambda) = \arg\min_W (Y^T Y - 2Y^T X W^T + W X^T X W^T + \lambda W^T W)
$$
求导并令其等于0,得到:
$$
\frac{\partial L}{\partial W} = -2X^T Y + 2X^T X W + 2\lambda W = 0
$$
$$
2(X^T X + \lambda I) W = 2X^T Y
$$
$$
W = (X^T X + \lambda I)^\dagger X^T Y
$$
其中 $(X^T X + \lambda I)^\dagger$ 表示 $X^T X + \lambda I$ 的伪逆。将每个测试数据投影到权重矩阵 $ W $ 上,取投影结果最大值的索引即为该测试数据的标签。如果目标和观测值均已居中,则可以忽略偏置项。此时投影矩阵 $ W $ 由下式给出:
$$
W = (X^T X)^\dagger X^T Y
$$
2.2. 随机厨房水槽算法
Random Kitchen Sink (RKS) 算法基于以下事实:径向基函数傅里叶变换的(RBF)内核可被解释为随机变量的期望。数据对 $ x $ 和 $ y $ 的 RBF 核由下式给出:
$$
k(x, y) = e^{-\frac{|x - y|^2}{\sigma^2}} = e^{-\frac{(x - y)^T(x - y)}{\sigma^2}}
$$
由于,
$$
k(x, y) = k(x - a, y - a) = k(x - y, 0)
$$
内核是平移不变的且因此:
$$
k(x, y) = k(x - y)
$$
它就像一个单向量变量的函数一样工作:
$$
d = x - y
$$
高斯函数的一个重要性质是其傅里叶变换是另一个高斯函数。由于高斯函数是对称的,其变换是实数。这里该函数是一个多元函数表示为 $ k(x, y) = k(d) $ 且 $ d $ 是一个向量。因此可以认为所考虑的傅里叶变换是多元傅里叶变换。
$$
FT[k(x, y)] = FT[k(x - y)]
$$
即:
$$
FT[e^{-\frac{|x - y|^2}{\sigma^2}}] = FT[e^{-\frac{|d|^2}{\sigma^2}}] = \sqrt{\pi}\sigma e^{-\frac{\sigma^2 \omega^T \omega}{4}} = p(\omega)
$$
这里 $ FT $ 对应于傅里叶变换,而 $ p(\omega) $ 是多元正态分布。$ \omega $ 与 $ d $ 具有相同的维度。$ p(\omega) $ 的逆由以下给出:
$$
k(x, y) = \int p(\omega) e^{j\omega^T(x - y)} d\omega = \int p(\omega) e^{j\omega^T x} e^{-j\omega^T y} d\omega
$$
这里的主要观察结果是,在 RKS 算法中 $ p(\omega) $ 作为一个函数服从多元正态分布,因此可以将其解释为一个概率分布。此外,上述表达式可以解释为多元函数 $ e^{j\omega^T x} $ 的期望值。期望值意味着平均值。因此,上述积分可以通过从多元正态分布中采样若干个(例如 $ D $)$ \omega $ 向量,然后对积分内部函数在 $ D $ 个样本上的取值求平均来实现。即:
$$
\int p(\omega) e^{j\omega^T(x - y)} d\omega \approx \frac{1}{D} \sum_{i=1}^D e^{j\omega_i^T(x - y)}
$$
这里出现了从多元正态分布生成随机向量的问题 $ \omega_i $。假设向量中的各个变量是独立的且同分布。因此,如果向量的维度 $ \omega_i $ 为 $ n $,则从 $ N(0, 1) $ 中生成 $ n $ 个随机值,并构成向量 $ \omega_i $。重复此过程 $ D $ 次,然后通过取平均来计算积分。上述求和可以拆分以得到:
$$
\frac{1}{D} \sum_{i=1}^D e^{j\omega_i^T x} e^{-j\omega_i^T y} = \left( \frac{1}{\sqrt{D}} e^{j\omega_1^T x}, …, \frac{1}{\sqrt{D}} e^{j\omega_D^T x} \right) \cdot \left( \frac{1}{\sqrt{D}} e^{j\omega_1^T y}, …, \frac{1}{\sqrt{D}} e^{j\omega_D^T y} \right)^T
$$
即,$ k(x, y) \approx \phi(x)^T \phi(y) $,其中 $ \phi(x) $ 作为一个随机变量。由于 $ k(x, y) = \phi(x)^T \phi(y) $,根据上述表达式可以推断出:
$$
\phi(x) = \frac{1}{\sqrt{D}} \begin{bmatrix}
\cos(\omega_1^T x) \
\sin(\omega_1^T x) \
\vdots \
\cos(\omega_D^T x) \
\sin(\omega_D^T x)
\end{bmatrix}
$$
这意味着我们可以通过以下步骤创建有限 $ D $ 维度的 $ \phi(x) $。
- 创建 $ D $ 个维度为 $ n $ 的随机高斯分布向量 $ \omega_i $。
- 根据上述表达式计算 $ \phi(x) $。
但是 $ \phi(x) $ 上面计算的是一个包含复数元素的向量。我们可以通过创建另一个具有两倍 $ D $ 个元素的向量来避免处理复数。前 $ D $ 个元素是余弦,后 $ D $ 个元素是正弦值。这并不影响 $ k(x, y) $ 的值。一旦我们有了所有数据点的 $ \phi(x) $,就可以使用任何线性分类器进行分类任务。
3. 硬件和软件
这里使用的硬件是树莓派或简称派。它是一台功能完整的低成本台式电脑,可直接连接互联网,并能够播放高清视频。由于派运行Linux,因此无需支付操作系统费用。通过使用树莓派我们可以从多种编程语言中进行选择来实现我们的项目。树莓派是一个用于趣味性实用程序和实验的灵活平台。Mathematica提供了一个集成的技术计算平台,它基本上由两个相互通信的程序组成并结合形成一个交互式解释器:前端提供图形用户界面,内核负责计算。前端充当一个先进的文本处理器。笔记本(notebooks)和可 portable 文档的创建由前端完成。此处使用的软件Mathematica在树莓派上已免费提供。这使得我们的项目成为数据挖掘算法的一种低成本实现。
4. 实现
这里我们对多标签分类应用于鸢尾花数据集。鸢尾花数据包含三个类别,每个类别包含50个样本。每个样本由四个属性描述:萼片和花瓣的长度与宽度。第五个属性表示鸢尾花的类别(物种)。该过程的目标是确定一个未分类的花属于哪个物种。从每个类别中选取45个样本作为训练数据,剩余的5个样本保留用于测试。以下是在Mathematica中的实现步骤:
-
将训练数据集加载到变量X中,并将其排列成每一列代表数据集中的一个实例。示例:
mathematica X = Import["iristrain.xlsx"]; X = Transpose[X]; -
计算 $ X^T X $:
mathematica Q = X.Transpose[X]; -
正则化参数 $ \lambda $ 的值通过以下方式获得:
mathematica lmd = Max[Q] + 5; -
将标签矩阵导入变量Y。示例:
mathematica Y = Import["label.xlsx"]; -
权重矩阵W的获取:
mathematica W = PseudoInverse[Transpose[X].X + lmd*IdentityMatrix[Length[Transpose[X]]]].Transpose[X].Y; -
将测试数据导入变量A,并进行转置:
mathematica A = Import["iristest.xlsx"]; A = Transpose[A]; -
将测试数据A投影到权重矩阵W上:
mathematica P = Transpose[W].A; -
测试数据的标签通过以下步骤获得:
mathematica g = Max /@ Transpose[P]; h = {}; For[u = 1, u <= Length[g], u++, AppendTo[h, First[Position[P, Part[g, u]]]] ]; Print[h]
该方法的效率可以通过比较测试数据的真实标签和从上述步骤中获得的标签来评估。此处遵循使用岭回归的多标签分类方法。通过省略正则化项(即忽略lambda),可实现不使用岭回归的多标签分类方法,即第5步变为:
W = PseudoInverse[X].Transpose[Y];
为了提高分类的效率,可以采用随机厨房水槽方法。在应用RKS之前,需要执行以下预处理步骤:
-
创建一个伪随机值矩阵,这些值来自标准正态分布:
mathematica phi = RandomReal[NormalDistribution[], {80, First[Dimensions[X]]}]; -
对数据集的每一列应用余弦变换并追加为新特征:
mathematica k = Last[Dimensions[X]]; For[q = 1, q <= k, q++, X = Transpose[Insert[Transpose[X], phi.N[Cos[X[[All, q]]]], Last[Dimensions[X]] + 1]] ] -
对数据集的每一列应用正弦变换并追加为新特征:
mathematica For[q = 1, q <= k, q++, X = Transpose[Insert[Transpose[X], phi.N[Sin[X[[All, q]]]], Last[Dimensions[X]] + 1]] ] -
更新数据矩阵X以仅保留新增的特征列:
mathematica X = X[[All, k + 1 ;; Last[Dimensions[X]]]];
另一个观察结果是,无需采用完整的RKS流程,只需将原始数据集中每一列的正弦和余弦值作为新列直接附加到现有数据上,然后进行分类,同样可以获得更好的结果。该简化方法可在多标签分类步骤1之后执行,具体如下:
k = Last[Dimensions[X]];
For[q = 1, q <= k, q++,
X = Transpose[Insert[Transpose[X], N[Sin[X[[All, q]]]], Last[Dimensions[X]] + 1]]
]
For[q = 1, q <= k, q++,
X = Transpose[Insert[Transpose[X], N[Cos[X[[All, q]]]], Last[Dimensions[X]] + 1]]
]
5. 结果和讨论
多标签分类在有和无岭回归的情况下均在此实现。为提高效率,应用了随机厨房水槽方法。Random Kitchen Sinks procedure对鸢尾花、泰米尔文OCR和医疗多标签数据集进行了分类。表1中给出了有关数据集的信息,例如样本数量和类别标签数量。
表1. 数据集的样本、类别标签和属性。
| 数据集 | 训练数量 | 测试数量 | 类别数量 | 属性数量 |
|---|---|---|---|---|
| Iris | 135 | 15 | 3 | 4 |
| 泰米尔文OCR | 300 | 54 | 6 | 7 |
| 医疗 | 75 | 13 | 2 | 7 |
在三个数据集上执行多标签分类所得到的混淆矩阵如下所示。应用RKS和不应用RKS进行多标签分类的结果分别整理为独立的混淆矩阵。
表2. 泰米尔文OCR数据无RKS的分类。
| 实际\预测 | 标签1 | 标签2 | 标签3 | 标签4 | 标签5 | 标签6 |
|---|---|---|---|---|---|---|
| 标签1 | 9 | 0 | 0 | 0 | 0 | 0 |
| 标签2 | 0 | 7 | 2 | 0 | 0 | 0 |
| 标签3 | 0 | 1 | 8 | 0 | 0 | 0 |
| 标签4 | 0 | 0 | 0 | 9 | 0 | 0 |
| 标签5 | 0 | 0 | 0 | 0 | 9 | 0 |
| 标签6 | 0 | 0 | 0 | 0 | 0 | 9 |
表3. 鸢尾花数据分类无RKS。
| 实际\预测 | 标签1 | 标签2 | 标签3 |
|---|---|---|---|
| 标签1 | 5 | 0 | 0 |
| 标签2 | 0 | 4 | 1 |
| 标签3 | 0 | 0 | 5 |
表4. 无RKS的医疗数据分类。
| 实际\预测 | 标签1 | 标签2 |
|---|---|---|
| 标签1 | 8 | 0 |
| 标签2 | 5 | 0 |
表5. 基于RKS的鸢尾花数据分类。
| 实际\预测 | 标签1 | 标签2 | 标签3 |
|---|---|---|---|
| 标签1 | 5 | 0 | 0 |
| 标签2 | 0 | 5 | 0 |
| 标签3 | 0 | 0 | 5 |
表6. 使用RKS进行医疗数据分类。
| 实际\预测 | 标签1 | 标签2 |
|---|---|---|
| 标签1 | 8 | 0 |
| 标签2 | 0 | 5 |
表7. 基于RKS的泰米尔文OCR数据分类。
| 实际\预测 | 标签1 | 标签2 | 标签3 | 标签4 | 标签5 | 标签6 |
|---|---|---|---|---|---|---|
| 标签1 | 9 | 0 | 0 | 0 | 0 | 0 |
| 标签2 | 0 | 9 | 0 | 0 | 0 | 0 |
| 标签3 | 0 | 0 | 9 | 0 | 0 | 0 |
| 标签4 | 0 | 0 | 0 | 9 | 0 | 0 |
| 标签5 | 0 | 0 | 0 | 0 | 9 | 0 |
| 标签6 | 0 | 0 | 0 | 0 | 0 | 9 |
从结果可以看出,应用随机厨房水槽方法后,分类准确率显著提升。特别是在鸢尾花和医疗数据集中,错误分类数量明显减少。对于泰米尔文OCR数据集,所有测试样本均被正确分类,表明RKS方法在处理高维非线性问题时具有优越性能。
6. 结论与未来工作
低成本实现多标签分类通过结合Mathematica和树莓派的能力得以实现。利用已在树莓派上免费提供的Mathematica,仅需几行代码即可完成分类。引入随机厨房水槽方法带来了改进,特别是在需要实时预测和/或具有大规模训练集的应用中,显著降低了内存使用。
在本项目中,仅使用树莓派上的Mathematica实现了数据挖掘中的多标签分类算法。可以利用Mathematica和树莓派的功能,低成本地实现各种数据挖掘算法。Mathematica的机器学习框架提供了一组用于机器学习的算法,可用于执行数据分析。它使用户能够交互式地分析其数据,通过快速循环检查结果和更改参数设置。
3218

被折叠的 条评论
为什么被折叠?



