kalman滤波python实现——基于维纳退化模型

参考文献:

Si X S, Wang W, Hu C H, et al. A Wiener-process-based degradation model with a recursive filter algorithm for remaining useful life estimation[J]. Mechanical Systems and Signal Processing, 2013, 35(1-2): 219-237.

维纳过程模型: 

  • 退化模型:

X(t)=\lambda t+\sigma B(t)

其中,\lambda为drift coef,\sigma为diffusion coef ,B(\cdot)为标准布朗运动

  • 状态空间方程:

\begin{aligned}\lambda_i&=\lambda_{i-1}+\eta,\quad \eta\sim N(0,Q) \\x_i&=x_{i-1}+\lambda_{i-1}(t_i-t_{i-1})+\sigma\varepsilon_i, \quad \varepsilon_i\sim N(0,t_i-t_{i-1}) \end{aligned}

kalman滤波

  • 算法细节:

  • 代码实现 
import matplotlib.pyplot as plt
from math import pi
import numpy as np
from numpy import log, exp, sqrt
from numpy.random import normal, randn

def kalman_filter_for_weiner_process(t, X):
    ''''X is an array'''
    n_samples = len(t)
    print("n_samples:", n_samples)
    sigma2 = 2                           # difussion coef
    Q = 1                               # drift noise variation
    K = np.zeros(n_samples)
    P = np.ones([n_samples,n_samples])  # P0 = 1

    λ_hat = np.zeros(n_samples) # a0 = 1
    y_pred = np.zeros(n_samples)

    for i in np.arange(1, n_samples):
        # Prediction (expectation)
        P[i][i-1] = P[i-1][i-1]+Q 
        K[i] = (t[i] - t[i-1])**2 * P[i][i-1] + sigma2 * (t[i] - t[i-1]) # kalman 增益
        λ_hat[i] = λ_hat[i-1]+P[i][i-1]*(t[i]-t[i-1])*(X[i]-X[i-1]-λ_hat[i-1]*(t[i]-t[i-1]))/K[i]

        # Correction (variance)
        P[i][i] = P[i][i-1] - P[i][i-1] * (t[i] - t[i-1])**2 / K[i]*P[i][i-1]
        y_pred[i] = y_pred[i-1] + λ_hat[i-1] * (t[i] - t[i-1])
        print(f"λ_hat:{λ_hat[i]},P:{P[i][i]}")

    # y_pred[i + 1] = y_pred[i] + λ_hat[i]*(t[i]-t[i-1])


    plt.scatter(t,X, color = 'black')
    plt.plot(t,X, color = 'blue', label = 'actual')
    plt.plot(t, y_pred, color = 'red', label='kalman')
    print("y_pred:",y_pred)
    print("λ_hat:",λ_hat)
    print("X:",X)
    plt.legend()

# data
t = df.iloc[0].index.to_numpy()
X = df.iloc[0].to_numpy()
kalman_filter_for_weiner_process(t,X)
  • 数据如下: 
t        X
0        0.0000
250      0.4741
500      0.9255
750      2.1147
1000     2.7168
1250     3.5110
1500     4.3415
1750     4.9076
2000     5.4782
2250     5.9925
2500     6.7224
2750     7.1303
3000     8.0006
3250     8.9193
3500     9.4940
3750     9.8675
4000    10.9446
Name: 0, dtype: float64
  •  输出结果:
n_samples: 17
λ_hat:0.001895641743302679,P:0.000799680127948843
λ_hat:0.0018056719183482896,P:0.000799361022160161
λ_hat:0.004754442867440618,P:0.0007993610219565461
λ_hat:0.002410273837351531,P:0.0007993610219566571
λ_hat:0.003176187758265448,P:0.0007993610219566571
λ_hat:0.0033218835364738357,P:0.0007993610219566571
λ_hat:0.0022652446359513623,P:0.0007993610219566571
λ_hat:0.0022823862976238066,P:0.0007993610219566571
λ_hat:0.002057379861374825,P:0.0007993610219566571
λ_hat:0.002918911325328529,P:0.0007993610219566571
λ_hat:0.0016326282045899178,P:0.0007993610219566571
λ_hat:0.0034797235040138026,P:0.0007993610219566571
λ_hat:0.0036746441880028437,P:0.0007993610219566571
λ_hat:0.0022998989177841316,P:0.0007993610219566571
λ_hat:0.0014946436896421033,P:0.0007993610219566571
λ_hat:0.00430615258937267,P:0.0007993610219566571
y_pred: [0.         0.         0.47391044 0.92532842 2.11393913 2.71650759
 3.51055453 4.34102542 4.90733657 5.47793315 5.99227811 6.72200595
 7.130163   8.00009387 8.91875492 9.49372965 9.86739057]
