卡尔曼滤波、马尔科夫模型、粒子滤波、TSP问题知识点回顾

前面有小结了概率论、线性代数、现代控制理论的一些知识点,这边再来回顾下之前看过了关于卡尔曼滤波、马尔科夫模型、粒子滤波、动态规划中的TSP问题,这边也只是知其形,便于日后应用到一些实际案例中。

一.卡尔曼滤波

这边只是记录要点,便于快速回忆起来,可以从如下5个公式来入手。

 所以在代码初始化的时候要先初始化状态真实值和后验误差协方差矩阵

 主要可参考博客

一文看懂卡尔曼滤波(附全网最详细公式推导) - 知乎

 其它博客可参考

【基础理论】卡尔曼滤波 - 知乎

 卡尔曼滤波的五大公式及python代码示例_卡尔曼滤波算法-CSDN博客

 二. 隐马尔可夫模型

 主要可以参考如下博客

隐马尔可夫模型(HMM)-CSDN博客

帖子中的推导是针对某个观测序列出现的概率,其是要求出所有可能的情况,故是在求和计算。此用的是前向算法。主要思路就是:比如观测序列是{红,白,白},隐状态集合是{第一个盒子,第二个盒子,第三个盒子}。那么在算到第3个观测序列是白的时候,要考虑这是从第一个盒子、第二个盒子、第三个盒子拿到的白色的情况,同时也要结合第2序列是从第一个盒子中取出白色,第二个盒子中取出白色,第三个盒子中取出白色这三种情况来计算。可以看到计算过程只需要依赖前一个观测序列的值。

从上面可以看到状态转移变化,是按照状态转移矩阵的列来取值的。该帖子也说明了隐马尔可夫模型解决几个常见问题。

如下帖子有更为详细的推导

https://www.cnblogs.com/skyme/p/4651331.html

在根据观测序列推出最有可能的状态序列时候,提到了Viterbi algorithm算法。此贴也用前向算法推了某个观测序列出现的可能性。

其它几篇博客可以稍微参考下

马尔可夫模型概念-CSDN博客

马尔可夫链 (Markov Chain)是什么鬼 - 知乎

隐马尔可夫模型(HMM)

一文带你了解隐马尔可夫模型(含详细推导) - 知乎

三.  粒子滤波

 粒子滤波大概原理可以是在图像上,或者目标区域附近随机分布一些粒子。然后状态转移计算新的粒子,然后计算这些粒子的权重,并根据粒子权重,重新分布粒子(重采样),再继续状态转移,继续循环计算。可主要参考如下帖子

