使用任意数据计算的任何 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/