scikit学习高斯过程中的线性基础

时间:2019-10-29 12:40:58

标签: python matlab machine-learning scikit-learn regression

我正在用Python在MATLAB中重写代码。该代码使用fitrgp执行高斯过程回归。在Python中,我正在使用scikit-learn及其GaussianProcessRegressor。在这两种情况下,GP都会在inputoutput之间学习映射。我的MATLAB和Python代码的核心如下:

-MATLAB

prediction_train=[];

%% z-score of input
[normalized_input_train,mu_train,std_train]=zscore(input_data);

parfor j=1:1:size(output_data,2)
j %prints time component

z1=squeeze(output_data(:,j));

beta1=fitrgp(normalized_input_train,z1,'BasisFunction','linear','KernelFunction','ardmatern32'); 

beta1=compact(beta1);

prediction_tmp=predict(beta1,normalized_input_train);

prediction_train=[prediction_train, prediction_tmp];

end

通过一些训练input_data训练GP,并学习相同的input_data的预测,然后与output_data进行比较。该脚本使用linear basis内核函数实现了ard Matern 3/2

-Python

# Instantiate a Gaussian Process model
kernel = 1.0 * Matern(nu=1.5)
gp = GaussianProcessRegressor(kernel=kernel)

# z-score of input
scale = StandardScaler()
normalized_input_train = scale.fit_transform(input_data)

prediction_train = np.zeros((np.shape(output_data)))

for i in range(np.shape(output_data)[1]):
    print("time component", i)

    gp.fit(normalized_input_train, output_data[:,i])

    prediction_tmp, sigma = gp.predict(normalized_input_train, return_std=True)

    prediction_train[:,i] = prediction_tmp

这应该和我的MATLAB代码完全一样。但是,我不确定如何实现在MATLAB脚本中实现的linear basis选项。

1 个答案:

答案 0 :(得分:0)

因此,我对MATLAB实现的所有工作并不熟悉,但是在浏览documentation之后,我相信我将其理解为高斯过程回归算法的“均值函数”。 scikit-learn上的implementation假设均值函数为零,并且没有直接的方法为该实现指定您自己的自定义均值函数。

如果绝对需要具有均值函数,那么我建议您尝试GPy库,该库具有更多自定义功能,包括可以直接指定均值函数。这是example。 GPy软件包的学习曲线要​​高一些,但是如果您想要更多自定义选项,那么我发现此软件包要比scikit-learn中的软件包更好。


另一方面,我注意到在您的MATLAB实现中,您指定了buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.google.gms:google-services:4.3.2' } } 内核。但是在sklearn实现中,您将nu参数设置为1.5,但是没有将长度比例尺初始化为特征的长度(即输入x的尺寸数)。

例如

ardmatern

请确保这样做,否则这两个内核是不相等的,因为术语“ ARD”表示输入中每个功能都有一个长度标度。有关更多详细信息,请参见sklearn docskernel = 1.0 * Matern( nu=1.5, length_scale=np.ones(normalized_input_train.shape[1]), ) 内核的length_scale参数。

希望这会有所帮助。