需求
搭建kriging参数值预测模型
模型中特征值2个,目标值1个,data数据集如图所示
克里金模型
克里金(Kriging)模型是一种基于空间相关性的插值方法,通过建立半变异函数来描述空间相关性,并利用已知观测点的数值和空间位置来预测未知点的数值。常用于地质、地理和环境科学等领域。
克里金模型的基本原理是通过建立半变异函数来描述空间相关性。半变异函数可以测量两个点之间的相似性程度,它表示两个点之间的数值差异随距离增加而变化的速率。常见的半变异函数包括指数模型、高斯模型和球模型等。
优点
- 精度高
Kriging模型通过对已有数据的空间相关性进行建模,能够较准确地估计未观测点的数值,尤其适用于连续变量的插值。 - 不受外部影响
Kriging模型不仅仅依赖于周围点的数值,还考虑了点之间的空间相关性。因此,它对异常值和局部波动有较好的免疫性,能够提供相对稳定的估计结果。 - 提供不确定性估计
Kriging模型不仅能够给出点估计值,还能给出估计的不确定性。通过计算协方差函数,可以得到预测值的方差和置信区间,提供了对预测结果的可靠性评估。
缺点
- 数据需满足空间相关性
Kriging模型的建立基于变量的空间相关性,因此,如果数据的空间相关性很弱或不存在,模型可能不适用。此外,Kriging模型对于大数据量的计算需求较高。 - 对模型参数的选择敏感
Kriging模型的结果受到模型参数的影响,包括半方差函数的参数和拟合方法等。选择合适的参数值对于结果的准确性很重要,但也较为困难。 - 不适用于非线性插值
Kriging模型是一种线性插值方法,对于非线性、非正态的数据拟合效果较差。在这种情况下,可能需要使用其他插值方法。 - 计算复杂度较高
Kriging模型在进行预测时需要计算协方差矩阵的逆矩阵,这一过程的计算复杂度较高,尤其是当数据量较大时会增加计算的困难度。
参数值预测模型搭建
资源已经上传,可以直接下载使用,接下来对其搭建过程进行简单介绍
库导入
import numpy as np
import pandas as pd
from pykrige.ok import OrdinaryKriging
from scipy import stats
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_percentage_error,mean_squared_error
import matplotlib.pyplot as plt
数据集导入
由于数据集以csv形式存在,采用read_csv
进行数据集的导入,代码如下:
# 从 csv 文件读取数据
data = pd.read_csv('data.csv')
数据预处理
数据预处理包括异常值的删除,以及测试集和训练集的划分,代码如下:
# 使用拉依达准则删除异常值
z_scores = stats.zscore(data)
outliers_mask = (z_scores<-3) | (z_scores>3)
outliers = data[outliers_mask.any(axis=1)]
# 删除异常值
data_cleaned = data[~outliers_mask.any(axis=1)]
# 随机保留三百组数据
data = data_cleaned.sample(n=300)
# 划分训练集测试集数据
train_data = data.iloc[:210]
x = train_data['A']
y = train_data['B']
z1 = train_data['C']
test_data = data.iloc[210:]
X = test_data['A']
Y = test_data['B']
Z1 = test_data['C']
kriging 预测
# # 进行 Kriging 插值
OK1 = OrdinaryKriging(x, y, z1, variogram_model='gaussian', verbose=False,anisotropy_scaling=0.7,nlags=5,anisotropy_angle=0.1)
# # 进行差值,返回差值结果和方差
z1_pred, ss1 = OK1.execute('points', X, Y)
# 计算预测值与真实值之间的均方误差
mse1 = mean_squared_error(Z1, z1_pred)
#MSE for z1: 0.000463147093922302
print('MSE for z1:',mse1)
error1 = r2_score(Z1, z1_pred)
MAPE=mean_absolute_percentage_error(Z1, z1_pred)
RMSE = mean_squared_error(Z1, z1_pred) ** 0.5
# r方 for z1: 0.03829658714923134
# MAPE for z1: 0.09049643963686702
# RMSE for z1: 0.021520852537069764
print('r方 for z1:',error1)
print('MAPE for z1:',MAPE)
print('RMSE for z1:',RMSE)