matlab - SVM 中的 Gram 矩阵/核不是半正定的

标签 matlab math matrix machine-learning svm

使用任意数据计算的任何 kernel 矩阵(或 Gram 矩阵)都保证是半正定的。

我有一个数据矩阵 D,其中每一行都是一个数据向量。如果我像这样计算内核,

K = D*D';

事实证明它不是半正定的,更不用说正定的了。

为什么会发生这种情况?我有什么遗漏的吗?我的直觉告诉我,这很可能是数值错误,因为我的内核矩阵的所有负特征值都在 1E-12 左右。

This question 在某种程度上暗示了一个答案,但我无法想象为什么矩阵至少不是对称的!

最佳答案

一般说明

首先,仔细检查您的 D 是否方向正确。如果您正在使用

K = D*D';

那么你需要D尺寸N x d ,其中N -样本数量,d - 特征数量(换句话说 - 面向行的数据集)。否则,您也会得到一个有效的格拉米安,但对于不同的问题(对于 d >> N 它可能会导致更多的数值不稳定)。

半正定 Gram 矩阵

结果矩阵将始终对称(除非您没有确定性算术运算)。

还保证了半正定性,缺乏这种特征的唯一可能原因是数值不准确。如果出现这种情况,请考虑减少D通过一些软技术来确定维数,例如具有非常高k的PCA (例如等于D/2)。另一个可能有帮助的技巧(但是,它对问题引入了额外的数学约束)是计算:

K = D*D' + eps*I

哪里eps是一个小常数(假设是 1e-10,所以它比负特征值大)并且 I是维度为 N 的单位矩阵。这种技术有很多名称(取决于研究领域),其中之一是正则化。

正定格拉姆矩阵

正定克(核)矩阵不太常见,它是 p.d。 iff 你的向量是线性独立的(所以特别是你需要 d>=N ,但显然线性独立性更强,所以这只是要求,而不是 iff)。因此,许多核矩阵是通过一些复杂的投影来获得的,这些投影确保了线性独立性,例如RBF核引入了线性独立性(在特征空间中!),因此基于RBF的核矩阵应该是p.d。 (最多有数值错误,并假设您的数据集是一致的,这意味着每个点都与其他点不同)。

关于matlab - SVM 中的 Gram 矩阵/核不是半正定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644180/

相关文章:

c++ vs MATLAB 速度优化。例如。我的 matlab 代码运行速度比 C++ 快?

arrays - 从数组中提取一定数量的 block

java - MATLAB 中的 datestr 函数到 Java

c++ - 如何在我的代码中使用 Matlab 引擎(用于调用 `engOpenSingleUse()` )?

math - 游戏设计中的数值积分、Runge-Kutta、RK4

c - 复数算术无法正常工作

c++ - 将平移应用于特征顶点

android - 像Atlas、MKL这样的数学库能用在智能手机上吗?

r - "asymmetric"成对距离矩阵

python - 在Python中构建由替代对象组成的矩阵