使用 python 和 scikit-learn 的 RKHS 网络
项目描述
ruckus是一个 Python 包,用于为机器学习构建再现内核希尔伯特空间的网络。
再现核希尔伯特空间 [1](RKHS,或者,正如我所说的“ruckuses”)构成了许多机器学习技术的数学基础,从支持向量机和高斯过程到神经切线核和随机特征嵌入。
此包中定义的类和方法旨在与其他流行的机器学习 API 兼容,特别是scikit-learn. 包的核心对象是RKHS类。可以RKHS是fit数据,可以transform通过将数据嵌入到希尔伯特空间坐标中来获取数据,并且可以fit_function使用核岭回归 [2]。在数据点样本上平均内核嵌入会产生数据分布的内核均值嵌入 [3],并且KernelHerd可以将对象应用于这些嵌入以使用内核羊群算法 [4] 对数据进行采样。
包括的具体RKHS实现有:
EigenRKHS它使用指定核矩阵的核的奇异值分解,使用 Nyström 方法 [5] 加速,来构造嵌入;RandomFourierRBF它使用高斯采样的傅里叶相位项来构造嵌入向量[6];OneHotRKHS它将分类数据嵌入概率空间。
此外,RKHS可以使用以下类将实例组合成网络:
CompositeRKHS它允许嵌入的功能组合以产生管道和深度内核 [7];ProductRKHS它允许具有张量积结构的希尔伯特空间,并包括跨因子空间执行条件密度嵌入的方法;DirectSumRKHS允许沿连接轴堆叠 RKHS 嵌入,ConvolutionalRKHS这允许使用任何 RKHS 作为n-D 数据 [8] 上的卷积滤波器。
除此之外,还包含了几个帮助函数和类,以提供与交叉验证和模型选择的兼容性scikit-learn。
NB ruckus 仍处于 alpha 阶段,可能会有我遗漏的错误。如果你发现任何东西,请不要犹豫,让我注意到它们。
安装
要从 安装pip,请运行
>>> pip install ruckus
要从源代码构建,您可以直接下载 zip 或tarball,或者通过以下方式克隆 GitHub 存储库
>>> git clone https://github.com/samlikesphysics/ruckus.git
然后在与以下相同的文件夹中运行setup.py:
>>> python setup.py build
>>> python -m pip install .
依赖项
ruckus取决于以下软件包:
| 包裹 | 推荐版本 |
|---|---|
numpy |
1.20.1 |
scipy |
1.7.0 |
scikit-learn |
1.0.1 |
例子
让我们生成洛伦兹吸引子演化的数据集:
import ruckus
import numpy as np
import matplotlib.pyplot as plt
def lorenz(n=100,s=10, r=28, b=2.667, dt=0.01):
xs = np.empty(n + 1)
ys = np.empty(n + 1)
zs = np.empty(n + 1)
xs[0], ys[0], zs[0] = (0., 1., 1.05)
for i in range(1,n+1):
xs[i] = xs[i-1] + (s*(ys[i-1] - xs[i-1]))*dt
ys[i] = ys[i-1] + (r*xs[i-1] - ys[i-1] - xs[i-1]*zs[i-1])*dt
zs[i] = zs[i-1] + (xs[i-1]*ys[i-1] - b*zs[i-1])*dt
return np.concatenate([xs[None,:],ys[None,:],zs[None,:]]).T
X = lorenz(10000)
我们希望了解如何从前面的 2 个时间步预测任何 10 个时间步的窗口。为此,我们将设置一个卷积滤波器,它采用长度为 12 的块,并使用 RKHS 分别嵌入长度为 2 的过去块和长度为 10 的未来块。我们可以在产品空间中使用这些嵌入来学习它们的联合分布,并根据过去的窗口计算未来窗口的条件分布。这可以使用简单的代码来完成:
Lp = 2
Lf = 10
beta=0.5
conv_net = ruckus.convolution.ConvolutionalRKHS(
# Convolution window includes past and future
window_shape=(Lp+Lf,),
# Setup filter RKHS
rkhs=ruckus.ProductRKHS([
# Use Random Fourier Features
ruckus.RandomFourierRBF(
gamma=0.1,n_components=1024,
# Take all 3 variables and past Lp timesteps
take=(np.array([[0],[1],[2]]),
np.array([list(range(Lp))])),
# Exponentially punish further-past points
filter=np.array([[beta**k for k in range(Lp)][::-1]]*3),
copy_X=False
),
# Use Random Fourier Features
ruckus.RandomFourierRBF(
gamma=0.1,n_components=1024,
# Take all 3 variables and future Lf timesteps
take=(np.array([[0],[1],[2]]),
np.array([list(range(Lp,Lp+Lf))])),
# Exponentially punish further-future points
filter=np.array([[beta**k for k in range(Lf)]]*3),
copy_X=False
),
],copy_X=False)
)
# Fit convolutional kernel network on data
conv_net.fit(X)
# Extract conditional distribution
conditional_map, future_space = conv_net.rkhs.conditional([0],[1],alpha=1e-6)
让我们来判断一下我们的工作:对于任何时间索引j,我们都可以取前两个时间步长,用于conditional_map预测未来十个时间步长的嵌入,并使用KernelHerd.
j = 750
dt = 0.01
rng = [j-25,j+25]
n_samples = 100
colors = ['r','b','g']
names = [r'$x$',r'$y$',r'$z$']
for k in range(3):
plt.plot(np.arange(rng[0],rng[1])*dt,X[rng[0]:rng[1],k],alpha=0.5,c=colors[k],label=names[k])
plt.plot(np.arange(j-Lp+1,j+1)*dt,X[j-Lp+1:j+1,k],c='k',linewidth=5,alpha=0.5)
samples = np.array(list(ruckus.sampling.KernelHerd(
conditional_map.predict(X[j-Lp+1:j+Lf+1,].T[None])[0],
future_space,
size=n_samples
)))
for s in samples:
for k in range(3):
plt.plot(np.arange(j+1,j+Lf+1)*dt,list(s[k][Lp:]),alpha=0.1,c='orange')
plt.ylabel(r'Lorenz variables $x$, $y$, $z$')
plt.xlabel(r'Time $t$')
plt.legend()
plt.savefig('Lorenz.png')
plt.show()
当然,这并不是“学习”洛伦兹吸引子的最佳方式。更好的方法将使用我们的条件嵌入来提取有关动态系统的信息,然后使用该知识进行预测。这也可以使用中的工具来完成ruckus- 但留给读者作为练习!
参考
- Aronszajn, N. “再生内核的理论”。反式。阿米尔。数学。社会党。68(1950),337-404。
- Murphy, KP “机器学习:概率视角”,麻省理工学院出版社。第 14.4.3 章,第 492-493 页
- Muandet, K.、Fukuzimu, K.、Sriperumbudur, B.、Schölkopf, B. “分布的内核平均嵌入:回顾及超越”。机器学习的基础和趋势:卷。10:第 1-2 期,第 1-141 页(2017 年)
- Chen, Y., Welling, M., Smola, A. “来自 Kernel Herding 的超级样本”。第二十六届人工智能不确定性会议论文集(UAI2010)
- Williams, C., Seeger, M. “使用 Nyström 方法加速内核机器”。神经信息处理系统的进展 13 (NIPS 2000)
- Rahimi, A., Recht, B. “大型内核机器的随机特征”。神经信息处理系统的进展 20 (NIPS 2007)
- Cho, Y.、Lawrence, S. “深度学习的内核方法”。神经信息处理系统的进展 22 (NIPS 2009)
- Mairal, J.、Koniusz, P.、Harchaoui, Z.、Schmid, C. “卷积核网络”。神经信息处理系统的进展 27 (NIPS 2014)
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。