ChartGPT多重插补法 填充缺失点

问题描述

已知时间戳与对应的值,需要根据时间戳找到缺失的点,然后进行值的填充。

例如:

源码

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-math3</artifactId>

<version>3.6.1</version>

</dependency>

引入相应的依赖包

import java.util.LinkedList;

import java.util.List;

import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;

import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;

缺失值填充的源码:

/**

* 根据时间戳进行填充value

* @param timestamps 时间戳数组

* @param values 对应的值

* @param interval 时间戳

* @return 填充后的list

*/

public static List<Double> insertMissingByTimestamps(List<Long> timestamps,

List<Double> values,

Long interval) {

// 检查问题

if (timestamps == null || values == null ||

timestamps.size() == 0 || values.size() == 0) {

return null;

}

// 准备好线性插值

LinearInterpolator interp = new LinearInterpolator();

double[] timestampsAry = timestamps.stream().mapToDouble(d -> d).toArray();

double[] valuesAry = values.stream().mapToDouble(d -> d).toArray();

PolynomialSplineFunction insertMissingFunc = interp.interpolate(timestampsAry, valuesAry);

// 计算正常情况下有多少个点

final int normalSize = countMissingPoints(timestamps, interval);

long current = timestamps.get(0);

List<Double> target = new LinkedList<>();

// 填充

for (int i=0; i<timestamps.size() && target.size() < normalSize; ) {

// 如果存在,则添加

if (current == timestamps.get(i)) {

target.add(values.get(i));

i++;

} else {

// 如果不存在,则插值

double value = insertMissingFunc.value(current);

target.add(value);

}

current += interval;

}

return target;

}

测试用例

double[] x = { 1, 3, 4, 7, 8, 9, 10};

double[] y = { 1, 3, 4, 7, 8, 9, 10};

LinearInterpolator interp = new LinearInterpolator();

PolynomialSplineFunction f = interp.interpolate(x, y);

System.out.println("Piecewise functions:");

Arrays.stream(f.getPolynomials()).forEach(System.out::println);

double value = f.value(5);

double value2 = f.value(6);

System.out.println("x = 3, y = " + f.value(3));

System.out.println("x = 6, y = " + f.value(6));

System.out.println("x = 7, y = " + f.value(7));

测试输出内容:

1 + x

2 + x

4 + x

5 + x

8 + x

x = 3, y = 3.0

x = 6, y = 6.0

x = 7, y = 7.0

1

2

3

4

5

6

7

8

注意:如果是边界外的是不能计算的。比如这个题目中不能计算 f.value(10) 。

例子二:

import java.util.Arrays;

//多重插补法是一种处理缺失数据的方法,通过对缺失数据周围的数据进行插值,从而填补缺失值。下面是一个基于Java的简单的多重插补法示例

import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;

import org.apache.commons.math3.analysis.interpolation.SplineInterpolator;

import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;

