我使用pykrige.ok.OrdinaryKriging中的插值算法对PM10数据进行插值画图,输出的结果出现特别大的值和特别小的值,用同样的代码调用其他数据,比如AQI,输出结果和预期一样,请问知道为什么吗?
from pykrige.ok import OrdinaryKriging
import pandas as pd
import numpy as np
df = pd.read_excel('test_for_kriging.xlsx')
def data_set(df,type_='AQI'):
Krin = OrdinaryKriging(df['经度'].values, df['纬度'].values, df[type_].values, variogram_model='linear')#,nlags=6)#gaussian linear
olon = np.arange(73,136,0.5)
olat = np.arange(14,55,0.5)
data, ssl = Krin.execute('grid', olon, olat)
olon,olat = np.meshgrid(olon,olat)
return olon, olat, data
olon,olat,data = data_set(df,'PM10')
可能出现特别大和特别小的值是因为在执行插值时,超出原始数据范围的点可能使用了较远的邻居节点,从而导致了结果的异常值。这种情况通常在使用较大的插值范围时更容易发生。可以使用其他插值算法进行插值,例如:径向基函数插值算法(RBF)或反距离插值算法(IDW)等。
下面是一个示例代码,它使用了RBF插值算法:
from pykrige.rk import Krige
import pandas as pd
import numpy as np
df = pd.read_excel('test_for_kriging.xlsx')
def data_set(df,type_='AQI'):
Krin = Krige(df[['经度', '纬度']].values, df[type_].values, variogram_model='linear', verbose=False, enable_plotting=False)
olon = np.arange(73,136,0.5)
olat = np.arange(14,55,0.5)
data = Krin.execute('grid', olon, olat)
olon,olat = np.meshgrid(olon,olat)
return olon, olat, data
olon,olat,data = data_set(df,'PM10')
如果以上代码时,需要先安装scikit-learn库。在此示例中,我们使用pykrige.rk.Krige类进行插值,并使用线性半变异函数。
根据代码中的注释,你遇到了一个问题,即使用相同的代码调用其他数据(如AQI),输出结果与预期一致,但对于PM10数据,输出结果出现特别大的值和特别小的值。这个问题可能由于PM10数据的分布特性不同于其他数据导致的。可能的原因包括PM10数据的离群值较多,或者PM10数据的空间分布不均匀。为了解决这个问题,你可以尝试调整插值算法的参数,如变程模型或者插值的网格大小,以获得更准确的结果。