λ_hat: [0.         0.00189564 0.00180567 0.00475444 0.00241027 0.00317619
 0.00332188 0.00226524 0.00228239 0.00205738 0.00291891 0.00163263
 0.00347972 0.00367464 0.0022999  0.00149464 0.00430615]
X: [ 0.      0.4741  0.9255  2.1147  2.7168  3.511   4.3415  4.9076  5.4782
  5.9925  6.7224  7.1303  8.0006  8.9193  9.494   9.8675 10.9446]

 

改进的kalman滤波

  • 算法细节:

  •  代码实现:
import matplotlib.pyplot as plt
from math import pi
import numpy as np
from numpy import log, exp, sqrt
from numpy.random import normal, randn

def strong_tracking_kalman_filter_for_weiner_process(t, X):
    ''''X is an array'''
    n_samples = len(t)
    print("n_samples:", n_samples)
    sigma2 = 20                           # difussion coef
    Q = 10                               # drift noise variation
    alpha, rho = 0.5, 0.5
    V = np.zeros(n_samples)
    gamma = np.zeros(n_samples)
    B = np.zeros(n_samples)
    C = np.zeros(n_samples)
    v = np.zeros(n_samples)
    

    K = np.zeros(n_samples)
    P = np.ones([n_samples,n_samples])  # P0 = 1

    λ_hat = np.zeros(n_samples) # a0 = 0
    y_pred = np.zeros(n_samples)

    for i in np.arange(1, n_samples):
        gamma[i] = X[i] - X[i-1] - λ_hat[i-1] * (t[i] - t[i-1])
        if i == 1:
            V[i] = gamma[i]**2
        elif i > 1:
            V[i] = (rho * V[i-1] + gamma[i]**2) / (1 + rho)
        B[i] = V[i] - Q * (t[i] - t[i-1])**2 - alpha * sigma2 * (t[i] - t[i-1])
        C[i] = P[i-1][i-1] * (t[i] - t[i-1])**2 - alpha * sigma2 * (t[i] - t[i-1])
        v0 = B[i] / C[i]
        if v0 >= 1:
            v[i] = v0
        else:
            v[i] = 1

        # Prediction (expectation)
        P[i][i-1] = v[i] * P[i-1][i-1] + Q 
        K[i] = (t[i] - t[i-1])**2 * P[i][i-1] + sigma2 * (t[i] - t[i-1]) # kalman 增益
        λ_hat[i] = λ_hat[i-1] + P[i][i-1] * (t[i] - t[i-1]) / K[i] * (X[i] - X[i-1] - λ_hat[i-1] * (t[i] - t[i-1])) 

        # Correction (variance)
        P[i][i] = P[i][i-1] - P[i][i-1] * (t[i] - t[i-1])**2 / K[i] * P[i][i-1]

        # pred
        y_pred[i] = y_pred[i-1] + λ_hat[i-1] * (t[i] - t[i-1])
        print(f"λ_hat:{λ_hat[i-1]},P:{P[i][i]}")

    plt.scatter(t,X, color = 'black')
    plt.plot(t,X, color = 'blue', label = 'actual')
    plt.plot(t, y_pred, color = 'red', label='kalman')
    print("y_pred:",y_pred)
    print("λ_hat:",λ_hat)
    print("X:",X)
    plt.legend()

# data
t = df.iloc[0].index.to_numpy()
X = df.iloc[0].to_numpy()
kalman_filter_for_weiner_process(t,X)
  • 数据如下: 
t        X
0        0.0000
250      0.4741
500      0.9255
750      2.1147
1000     2.7168
1250     3.5110
1500     4.3415
1750     4.9076
2000     5.4782
2250     5.9925
2500     6.7224
2750     7.1303
3000     8.0006
3250     8.9193
3500     9.4940
3750     9.8675
4000    10.9446
Name: 0, dtype: float64
  •  输出结果:
