自然语言处理:最大期望值算法
介绍
大家好,博主又来给大家分享知识了,今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢?
最大期望值算法,英文简称为EM算法,它的核心思想非常巧妙。它把求解模型参数的过程分成了两个关键步骤,就像一场接力赛,期望(E)步骤和最大化(M)步骤相互配合,不断迭代。在期望步骤中,算法会根据当前模型的参数,对那些隐藏的变量进行 “猜测”,计算出它们的期望值。
打个比方,还是以新闻文章分类为例,在这一步,算法会去计算每篇文章属于各个类别的可能性有多大。然后到了最大化步骤,算法会利用期望步骤得到的结果,想办法调整模型的参数,让模型能更好地拟合数据,就好像是在调整拼图的各个板块,让它们能更完美地拼合在一起。这两个步骤不断重复,模型的参数就会越来越接近最优值,最终达到我们想要的效果。
好了,话不多说,我们直接进入正题。
最大期望值算法
在自然语言处理(NLP)的复杂领域中,处理含有隐变量的数据是一项极具挑战性但又至关重要的任务。最大期望值算法(Expectation-Maximization Algorithm,简称EM算法)作为一种强大的迭代优化算法,为解决这类问题提供了有效的途径。它在文本聚类、主题模型学习、语音识别等多个自然语言处理任务中扮演着关键角色。
基础概念
隐变量
隐变量是指在数据中存在,但无法直接观测或获取到的变量。在自然语言处理的文本聚类任务中,每篇文本具体所属的类别就是隐变量,因为在未完成分类前,这些类别信息是未知的。
由于隐变量的存在,直接运用传统统计方法进行数据分析会面临困难,而最大期望值算法的目标就是在包含隐变量或数据不完整的情况下,寻求模型参数的最优估计。
不完整数据
不完整数据是指数据中部分信息缺失或者隐藏的数据。在自然语言处理场景中,可能表现为文本中某些词汇缺失、句子结构不完整,或者文本的关键属性信息(如作者、创作时间等)未被记录。
在文本分类任务里,如果部分文本的标注信息(如所属类别标签)丢失,那么这些文本数据就是不完整数据。在信息抽取任务中,若某些文本中关键的实体信息(如人物、地点、事件等)未明确给出,也属于不完整数据。这种数据的不完整性会影响数据分析和模型训练的效果,增加了处理的难度。
似然函数
对于一组观测数据,假设它们是从概率分布
中抽取的,其中
是模型的参数。当把
看作固定值,将
视为变量时,
就成为关于
的函数,这个函数就是似然函数,记为
。
似然函数在最大期望值算法中起着关键作用。对于给定的模型和观测数据,似然函数表示在不同参数取值下,观测数据出现的概率。在自然语言处理中,我们希望找到一组模型参数,使得观测到的文本数据的似然值最大。假设我们有观测数据,模型参数为
,隐变量为
,那么似然函数可以表示为
。
在存在隐变量的情况下,我们通常使用联合似然函数,通过对隐变量
进行积分或求和(取决于
是连续变量还是离散变量)来计算
,即
(离散情况)或
(连续情况)。
最大期望值算法就是通过不断优化参数,使得这个似然函数的值最大化。
核心思想
最大期望值算法的核心是通过迭代的方式逐步逼近最优解。它基于概率论和统计学原理,将求解参数的过程分为两个主要步骤:期望(E)步骤和最大化(M)步骤。
在期望步骤中,利用当前估计的模型参数来计算隐变量的期望值;在最大化步骤中,基于期望步骤得到的期望值,最大化似然函数,从而更新模型参数。通过不断重复这两个步骤,使得模型参数逐渐收敛到最优值,以达到最佳的数据拟合效果。
算法流程
初始化模型参数
在算法开始时,需要为模型参数选择一组初始值。这些初始值的选择会影响算法的收敛速度和最终结果,但通常在实际应用中,只要初始值不是特别离谱,算法都能收敛到一个较好的结果。例如在高斯混合模型(GMM)中使用最大期望值算法时,需要初始化每个高斯分布的均值、方差和权重等参数。
期望步骤
E步。根据当前的模型参数(
表示迭代次数),计算隐变量
的条件期望,即
在文本聚类场景中,如果将文档的类别视为隐变量,那么在这一步会计算每个文档属于各个类别的概率。通过这个期望步骤,我们利用当前的模型参数对隐变量进行了“猜测”。
最大化步骤
M步。在期望步骤的基础上,寻找一组新的模型参数,使得
最大化,即
在实际计算中,通常对关于参数
求导,并令导数为0来求解。例如在高斯混合模型中,会根据E步计算出的概率,重新计算每个高斯分布的均值、方差和权重等参数。
判断收敛条件
检查新得到的模型参数与上一次迭代的参数
之间的差异是否满足某个收敛条件。常见的收敛条件可以是参数的变化量小于某个阈值,或者似然函数值的变化量小于某个阈值。如果满足收敛条件,则算法停止迭代;否则,返回E步继续下一轮迭代。
与高斯模型的关系
高斯混合模型是一种概率模型,假定数据由多个高斯分布混合而成。在使用高斯混合模型时,关键任务是估计出每个高斯分布的参数(像均值、标准差)以及每个高斯分布的权重。不过,直接估计这些参数往往颇具难度,尤其是在数据存在隐变量(比如数据点究竟属于哪个高斯分布并不明确)的情形下。
最大期望值算法(EM算法)是一种迭代优化算法,专门用于在存在隐变量时估计模型参数。在高斯混合模型中,EM算法通过不断交替执行E步(期望步)和M步(最大化步),逐步逼近最优的参数估计值,从而实现对高斯混合模型的拟合。
代码实现
接下来我们用代码来演示一下如何使用期望最大化算法(EM 算法)对高斯混合模型(GMM)进行拟合。在代码中,我们主要借助numpy库进行数值计算和数组操作,利用matplotlib库进行图形的绘制和数据的可视化。
完整代码
# 导入numpy库,用于进行数值计算和数组操作
import numpy as np
# 导入matplotlib库,它是一个用于绘制图形和可视化数据的库
import matplotlib# 设置matplotlib的后端为tkAgg,这是一种图形用户界面后端,用于显示图形窗口
matplotlib.use('tkAgg')
# 定义一个字典plot_config,用于设置matplotlib的字体和符号显示配置
plot_config = {# 设置字体族为衬线字体"font.family": 'serif',# 设置数学文本的字体集为stix"mathtext.fontset": 'stix',# 设置衬线字体为宋体"font.serif": 'SimSun',# 解决负号显示问题'axes.unicode_minus': False
}
# 使用update方法将配置字典应用到matplotlib的全局参数中
matplotlib.rcParams.update(plot_config)
# 从matplotlib中导入pyplot子模块,别名plt,用于绘制各种图形
import matplotlib.pyplot as plt# 定义一个名为MaximumExpectedValue的类,用于实现高斯混合模型
class MaximumExpectedValue:# 类的构造函数,用于初始化对象的属性def __init__(self, num_components, max_iter=100, convergence_threshold=1e-6):# 高斯混合模型中高斯分量的数量self.num_components = num_components# 期望最大化算法的最大迭代次数self.max_iter = max_iter# 收敛阈值,用于判断算法是否收敛self.convergence_threshold = convergence_threshold# 初始化均值数组,初始值为Noneself.mean_values = None# 初始化标准差数组,初始值为Noneself.std_deviations = None# 初始化权重数组,初始值为Noneself.weights = None# 定义高斯概率密度函数,用于计算给定输入值在指定均值和标准差下的概率密度def gaussian_probability_density_function(self, input_value, mean_value, standard_deviation):# 根据高斯概率密度函数的公式进行计算并返回结果return (1.0 / (np.sqrt(2 * np.pi * standard_deviation ** 2))) * np.exp(-(input_value - mean_value) ** 2 / (2 * standard_deviation ** 2))# 定义期望最大化算法的实现方法def expectation_maximization_algorithm(self, sample_data):# 获取样本数据的数量sample_size = len(sample_data)# 初始化参数# 从样本数据中随机选择num_components个值作为初始均值self.mean_values = np.random.choice(sample_data, self.num_components)# 初始化标准差数组,每个分量的标准差初始值为1self.std_deviations = np.ones(self.num_components)# 初始化权重数组,每个分量的权重初始值相等self.weights = np.ones(self.num_components) / self.num_components# 开始迭代,最多迭代max_iter次for _ in range(self.max_iter):# E步:计算每个样本属于每个高斯分量的责任度membership_responsibilities = np.zeros((sample_size, self.num_components))# 遍历每个样本for i in range(sample_size):# 遍历每个高斯分量for j in range(self.num_components):# 计算样本i属于高斯分量j的未归一化责任度membership_responsibilities[i, j] = self.weights[j] * self.gaussian_probability_density_function(sample_data[i], self.mean_values[j], self.std_deviations[j])# 对样本i属于各个高斯分量的责任度进行归一化membership_responsibilities[i] /= membership_responsibilities[i].sum()# M步:更新模型的参数# 计算每个高斯分量的责任度总和component_sums = membership_responsibilities.sum(axis=0)# 更新每个高斯分量的权重self.weights = component_sums / sample_size# 遍历每个高斯分量for j in range(self.num_components):# 更新高斯分量j的均值self.mean_values[j] = np.sum(membership_responsibilities[:, j] * sample_data) / component_sums[j]# 更新高斯分量j的标准差self.std_deviations[j] = np.sqrt(np.sum(membership_responsibilities[:, j] * (sample_data - self.mean_values[j]) ** 2) /component_sums[j])# 判断收敛# 复制当前的均值数组new_mean_values = np.copy(self.mean_values)# 复制当前的标准差数组new_std_deviations = np.copy(self.std_deviations)# 复制当前的权重数组new_weights = np.copy(self.weights)# 计算新均值和旧均值之间的差异mean_diff = np.linalg.norm(new_mean_values - self.mean_values)# 计算新标准差和旧标准差之间的差异std_dev_diff = np.linalg.norm(new_std_deviations - self.std_deviations)# 计算新权重和旧权重之间的差异weight_diff = np.linalg.norm(new_weights - self.weights)# 如果所有差异都小于收敛阈值,则认为算法收敛,跳出循环if mean_diff < self.convergence_threshold and std_dev_diff < self.convergence_threshold and weight_diff < self.convergence_threshold:break# 返回估计的均值、标准差和权重return self.mean_values, self.std_deviations, self.weights# 定义可视化方法,用于将拟合结果进行可视化展示def visualize(self, sample_data):# 创建一个新的图形窗口,设置窗口大小为10x6英寸plt.figure(figsize=(10, 6))# 绘制数据的直方图plt.hist(sample_data, bins=30, density=True, alpha=0.6, color='g', label='数据直方图')# 生成用于绘制概率密度函数的x轴值x_axis_values = np.linspace(np.min(sample_data) - 1, np.max(sample_data) + 1, 1000)# 遍历每个高斯分量for j in range(self.num_components):# 绘制每个高斯分量的概率密度函数plt.plot(x_axis_values,self.weights[j] * self.gaussian_probability_density_function(x_axis_values, self.mean_values[j],self.std_deviations[j]),label=f'高斯(分布) {j + 1}')# 初始化总的高斯混合模型的概率密度数组total_gmm_density = np.zeros_like(x_axis_values)# 遍历每个高斯分量for j in range(self.num_components):# 累加每个高斯分量的概率密度函数得到总的高斯混合模型的概率密度total_gmm_density += self.weights[j] * self.gaussian_probability_density_function(x_axis_values,self.mean_values[j],self.std_deviations[j])# 绘制总的高斯混合模型的概率密度函数,用红色虚线表示plt.plot(x_axis_values, total_gmm_density, 'r--', label='高斯混合模型')# 设置图形的标题plt.title('高斯混合模型拟合')# 设置x轴的标签plt.xlabel('数据')# 设置y轴的标签plt.ylabel('密度')# 显示图例plt.legend()# 显示图形plt.show()# 当脚本作为主程序运行时执行以下代码
if __name__ == "__main__":# 设置随机数种子,确保结果可复现np.random.seed(0)# 生成样本数据,由两个不同均值和标准差的正态分布样本拼接而成sample_data = np.concatenate([np.random.normal(0, 1, 50), np.random.normal(5, 1, 50)])# 设置高斯混合模型中高斯分量的数量num_components = 2# 创建MaximumExpectedValue类的实例maximum_expected_value = MaximumExpectedValue(num_components)# 调用期望最大化算法进行参数估计mean_values, std_deviations, weights = maximum_expected_value.expectation_maximization_algorithm(sample_data)# 打印估计的均值print(f"估计的均值: {mean_values}")# 打印估计的标准差print(f"估计的标准差: {std_deviations}")# 打印估计的权重print(f"估计的权重: {weights}")# 调用可视化方法展示拟合结果maximum_expected_value.visualize(sample_data)
运行结果
估计的均值: [0.1163709 4.94665325]
估计的标准差: [1.10985417 0.91259302]
估计的权重: [0.49414197 0.50585803]进程已结束,退出代码为 0
这段代码主要实现了使用期望最大化(EM)算法拟合高斯混合模型(GMM)并进行可视化的功能。导入numpy用于数值计算,导入matplotlib并配置其绘图相关设置。
gaussian_probability_density_function方法计算高斯概率密度,expectation_maximization_algorithm方法实现EM算法,通过E步计算样本责任度、M步更新模型参数并判断收敛,visualize方法绘制数据直方图及模型概率密度函数曲线以可视化拟合结果。
这段代码其实在对复杂数据分布建模、进行聚类分析与异常检测方面有着重要作用,且可视化有助于理解数据和模型。希望此段代码能给大家在实际项目中作参考。
算法优点
- 广泛适用性:最大期望值算法不依赖于数据的具体分布形式,适用于各种含有隐变量的模型,无论是在自然语言处理、计算机视觉还是其他领域,只要存在隐变量的问题,都可以尝试使用该算法求解。
- 原理简单且易于实现:算法的核心思想是基于期望和最大化两个基本步骤的迭代,原理相对直观,实现起来也并不复杂。通过不断重复这两个步骤,就能够逐步逼近最优解,这种迭代的方式使得算法在实际应用中具有很高的可操作性。
- 收敛性有理论保障:在一定的条件下,最大期望值算法能够保证收敛到局部最优解。虽然不能保证收敛到全局最优解,但在许多实际问题中,局部最优解已经能够满足需求。而且,通过多次随机初始化参数并运行算法,可以在一定程度上提高找到更优解的概率。
算法缺点
- 容易陷入局部最优解:由于算法是基于迭代的方式逐步优化参数,很容易受到初始值的影响而陷入局部最优解。不同的初始值可能导致最终得到的结果差异很大,在复杂的模型和数据情况下,找到全局最优解变得非常困难。
- 计算复杂度较高:在每次迭代的E步和M步中,都需要对所有数据进行计算。当数据量非常大时,计算隐变量的期望值以及最大化似然函数的计算量会显著增加,导致算法的运行时间变长,计算效率较低。
- 对模型的依赖性强:最大期望值算法的性能很大程度上依赖于所选择的模型。如果模型本身不能很好地拟合数据,即使算法收敛,得到的结果也可能不理想。而且,在选择模型时,需要对数据有一定的先验知识,否则可能选择不合适的模型,影响算法效果。
结论赋能
最大期望值算法作为自然语言处理中处理隐变量问题的重要工具,凭借其广泛的适用性、简单的原理和有保障的收敛性,在众多任务中发挥着不可或缺的作用。它为我们解决自然语言处理中复杂的数据问题提供了有效的方法,帮助我们从含有隐变量的文本数据中挖掘出有价值的信息。
然而,其容易陷入局部最优解、计算复杂度高以及对模型依赖性强的缺点也限制了它在一些场景中的应用。在实际使用中,需要根据具体的自然语言处理任务和数据特点,谨慎选择是否使用最大期望值算法。可以通过合理选择初始值、结合其他优化算法或者对数据进行预处理等方式来弥补其不足,以更好地实现自然语言处理的目标。
结束
好了,以上就是本次分享的全部内容,希望大家对最大期望值算法有了更多的认识。从它的基础概念,像隐变量、不完整数据以及似然函数,到核心思想的期望和最大化两个步骤的配合,再到具体的算法流程、与高斯模型的紧密联系,还有实际的代码实现,以及对其优缺点的深入分析,我们层层递进,深入探索了这个在自然语言处理中极为重要的算法。
回顾一下,最大期望值算法为我们处理自然语言处理中那些含有隐变量的数据提供了一种有效的途径。它通过不断迭代期望步骤和最大化步骤,逐渐优化模型参数,让模型能更好地拟合数据。就像我们代码中展示的,在拟合高斯混合模型时,它能准确地估计出每个高斯分布的参数,并且通过可视化让我们直观地看到模型与数据的拟合效果。
希望大家在今后的学习和实践中,如果遇到自然语言处理中涉及隐变量的问题,能够想到最大期望值算法这个有力的工具。同时,也不要局限于此,要结合其他方法,充分发挥它的优势,克服其不足,从而更好地解决实际问题。
那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。
相关文章:
自然语言处理:最大期望值算法
介绍 大家好,博主又来给大家分享知识了,今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢? 最大期望值算法,英文简称为EM算法,它的核心思想非常巧妙。它把求解模型参数的过程分成…...
leetcode-sql数据库面试题冲刺(高频SQL五十题)
题目: 197.上升的温度 表: Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate …...
开发者社区测试报告(功能测试+性能测试)
功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代,编程已经成为一项核心技能,越来越多的人开始学习编程,以适应快速变化的科技 环境。基于这一需求,我设计开发了一个类似博客的论坛系统,专注于方便程序员…...
环形链表问题的探究与代码实现
在数据结构与算法的学习中,环形链表是一个经典的问题。它不仅考察对链表这种数据结构的理解,还涉及到指针操作和逻辑推理。本文将结合代码和图文,深入分析如何判断链表中是否有环以及如何找到环的入口点。 目录 一、判断链表中是否有环 …...
【C++】vector(下):vector类的模拟实现(含迭代器失效问题)
文章目录 前言一、vector类的常用接口的模拟实现1.头文件(my vector.h)整体框架2.模拟实现vector类对象的常见构造3.模拟实现vector iterator4.模拟实现vector类对象的容量操作5.模拟实现vector类对象的访问6.模拟实现vector类对象的修改操作 二、vector…...
NLTK和jieba
NLTK与jieba概述 自然语言处理(NLP)领域是计算机科学领域与人工智能领域中的一个重要方向,主要研究方向是实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 在自然语言处理领域中,文本类型的数据占据着很大的市场&a…...
Java后端高频面经——计算机网络
TCP/IP四层模型?输入一个网址后发生了什么,以百度为例?(美团) (1)四层模型 应用层:支持 HTTP、SMTP 等最终用户进程传输层:处理主机到主机的通信(TCP、UDP&am…...
CSDN博客:Markdown编辑语法教程总结教程(中)
❤个人主页:折枝寄北的博客 Markdown编辑语法教程总结 前言1. 列表1.1 无序列表1.2 有序列表1.3 待办事项列表1.4 自定义列表 2. 图片2.1 直接插入图片2.2 插入带尺寸的图片2.3 插入宽度确定,高度等比例的图片2.4 插入高度确定宽度等比例的图片2.5 插入居…...
Springboot redis bitMap实现用户签到以及统计,保姆级教程
项目架构,这是作为demo展示使用: Redis config: package com.zy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…...
AI Agent系列(一) - Agent概述
AI Agent系列【一】 前言一、AI代理的特点二、 AI Agent的技术框架三、 开源自主代理 前言 AI Agent,即人工智能代理,一般直接叫做智能体 百度百科给AI Agent定义为: “以大语言模型为大脑驱动的系统,具备自主理解、感知、规划、…...
Scala 中trait的线性化规则(Linearization Rule)和 super 的调用行为
在 Scala 中,特质(Trait)是一种强大的工具,用于实现代码的复用和组合。当一个类混入(with)多个特质时,可能会出现方法冲突的情况。为了解决这种冲突,Scala 引入了最右优先原则&#…...
【Linux系统编程】初识系统编程
目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理(Process Management)2. 内存管理(Memory Management)3. 文…...
Unsloth - 动态 4 bit 量化
文章目录 💔 量化可能会破坏模型🦙 Llama 3.2 Vision 细节Pixtral (12B) 视觉🦙 Llama 3.2 (90B) 视觉指令 本文翻译自:Unsloth - Dynamic 4-bit Quantization (2024年12月4日 Daniel & Michael https://unsloth.…...
技术领域,有许多优秀的博客和网站
在技术领域,有许多优秀的博客和网站为开发者、工程师和技术爱好者提供了丰富的学习资源和行业动态。以下是一些常用的技术博客和网站,涵盖了编程、软件开发、数据科学、人工智能、网络安全等多个领域: 1. 综合技术博客 1.1 Medium 网址: ht…...
黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 针对人像、静物以及户外旅拍照片,运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具,如基本参数调整、HSL(色相、饱和度、明亮度)调整、曲线工具等改变照片原本的色彩、明度、对比度等属性,将…...
Manus 与鸿蒙 Next 深度融合:构建下一代空间计算生态
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 文章目录 一、技术融合背景与意义1.1 技术栈协同优势1.2 典型应用场景 二、系统架构设计2.1 整体架构图…...
并查集模板
注意理解路径压缩 static class UnionFind {int[] fa;public UnionFind(int n) {fa new int[n];for (int i 0; i < n; i) {fa[i] i;}}public int find(int i) {if (fa[i] ! i) {fa[i] find(fa[i]);}return fa[i];}public void union(int i, int j) {int fai find(i);in…...
推流项目的ffmpeg配置和流程重点总结一下
ffmpeg的初始化配置,在合成工作都是根据这个ffmpeg的配置来做的,是和成ts流还是flv,是推动远端还是保存到本地, FFmpeg 的核心数据结构,负责协调编码、封装和写入操作。它相当于推流的“总指挥”。 先来看一下ffmpeg的…...
使用 Python 开发的简单招聘信息采集系统
以下是一个使用 Python 开发的简单招聘信息采集系统,它包含用户登录、招聘信息收集和前后端交互的基本功能。我们将使用 Flask 作为后端框架,HTML 作为前端页面。 项目结构 recruitment_system/ ├── app.py ├── templates/ │ ├── login.html │ ├── index…...
Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】
就是在写动态爬虫爬取数据的过程中,如果用selenium的话,有一个缺点,就是当我们去测试一个网站能不能爬取,它都会重新换端口打开一个浏览器,不会使用上一次使用的浏览器,在实际使用过程中这样调试很烦&#…...
Android MVI架构模式详解
MVI概念 MVI(Model-View-Intent)是一种Android应用架构模式,旨在通过单向数据流和不可变性来简化应用的状态管理。MVI的核心思想是将用户操作、状态更新和界面渲染分离,确保应用的状态可预测且易于调试。 MVI的核心组件 Model&a…...
低代码开发直聘管理系统
低代码 DeepSeek 组合的方式开发直聘管理系统,兼职是开挂的存在。整个管理后台系统 小程序端接口的输出,只花了两个星期不到。 一、技术栈 后端:SpringBoot mybatis MySQL Redis 前端:Vue elementui 二、整体效果 三、表结…...
LVGL开发说明
准备工作 LVGL图形化工具:Gui-Guider-Setup-1.8.0-GA.exeLVGL库:lvgl-release-v8.3屏幕触摸驱动:CST816屏幕驱动:ST7789屏幕尺寸:320 * 170 触发事件 按键的点击事件 添加点击事件 触摸屏点击对应的按键后就会触发回…...
推荐优秀的开源软件合集
在信息化高度发达的今天,数据安全与远程协作变得越来越重要。很多企业和个人都在寻找可替代商业闭源软件的开源解决方案。今天,我们向大家推荐几款优秀的开源软件,涵盖私有云存储、远程桌面、团队协作、内容管理等多个领域。 1. Nextcloud —…...
代码随想录刷题day41|(二叉树篇)二叉树的最大深度(递归)
目录 一、二叉树理论基础 二、二叉树的深度和高度 三、递归和迭代思路 3.1 递归法 3.2 迭代法 四、相关算法题目 五、总结 一、二叉树理论基础 详见:代码随想录刷题day34|(二叉树篇)二叉树的递归遍历-CSDN博客 二、二叉树的深度和高…...
向量内积(点乘)和外积(叉乘)
文章目录 1. 向量的内积(点积)1.1 定义1.2 几何意义表征两个向量的投影关系计算向量夹角的余弦值 1.3 重要性质1.4 应用场景 2. 向量的外积(叉积)2.1 定义(仅适用于三维空间)2.2 几何意义2.3 重要性质2.4 应…...
PDF转JPG(并去除多余的白边)
首先,手动下载一个软件(poppler for Windows),下载地址:https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误: PDFInfoNotInstalledError: Unable to get pag…...
【无人机路径规划】基于麻雀搜索算法(SSA)的无人机路径规划(Matlab)
效果一览 代码获取私信博主基于麻雀搜索算法(SSA)的无人机路径规划(Matlab) 一、算法背景与核心思想 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种受麻雀群体觅食行为启发的元启发式算法࿰…...
2020CVPR-SiamBAN:用于视觉跟踪的Siamese框自适应网络
原文标题:Siamese Box Adaptive Network for Visual Tracking 中文标题:用于视觉跟踪的Siamese框自适应网络 代码地址: GitHub - hqucv/siamban: Siamese Box Adaptive Network for Visual Tracking Abstract 大多数现有的跟踪器通常依靠多尺…...
带你从入门到精通——自然语言处理(五. 自注意力机制和transformer的输入部分)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下: 带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客 带你从入门到精通——自然语言处理(二…...
MySql自动安装脚本
一、脚本安装流程 1. 添加MySQL的Repository 使用wget命令从MySQL官方网站下载Yum Repository的RPM包。使用rpm -ivh命令安装下载的RPM包,以添加MySQL的Yum Repository。 2. 安装mysql-community-server 使用yum install -y mysql-community-server --nogpgchec…...
3.9【Q】csd
在计算机存储领域,CSD是什么? 基于CXL™-Type3 实现内存池化 CPU访问内存的瓶颈是什么?具体矛盾是什么? 计算型存储-2:标准、API实现 NUMA是什么?详细解释一下它的核心思想?...
Qt常用控件之表格QTableWidget
表格QTableWidget QTableWidget 是一个表格控件,行和列交汇形成的每个单元格,是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个: 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…...
数据库批处理
数据库批处理是一种处理数据的方法,通常用于对大量数据进行一次性操作。批处理可以有效地减少数据库操作的次数,提高数据处理的效率。在数据库中,批处理通常通过编写批处理脚本或使用相应的工具来实现。 一般情况下,数据库批处理…...
Flask 框架简介
Flask 框架简介 Flask 框架简介 Flask 框架简介 Flask 是一个 Python 微型网页开发框架。微型指明了 Flash 的核心是轻量级的,但是可以灵活扩展。下面的简单的例子要和一个数据库系统交互。Django附带了与最常见的数据库交互所需的库。另一方面,Flask允…...
KMP 算法的 C 语言实现
# include <stdio.h> # include <stdlib.h> # include <string.h>// 打印 KMP 匹配结果. void ColorPrint(char *T, int *result, int result_size, int m) {int green_size strlen("\x1b[31m");int reset_size strlen("\x1b[0m");cha…...
深入理解 TCP 协议:可靠传输、连接管理与经典面试题解析
TCP(Transmission Control Protocol)是互联网中最重要的传输层协议之一,其设计目标是提供可靠的、面向连接的、全双工的数据传输服务。本文将从核心机制、工作原理到经典面试题,全面解析 TCP 协议的关键特性。 一、TCP 核心特性 …...
雪花算法
雪花算法(Snowflake) 雪花算法是一种由Twitter开源的分布式ID生成算法,广泛应用于分布式系统中,用于生成全局唯一的ID。这些ID不仅具有唯一性,还按照时间顺序递增,便于排序和查询。以下是雪花算法的详细解…...
coding ability 展开第二幕(双指针——巩固篇)超详细!!!!
文章目录 前言有效的三角形个数思路 查找总价格为目标值的两个商品思路 两数之和思路 三数之和思路 四数之和思路 总结 前言 本专栏的上篇,讲述了双指针的一些基础的算法习题 今天我们来学习更进一步的双指针用法吧 其实也是大相径庭,和前面的差不多&…...
系统安全阶段练习真题(高软44)
系列文章目录 系统安全阶段练习真题 文章目录 系列文章目录前言一、真题总结 前言 本节就是系统安全的阶段练习真题,带答案与解析。 一、真题 总结 就是高软笔记,大佬请略过!...
Mybatis Generator 使用手册
第一章 什么是Mybatis Generator? MyBatis Generator Core – Introduction to MyBatis Generator MyBatis生成器(MBG)是MyBatis框架的代码生成工具。它支持为所有版本的MyBatis生成代码,通过解析数据库表(或多个表&…...
Android中AIDL和HIDL的区别
在Android中,AIDL(Android Interface Definition Language) 和 HIDL(HAL Interface Definition Language) 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC(进程间通信࿰…...
Gazebo 启动时候配置物体
1. 准备模型 mkdir -p ~/.gazebo/models/table echo export GAZEBO_MODEL_PATH$HOME/.gazebo/models:$GAZEBO_MODEL_PATH >> ~/.bashrc source ~/.bashrc # 从https://github.com/osrf/gazebo_models下载模型 # 桌子 cd ~/.gazebo/models/table wget https://raw.github…...
展示深拷贝与移动语义的对比
定义 Buffer 类(含深拷贝和移动语义) #include <iostream> #include <chrono> #include <cstring>class Buffer { public:// 默认构造函数(分配内存)explicit Buffer(size_t size) : size_(size), data_(new in…...
STM32基础教程——对射式红外传感器计数实验
前言 对射式红外传感器介绍 对射式红外传感器是一种非接触式的距离检测器,主要由发射器和接收器两部分组成。发射器发出特定波长的红外光束,当物体阻挡了这条光束时,接收器无法接收到光线信号,从而产生一个开关信号来判断物体的存…...
Git与GitHub:理解两者差异及其关系
目录 Git与GitHub:理解两者差异及其关系Git:分布式版本控制系统概述主要特点 GitHub:基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub:理解两者差异及其关系 Git:分布式版本控…...
【时时三省】(C语言基础)赋值语句2
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 赋值运算符 赋值符号“”就是赋值运算符,它的作用是将一个数据赋给一个变量。如a 3的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以…...
服务器上通过ollama部署deepseek
2025年1月下旬,DeepSeek的R1模型发布后的一周内就火了,性能比肩OpenAI的o1模型,且训练成本仅为560万美元,成本远低于openAI,使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...
自动控制原理【知识点总结、复习笔记】
1.控制系统定义 控制系统是指通过监测和调整系统的行为,以达到预期目标的一套系统。它由一组相互关联的组件组成,这些组件协同工作,用于控制物理过程、机械设备、电子设备或其他系统。例如,一个简单的温控系统可以通过监测房间温…...
【AI】什么是Embedding向量模型?我们应该如何选择?
我们之前讲的搭建本地知识库,基本都是使用检索增强生成(RAG)技术来搭建,Embedding模型则是RAG的核心,同时也是大模型落地必不可少的技术。那么今天我们就来聊聊Embedding向量模型: 一、Embedding模型是什么? Embedding模型是一种将离散数据(如文本、图像、用户行为等)…...