https://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html

 主要代码如下:

 while( frame = cvQueryFrame( video ) )
    {
      hsv_frame = bgr2hsv( frame );
      frames[i] = cvClone( frame );

      /* allow user to select object to be tracked in the first frame */
      if( i == 0 )
	{
	  w = frame->width;
	  h = frame->height;
	  fprintf( stderr, "Select object region to track\n" );
	  while( num_objects == 0 )
	    {
	      num_objects = get_regions( frame, &regions );
	      if( num_objects == 0 )
		fprintf( stderr, "Please select a object\n" );
	    }

	  /* compute reference histograms and distribute particles */
	  ref_histos = compute_ref_histos( hsv_frame, regions, num_objects );
	  if( export )
	    export_ref_histos( ref_histos, num_objects );
	  particles = init_distribution( regions, ref_histos,
					 num_objects, num_particles );
	}
      else
	{
	  /* perform prediction and measurement for each particle */
	  for( j = 0; j < num_particles; j++ )
	    {
	      particles[j] = transition( particles[j], w, h, rng );
	      s = particles[j].s;
	      particles[j].w = likelihood( hsv_frame, cvRound(particles[j].y),
					   cvRound( particles[j].x ),
					   cvRound( particles[j].width * s ),
					   cvRound( particles[j].height * s ),
					   particles[j].histo );
	    }
	  
	  /* normalize weights and resample a set of unweighted particles */
	  normalize_weights( particles, num_particles );
	  new_particles = resample( particles, num_particles );
	  free( particles );
	  particles = new_particles;
	}

 init_distribution函数代码如下:

particle* init_distribution( CvRect* regions, histogram** histos, int n, int p)
{
  particle* particles;
  int np;
  float x, y;
  int i, j, width, height, k = 0;
  
  particles = malloc( p * sizeof( particle ) );
  np = p / n;

  /* create particles at the centers of each of n regions */
  for( i = 0; i < n; i++ )
    {
      width = regions[i].width;
      height = regions[i].height;
      x = regions[i].x + width / 2;
      y = regions[i].y + height / 2;
      for( j = 0; j < np; j++ )
	{
	  particles[k].x0 = particles[k].xp = particles[k].x = x;
	  particles[k].y0 = particles[k].yp = particles[k].y = y;
	  particles[k].sp = particles[k].s = 1.0;
	  particles[k].width = width;
	  particles[k].height = height;
	  particles[k].histo = histos[i];
	  particles[k++].w = 0;
	}
    }

  /* make sure to create exactly p particles */
  i = 0;
  while( k < p )
    {
      width = regions[i].width;
      height = regions[i].height;
      x = regions[i].x + width / 2;
      y = regions[i].y + height / 2;
      particles[k].x0 = particles[k].xp = particles[k].x = x;
      particles[k].y0 = particles[k].yp = particles[k].y = y;
      particles[k].sp = particles[k].s = 1.0;
      particles[k].width = width;
      particles[k].height = height;
      particles[k].histo = histos[i];
      particles[k++].w = 0;
      i = ( i + 1 ) % n;
    }

  return particles;
}

 其中particle类的定义如下:

typedef struct particle {
  float x;          /**< current x coordinate */
  float y;          /**< current y coordinate */
  float s;          /**< scale */
  float xp;         /**< previous x coordinate */
  float yp;         /**< previous y coordinate */
  float sp;         /**< previous scale */
  float x0;         /**< original x coordinate */
  float y0;         /**< original y coordinate */
  int width;        /**< original width of region described by particle */
  int height;       /**< original height of region described by particle */
  histogram* histo; /**< reference histogram describing region being tracked */
  float w;          /**< weight */
} particle;

transition函数中代码

particle transition( particle p, int w, int h, gsl_rng* rng )
{
  float x, y, s;
  particle pn;
  
  /* sample new state using second-order autoregressive dynamics */
  x = A1 * ( p.x - p.x0 ) + A2 * ( p.xp - p.x0 ) +
    B0 * gsl_ran_gaussian( rng, TRANS_X_STD ) + p.x0;
  pn.x = MAX( 0.0, MIN( (float)w - 1.0, x ) );
  y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) +
    B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;
  pn.y = MAX( 0.0, MIN( (float)h - 1.0, y ) );
  s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) +
    B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;
  pn.s = MAX( 0.1, s );
  pn.xp = p.x;
  pn.yp = p.y;
  pn.sp = p.s;
  pn.x0 = p.x0;
  pn.y0 = p.y0;
  pn.width = p.width;
  pn.height = p.height;
  pn.histo = p.histo;
  pn.w = 0;

  return pn;
}

likehood函数中代码

float likelihood( IplImage* img, int r, int c,
		  int w, int h, histogram* ref_histo )
{
  IplImage* tmp;
  histogram* histo;
  float d_sq;

  /* extract region around (r,c) and compute and normalize its histogram */
  cvSetImageROI( img, cvRect( c - w / 2, r - h / 2, w, h ) );
  tmp = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 3 );
  cvCopy( img, tmp, NULL );
  cvResetImageROI( img );
  histo = calc_histogram( &tmp, 1 );
  cvReleaseImage( &tmp );
  normalize_histogram( histo );

  /* compute likelihood as e^{\lambda D^2(h, h^*)} */
  d_sq = histo_dist_sq( histo, ref_histo );
  free( histo );
  return exp( -LAMBDA * d_sq );
}

