dev*_*max 1 math matlab machine-learning matrix svm
使用任意数据计算的任何核矩阵(或Gram矩阵)都保证是正半正定的.
我有一个数据矩阵D,其中每一行都是一个数据向量.如果我像这样计算内核,
K = D*D';
Run Code Online (Sandbox Code Playgroud)
事实证明,这不是正半确定的,更不用说肯定的了.
为什么会这样?有什么我想念的吗?我的预感告诉我,这很可能是数值误差,因为我的核矩阵的所有负特征值都在1E-12左右.
这个问题在某种程度上暗示了一个答案,但我无法想象为什么矩阵不会至少是对称的!
首先,仔细检查您的方向D是否正确.如果你正在使用
K = D*D';
Run Code Online (Sandbox Code Playgroud)
然后你需要D尺寸N x d,其中N- 样本数量,d- 数量的特征(换句话说 - 行面向数据集).否则你也会得到一个有效的Gramian,但是对于不同的问题(因为d >> N它可能会导致更多的数值不稳定).
Resulitng矩阵将始终是对称的(除非您没有确定性的artihmetic操作).
半正定义也得到保证,只有缺乏这种特征的可能原因是数值不准确.如果出现这种情况,可以考虑D通过一些软技术来降低维数,例如具有非常高的PCA k(D/2例如等于).另一个可能有用的技巧(但是,它会对问题引入额外的数学约束)是计算:
K = D*D' + eps*I
Run Code Online (Sandbox Code Playgroud)
其中eps是一个小常数(比如1e-10,所以它大于你的负特征值)并且I是维数的单位矩阵N.这种技术有许多名称(取决于研究领域),其中之一是正规化.
正定克(核)矩阵不太常见,如果你的向量是线性无关的,那就是pd(特别是你需要d>=N,但显然线性独立是更强的东西,所以这只是要求,而不是iff).由于这个原因,许多内核矩阵是通过一些确保线性独立性的复杂项目获得的,例如RBF内核引起线性独立性(在特征空间中!)因此基于RBF的内核矩阵应该是pd(达到数值误差,并假设你的数据集是一致的,意味着每个点与其余点不同).