所以......我几个小时以来一直在尝试制作径向基内核,但我不确定我的最终矩阵应该是什么样子。我有 30 个特征和 200000 个数据点。我的矩阵 K 应该是 200000*200000 还是 30*30 ?
到目前为止,我的代码产生 30*30:
def build_kernel(x, func, option):
x = x.T
K = np.zeros([x.shape[0], x.shape[0]])
for i in range(x.shape[0]):
xi = x[i,:]
for j in range (x.shape[0]):
xj = x[j,:]
K[i,j] = func(xi, xj, option)
return K
def radial_basis(xi, xj, gamma):
r = (np.exp(-gamma*(np.linalg.norm(xi-xj)**2)))
return r
我的目标是在岭回归中使用内核技巧,就像这里解释的那样:http : //www.ics.uci.edu/~welling/classnotes/papers_class/Kernel-Ridge.pdf
但我不知道如何手动实现(我必须为学校手动实现!)
有人知道怎么做这样的事情吗?:)
谢谢 !
核函数比较数据点,所以它是$200,000 \times 200,000$。(似乎你的数据x
是按函数存储为实例的,但是你x = x.T
出于某种原因进行了交换。据我所知,你计算的矩阵没有任何意义。)
在普通的个人计算机上使用这将是非常具有挑战性的。如果你只是删除该x = x.T
行以便你的代码计算正确的值,则矩阵K
在内存中将是 298 GB!(另外,你使用 Python 嵌套循环和 400 亿次函数调用来实现它的方式radial_basis
,即使你有那么多内存,也需要很长时间来计算。)
这是一个直接使用内核技巧的例子,坦率地说,这是一个坏主意。
如果你对进行核岭回归一无所知,那么你可以进行各种近似以使其在该大小的数据上在计算上合理,我可以向你指出其中的一些。但学校作业似乎不太可能真的要求你这样做。
@AlbertJamesTeddy 你对内核技巧的观点是正确的,但问题是它消除了对特征维度的依赖(允许你使用无限维 RBF 内核),但恶化了对数据点数量的依赖n$。这对于 $n$ 高达几千美元来说很棒,但对于像你这样的较大 $n$ 来说却很糟糕。
两种主要的近似技术是 Nyström 方法和随机傅立叶特征。两者在算法上都非常简单,但它们工作背后的数学原理有点复杂,具体取决于你的背景。这是一篇关于这两者的博客文章:peekaboo-vision.blogspot.co.uk/2012/12/...
@AlbertJamesTeddy 在你链接的注释中查看等式 (6)。
它是 $y_\text{pred} = y_\text{train} (K_\text{train,train} + \lambda I)^{-1} K_\text{train,pred}$。你需要计算从每个训练点到测试点的 RBF 核。
不要使用 for 循环!如果你在 numpy 中对所有内容进行矢量化,这在普通计算机上会很快。