自然语言处理:最大期望值算法

介绍

大家好,博主又来给大家分享知识了,今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢?

最大期望值算法,英文简称为EM算法,它的核心思想非常巧妙。它把求解模型参数的过程分成了两个关键步骤,就像一场接力赛,期望(E)步骤最大化(M)步骤相互配合,不断迭代。在期望步骤中,算法会根据当前模型的参数,对那些隐藏的变量进行 “猜测”,计算出它们的期望值。

打个比方,还是以新闻文章分类为例,在这一步,算法会去计算每篇文章属于各个类别的可能性有多大。然后到了最大化步骤,算法会利用期望步骤得到的结果,想办法调整模型的参数,让模型能更好地拟合数据,就好像是在调整拼图的各个板块,让它们能更完美地拼合在一起。这两个步骤不断重复,模型的参数就会越来越接近最优值,最终达到我们想要的效果。

好了,话不多说,我们直接进入正题。

最大期望值算法

自然语言处理(NLP)的复杂领域中,处理含有隐变量的数据是一项极具挑战性但又至关重要的任务。最大期望值算法(Expectation-Maximization Algorithm,简称EM算法)作为一种强大的迭代优化算法,为解决这类问题提供了有效的途径。它在文本聚类、主题模型学习、语音识别等多个自然语言处理任务中扮演着关键角色。

基础概念

隐变量

隐变量是指在数据中存在,但无法直接观测或获取到的变量。在自然语言处理的文本聚类任务中,每篇文本具体所属的类别就是隐变量,因为在未完成分类前,这些类别信息是未知的。

由于隐变量的存在,直接运用传统统计方法进行数据分析会面临困难,而最大期望值算法的目标就是在包含隐变量或数据不完整的情况下,寻求模型参数的最优估计。

不完整数据

不完整数据是指数据中部分信息缺失或者隐藏的数据。在自然语言处理场景中,可能表现为文本中某些词汇缺失、句子结构不完整,或者文本的关键属性信息(如作者、创作时间等)未被记录。

在文本分类任务里,如果部分文本的标注信息(如所属类别标签)丢失,那么这些文本数据就是不完整数据。在信息抽取任务中,若某些文本中关键的实体信息(如人物、地点、事件等)未明确给出,也属于不完整数据。这种数据的不完整性会影响数据分析和模型训练的效果,增加了处理的难度。

似然函数

对于一组观测数据X = \{x_1, x_2, \ldots, x_n\},假设它们是从概率分布P(X|\theta)中抽取的,其中\theta是模型的参数。当把X看作固定值,将\theta视为变量时,P(X|\theta)就成为关于\theta的函数,这个函数就是似然函数,记为L(\theta|X)

似然函数在最大期望值算法中起着关键作用。对于给定的模型和观测数据,似然函数表示在不同参数取值下,观测数据出现的概率。在自然语言处理中,我们希望找到一组模型参数,使得观测到的文本数据的似然值最大。假设我们有观测数据$X$,模型参数为$\theta$,隐变量为$Z$,那么似然函数可以表示为$P(X|\theta)$

在存在隐变量的情况下,我们通常使用联合似然函数$P(X,Z|\theta)$,通过对隐变量$Z$进行积分或求和(取决于$Z$是连续变量还是离散变量)来计算$P(X|\theta)$,即

$P(X|\theta)=\sum_{Z}P(X,Z|\theta)$(离散情况)$P(X|\theta)=\int_{Z}P(X,Z|\theta)dZ$(连续情况)

最大期望值算法就是通过不断优化参数$\theta$,使得这个似然函数的值最大化。

核心思想

最大期望值算法的核心是通过迭代的方式逐步逼近最优解。它基于概率论和统计学原理,将求解参数的过程分为两个主要步骤:期望(E)步骤最大化(M)步骤

期望步骤中,利用当前估计的模型参数来计算隐变量的期望值;在最大化步骤中,基于期望步骤得到的期望值,最大化似然函数,从而更新模型参数。通过不断重复这两个步骤,使得模型参数逐渐收敛到最优值,以达到最佳的数据拟合效果。

算法流程

初始化模型参数

在算法开始时,需要为模型参数选择一组初始值。这些初始值的选择会影响算法的收敛速度和最终结果,但通常在实际应用中,只要初始值不是特别离谱,算法都能收敛到一个较好的结果。例如在高斯混合模型(GMM)中使用最大期望值算法时,需要初始化每个高斯分布的均值、方差和权重等参数。

期望步骤

E步。根据当前的模型参数$\theta^{(t)}$($t$表示迭代次数),计算隐变量$Z$的条件期望,即

