Skip to main content

使用 python 和 scikit-learn 的 RKHS 网络

项目描述

ruckus是一个 Python 包,用于为机器学习构建再现内核希尔伯特空间的网络。

再现核希尔伯特空间 [1](RKHS,或者,正如我所说的“ruckuses”)构成了许多机器学习技术的数学基础,从支持向量机和高斯过程到神经切线核和随机特征嵌入。

此包中定义的类和方法旨在与其他流行的机器学习 API 兼容,特别是scikit-learn. 包的核心对象是RKHS类。可以RKHSfit数据,可以transform通过将数据嵌入到希尔伯特空间坐标中来获取数据,并且可以fit_function使用核岭回归 [2]。在数据点样本上平均内核嵌入会产生数据分布的内核均值嵌入 [3],并且KernelHerd可以将对象应用于这些嵌入以使用内核羊群算法 [4] 对数据进行采样。

包括的具体RKHS实现有:

  1. EigenRKHS它使用指定核矩阵的核的奇异值分解,使用 Nyström 方法 [5] 加速,来构造嵌入;
  2. RandomFourierRBF它使用高斯采样的傅里叶相位项来构造嵌入向量[6];
  3. OneHotRKHS它将分类数据嵌入概率空间。

此外,RKHS可以使用以下类将实例组合成网络:

  1. CompositeRKHS它允许嵌入的功能组合以产生管道和深度内核 [7];
  2. ProductRKHS它允许具有张量积结构的希尔伯特空间,并包括跨因子空间执行条件密度嵌入的方法;
  3. DirectSumRKHS允许沿连接轴堆叠 RKHS 嵌入,
  4. ConvolutionalRKHS这允许使用任何 RKHS 作为n-D 数据 [8] 上的卷积滤波器。

除此之外,还包含了几个帮助函数和类,以提供与交叉验证和模型选择的兼容性scikit-learn

NB ruckus 仍处于 alpha 阶段,可能会有我遗漏的错误。如果你发现任何东西,请不要犹豫,让我注意到它们。

安装

要从 安装pip,请运行

>>> pip install ruckus

要从源代码构建,您可以直接下载 ziptarball,或者通过以下方式克隆 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- 但留给读者作为练习!

参考

  1. Aronszajn, N. “再生内核的理论”。反式。阿米尔。数学。社会党。68(1950),337-404。
  2. Murphy, KP “机器学习:概率视角”,麻省理工学院出版社。第 14.4.3 章,第 492-493 页
  3. Muandet, K.、Fukuzimu, K.、Sriperumbudur, B.、Schölkopf, B. “分布的内核平均嵌入:回顾及超越”。机器学习的基础和趋势:卷。10:第 1-2 期,第 1-141 页(2017 年)
  4. Chen, Y., Welling, M., Smola, A. “来自 Kernel Herding 的超级样本”。第二十六届人工智能不确定性会议论文集(UAI2010)
  5. Williams, C., Seeger, M. “使用 Nyström 方法加速内核机器”。神经信息处理系统的进展 13 (NIPS 2000)
  6. Rahimi, A., Recht, B. “大型内核机器的随机特征”。神经信息处理系统的进展 20 (NIPS 2007)
  7. Cho, Y.、Lawrence, S. “深度学习的内核方法”。神经信息处理系统的进展 22 (NIPS 2009)
  8. Mairal, J.、Koniusz, P.、Harchaoui, Z.、Schmid, C. “卷积核网络”。神经信息处理系统的进展 27 (NIPS 2014)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

ruckus-0.0.8.tar.gz (26.1 kB 查看哈希

已上传 source

内置分布

ruckus-0.0.8-py3-none-any.whl (26.4 kB 查看哈希

已上传 py3