normalize_weights函数中代码

void normalize_weights( particle* particles, int n )
{
  float sum = 0;
  int i;

  for( i = 0; i < n; i++ )
    sum += particles[i].w;
  for( i = 0; i < n; i++ )
    particles[i].w /= sum;
}

resample函数中代码如下,这边的意思是根据权重来产生和该粒子相同的新粒子的个数,那么权重大的就会多复制一些粒子,由于一些粒子不产生新粒子了,那么有可能k的值还不足n个,那么剩余差的粒子统一由最大的粒子来复制。

particle* resample( particle* particles, int n )
{
  particle* new_particles;
  int i, j, np, k = 0;

  qsort( particles, n, sizeof( particle ), &particle_cmp );
  new_particles = malloc( n * sizeof( particle ) );
  for( i = 0; i < n; i++ )
    {
      np = cvRound( particles[i].w * n );
      for( j = 0; j < np; j++ )
	{
	  new_particles[k++] = particles[i];
	  if( k == n )
	    goto exit;
	}
    }
  while( k < n )
    new_particles[k++] = particles[0];

 exit:
  return new_particles;
}

车辆(十)——粒子滤波 - 知乎

此贴中观测值可用于和预测值求相似性,以便于计算粒子的权重。如下贴也说明了观测值的作用。

【滤波】粒子滤波(PF)-CSDN博客

如下贴能够比较好的介绍一个实际应用

 通俗理解:卡尔曼滤波和粒子滤波 - 知乎

OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪_opencv粒子光-CSDN博客

四.  旅行商问题(动态规划)

主要参考如下贴

旅行商问题(动态规划方法,超级详细的)-CSDN博客

 通过如下图可以快速回忆,在数据结构表示点集合上也有小技巧,是用二进制位来表示的。

可看到是逐步分解的一个动作,下一步例举出所有可能先到的城市。

其它可借鉴帖子如下:

干货 十分钟教你用动态规划算法解Travelling Salesman Problem(TSP)问题 - 知乎

补充:蚁群算法和遗传算法可参考如下帖子

干货|十分钟快速get蚁群算法(附代码) - 知乎

国赛必备算法——蚁群算法理解与实现

蚁群算法解决最短路径问题 - 知乎

 【遗传算法】求解TSP问题_遗传算法求解tsp问题-CSDN博客

 干货 | 遗传算法(Genetic Algorithm) (附代码及注释) - 知乎

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

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

相关文章

浪花 - 主页开发

一、简易版主页 1. 主页展示用户列表 <template><!--推荐用户列表--><van-cardv-for"user in userList":desc"user.profile":title"${user.username}(${user.planetCode})":thumb"user.avatarUrl"><template #…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列&#xff1f; 消息队列是一种进程间通信或同一进程的不同线程间的通信方式&#xff0c;软件的贮列用来处理一系列的输入&#xff0c;通常是来自用户。消息队列提供了异步的通信协议&#xff0c;每一个贮列中的纪录包含详细说明的数据…

一文看完String的前世今生,内容有点多,请耐心看完!

写在开头 String字符串作为一种引用类型&#xff0c;在Java中的地位举足轻重&#xff0c;也是代码中出现频率最高的一种数据结构&#xff0c;因此&#xff0c;我们需要像分析Object一样&#xff0c;将String作为一个topic&#xff0c;单独拿出来总结&#xff0c;这里面涉及到字…

虹科分享 | Redis与MySQL协同升级企业缓存

文章速览&#xff1a; MySQL为什么需要Redis EnterpriseRedis Enterprise带来哪些优势Redis Enterprise与MySQL协同 传统的MySQL数据库在处理大规模应用时已经到了瓶颈&#xff0c;Redis Enterprise怎样助力突破这一瓶颈&#xff1f;Redis Enterprise与MYSQL共同用作企业级缓存…

第二次作业+第三次作业