$Q(\theta,\theta^{(t)}) = E_{Z|X,\theta^{(t)}}[\log P(X,Z|\theta)]$

在文本聚类场景中,如果将文档的类别视为隐变量,那么在这一步会计算每个文档属于各个类别的概率。通过这个期望步骤,我们利用当前的模型参数对隐变量进行了“猜测”

最大化步骤

M步。在期望步骤的基础上,寻找一组新的模型参数$\theta^{(t+1)}$,使得$Q(\theta,\theta^{(t)})$最大化,即$\theta^{(t+1)}=\arg\max_{\theta}Q(\theta,\theta^{(t)})$

在实际计算中,通常对$Q(\theta,\theta^{(t)})$关于参数$\theta$求导,并令导数为0来求解。例如在高斯混合模型中,会根据E步计算出的概率,重新计算每个高斯分布的均值、方差和权重等参数。

判断收敛条件

检查新得到的模型参数$\theta^{(t+1)}$与上一次迭代的参数$\theta^{(t)}$之间的差异是否满足某个收敛条件。常见的收敛条件可以是参数的变化量小于某个阈值,或者似然函数值的变化量小于某个阈值。如果满足收敛条件,则算法停止迭代;否则,返回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步中,都需要对所有数据进行计算。当数据量非常大时,计算隐变量的期望值以及最大化似然函数的计算量会显著增加,导致算法的运行时间变长,计算效率较低。
  • 对模型的依赖性强:最大期望值算法的性能很大程度上依赖于所选择的模型。如果模型本身不能很好地拟合数据,即使算法收敛,得到的结果也可能不理想。而且,在选择模型时,需要对数据有一定的先验知识,否则可能选择不合适的模型,影响算法效果。

结论赋能

最大期望值算法作为自然语言处理中处理隐变量问题的重要工具,凭借其广泛的适用性、简单的原理和有保障的收敛性,在众多任务中发挥着不可或缺的作用。它为我们解决自然语言处理中复杂的数据问题提供了有效的方法,帮助我们从含有隐变量的文本数据中挖掘出有价值的信息。

然而,其容易陷入局部最优解、计算复杂度高以及对模型依赖性强的缺点也限制了它在一些场景中的应用。在实际使用中,需要根据具体的自然语言处理任务和数据特点,谨慎选择是否使用最大期望值算法。可以通过合理选择初始值、结合其他优化算法或者对数据进行预处理等方式来弥补其不足,以更好地实现自然语言处理的目标。

结束

好了,以上就是本次分享的全部内容,希望大家对最大期望值算法有了更多的认识。从它的基础概念,像隐变量、不完整数据以及似然函数,到核心思想的期望和最大化两个步骤的配合,再到具体的算法流程、与高斯模型的紧密联系,还有实际的代码实现,以及对其优缺点的深入分析,我们层层递进,深入探索了这个在自然语言处理中极为重要的算法。

回顾一下,最大期望值算法为我们处理自然语言处理中那些含有隐变量的数据提供了一种有效的途径。它通过不断迭代期望步骤和最大化步骤,逐渐优化模型参数,让模型能更好地拟合数据。就像我们代码中展示的,在拟合高斯混合模型时,它能准确地估计出每个高斯分布的参数,并且通过可视化让我们直观地看到模型与数据的拟合效果。

希望大家在今后的学习和实践中,如果遇到自然语言处理中涉及隐变量的问题,能够想到最大期望值算法这个有力的工具。同时,也不要局限于此,要结合其他方法,充分发挥它的优势,克服其不足,从而更好地解决实际问题。

那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascrip网页设计案例,SuperSlide+bootstrap+html经典组合

概述 JavaScript作为一种强大的脚本语言&#xff0c;在网页设计领域发挥着举足轻重的作用&#xff0c;能够为网页赋予丰富的交互性与动态功能。以下通过具体案例来深入理解其应用。​ 假设要打造一个旅游网站&#xff0c;该网站具备诸多实用功能。在响应式设计方面&#xff0…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…

MySQL创建数据库和表,插入四大名著中的人物

一、登录数据库并创建数据库db_ck 二、创建表t_hero 表属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …

Python项目在 Cursor 编辑器中 Conda 环境配置问题

在开发使用 FastApi 框架的 Python 某项目时&#xff0c;我遇到了一个因为 Conda 环境配置没有起作用的问题。 我是用 Cursor 编辑器开发 FastApi 项目的&#xff0c;项目运行在 Conda 环境blog中&#xff0c; 由于使用了 opencc-python-reimplemented&#xff0c;Python 版本…

Redis客户端

