如何规范化数据,使得高斯 RBF 核不受影响?

问题描述

我正在对一些语音数据训练支持向量分类器。在预处理中,我从数据中提取了大量信息,最后通过离散余弦变换 (DCT) 运行它。当我通过以下任一方式运行获得的特征和示例矩阵时:

def K1(X,gamma):
X_norm = -gamma*np.einsum('ij,ij->i',X,X)
return ne.evaluate('exp(A + B + C)',{\
    'A' : X_norm[:,None],\
    'B' : X_norm[None,:],\
    'C' : sgemm(alpha=2.0*gamma,a=X,b=X,trans_b=True),\
    'g' : gamma,\
})

def K2(X,gamma):
pairwise_sq_dists = squareform(pdist(X,'sqeuclidean'))
K = np.exp(-pairwise_sq_dists *(gamma**2))
return K

计算高斯 RBF 核,我得到一个核矩阵 K,这样当我计算 np.dot(K.T,K) 时,我得到一个正定矩阵。更好的是,我得到了一个非常类似于身份的矩阵(并且 K2 实际上返回了一个身份)。这很重要,因为我使用的二次规划模块 quadprog 要求内积矩阵为正定矩阵。

但是如果我直接从 DCT 运行数据(将所有示例连接到一个 numpy 数组中)然后计算我的 RBF 内核,那么一切都很好。

但是,如果不是通过内核运行新鲜的 DCT 数据,我会事先使用以下方法对其进行标准化:

for i in range(len(feats)):    
feats[i] = (feats[i] - np.mean(feats[i]))/(feats[i].max() - feats[i].min())

for i in range(len(feats)):    
feats[i] = (feats[i] - feats[i].max())/(feats[i].max() - feats[i].min())

其中 feats 是完整的示例 x 特征矩阵(每个示例是一个列向量,每个特征是一行),并且我成功地将数据归一化到 [0,1] 内,然后每行我的内核突然看起来像:

Q = np.dot(K.T,K)

[3199.58070744 3199.43380552 3198.89583479 ... 3180.18837617
  3188.50339709 3186.77306857]

K:

[1.         0.99954989 0.99959552 ... 0.99277871 0.99517369 0.99524231]

(这些都是第一行,我有大约 3200 个示例)。

从索引与内核行索引相同的行中的元素开始,两者都在两个方向上单调递减(渐近接近零)。你看,它试图成为身份。我不确定我做错了什么。

显然,归一化处理了数据。也就是说,通过对数据进行归一化,我调整了所有点之间的欧几里得距离,这以某种方式导致 K 矩阵没有标准正交基。或者也许我错过了其他东西。

我得到的 Q 矩阵不是正定的。我需要来自 QP 数据的正定矩阵。有没有人知道我的标准化方式可能有什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...