n_samples: 17
λ_hat:0.0,P:0.0794223826714795
λ_hat:0.001882707581227437,P:0.07999541573485658
λ_hat:0.0018056044185198762,P:0.07999996363651007
λ_hat:0.004756798657830221,P:0.07999999821186066
λ_hat:0.002408400008471828,P:0.07999998331069946
λ_hat:0.0031767999998636902,P:0.07999999821186066
λ_hat:0.0033219999997595936,P:0.07999998331069946
λ_hat:0.002264400000187615,P:0.07999999821186066
λ_hat:0.0022823999999701966,P:0.07999998331069946
λ_hat:0.002057200000039947,P:0.07999999821186066
λ_hat:0.00291959999857214,P:0.07999998331069946
λ_hat:0.0016316000002284837,P:0.07999999821186066
λ_hat:0.003481199996937646,P:0.07999998331069946
λ_hat:0.003674799999965654,P:0.07999999821186066
λ_hat:0.0022988000022782225,P:0.07999998331069946
λ_hat:0.001494000000142767,P:0.07999999821186066
y_pred: [0.         0.         0.4706769  0.922078   2.11127766 2.71337767
 3.50757767 4.33807767 4.90417767 5.47477767 5.98907767 6.71897767
 7.12687767 7.99717767 8.91587767 9.49057767 9.86407767]
λ_hat: [0.         0.00188271 0.0018056  0.0047568  0.0024084  0.0031768
 0.003322   0.0022644  0.0022824  0.0020572  0.0029196  0.0016316
 0.0034812  0.0036748  0.0022988  0.001494   0.0043084 ]
X: [ 0.      0.4741  0.9255  2.1147  2.7168  3.511   4.3415  4.9076  5.4782
  5.9925  6.7224  7.1303  8.0006  8.9193  9.494   9.8675 10.9446]

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

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

相关文章

前端基础篇-深入了解 JavaScript(一)

文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述 JavaScript(简称:JS)是一门夸平台、面向对象的脚本语言。使用来控制网页行为,它…

主机 渗透

1:kali 靶机:Windows Server 2003 端口扫描 1.用nmap端口扫描靶机 nmap -sP 192.168.157.0/24 #扫描192.168.157.0这个网段存活的主机 靶机的IP为192.168.157.130 2 nmap -sV192.168.157.130 -p- #-sV 参数用于启用版本检测,192.168.…

【MySQL】锁信息

title: MySQL 锁信息 tags: MySQL abbrlink: 364637211 date: 2021-07-26 18:34:34 1 MySQL 锁定义 MySQL 锁(Lock)是数据库管理系统用于管理并发访问的一种机制。 在多用户同时访问数据库的环境下,可能会出现多个事务同时对相同的数据进行…

【C++ 】stack 和 queue

1. 标准库中的stack stack 的介绍: 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作 2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其…

linux系统对于docker容器的监控

容器监控 容器监控原生命令操作问题 容器监控三剑客CAdvisorInfluxDBGranfana compose编排监控工具新建目录创建CIG.yml文件启动docker-compose测试 容器监控 CAdvisorInfluxDBGranfana 原生命令 操作 docker stats问题 通过docker stats命令可以很方便的看到当前宿主机上所…

PostgreSQL YUM安装

docker中的centos7中安装 选择对应的版本然后在容器中的centos7中执行下面命令 但是启动容器的时候需要注意 开启端口映射开启特权模式启动init进程 docker run -itd --name centos-postgresql -p 5433:5432 --privilegedtrue centos:centos7 /usr/sbin/init 启动然后进入后先…

算法刷题Day9 | 28. 实现 strStr()、459.重复的子字符串、字符串总结

目录 0 引言1 实现 strStr()1.1 我的解题1.2 KMP算法解题 2 重复的子字符串2.1 暴力求解2.2 KMP求解法 3 字符串总结 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:算法刷题Day8 | 28. 实现 strStr()、45…

[虚拟机]

