美文网首页机器学习
缺失值处理-拉格朗日插值

缺失值处理-拉格朗日插值

作者: 亲爱的十一熊猫 | 来源:发表于2018-08-27 15:16 被阅读32次

    常用的插值法有:
    一维插值法:拉格朗日插值、牛顿插值、分段低次插值、埃尔米特插值、样条插值。
    二维插值法:双线性插值、双二次插值。

    拉格朗日插值法
    https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95

    优点与缺点:
    拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐[5]。这时可以用重心拉格朗日插值法或牛顿插值法来代替。此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差(如右下图)[6]。这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。

    Python实现:

    from scipy.interpolate import lagrange #导入拉格朗日插值函数
    
    inputfile = '/Users/xiaoyi.yang/Downloads/missing_data.xls' #输入数据路径,需要使用Excel格式;
    outputfile = '/Users/xiaoyi.yang/Downloads/missing_data_processed.xls' #输出数据路径,需要使用Excel格式
    
    data = pd.read_excel(inputfile, header=None) #读入数据
    data
    
    #自定义列向量插值函数
    #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
    def ployinterp_column(s, n, k=5):
      y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
      y = y[y.notnull()] #剔除空值
      return lagrange(y.index, list(y))(n) #插值并返回插值结果
    
    #逐个元素判断是否需要插值
    for i in data.columns:
      for j in range(len(data)):
        if (data[i].isnull())[j]: #如果为空即插值。
          data[i][j] = ployinterp_column(data[i], j)
    
    data.to_excel(outputfile, header=None, index=False) #输出结果` 
    

    相关文章

      网友评论

        本文标题:缺失值处理-拉格朗日插值

        本文链接:https://www.haomeiwen.com/subject/knxtwftx.html