public class MultipleImputation {

public static void main(String[] args) {

double[] data = {1.2, 3.4, Double.NaN, 5.6, 7.8, Double.NaN, 9.0};

// 使用线性插值法进行缺失值填补

LinearInterpolator linearInterpolator = new LinearInterpolator();

PolynomialSplineFunction function = linearInterpolator.interpolate(getDataIndices(data), getDataValues(data));

for (int i = 0; i < data.length; i++) {

if (Double.isNaN(data[i])) {

data[i] = function.value(i);

}

}

// 使用样条插值法进行缺失值填补

SplineInterpolator splineInterpolator = new SplineInterpolator();

function = splineInterpolator.interpolate(getDataIndices(data), getDataValues(data));

for (int i = 0; i < data.length; i++) {

if (Double.isNaN(data[i])) {

data[i] = function.value(i);

}

}

System.out.println(Arrays.toString(data));

}

private static double[] getDataIndices(double[] data) {

double[] indices = new double[data.length];

for (int i = 0; i < data.length; i++) {

indices[i] = i;

}

return indices;

}

private static double[] getDataValues(double[] data) {

double[] values = new double[data.length];

for (int i = 0; i < data.length; i++) {

values[i] = data[i];

}

return values;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序】-- uni-app 项目-- 配置 tabBar 效果(五十一)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

【C++进阶】智能指针

文章目录为什么需要智能指针&#xff1f;内存泄漏什么是内存泄漏&#xff0c;内存泄漏的危害内存泄漏分类&#xff08;了解&#xff09;如何避免内存泄漏智能指针的使用及原理smart_ptrauto_ptrunique_ptrshared_ptr线程安全的解决循环引用weak_ptr删除器为什么需要智能指针&am…

HJZS电源监视继电器HJZS-E202 AC220V

系列型号&#xff1a; HJZS-E202断电延时继电器 HJZS-E002断电延时继电器 一 应用 HJZS-E202电源监视继电器用于直流或交流操作的各种保护和自动控制的装置中&#xff0c;用以增加触点数量。 二 安装结构 导轨安装9壳体结构&#xff0c;具体尺寸参阅外型尺寸图。 三 产品型号…

蓝桥杯刷题冲刺 | 倒计时14天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.最长递增2.走迷宫3.解立方根4.回文特判5.修改数组1.最长递增 题目 链接&#xff1a; 最长递增…

【Java版oj 】 day17杨辉三角形的变形、计算某字符出现次数

目录 一、杨辉三角形的变形 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、计算某字符出现次数 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代…

Python调用GPT3.5接口的最新方法

GPT3.5接口调用方法主要包括openai安装、api_requestor.py替换、接口调用、示例程序说明四个部分。 1 openai安装 Python openai库可直接通过pip install openai安装。如果已经安装openai&#xff0c;但是后续提示找不到ChatCompletion&#xff0c;那么请使用命令“pip instal…

【ArcGIS Pro二次开发】(18):地理处理工具类【Geoprocessing】补遗

ArcGIS Pro SDK 3.0中的Geoprocessing类是用于执行地理处理工具的核心类。地理处理工具是用于执行空间分析、数据转换、数据管理等任务的工具集&#xff0c;包括常见的空间分析工具、栅格处理工具、矢量处理工具、地图制图工具等。 之前有简单记录了下Geoprocessing工具的用法…

整理了一份github上比较热门的ChatGPT项目,值得收藏

ChatGPT已经火了一段时间了&#xff0c;但是&#xff0c;热度依旧是各大自媒体的热榜。由于&#xff0c;国内不能直接访问ChatGPT,国内的开发者依托OpenAI的接口&#xff0c;开发出一些ChatGPT的应用。今天就整理一下github上最热门的ChatGPT项目。 lencx/ChatGPT 该项目是Cha…

springboot校友社交系统

050-springboot校友社交系统演示录像开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;e…

蓝桥杯第14天(Python版)

并查集的使用# 并查集模板 N400 fa[] def init(): # 初始化&#xff0c;默认自身为根接点for i in range(N):fa.append(i)def merge(x,y): # 发现可以合并&#xff0c;默认选x的根节点为根接点fa[find(x)]find(y)def find(x): # 相等就是根结点&#xff0c;不然就递归查找根…

Vue3监听器使用

watch(监听的对象或值, 回调函数&#xff08;参数新值&#xff0c;旧值&#xff09;, 配置项是对象{ immediate: true//立即监听--进入就会执行一次 deep&#xff1a;true //深度监听 }) 首先引入 import { ref, watch } from vue; 设置响应式数据 const num ref(1) …

【数据结构篇C++实现】- 栈

文章目录&#x1f680;一、栈的原理精讲&#x1f680;二、栈的算法实现⛳栈的顺序存储结构&#x1f389;&#xff08;一&#xff09;顺序栈1.栈的结构体定义2.栈的初始化3.判断空栈4.判断栈满5.元素入栈6.元素出栈7.获取栈顶元素&#x1f389;&#xff08;二&#xff09;共享栈…

冯诺依曼,操作系统以及进程概念

文章目录一.冯诺依曼体系结构二.操作系统&#xff08;operator system&#xff09;三.系统调用和库函数四.进程1.进程控制块&#xff08;PCB&#xff09;2.查看进程3.系统相关的调用4.fork介绍&#xff08;并发引入&#xff09;五.总结一.冯诺依曼体系结构 计算机大体可以说是…

MD5加密竟然不安全,应届生表示无法理解?

前言 近日公司的一个应届生问我&#xff0c;他做的一个毕业设计密码是MD5加密存储的&#xff0c;为什么密码我帮他调试的时候&#xff0c;我能猜出来明文是什么&#xff1f; 第六感&#xff0c;是后端研发的第六感&#xff01; 正文 示例&#xff0c;有个系统&#xff0c;前…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的近端策略优化算法&#xff08;proximal policy optimization&#xff0c;PPO&#xff09;&#xff0c;并借助 OpenAI 的 gym 环境完成一个小案例&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://gith…

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器&#xff0c;可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点&#xff1a;多种信号类型&#xff1a;泰克信号发生器可以产生多种类型的电子信号&#xff0c;包括正弦波、方波、三角波、脉冲等…

TitanIDE:云原生开发到底强在哪里?

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法&#xff0c;旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同&#xff0c;云原生是将开发环境完全搬到云端&#xff0c;构建一站式的云原生开发环境。云原生的开…

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波&#xff0c;且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码&#xff1a; bsp_advance_tim.c /********************************************************************************* fi…

【YOLO】YOLOv8训练自定义数据集(4种方式)

YOLOv8 出来一段时间了&#xff0c;继承了分类、检测、分割&#xff0c;本文主要实现自定义的数据集&#xff0c;使用 YOLOV8 进行检测模型的训练和使用 YOLOv8 此次将所有的配置参数全部解耦到配置文件 default.yaml&#xff0c;不再类似于 YOLOv5&#xff0c;一部分在配置文件…

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前&#xff0c;我们必须先明白anaconda是什么&#xff1b;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言&#xff0c;后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…