如果你电脑的物理机器硬件强大, 由于一台物理机器只能运行一个操作系统, 那么就会造成物理机器硬件的浪费 虚拟机:使用虚拟化技术,将一台物理机器虑拟化为多台虚拟机器(Virtual Machine, VM),每个虚拟机器都可以独立运行一个操作系统 虚拟机…

WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录 开发环境安装opencv环境 实践出真知完整项目效果图 踩坑fatal error: opencv2/opencv.hpp file not found增加软链ln(无效)改用自行安装opencv,再显示指定lib路径 emcc命令行运行方式 最近因为项目原因,研究了一下WebAss…

轻松驾驭时间流:MYSQL日期与时间函数的实用技巧

​🌈 个人主页:danci_🔥 系列专栏:《MYSQL应用》💪🏻 制定明确可量化的目标,坚持默默的做事。 MySQL的时间函数用于处理日期和时间数据。以下是一些常用的MySQL时间函数。 内容有点多&#xff0…

一个H5页面中直接使用React的示例与说明

示例 如题&#xff0c;下面的个简单代码示例—在H5页面中直接使用React <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

docker-compose 部署nginx和jdk步骤

** yum安装jdk ** 1、​​yum -y list java* 查看可安装java版本 选择安装 java-1.8.0-openjdk-accessibility.x86_64 2、​​yum install -y java-1.8.0-openjdk-devel.x86_64 耐心等待安装完成即可 3、​java -version​​ 即可查看当前安装的java版本 4、yum安装的jdk&am…

信息检索(十一):Nonparametric Decoding for Generative Retrieval

Nonparametric Decoding for Generative Retrieval 摘要1. 引言2. 相关工作3. 非参数解码3.1 关键优势3.2 Base Np3.3 异步 Np3.4 对比 Np3.5 聚类 4. 实验设置4.1 基线4.2 数据集和评价指标4.3 构建CE 的细节 5. 实验结果5.1 普通解码 vs Np 解码5.2 非参数解码的优点5.3 什么…

前端测试——端对端测试框架 Playwright 总结

在进行前端测试前&#xff0c;我们需要明确我们需要怎样的前端测试。 前端测试类型总结 前端应用测试分为几种常见类型: 端到端&#xff08;e2e&#xff09; &#xff1a;一个辅助机器人&#xff0c;表现得像一个用户&#xff0c;在应用程序周围点击&#xff0c;并验证其功能…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分&#xff0c;帮助模型决定在处理信息时&#xff0c;所应该关注的部…

识局者生,破局者存,掌局者赢

在我们生活的世界中&#xff0c;每个人可能都被各种各样的情况所围绕着&#xff0c;这些情况可能来自我们的工作&#xff0c;可能来自我们的生活&#xff0c;也可能来自我们周围的人。我们可能会被这些情况所困扰&#xff0c;可能会因这些情况感到困惑&#xff0c;甚至可能会因…

扒带和扒谱的区别 FL Studio怎么扒带 扒带编曲制作 扒带简单歌曲

在许多业余音乐爱好者们的眼里&#xff0c;扒带和扒谱是同一种东西。诚然&#xff0c;扒带和扒谱的确非常相似&#xff0c;但是从严格的意义上来说&#xff0c;这二者还是有一定的区别。今天我们就来说一说扒带和扒谱的区别&#xff0c;FL Studio怎么扒带。 FL Studio21中文官网…

深入理解JAVA异常(自定义异常)

目录 异常的概念与体系结构 异常的概念&#xff1a; 异常的体系结构&#xff1a; 异常的分类&#xff1a; 异常的处理 防御式编程 LBYL: EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 面试题&#xff1a; 异常的处理流程 异常处…

Linux中搭建DNS 域名解析服务器(详细版)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言———— 在Linux中搭建DNS服务器涉及配置和运行一个软件来提供DNS服务。DNS&#xff08;Domain Name System…

如何免费获取基于公网 IP 的 SSL 证书 (无需域名)

现在给网站安装SSL证书来实现网站的HTTPS安全访问已经成了大多数人的共识&#xff0c;但是有一些特殊情况&#xff1a;比如对于个别的应用IP地址不需要绑定域名&#xff0c;只是单纯用IP来访问网站&#xff0c;这种情况下&#xff0c;可以实现HTTPS访问吗&#xff1f; 先说答案…