IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 缺失值填充6——拉格朗日插值法填充序列缺失值 -> 正文阅读

[人工智能]缺失值填充6——拉格朗日插值法填充序列缺失值

拉格朗日插值法的直观表述可以参考:https://www.zhihu.com/question/58333118

拉格朗日插值法

在python中可以直接使用:

from scipy.interpolate import lagrange
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([10, 8, 4, 6, 2, 10])
lag_model = lagrange(x, y) # 根据x与y建模
print(lag_model)
print("when x=4, y=", lag_model(4))  # 模型预测x=4时的值
print("when x=6, y=", lag_model(6))  # 模型预测x=6时的值

打印的结果是:

         4         3         2
-0.8333 x + 9.667 x - 38.17 x + 57.33 x - 18
when x=4, y= 5.999999999999915
when x=6, y= -40.00000000000037

打印lag_model时,给出拟合的函数:-0.8333 x4 + 9.667 x3 - 38.17 x2 + 57.33 x - 18

但是根据模型拟合结果来看:

  • 当x=4时,模型给的值时5.9999,无限接近真实的6
  • 但是当x=6时,给出y=-40,这步子也太大了!

所以拉格朗日插值适合存在一定函数依赖的序列,常见于时间序列,如果是一般的采样数据预测偏差会较大

拉格朗日填充缺失值:示例代码

由于拉格朗日插值的原理是尝试用一个函数拟合给定的数据点,但是有时候数据点的x是随机的,真正有价值的是y,因此这里给定两种代码:

  • 如果x有用,比如时间序列中x表示时间,则执行版本1
  • 如果x无用,比如常规的预测任务,则执行版本2

版本1:x有意义

import pandas as pd
import numpy as np


def lagrange_fill(series, k=5):
    """拉格朗日填充"""
    from scipy.interpolate import lagrange
    def ployinterp_column(s, n, k=k):
        up_index = list(range(n - k, n))
        down_index = list(range(n + 1, n + 1 + k))
        if n + 1 + k > series.shape[0]:
            down_index = [_ - series.shape[0] for _ in down_index]  # 防止结尾越界
        y = s.iloc[up_index + down_index]  # 取数
        y = y[y.notnull()]  # 剔除空值
        return lagrange(y.index.tolist(), y.values)(n)  # 插值并返回插值结果
        # return lagrange(list(range(len(y))), list(y))(n)  # 插值并返回插值结果

    for i, index in enumerate(series[series.isnull() == True].index):
        series[index] = ployinterp_column(series, index)  # 返回当前数据的位置
    return series


def get_dataset():
    """得到数据
    :return data_x:有缺失值的数据
    :return true_value:缺失数据的原始真实值
    :return data_y:原问题中待预测的label
    """
    import copy
    from sklearn.datasets import make_classification
    data_x, data_y = make_classification(n_samples=100, n_classes=4, n_features=6, n_informative=4,
                                         random_state=0)  # 6个特征
    data_x = pd.DataFrame(data_x)
    data_x.columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'miss_line']
    true_data = copy.deepcopy(data_x)
    # 在miss_line这一列删除20%的数据
    drop_index = data_x.sample(frac=0.2).index
    data_x.loc[drop_index, "miss_line"] = np.nan
    true_value = true_data.loc[drop_index, 'miss_line']  # 空值的真实值
    return data_x, true_value, data_y


if __name__ == '__main__':
    value_x, true_value_x, value_y = get_dataset()
    fill_value = lagrange_fill(value_x['miss_line'])
    value_x['miss_line'] = fill_value

版本2:x无意义

import pandas as pd
import numpy as np


def lagrange_fill(series, k=5):
    """拉格朗日填充"""
    from scipy.interpolate import lagrange
    def ployinterp_column(s, n, k=k):
        up_index = list(range(n - k, n))
        down_index = list(range(n + 1, n + 1 + k))
        if n + 1 + k > series.shape[0]:
            down_index = [_ - series.shape[0] for _ in down_index]  # 防止结尾越界
        y = s.iloc[up_index + down_index]  # 取数
        y = y[y.notnull()]  # 剔除空值
        return lagrange(list(range(len(y))), list(y))(n)  # 插值并返回插值结果

    for i, index in enumerate(series[series.isnull() == True].index):
        series[index] = ployinterp_column(series, index)  # 返回当前数据的位置
    return series


def get_dataset():
    """得到数据
    :return data_x:有缺失值的数据
    :return true_value:缺失数据的原始真实值
    :return data_y:原问题中待预测的label
    """
    import copy
    from sklearn.datasets import make_classification
    data_x, data_y = make_classification(n_samples=100, n_classes=4, n_features=6, n_informative=4,
                                         random_state=0)  # 6个特征
    data_x = pd.DataFrame(data_x)
    data_x.columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'miss_line']
    true_data = copy.deepcopy(data_x)
    # 在miss_line这一列删除20%的数据
    drop_index = data_x.sample(frac=0.2).index
    data_x.loc[drop_index, "miss_line"] = np.nan
    true_value = true_data.loc[drop_index, 'miss_line']  # 空值的真实值
    return data_x, true_value, data_y


if __name__ == '__main__':
    value_x, true_value_x, value_y = get_dataset()
    fill_value = lagrange_fill(value_x['miss_line'])
    value_x['miss_line'] = fill_value
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:30:27  更:2022-03-12 17:34:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:44:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码