我的数据集有一个包含 1000 个输入的训练集,其中包含 6 个特征。(数据集大小为 1000*6(。我将 KPCA 应用于数据集,并将特征数量减少到 3 个。这意味着现在向量矩阵的维数是1000*3。我使用简化的数据集来训练神经网络。训练完网络后,现在,让我们想象一下我想对一个新数据进行分类(大小为 1*6(。显然我必须将其转换为 1*3 数据,然后将其呈现给网络,但我不知道该怎么做?
内核 PCA 首先计算内核矩阵K
与条目
K_{ij} = KernelFunction(x_i, x_j).
在您的情况下,K
是一个1000 x 1000
矩阵。接下来,对矩阵进行对角化以获得分解
K = W S W^T
(在实践中,人们会执行双PCA,因为这会导致更小的维度,但这在这里并不重要,因为您已经获得了减少(。
现在,减少数据集相当于只保留特征向量对角矩阵中最大的三个条目S
而忽略所有其他条目(如果这种近似是合理的,你的内核是很好的选择(。
实际上,这意味着在投影矩阵中,W^T
仅保留前 L=3
行。调用维度为 1000 x 3
的约化矩阵W_L
。现在"减少"与使用矩阵相关的特征数量
K_L = K W_L
其中也有维度1000 x 3
.这些行用作训练神经网络的输入。
让我们来回答你的问题:如何处理新的特征向量y
?
- 首先,计算一个
k_i = KernelFunction(x_i, y)
元素的向量k
。 - 其次,通过计算
k_L = k W_L
将该向量映射到 KPCA 子空间上——这是维度为1 x 3
的向量。 - 最后,将向量
k_L
输入神经网络并使用预测。
将数据投影到缩小的空间上。具体如何 - 取决于KPCA的特定实现,例如在python和scikit-learn中你会做的
[...]
kpca = KPCA(n_components=3)
kpca.fit(X_train)
[...]
reduced_new_point = kpca.transform(new_point)
一般来说,您有一个与每个特征值相连的乘数 alpha 序列,并且您在第 i
特征向量的投影是
P(x, i) = SUM alpha^{i}_j K(x_j, x)
其中alpha^{i}_j
是i
特征向量的j
训练样本的系数,x_j
是第j个训练样本,K
是使用核的。