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

news2025/3/10 5:57:24

介绍

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

最大期望值算法,英文简称为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
        # 初始化均值数组,初始值为None
        self.mean_values = None
        # 初始化标准差数组,初始值为None
        self.std_deviations = None
        # 初始化权重数组,初始值为None
        self.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)
        # 初始化标准差数组,每个分量的标准差初始值为1
        self.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.coloradmin.cn/o/2312517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python绘制数据分析中经典的图形--列线图

Python绘制数据分析中经典的图形–列线图 列线图是数据分析中的经典图形&#xff0c;通过背后精妙的算法设计&#xff0c;展示线性模型&#xff08;logistic regression 和Cox&#xff09;中各个变量对于预测结果的总体贡献&#xff08;线段长短&#xff09;&#xff0c;另外&…

11. 盛最多水的容器(力扣)

11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不…

vue3 vite或者vue2 百度地图(卫星图)离线使用详细讲解

1、在Windows上下载瓦片&#xff0c;使用的工具为: 全能电子地图下载器3.0最新版&#xff08;推荐&#xff09; 下载后解压&#xff0c;然后进入目录"全能电子地图下载器3.0最新版&#xff08;推荐&#xff09;\全能电子地图下载器3.0\MapTileDownloader" 在这个目录…

大语言模型从理论到实践(第二版)-学习笔记(绪论)

大语言模型的基本概念 1.理解语言是人工智能算法获取知识的前提 2.语言模型的目标就是对自然语言的概率分布建模 3.词汇表 V 上的语言模型&#xff0c;由函数 P(w1w2 wm) 表示&#xff0c;可以形式化地构建为词序列 w1w2 wm 的概率分布&#xff0c;表示词序列 w1w2 wm…

Unity 通用UI界面逻辑总结

概述 在游戏开发中&#xff0c;常常会遇到一些通用的界面逻辑&#xff0c;它不论在什么类型的游戏中都会出现。为了避免重复造轮子&#xff0c;本文总结并提供了一些常用UI界面的实现逻辑。希望可以帮助大家快速开发通用界面模块&#xff0c;也可以在次基础上进行扩展修改&…

Navigation的进阶知识与拦截器配置

Navigation的进阶知识与拦截器配置 写的不是很详细&#xff0c;后续有时间会补充&#xff0c;建议参考官方文档食用 1.如何配置路由信息 1.1 创建工程结构 src/main/ets ├── pages │ └── navigation │ ├── views │ │ ├── Mine.ets //…

Java数据结构第二十一期:解构排序算法的艺术与科学(三)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、常见排序算法的实现 1.1. 归并排序 二、排序算法复杂度及稳定性分析 一、常见排序算法的实现 1.1. 归并排序 归并排序是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法的一个⾮常典型的…

go切片定义和初始化

1.简介 切片是数组的一个引用&#xff0c;因此切片是引用类型&#xff0c;在进行传递时&#xff0c;遵守引用传递的机制。切片的使用和数组类似&#xff0c;遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的&#xff0c;因此切片是一个可以动态变化的数…

【NLP 39、激活函数 ⑤ Swish激活函数】

我的孤独原本是座荒岛&#xff0c;直到你称成潮汐&#xff0c;原来爱是让个体失序的永恒运动 ——25.2.25 Swish激活函数是一种近年来在深度学习中广泛应用的激活函数&#xff0c;由Google Brain团队在2017年提出。其核心设计结合了Sigmoid门控机制和线性输入的乘积&#xff0c…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理&#xff0c;手册分析&#xff0c;驱动程序。初始化&#xff0c;清屏&#xff0c;ASCII字库&#xff0c;显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子&#xff0c;杜…

MySQL语法总结

本篇博客说明&#xff1a; &#xff01;&#xff01;&#xff01;.注意此系列都用的是MySQL语句&#xff0c;和SQLServer&#xff0c;PostgreSQL有些细节上的差别&#xff01;&#xff01;&#xff01; 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

从预测到控制:电力RK3568边缘计算机在电网调度中的全面应用

在智能电网的快速发展中&#xff0c;电力Ubuntu工控机&#xff08;简称“电力工控机”&#xff09;作为核心设备&#xff0c;扮演着不可或缺的角色。特别是在智能电网调度场景中&#xff0c;电力工控机的高效、稳定和智能化特性&#xff0c;为电网的稳定运行和高效管理提供了强…

day-106 统计放置房子的方式数

思路 动态规划&#xff1a;因为中间有街道隔开&#xff0c;所以只需计算一边街道的排列方式&#xff0c;最后计算平方即可 解题过程 动态转换方程&#xff1a;f[i]f[i-1]f[i-2] Code class Solution {int num 1000000007;public int countHousePlacements(int n) {int arr[…

PostgreSQL安装和mcp PostgreSQL

文章目录 一. 安装之后修改权限并登录1. 确保当前用户具有sudo权限2. 修改/etc/postgresql/<版本号>/main/pg_hba.conf配置文件为trust&#xff0c;可以免密登录3. 进行免密登录4. 添加root用户和修改postgres用户密码1. postgres用户密码2. 添加root用户3. 为root用户设…

LPZero: Language Model Zero-cost Proxy Search from Zero(未更新完预览版本)

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

字典树运用

字典树运用 字典树LC208 创建字典树0-1字典树 字典树 字典树又叫 前缀树&#xff0c; 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 LC208 创建字典树 这是一个字符串字典树…

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…

0087.springboot325基于Java的企业OA管理系统的设计与实现+论文

一、系统说明 基于springbootvue的企业OA管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…