解锁维特比算法:探寻复杂系统的最优解密码
引言
在复杂的技术世界中,维特比算法以其独特的魅力和广泛的应用,成为通信、自然语言处理、生物信息学等领域的关键技术。今天,让我们一同深入探索维特比算法的奥秘。
一、维特比算法的诞生背景
维特比算法由安德鲁・维特比在 1967 年提出。当时通信技术飞速发展,对通信系统的可靠性和传输效率要求不断提高。信号在传输时易受噪声干扰导致错误,传统解码方法效率低,无法满足卫星通信等复杂场景需求。同时,信息论和马尔可夫过程理论的成熟为其奠定了理论基础,维特比算法应运而生,用于解决通信中的解码难题。
在信息论中,香农提出的编码定理从理论上为通信系统的编码和解码提供了指导,让人们明白如何在有限的带宽和噪声环境下,通过合理的编码来提高信息传输的可靠性。而马尔可夫过程理论则为描述通信中的信号传输提供了有力的工具。在很多通信场景中,信号的当前状态可以看作只与前一时刻的状态有关,基于马尔可夫过程的隐含马尔可夫模型(HMM)在通信、语音处理等领域得到了广泛应用,维特比算法正是为了解决隐含马尔可夫模型中的解码问题而提出的,用于寻找最可能的隐藏状态序列。
二、维特比算法的核心人物:安德鲁・维特比
安德鲁・维特比 1935 年出生于意大利犹太家庭,1939 年移民美国。他在麻省理工学院获得电气工程学士和硕士学位,在南加州大学获博士学位。他曾在多所高校任教,创立 Linkabit 和高通公司,担任维特比集团总裁并为多家公司提供战略顾问服务。他荣获多项荣誉,还在教育领域慷慨捐赠,南加州大学工程学院以他命名。
三、维特比算法原理详解
以一个简单的天气预测例子来理解维特比算法。假设存在一个只有晴天和雨天两种天气状态的场景,并且已知以下概率信息:
天气转移概率:从晴天到晴天的概率为 0.7,从晴天到雨天的概率为 0.3;从雨天到晴天的概率为 0.4,从雨天到雨天的概率为 0.6。
活动与天气的概率:晴天时,朋友去散步的概率为 0.6,去购物的概率为 0.3,待在家的概率为 0.1;雨天时,朋友去散步的概率为 0.1,去购物的概率为 0.3,待在家的概率为 0.6。
若朋友连续三天的活动分别为散步、购物、待在家,下面我们来详细计算利用维特比算法计算最可能的天气序列的过程:
第一天:
设晴天为状态 S1,雨天为状态 S2。初始时,假设晴天和雨天的概率都是 0.5。
-
如果第一天是晴天(S1)且朋友去散步,根据公式:初始概率 × 当前天气下活动的概率,即 0.5 × 0.6 = 0.3 0.5 \times 0.6 = 0.3 0.5×0.6=0.3。
-
如果第一天是雨天(S2)且朋友去散步,计算可得: 0.5 × 0.1 = 0.05 0.5 \times 0.1 = 0.05 0.5×0.1=0.05。
第二天:
当第二天是晴天(S1)时:
-
若第一天是晴天(S1),那么根据公式:第一天为 S1 且散步的概率 ×S1 到 S1 的转移概率 × 第二天 S1 时购物的概率,即 0.3 × 0.7 × 0.3 = 0.063 0.3 \times 0.7 \times 0.3 = 0.063 0.3×0.7×0.3=0.063。
-
若第一天是雨天(S2),则概率为:第一天为 S2 且散步的概率 ×S2 到 S1 的转移概率 × 第二天 S1 时购物的概率,即 0.05 × 0.4 × 0.3 = 0.006 0.05 \times 0.4 \times 0.3 = 0.006 0.05×0.4×0.3=0.006。
当第二天是雨天(S2)时:
-
若第一天是晴天(S1),概率为:第一天为 S1 且散步的概率 ×S1 到 S2 的转移概率 × 第二天 S2 时购物的概率,即 0.3 × 0.3 × 0.3 = 0.027 0.3 \times 0.3 \times 0.3 = 0.027 0.3×0.3×0.3=0.027。
-
若第一天是雨天(S2),概率为:第一天为 S2 且散步的概率 ×S2 到 S2 的转移概率 × 第二天 S2 时购物的概率,即 0.05 × 0.6 × 0.3 = 0.009 0.05 \times 0.6 \times 0.3 = 0.009 0.05×0.6×0.3=0.009。
第三天:
当第三天是晴天(S1)时:
-
若第二天是晴天(S1),第一天是晴天(S1),概率为:第二天为 S1(第一天为 S1)且购物的概率 ×S1 到 S1 的转移概率 × 第三天 S1 时待在家的概率,即 0.063 × 0.7 × 0.1 = 0.00441 0.063 \times 0.7 \times 0.1 = 0.00441 0.063×0.7×0.1=0.00441。
-
若第二天是晴天(S1),第一天是雨天(S2),概率为:第二天为 S1(第一天为 S2)且购物的概率 ×S1 到 S1 的转移概率 × 第三天 S1 时待在家的概率,即 0.006 × 0.7 × 0.1 = 0.00042 0.006 \times 0.7 \times 0.1 = 0.00042 0.006×0.7×0.1=0.00042。
-
若第二天是雨天(S2),第一天是晴天(S1),概率为:第二天为 S2(第一天为 S1)且购物的概率 ×S2 到 S1 的转移概率 × 第三天 S1 时待在家的概率,即 0.027 × 0.4 × 0.1 = 0.00108 0.027 \times 0.4 \times 0.1 = 0.00108 0.027×0.4×0.1=0.00108。
-
若第二天是雨天(S2),第一天是雨天(S2),概率为:第二天为 S2(第一天为 S2)且购物的概率 ×S2 到 S1 的转移概率 × 第三天 S1 时待在家的概率,即 0.009 × 0.4 × 0.1 = 0.00036 0.009 \times 0.4 \times 0.1 = 0.00036 0.009×0.4×0.1=0.00036。
当第三天是雨天(S2)时:
-
若第二天是晴天(S1),第一天是晴天(S1),概率为:第二天为 S1(第一天为 S1)且购物的概率 ×S1 到 S2 的转移概率 × 第三天 S2 时待在家的概率,即 0.063 × 0.3 × 0.6 = 0.01134 0.063 \times 0.3 \times 0.6 = 0.01134 0.063×0.3×0.6=0.01134。
-
若第二天是晴天(S1),第一天是雨天(S2),概率为:第二天为 S1(第一天为 S2)且购物的概率 ×S1 到 S2 的转移概率 × 第三天 S2 时待在家的概率,即 0.006 × 0.3 × 0.6 = 0.00108 0.006 \times 0.3 \times 0.6 = 0.00108 0.006×0.3×0.6=0.00108。
-
若第二天是雨天(S2),第一天是晴天(S1),概率为:第二天为 S2(第一天为 S1)且购物的概率 ×S2 到 S2 的转移概率 × 第三天 S2 时待在家的概率,即 0.027 × 0.6 × 0.6 = 0.00972 0.027 \times 0.6 \times 0.6 = 0.00972 0.027×0.6×0.6=0.00972。
-
若第二天是雨天(S2),第一天是雨天(S2),概率为:第二天为 S2(第一天为 S2)且购物的概率 ×S2 到 S2 的转移概率 × 第三天 S2 时待在家的概率,即 0.009 × 0.6 × 0.6 = 0.00324 0.009 \times 0.6 \times 0.6 = 0.00324 0.009×0.6×0.6=0.00324。
通过比较第三天所有的概率,发现第三天是雨天,且第二天是晴天,第一天是晴天的概率 0.01134 0.01134 0.01134是最大的。所以通过维特比算法得出,这三天最可能的天气序列是第一天晴天,第二天晴天,第三天雨天。
维特比算法的核心思想就是通过计算每一步所有可能路径的概率,保存概率最大的路径,最终找到整体概率最大的路径,即最可能的状态序列。
四、计算复杂度分析
时间复杂度
对于一个隐马尔可夫模型,假设状态空间大小为 N N N(即有 N N N个不同的隐藏状态),观测序列的长度为 T T T。
在维特比算法的每一步 t t t( 1 ≤ t ≤ T 1\leq t\leq T 1≤t≤T),对于每个可能的状态 i i i( 1 ≤ i ≤ N 1\leq i\leq N 1≤i≤N),要计算从初始状态到当前状态 i i i的最大概率路径。在计算这个最大概率时,需要考虑前一个时刻 t − 1 t - 1 t−1的所有 N N N个状态转移到当前状态 i i i的概率,并取最大值。
具体来说,计算当前状态 i i i的最大概率时,需要进行 N N N次乘法和 N − 1 N - 1 N−1次比较操作(因为要从 N N N个前一时刻状态转移过来的概率中取最大值),总的操作次数约为 2 N − 1 2N - 1 2N−1,在大 O 表示法中,忽略常数项和低阶项,可近似看作 O ( N ) O(N) O(N)。而每一步有 N N N个状态需要计算,所以每一步的时间复杂度为 O ( N × N ) = O ( N 2 ) O(N \times N)=O(N^2) O(N×N)=O(N2)
由于要处理整个长度为 T T T的观测序列,所以总的时间复杂度为 O ( T × N 2 ) O(T \times N^2) O(T×N2)
空间复杂度
维特比算法在运行过程中,需要保存每个时刻每个状态的最大概率以及对应的路径信息。
对于每个时刻 t t t,需要保存 N N N个状态的最大概率和路径信息,每个状态至少需要保存一个概率值和一个指向前一个状态的指针(用于回溯路径),所以每个时刻需要 O ( N ) O(N) O(N)的空间。
因为要保存所有 T T T个时刻的信息,所以总的空间复杂度为 O ( T × N ) O(T \times N) O(T×N)
五、维特比算法的广泛应用
通信领域
-
卷积编码解码:在数字通信中,卷积编码是一种常用的信道编码方式。发送端将原始数据通过卷积编码器按照特定规则进行编码,增加冗余信息,这样在接收端就可以利用这些冗余信息来纠正传输过程中可能出现的错误。当接收端接收到编码后的信号后,维特比算法开始发挥作用。它会基于接收到的信号序列,结合卷积码的约束长度和状态转移规则,计算所有可能的状态转移路径的概率。由于卷积码的状态数是有限的(取决于约束长度),维特比算法会在这些有限的状态和路径中,根据最大似然准则找到概率最大的路径,这条路径对应的状态序列就是解码后的原始数据估计值。例如在 4G、5G 通信标准中,卷积编码解码中的维特比算法是保障数据可靠传输的关键技术之一,它能够在复杂的无线信道环境下,有效降低误码率,提高通信质量。
-
信号检测与估计:在无线通信中,信号在传输过程中会受到多径衰落、噪声等干扰。接收端接收到的信号是多个路径信号的叠加以及噪声的混合。维特比算法通过建立信号模型和信道模型,将接收到的信号与可能发送的信号序列进行匹配。它会计算每个可能的发送信号序列在当前信道条件下产生接收到信号的概率,选择概率最大的信号序列作为估计的发送信号。比如在城市环境中的移动通信,信号会在建筑物之间反射、折射,形成多径传播,导致接收信号出现时延扩展和衰落。维特比算法可以通过分析这些复杂的信号特征,有效对抗多径效应,准确地检测和估计出发送信号,提升信号传输的质量和可靠性。
自然语言处理领域
-
词性标注:在对一段文本进行处理时,首先要对每个单词标注其词性,如名词、动词、形容词等。维特比算法依据预先建立的词性转移概率模型和单词与词性的对应概率模型来进行标注。例如,在英语中,“the” 通常后面接名词,“run” 作为动词的概率较高,且在一般现在时中,第三人称单数后面的动词要加 “s” 等规则,都可以体现在概率模型中。它从文本的第一个单词开始,计算每个单词可能的词性以及到当前单词为止的最可能词性序列。对于句子 “我 爱 自然 语言 处理”,维特比算法会根据 “爱” 这个词在不同语境下作为动词的概率,以及 “我” 后面接动词的概率等信息,确定 “爱” 的词性为动词,以此类推标注整句单词的词性,为后续的语法分析、语义理解等任务提供基础。
-
语音识别:在语音识别系统中,首先将语音信号转换为特征向量序列。维特比算法根据声学模型计算每个特征向量对应不同音素或单词的概率,声学模型描述了语音信号特征与音素之间的映射关系。同时,结合语言模型中单词之间的概率关系,语言模型体现了自然语言中单词出现的统计规律,比如 “我” 后面接 “喜欢”“想要” 等动词的概率较高。从第一个特征向量开始,逐步计算到最后一个特征向量,找到概率最大的单词序列作为识别结果。例如,当用户说 “打开电脑”,语音识别系统通过维特比算法分析语音特征,结合语言模型,识别出这四个单词组成的命令,实现将语音准确转换为文字。
-
机器翻译:在统计机器翻译中,源语言句子到目标语言句子的翻译存在多种可能性。维特比算法根据源语言和目标语言之间的翻译概率模型以及目标语言的语言模型来选择最优翻译。例如,对于源语言句子 “我喜欢苹果”,算法会根据 “我” 对应 “I”“me” 等的概率,“喜欢” 对应 “like”“love” 等的概率,这些概率来自于大量的平行语料库的统计分析。同时,考虑目标语言中单词组合的合理性,如 “I like apples” 比 “I love apples” 在这个语境下更符合概率模型(如果训练数据中 “like” 在描述一般性喜好且对象为常见事物时出现频率更高),从而选择出最合适的翻译结果,实现不同语言之间的自动翻译。
生物信息学领域
-
基因序列分析:在分析 DNA 序列时,维特比算法可以用于识别基因中的编码区域和非编码区域等重要结构。通过将已知的基因序列模式作为隐藏状态,待分析的 DNA 序列作为观测序列,建立状态转移概率和观测概率模型。例如,已知某些特定的碱基序列模式通常对应着启动子区域、外显子区域、内含子区域等,这些模式之间的转换概率以及它们与实际观测到的 DNA 序列的匹配概率可以通过对大量已知基因的分析和研究来确定。维特比算法会在这些复杂的概率模型中,找出最可能的状态序列,即最符合已知模式的基因结构划分。比如在人类基因组计划中,研究人员需要处理海量的基因序列数据,维特比算法能够帮助他们从这些数据中准确地识别出具有重要功能的基因区域,为后续的基因功能研究、疾病诊断和治疗等提供关键的信息支持。
-
蛋白质二级结构预测:蛋白质的二级结构包括 α - 螺旋、β - 折叠等,其结构对于理解蛋白质的功能至关重要。根据蛋白质的氨基酸序列预测其二级结构时,维特比算法将不同的二级结构单元作为隐藏状态,氨基酸序列作为观测序列。依据氨基酸之间的物理化学性质和相互作用确定状态转移概率和观测概率。例如,某些氨基酸之间容易形成氢键,这会影响它们形成特定二级结构的倾向。对于一段特定的氨基酸序列,维特比算法会综合考虑这些因素,计算出最可能形成的二级结构组合,如哪些区域形成 α - 螺旋,哪些区域形成 β - 折叠,从而帮助研究人员深入了解蛋白质的折叠机制和功能,为药物研发、蛋白质工程等领域提供重要的理论依据。
其他领域
-
故障诊断:在工业设备的故障诊断中,将设备的不同运行状态(正常运行、轻微故障、严重故障等)作为隐藏状态,设备的各种监测数据(如温度、压力、振动、电流等)作为观测序列。维特比算法根据设备正常运行和故障状态之间的转移概率以及监测数据与状态的对应概率,从监测数据序列中推断出设备最可能经历的状态变化路径。例如,对于一台大型燃气轮机,当监测到其振动值逐渐增大、温度异常升高时,维特比算法可以结合这些数据与不同故障状态的关联概率,判断出燃气轮机是否存在故障以及故障发展的路径,如是否从叶片轻微磨损逐渐发展到严重的机械故障,从而帮助维护人员提前采取措施,避免设备的严重损坏,提高设备的可靠性和运行效率。
-
金融风险评估:在金融市场分析中,将市场的不同状态(如上涨、下跌、平稳等)作为隐藏状态,各种经济指标(如 GDP 增长率、通货膨胀率、利率等)、市场交易数据(如股票价格、成交量、汇率等)作为观测序列。维特比算法根据市场状态之间的转移概率和观测数据与市场状态的对应概率,来推断市场最可能的状态变化序列。例如,当 GDP 增长率下降、通货膨胀率上升时,结合历史数据中这些经济指标与市场状态的关系,维特比算法可以分析出市场在未来一段时间内最可能的状态演变过程,帮助投资者判断市场趋势,评估投资风险,制定合理的投资策略。比如,投资者可以根据维特比算法的分析结果,在市场可能下跌时减少股票投资,增加债券等稳健型资产的配置,以降低投资风险,实现资产的保值增值。
六、总结
维特比算法以其强大的功能和广泛的适用性,在众多领域发挥着不可替代的作用。随着技术的不断发展和数据量的不断增长,相信它将在更多领域展现出独特的价值,为解决复杂问题提供高效的解决方案。未来,维特比算法可能会与其他先进技术(如深度学习、量子计算等)相结合,进一步拓展其应用范围和提升性能,为我们的生活和社会发展带来更多的惊喜和变革。
相关文章:

