我想使用GPR来预测从已部署的接入点(AP)接收到的RSS。由于GPR不仅能提供RSS的均值,还能提供其方差,因此GPR在定位和导航系统中可能非常有用。我阅读了与GPR相关的已发表的期刊,掌握了其理论基础。现在,我希望用真实数据(RSS)来实现它。在我的系统中,输入和相应的输出(观测值)是:
X:二维笛卡尔坐标点
y:在相应坐标处的RSS(-dBm)数组
在网上搜索后,我发现可以使用sklearn软件(使用Python)。我安装了sklearn并成功测试了样本代码。这些样本Python脚本是为1D GPR设计的。由于我的输入集是2D坐标,我希望修改样本代码。我发现其他人也尝试过同样的操作,例如:如何正确使用scikit-learn的高斯过程进行2D输入,1D输出的回归?,如何使用GPML(Matlab)进行2D高斯过程回归?,以及克里金法是否适合高维回归问题?。
预期(预测)的值应该与y相似。我得到的值却大不相同。我想要预测RSS的测试床大小为16*16平方米。我希望每隔一米预测一次RSS。我假设样本代码中的高斯过程预测器使用了高斯下降算法进行训练。我希望使用萤火虫算法优化超参数(theta:使用y和X训练)。
为了使用我的数据(2D输入),我应该编辑哪一行代码?同样,我如何实现萤火虫算法(我已经通过pip安装了萤火虫算法)?
请提供您的建议和评论,谢谢您的帮助。
非常感谢您。
回答:
我简化了代码,以说明可能存在的问题:
import numpy as npfrom sklearn.gaussian_process import GaussianProcessRegressorx_train = np.array([[0,0],[2,0],[4,0],[6,0],[8,0],[10,0],[12,0],[14,0],[16,0],[0,2], [2,2],[4,2],[6,2],[8,2],[10,2],[12,2],[14,2],[16,2]])y_train = np.array([-54,-60,-62,-64,-66,-68,-70,-72,-74,-60,-62,-64,-66, -68,-70,-72,-74,-76])# 这是一个测试集吗?x1min = 0x1max = 16x2min = 0x2max = 16x1 = np.linspace(x1min, x1max)x2 = np.linspace(x2min, x2max)x_test =(np.array([x1, x2])).Tgp = GaussianProcessRegressor()gp.fit(x_train, y_train)# 在训练数据上预测y_pred_train = gp.predict(x_train)print('Avg MSE: ', ((y_train - y_pred_train)**2).mean()) # MSE 为 0# 在测试(?)数据上预测y_pred_test = gp.predict(x_test)# 如果没有y_test(例如,保留的标记测试样本),无法确定结果的优劣
预期(预测)的值应该与y相似。
在这里,我为了清晰起见将y
重命名为y_train
。在拟合GP并在x_train
上预测后,我们看到模型完美地预测了训练样本,这可能是您所指的意思。我不确定您是否错误地写了小写的x
,我称之为x_test
(而不是大写的X
,我称之为x_train
)。如果我们在x_test
上预测,没有相应的y_test
值,我们真的无法知道预测的效果如何。因此,这个基本示例的运行情况符合我的预期。
看起来您还尝试为x_test
创建一个网格,但当前代码并未实现这一点。这里,x1
和x2
在每个位置总是相同的。如果您想要一个网格,请查看np.meshgrid。