我正在用Python在MATLAB中重写代码。该代码使用fitrgp
执行高斯过程回归。在Python中,我正在使用scikit-learn
及其GaussianProcessRegressor
。在这两种情况下,GP都会在input
和output
之间学习映射。我的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
选项。
答案 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 docs中kernel = 1.0 * Matern(
nu=1.5,
length_scale=np.ones(normalized_input_train.shape[1]),
)
内核的length_scale
参数。
希望这会有所帮助。