解锁维特比算法:探寻复杂系统的最优解密码
引言 在复杂的技术世界中,维特比算法以其独特的魅力和广泛的应用,成为通信、自然语言处理、生物信息学等领域的关键技术。今天,让我们一同深入探索维特比算法的奥秘。 一、维特比算法的诞生背景 维特比算法由安德鲁・维特比在 1967 年提出…...
计算机网络一点事(20)
IEEE802.11 无线局域网 分类有无基础设施 星型拓扑,基本服务集BSS一基站多移动站,服务集标识符SSID不超过32b,可接入802.3 漫游:移动站从一个基本服务集切换到另一个(类似换联WiFi) 802.11帧࿱…...

java求职学习day23
MySQL 单表 & 约束 & 事务 1. DQL操作单表 1.1 创建数据库,复制表 1) 创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8; 2) 将 db1 数据库中的 emp 表 复制到当前 db2 数据库 1.2 排序 通过 ORDER BY 子句 , 可以将查询出的结果进行排序 ( 排序只…...

Vue-cli 脚手架搭建
安装node.js 官网下载node.js安装包,地址:Node.js — Download Node.js 先在node.js即将要安装的路径下创建两个文件夹:node_cache(缓存)、node_global(全局) 点击安装包…...

认识小程序的基本组成结构
1.基本组成结构 2.页面的组成部分 3.json配置文件 4.app.json文件(全局配置文件) 5.project.config.json文件 6.sitemap.json文件 7.页面的.json配置文件 通过window节点可以控制小程序的外观...

Spring Boot 热部署实现指南
在开发 Spring Bot 项目时,热部署功能能够显著提升开发效率,让开发者无需频繁重启服务器就能看到代码修改后的效果。下面为大家详细介绍一种实现 Spring Boot 热部署的方法,同时也欢迎大家补充其他实现形式。 步骤一、开启 IDEA 自动编译功能…...

深度学习编译器的演进:从计算图到跨硬件部署的自动化之路
第一章 问题的诞生——深度学习部署的硬件困境 1.1 计算图的理想化抽象 什么是计算图? 想象你正在组装乐高积木。每个积木块代表一个数学运算(如加法、乘法),积木之间的连接代表数据流动。深度学习框架正是用这种"积木拼接…...
【数据结构】_顺序表经典算法OJ(力扣版)
目录 1. 移除元素 1.1 题目描述及链接 1.2 解题思路 1.3 程序 2. 合并两个有序数组 1.1 原题链接及题目描述 1.2 解题思路 1.3 程序 1. 移除元素 1.1 题目描述及链接 原题链接:27. 移除元素 - 力扣(LeetCode) 题目描述:…...

数据结构:队列篇
图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 文章目录 系列文章目录前言一.队列的概念和结构1.1概念一、动态内存管理优势二、操作效率与安全性…...
第05章 17 Contour 过滤器介绍与例子
vtkContourFilter 是 VTK(Visualization Toolkit)中的一个关键类,用于从输入数据生成等值线或等值面。它是基于阈值的过滤器,可以从标量字段中提取等值线或等值面。vtkContourFilter 的核心功能是根据用户指定的值生成等值线或等值…...

【落羽的落羽 数据结构篇】顺序表
文章目录 一、线性表二、顺序表1. 概念与分类2. 准备工作3. 静态顺序表4. 动态顺序表4.1 定义顺序表结构4.2 顺序表的初始化4.3 检查空间是否足够4.3 尾部插入数据4.4 头部插入数据4.5 尾部删除数据4.6 头部删除数据4.7 在指定位置插入数据4.8 在指定位置删除数据4.9 顺序表的销…...

AI编程:如何编写提示词
这是小卷对AI编程工具学习的第2篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是两条提示词的对…...

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
近年来,人工智能(AI)领域发展迅猛,大语言模型(LLMs)为通用人工智能(AGI)的发展开辟了道路。OpenAI 的 o1 模型表现非凡,它引入的创新性推理时缩放技术显著提升了推理能力…...
高阶C语言|深入理解字符串函数和内存函数
文章目录 前言1.求字符串长度1.1 字符串长度函数:strlen模拟实现 2.长度不受限制的字符串函数2.1 字符串拷贝函数:strcpy模拟实现 2.2 字符串连接函数:strcat模拟实现 2.3 字符串比较函数:strcmp模拟实现 3.长度受限制的字符串函数…...
UE学习日志#17 C++笔记#3 基础复习3
19.2 [[maybe_unused]] 禁止编译器在未使用某些内容时发出警告 19.3 [[noreturn]] 永远不会把控制权返回给调用点 19.4 [[deprecated]] 标记为已弃用,仍然可以使用但是不鼓励使用 可以加参数表示弃用的原因[[deprecated("")]] 19.5 [[likely]]和[[un…...

团体程序设计天梯赛-练习集——L1-028 判断素数
前言 一道10分的题目,相对来说比较简单,思考的时候要仔细且活跃,有时候在写代码的时候一些代码的出现很多余,并且会影响最后的结果 L1-028 判断素数 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆,圆弧和椭圆 继续我们的…...

创新创业计划书|建筑垃圾资源化回收
目录 第1部分 公司概况........................................................................ 1 第2部分 产品/服务...................................................................... 3 第3部分 研究与开发.................................................…...

反射、枚举以及lambda表达式
一.反射 1.概念:Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么&am…...

ROS应用之IMU碰撞检测与接触事件识别
前言 碰撞检测与接触事件识别是机器人与环境交互中的重要任务,尤其是在复杂的动态环境中。IMU(惯性测量单元)作为一种高频率、低延迟的传感器,因其能够检测加速度、角速度等动态变化而成为实现碰撞检测的核心手段之一。结合先进的…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...