第二次作业第三次作业 第二次作业 题目&#xff1a; 网站需求&#xff1a; ​ 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[ww…

[全连接神经网络]Transformer代餐,用MLP构建图像处理网络

一、MLP-Mixer 使用纯MLP处理图像信息&#xff0c;其原理类似vit&#xff0c;将图片进行分块(patch)后展平(fallten)&#xff0c;然后输入到MLP中。理论上MLP等价于1x1卷积&#xff0c;但实际上1x1卷积仅能结合通道信息而不能结合空间信息。根据结合的信息不同分为channel-mixi…

hash应用

目录 一、位图 1.1、引出位图 1.2、位图的概念 1.3、位图的应用 1.4、位图模拟实现 二、布隆过滤器 2.1、什么是布隆过滤器 2.2、布隆过滤器应用的场景 2.3、布隆过滤器的原理 2.4、布隆过滤器的查找 2.5、布隆过滤器的插入 2.6、布隆过滤器的删除 2.7、布隆过滤器…

深入解析JavaScript中箭头函数的用法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 箭头函数(Arrow function)是JavaScript ES6中引入的一大特性。箭头函…

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法&#xff08;线性&#xff09;6、 中值滤波法&#xff08;分线性&#xff09;7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

【Linux】yum

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 yum 1. 什么是yum&#xff1f;2. Linux系统(Centos)的生态3. yum的相关操作4. yum的本地配置5. 如何安装软件 1. 什么是yum&#xff1f; yum是一个软件下载安装的一个客户端&a…

逻辑运算

目录 AND OR NOT Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 逻辑运算可以保证连接多个条件&#xff0c;连接主要使用 AND、OR 、NOT完成 AND 1.查询职位不是办事员&#xff0c;但是工资低于 300 的员工信息 这个范例可以理…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

Visual Studio 设置编辑框(即代码编辑器)的背景颜色

在Visual Studio 中设置编辑框&#xff08;即代码编辑器&#xff09;的背景颜色&#xff0c;可以按照以下步骤进行&#xff1a; 打开Visual Studio。在菜单栏上找到并点击“工具”(Tools)选项。在下拉菜单中选择“选项”(Options)。在“选项”对话框中&#xff0c;导航至“环境…

基于Spring+mybatis+vue的在线课后测试系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Oracle架构_数据库底层原理、机制 (授人以渔)

目录 系统全局区SGA 高速缓存缓冲区(数据库缓冲区) 日志缓冲区 共享池 其他结构 用户连接进程 用户进程User Process Server Process服务进程 程序全局区PGA Oracle的connect连接和session会话与User Process紧密相关 后台进程 数据库写入进程(DBWn) 检查点(CKPT)…

plt.table绘制表格

目录 一&#xff1a;介绍 二&#xff1a;绘制一个表格 一&#xff1a;介绍 plt.table()函数是Matplotlib库中的一个函数&#xff0c;用于在图表中插入一个表格。它提供了创建和定制表格的功能。下面是plt.table()函数的一些常用参数&#xff1a; cellText: 一个二维列表或数…

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代&#xff0c;刷短视似乎成了人们休闲娱乐的一种方式&#xff0c;在日常刷短视频过程中&#xff0c;肯定会有很多同学被短视频 bgm 神曲洗脑&#xff0c;比如很多被网红翻唱带火的歌曲&#xff0c;例如其中"不负人间”&#xff0c;就是其中…

elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示

Upload 上传组件的使用 官方文档链接使用el-upload组件上传文件 具体参数说明&#xff0c;如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码 文件展示列表自定义为表格展示 使用的具体参数说明文件大小展示问题&#xff08;KB/MB&#xff09;文件下载代码…

Windows下载并配置Kettle

注意&#xff1a;需要windows配置Java 下载 Kettle 进入官网&#xff1a;https://www.hitachivantara.com/en-us/products/pentaho-plus-platform/data-integration-analytics/pentaho-community-edition.html 下载带有Pentaho Data Integration (Base Install)的文件&#…
最新文章