1.前言 前面学习的Redis的基本操作和命令都是在redis命令行手动执行的&#xff0c;更多的时候&#xff0c;是使用redis的API来实现定制化的redis客户端操作redis服务器。接下来我们要了解Redis服务端和客户端的通信协议&#xff0c;以及Java语言的Redis客户端使用方法 Redis服…

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …

Java多线程与高并发专题——什么是阻塞队列?

引入 阻塞队列&#xff08;Blocking Queue&#xff09;是一种线程安全的队列数据结构&#xff0c;它的主要特点是&#xff1a; 线程安全&#xff1a;多个线程可以安全地同时访问队列。阻塞操作&#xff1a;当队列为空时&#xff0c;从队列中获取元素的操作会被阻塞&#xff0…

电路常用常用的定理/定律/计算方法

1、欧姆定理 在恒定温度下&#xff0c;导体中的电流I与导体两端的电压U成正比&#xff0c;与导体的电阻R成反比。 2、基尔霍夫定律 2.1基尔霍夫电流定律&#xff08;KCL&#xff09; 在电路中任何一个节点上&#xff0c;任意时刻&#xff0c;流入节点的电流之和等于流出节点…

unity 让两个物体相遇时候刚体互不影响

解决方案是设定好层级不同&#xff0c;在PlayerSetting中找到物理&#xff0c;有一个图层碰撞矩阵 取消对应 勾选即可 如图

编译Telegram Desktop

目录 一、前言 二、环境准备 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 三、编译 四、总结和学习 一、前言 Telegram 是一款全球广泛使用的即时通讯软件&#xff0c;以其强大的隐私保护、跨平台同步和丰富的功能而闻名。它支持一对一聊天、群组&#xff08;最多20万成员&am…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器&#xff0c;同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势&#xff0c;广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

PCIE接口

PCIE接口 PIC接口介绍PIC总线结构PCI总线特点PCI总线的主要性能PIC的历程 PCIE接口介绍PCIe接口总线位宽PCIE速率GT/s和Gbps区别PCIE带宽计算 PCIE架构PCIe体系结构端到端的差分数据传递PCIe总线的层次结构事务层数据链路层物理层PCIe层级结构及功能框图 PCIe链路初始化PCIe链路…

边缘计算盒子:解决交通拥堵的智能方案

在当今的智能交通系统中&#xff0c;边缘计算盒子&#xff08;Edge Computing Box&#xff09;正逐渐成为不可或缺的核心组件。这种设备通过将计算能力下沉到网络边缘&#xff0c;极大地提升了数据处理的速度和效率&#xff0c;特别适用于实时性要求极高的交通监控场景。本文将…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布&#xff01;此次更新&#xff0c;Easysearch 增加了新的功能和数据类型&#xff0c;包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持&#xff0c;Console 新增了日志查询功能。 INFINI Easyse…

Kotlin从入门到精通:开启高效编程之旅

目录 一、为什么选择 Kotlin 二、Kotlin 基础语法入门​ 2.1 Hello, Kotlin​ 2.2 变量与数据类型​ 2.2.1 可变与不可变变量​ 2.2.2 基本数据类型​ 2.2.3 数组​ 三、Kotlin 流程控制与函数​ 3.1 流程控制语句​ 3.1.1 if 表达式​ 3.1.2 when 表达式​ 3.2 函…

大模型量化技术实践指南:GPTQ、AWQ、BitsandBytes 和 Unsloth

在大模型&#xff08;LLM&#xff09;的时代&#xff0c;我们需要了解量化技术&#xff0c;以便在本地电脑上运行这些模型&#xff0c;因为它们的规模非常庞大。然而&#xff0c;实现量化的方法有很多&#xff0c;这让像我这样的初学者很容易感到困惑。本文介绍了我们必须掌握的…

C51 Proteus仿真实验16:4X4矩阵键盘控制条形LED显示

说明 按下的按键值越大点亮的LED越多 Proteus仿真 注意&#xff1a; K1、K5、K9、K13左边引脚连接的是P1.0 K2、K6、K10、K14左边引脚连接的是P1.1 K3、K7、K11、K15左边引脚连接的是P1.2 K4、K8、K12、K16左边引脚连接的是P1.3 K1、K2、K3、K4右边引脚连接的是P1.4 K5、K6、…

Hive的架构

1. 概念 Hive 是建立在 Hadoop 上的数据仓库工具&#xff0c;旨在简化大规模数据集的查询与管理。它通过类 SQL 语言&#xff08;HiveQL&#xff09;将结构化数据映射为 Hadoop 的 MapReduce&#xff0c;适合离线批处理&#xff0c;尤其适用于数据仓库场景。 2. 数据模型 表&a…