当前位置: 首页 > news >正文

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战(4)——遗传算法详解与实现

    • 0. 前言
    • 1. 遗传算法简介
      • 1.1 遗传学和减数分裂
      • 1.2 类比达尔文进化论
    • 2. 遗传算法的基本流程
      • 2.1 创建初始种群
      • 2.2 计算适应度
      • 2.3 选择、交叉和变异
      • 2.4算法终止条件
    • 3. 使用 Python 实现遗传算法
      • 3.1 构建种群
      • 3.2 评估适应度
      • 3.3 应用选择
      • 3.4 应用交叉
      • 3.5 应用突变
      • 3.6 运行演化过程
    • 小结
    • 系列链接

0. 前言

遗传算法是通过代码模拟生命的过程,借鉴了进化、自然选择和通过基因传递成功特征的理念。算法模拟了高级有机繁殖中的减数分裂,我们不必精通遗传学才能使用遗传算法,但了解遗传学能够帮助我们更好的理解遗传算法。在本节中,我们首先回顾遗传学和减数分裂过程的一些重要概念,旨在为代码模拟遗传理论和减数分裂奠定基础,然后使用 Python 实现遗传算法。

1. 遗传算法简介

1.1 遗传学和减数分裂

遗传算法 (Genetic Algorithms, GA) 模拟了遗传水平上生命的演化。同时,在基因过程(减数分裂)中进行了一些简化。当我们谈论遗传学时,需要从脱氧核糖核酸 (DeoxyriboNucleic Acid, DNA) 开始。DNA 链常被称为生命的蓝图,地球生物的一切组成(包括细胞)都由 DNA 定义。
DNA 本身由四对碱基组成,并排列成不同的复杂模式。下图显示了 DNA 是如何形成并缠绕成双螺旋结构,然后折叠成染色体 (Chromosome) 的,染色体位于每个细胞 (Cell) 的细胞核 (Nucleus ) 中。

细胞结构

基因 (Gene) 可以在 DNA 水平上识别,是一段定义生物特征或属性的 DNA 序列。当前,人类基因组计划已经研究和分类了人类染色体中的所有基因。
染色体是这些基因序列的容器,一个单独的染色体可能包含数百个或数千个基因。每个基因本身可能由数百到数千个 DNA 碱基对组成。但在遗传算法中,我们只需要关注基因和染色体。
遗传演化的模拟本身是通过模仿减数分裂的过程来完成的,减数分裂是通过精子和卵子进行细胞繁殖的过程,而有丝分裂是细胞基本分裂的过程。
减数分裂是将一个生物体的一半遗传物质与另一个生物体的一半遗传物质相结合的过程。例如在人类中,男性将其一半的 DNA (精子细胞)与女性的一半 DNA (卵子)相结合。
减数分裂过程如下所示,其中来自父代生物的染色体被组合在一起。在这个过程中,同源染色体对(即相似的染色体)首先对齐,然后发生交叉,即基因物质的共享,重新组合后的染色体用于定义新的生物体。

减数分裂过程

在遗传算法中,主要模拟细胞水平上的基因、染色体和交叉过程等。

1.2 类比达尔文进化论

1.2.1 达尔文进化理论

遗传算法是类比自然界的达尔文进化实现的简化版本。达尔文进化论的原理概括总结如下:

  1. 突变:种群中单个样本的特征(也称性状或属性)可能会有所不同,这导致了样本彼此之间有一定程度的差异
  2. 遗传:某些特征可以遗传给其后代。导致后代与双亲样本具有一定程度的相似性
  3. 选择:种群通常在给定的环境中争夺资源。更适应环境的个体在生存方面更具优势,因此会产生更多的后代

换句话说,进化维持了种群中个体样本彼此不同。那些适应环境的个体更有可能生存,繁殖并将其性状传给下一代。这样,随着世代的更迭,物种变得更加适应其生存环境。而进化的重要推动因素是交叉 (crossover) 或重组 (recombination) 或杂交——结合双亲的特征产生后代。交叉有助于维持人口的多样性,并随着时间的推移将更好的特征融合在一起。此外,变异 (mutations) 或突变(特征的随机变异)可以通过引入偶然性的变化而在进化中发挥重要作用。

1.2.2 遗传算法对应概念

遗传算法试图找到给定问题的最佳解。达尔文进化论保留了种群的个体性状,而遗传算法则保留了针对给定问题的候选解集合(也称为individuals)。这些候选解经过迭代评估 (evaluate),用于创建下一代解。更优的解有更大的机会被选择,并将其特征传递给下一代候选解集合。这样,随着世代更新,候选解集合可以更好地解决当前的问题。

  • 基因型 (Genotype):在自然界中,通过基因型表征繁殖,繁殖和突变,基因型是组成染色体的一组基因的集合。在遗传算法中,每个个体都由代表基因集合的染色体构成。例如,一条染色体可以表示为二进制串,其中每个位代表一个基因。

染色体

  • 种群 (Population):遗传算法保持大量的个体 (individuals)——针对当前问题的候选解集合。由于每个个体都由染色体表示,因此这些种族的个体可以看作是染色体集合。

候选解集合

  • 适应度函数 (Fitness function):在算法的每次迭代中,使用适应度函数(也称为目标函数)对个体进行评估。目标函数是用于优化的函数或试图解决的问题。适应度得分更高的个体代表了更好的解,其更有可能被选择繁殖并且其性状会在下一代中得到表现。随着遗传算法的进行,解的质量会提高,适应度会增加,一旦找到具有令人满意的适应度值的解,终止遗传算法。

  • 选择 (Selection):在计算出种群中每个个体的适应度后,使用选择过程来确定种群中的哪个个体将用于繁殖并产生下一代,具有较高值的个体更有可能被选中,并将其遗传物质传递给下一代。仍然有机会选择低适应度值的个体,但概率较低。这样,就不会完全摒弃其遗传物质。

  • 交叉 (Crossover):为了创建一对新个体,通常将从当前代中选择的双亲样本的部分染色体互换(交叉),以创建代表后代的两个新染色体。此操作称为交叉或重组:

交叉

  • 突变 (Mutation):突变操作的目的是定期随机更新种群,将新模式引入染色体,并鼓励在解空间的未知区域中进行搜索。突变可能表现为基因的随机变化。变异是通过随机改变一个或多个染色体值来实现的。例如,翻转二进制串中的一位:
    突变

2. 遗传算法的基本流程

以下流程图显示了基本遗传算法流程的主要阶段:

Created with Raphaël 2.3.0 开始 创建初始种群 计算种群中每个个体的适应度 选择 交叉 突变 计算种群中每个个体的适应度 满足终止条件? 选择适应度最高的个体 结束 yes no

2.1 创建初始种群

初始种群是随机选择的一组有效候选解(个体)。由于遗传算法使用染色体代表每个个体,因此初始种群实际上是一组染色体。

2.2 计算适应度

适应度函数的值是针对每个个体计算的。对于初始种群,此操作将执行一次,然后在应用选择、交叉和突变的遗传算子后,再对每个新一代进行。由于每个个体的适应度独立于其他个体,因此可以并行计算。
由于适应度计算之后的选择阶段通常认为适应度得分较高的个体是更好的解决方案,因此遗传算法专注于寻找适应度得分的最大值。如果是需要最小值的问题,则适应度计算应将原始值取反,例如,将其乘以值 (-1)。

2.3 选择、交叉和变异

将选择,交叉和突变的遗传算子应用到种群中,就产生了新一代,该新一代基于当前代中较好的个体。
选择 (selection) 操作负责当前种群中选择有优势的个体。
交叉 (crossover,或重组,recombination) 操作从选定的个体创建后代。这通常是通过两个被选定的个体互换他们染色体的一部分以创建代表后代的两个新染色体来完成的。
变异 (mutation) 操作可以将每个新创建个体的一个或多个染色体值(基因)随机进行变化。突变通常以非常低的概率发生。

2.4算法终止条件

在确定算法是否可以停止时,可能有多种条件可以用于检查。两种最常用的停止条件是:

  1. 已达到最大世代数。这也用于限制算法消耗的运行时间和计算资源。
  2. 在过去的几代中,个体没有明显的改进。这可以通过存储每一代获得的最佳适应度值,然后将当前的最佳值与预定的几代之前获得的最佳值进行比较来实现。如果差异小于某个阈值,则算法可以停止。

其他停止条件:

  1. 自算法过程开始以来已经超过预定时间。
  2. 消耗了一定的成本或预算,例如 CPU 时间或内存。
  3. 最好的解已接管了一部分种群,该部分大于预设的阈值。

3. 使用 Python 实现遗传算法

遗传算法的核心是基因,它描述了一个个体所拥有的各种特征。在遗传算法中,我们将个体视为包含在染色体中的一个或多个基因序列。我们也可以模拟多个染色体,但通常只需使用一个染色体。
种群中的每个个体都有一个包含基因序列的染色体。每个基因由一个数字或布尔值描述,当然一个基因可以包含任何信息,包括文本字符、颜色或任何用于描述个体特征的信息。一个基因可以映射到单个数值,也可以由多个值定义。同样,我们可以定义一个单独的染色体,也可以定义多个染色体。

3.1 构建种群

为了便于理解,在本节中,我们将通过 Python 实现一个简单的遗传算法。
首先,使用 NumPy 数组设置一个种群。种群中的每个个体都由一个大小为 genes 的一维向量组成。将整个种群使用 randint 函数构建成一个元素值为 01NumPy 张量,并且张量的大小为 (population, genes) 。得到的输出张量中每一行表示一个大小为 genes 的向量:

import numpy as np
import random
import matplotlib.pyplot as plt#initial population
population = 100
genes = 100
generations = 100pop = np.random.randint(0,2, size=(population,genes))
print(pop)

输出

3.2 评估适应度

在一个种群中,我们需要确定哪个是最适合或最有可能解决问题的个体。在本节的简单示例中,我们的目标是进化个体,使其所有基因的值都为 1。这个问题在遗传算法中称为 OneMax 问题,是常见的入门问题之一。
为了确定个体的适应度,我们通常会推导出一个适应度函数用于计算个体接近目标的程度。通常,该目标是最大化或最小化目标值。在 OneMax 问题中,我们的目标是最大化个体中所有基因的总和。由于每个基因的元素取值是 01,最大化总和意味着个体的所有基因都为 1
NumPy 中,指定参数种群张量 pop 和轴 axis=1 调用 np.sum 函数计算适应度:

fitness = np.sum(pop,axis=1)
plt.hist(fitness)

下图显示了随机初始化的种群中个体适应度的直方图,输出近似一个大约以 50 中心的正态分布。在本例中,由于每个个体只有一个包含 100 个基因的染色体,每个基因的值为 01,因此最大适应度为 100

适应度评估

3.3 应用选择

在评估种群的适应度之后,我们可以确定哪些个体用于繁殖以产生后代。在自然界中,通常强壮或适应性更强的个体能够生存和繁殖,使后代共享部分遗传基因。在遗传算法中,我们通过确定种群中哪些个体适合繁殖来模拟这个过程。我们可以使用不同策略来进行选择,但对于本节的简单示例,我们选择适应度最高的两个个体作为整个下一代的父母,这种选择方式称为精英选择。
elite_selection 函数以种群适应度作为输入,通过使用 argsort 函数对适应度值进行排序,返回适应度最高的两个个体的索引,返回的索引可以用于通过 pop[parents[idx]] 从种群中提取个体:

def elite_selection(fitness):return fitness.argsort()[-2:][::-1]  parents = elite_selection(fitness)
print(pop[parents[0]])

输出结果

对于本节中的简单示例,选择最佳个体进行繁殖能够得到不错的效果,但在更复杂的问题中,通常使用更多样化的选择方法。父母选择的多样性使个体可能传播在短期内并不有利的特征,但有可能成为最终的解决方案,避免在求解过程中陷入局部最大/小值的情况。

3.4 应用交叉

在选择了父母之后,可以应用交叉或者说是繁殖过程来创建后代。类似于生物学中的细胞分裂过程,通过交叉操作模拟染色体的组合,其中双亲中的每一个都共享其基因序列的一部分,并进行组合。
在交叉操作中,可以随机选择一个或多个点或使用某种策略沿着基因序列选择一个或多个点。在所选择的点上分割双亲的基因序列然后重新组合。在本节示例中,我们并未考虑每个后代与双亲共享基因序列的百分比。对于需要数万甚至数百万代进化的复杂问题,我们需要更平衡的交叉策略,而非随机交叉策略。
在代码实现中,交叉操作首先复制父代以创建原始子代,然后使用变量 crossover_rate 随机确定是否进行交叉操作。如果进行交叉操作,则沿基因序列生成一个随机点作为交叉点,用来分割基因序列,然后通过组合双亲的基因序列生成子代:

def crossover(parent1, parent2, crossover_rate):# children are copies of parents by defaultchild1, child2 = parent1.copy(), parent2.copy()  # check for recombinationif random.random() < crossover_rate:# select crossover point that is not on the end of the stringpt = random.randint(1, len(parent1)-2)# perform crossover    child1 = np.concatenate((parent1[:pt], parent2[pt:]))child2 = np.concatenate((parent2[:pt], parent1[pt:]))return [child1, child2]crossover(pop[parents[0]],pop[parents[1]], .5)

输出结果

交叉操作有多种不同的变体和应用方式。在本节中,选择一个随机的交叉点,然后在交叉点处组合序列。但在某些情况下,只有符合特定规则的基因序列才是有效的,对于这类情况,我们需要其他方法来保持基因序列的完整性。

3.5 应用突变

在自然界中,有时会看到后代拥有父母都不具备的特征,这是由于后代可能会发生突变,导致出现了父母没有的特征。随着时间的推移,这些突变可能会不断积累,从而产生全新的特征或物种。通常认为,通过突变这个关键过程,生命才得以从单细胞生物进化为高级物种。
在进化过程中,突变通常是独特且罕见的。在遗传算法中,可以在交叉操作之后使用指定突变规律和突变类型应用突变操作。因此,可以将突变理解为在繁殖过程中可能发生的基因变化现象。
在本节中,我们通过翻转序列中的一个位(基因)执行突变操作。在 mutation 函数中,测试每个个体的每个基因是否存在突变的可能性。为了测试该函数,我们使用 50% 的mutation_rate进行对比,但通常突变率需要设置为较小,一般小于 5%

def mutation(individual, mutation_rate):for i in range(len(individual)):# check for a mutationif random.random() < mutation_rate:# flip the bitindividual[i] = 1 - individual[i]return individualmutation(pop[parents[0]], .5)

输出结果

与选择和交叉操作一样,突变也具有多种类型。在某些情况下,我们可能希望保持突变的可能性较低,而在其他情况下,种群可能会从更高的随机性中受益。突变率就像深度学习 ( Deep learning, DL) 中的学习率一样,较低的学习率会使训练过程更加稳定,但可能会陷入局部最优解,而较高的学习率会的初始结果较好,但可能无法稳定训练。

3.6 运行演化过程

遗传算法从种群的随机初始化开始,接下来,第一步操作是计算所有个体的适应度。根据适应度,使用选择操作确定哪些个体用于繁殖后代。然后应用交叉操作,再应用突变,然后再次计算适应度。接下来,检查是否满足停止标准。通常,通过 GA 运行的代数定义停止标准,其中每代视为一个完整的 GA 过程。我们还可以使用其他停止标准,例如实现最大或最小适应度。
将所有 GA 过程代码放入 simple_GA 函数中。在函数中,通过应用遗传操作产生新的后代,并返回这些后代种群,以便作为下一遗传过程的父代传递给 simple_GA

def simple_GA(pop, crossover_rate=.5, mutation_rate=.05):fitness = np.sum(pop,axis=1) parents = elite_selection(fitness)children = np.zeros((population,genes))  for i in range(population):offspring = crossover(pop[parents[0]],pop[parents[1]], crossover_rate)children[i] = mutation(offspring[0],mutation_rate)  return childrensimple_GA(pop)

函数 simple_ga 执行了种群的所有遗传操作的一个完整过程,循环调用 simple_ga 函数直到达到算法的停止标准。记录每代种群的适应度,以观察种群的进化过程:

#initial population
pop = np.random.randint(0,2, size=(population,genes))for i in range(generations):pop = simple_GA(pop)fitness = np.sum(pop,axis=1)plt.hist(fitness)plt.show()print(f"Generation {i+1}")print(f"    Max fitness {np.max(fitness)}")print(f"    Min fitness {np.min(fitness)}")print(f"    Mean fitness {np.mean(fitness)}")print(f"    Std fitness {np.std(fitness)}")

下图展示了种群演化 100 代的结果,可以看到算法结束时最大适应度为 98,最小适应度为 86,平均值为 92.49,标准差为 2。与 DL 不同的是,在 DL 中,重点关注最大/最小损失或准确性,而在 GA 中,重点关注确定整个种群的进化情况。

输出结果

虽然单个个体具有较高适应度可以解决复杂的问题,但我们希望确保整个种群的适应度足够高以继续演化。与 DL 不同,在 DL 中训练效果随时间而衰减,在 GA 中,通常会出现突破性演化,产生根本性变化和更优解。因此,我们通常希望在使用进化算法时考虑整个种群的适应度。
适者生存是进化算法训练的目标,因此我们通常希望看到个体适应度满足正态分布,以确保种群对变化具有适应性,我们可以通过使用不同类型的选择和突变操作来控制适应度的分布。
遗传算法中可以通过调整超参数和遗传算子来优化解的进化,接下来,通过介绍遗传算法中常见超参数及其作用来了解遗传算法性能优化的方法:

  • 种群大小:表示每一代进化模拟的个体数量。种群大小与染色体大小或基因序列长度相关,因此,具有更复杂基因序列的个体需要更大的训练种群才有机会得到高适应度个体
  • 基因/染色体长度:染色体的数量和长度或基因的类型通常由问题设置
  • 世代数:类似于 DL 中的 epoch,世代数表示进化的迭代次数。在遗传算法中,需要进化整个种群,世代数通常由染色体长度和复杂性决定。这可能与种群大小平衡,可以使用大量的种群和少量的世代数
  • 交叉率:用于确定交叉点的位置或数量
  • 突变率:用于确定个体基因发生突变的可能性。较高的突变率通常会导致种群发生较多变异,这可能有利于解决复杂的问题。但是,较高的变异率也可能阻碍个体达到最佳表现。相反,较低的突变率会产生较少的种群变异

通过在代码中修改这些超参数,并观察不同超参数对运行结果的影响,学习和理解如何修改超参数是改变种群演化的最佳方式。遗传算法为进化计算 (Evolutionary Computation, EC) 方法奠定了基础。从根本上讲,进化和适者生存的概念是 EC 方法的关键组成部分。

小结

在遗传算法 (Genetic Algorithms, GA) 中,使用选择、交叉、突变和适应度来模拟生物减数分裂或繁殖的基本操作。适应度是衡量个体优劣的指标,可以用于量化模拟个体成功解决给定问题的能力。通过修改遗传算法超参数,如种群大小、世代数、交叉率和突变率等超参数,能够调整和修改进化进程。在本节中,我们介绍了遗传算法基本概念及算法流程,并使用 Python 实现遗传算法解决 OneMax 问题。

系列链接

遗传算法与深度学习实战(1)——进化深度学习
遗传算法与深度学习实战(2)——生命模拟及其应用
遗传算法与深度学习实战(3)——生命模拟与进化论
遗传算法与深度学习实战(5)——遗传算法框架DEAP

相关文章:

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战&#xff08;4&#xff09;——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…...

Nginx+Tomcat实现负载均衡、动静分离集群部署

文章目录 一、Nginx​​实现负载均衡原理1.正向代理和反向代理2.负载均衡模式1. 轮询&#xff08;Round Robin&#xff09;&#xff1a;2. 最少连接数&#xff08;Least Connections&#xff09;&#xff1a;3. IP 哈希&#xff08;IP Hash&#xff09;&#xff1a;4. 加权轮询…...

英语学习8月19日

词根前缀后缀 accomplishment 成就 acid n.酸的&#xff0c;adj.酸的 acidity n.酸性 ace adj.顶尖的 acute adj.敏锐的&#xff1b;急性的&#xff1b;严重的 acuity n.敏锐 obtuse adj.迟钝的&#xff1b;钝角的 acuity n.敏锐&#xff0c;严重 1.前缀ac: 尖&#x…...

关于windows环境使用nginx的一些性能问题

遇到的问题 最近在一个windows环境中部署nginx&#xff0c;遇到了以下问题&#xff1a; 1. nginx启动了九个线程&#xff08;1master8woekr&#xff09;&#xff0c;但是所有链接都被1个woker接收&#xff0c;其余worker不工作 2. 用户端访问web很慢&#xff0c;登录服务器使…...

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

背景: 今天在日常的工作中&#xff0c; 我想将笔记本分屏到另一个显示屏&#xff0c;我这电脑Windows10&#xff0c;当我按下Windows键P键&#xff0c;提示我"你的电脑不能投影到其他屏幕&#xff0c;请尝试从新安装驱动程序或使用"遇到这种问题。 解决方法1: 1.快…...

第10章 无持久存储的文件系统 (2)

目录 10.1 proc文件系统 10.1.2 数据结构 10.1.3 初始化 10.1.4 装载 proc 文件系统 10.1.5 管理 /proc 数据项 10.1.6 读取和写入信息 10.1.7 进程相关信息 10.1.8 系统控制机制 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 10.1 proc文件…...

云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…...

AI搜索引擎Perplexica的本地部署(之二)Perplexica的非docker安装

Perplex 是一个开源的AI 驱动的搜索引擎&#xff0c;可以使用 Grok 和 Open AI 等模型在计算机上本地安装和运行。它为学术研究、写作、YouTube 和 Reddit 提供了一系列搜索功能。用户可以通过选择不同的模型、设置本地嵌入模型和探索各种搜索选项来定制他们的体验。该工具演示…...

Oracle环境下在相同参数和数据源的情况,mybatis-plus查询和sql查询结果不一致

场景: 在系统中某个对象执行修改的时候,查询对象为空,造成修改报错 分析: 在传参中有一个eq的参数需要传null,mybatis-plus在执行eq时可能是拼成" null",但是oracle中查null必须要用is null, null是查不出东西的 解决: 改成用sql查询修改,或者加判断如果这个参…...

springboot静态资源访问问题归纳

以下内容基于springboot 2.3.4.RELEASE 1、默认配置的springboot项目&#xff0c;有四个静态资源文件夹&#xff0c;它们是有优先级的&#xff0c;如下&#xff1a; "classpath:/META-INF/resources/", &#xff08;优先级最高&#xff09; "classpath:/reso…...

HTML与CSS学习Day01

文章目录 一 、CSS技巧1.1 CSS精灵&#xff08;CSS Sprites&#xff09;1.1.1 实现步骤1.1.2 例子 1.2 字体图标1.2.1如何使用字体图标1.2.2 字体图标使用总结 1.3 垂直对齐方式vertical-align1.3.1 值1.3.2 例子 1.4 过渡效果transition1.4.1 CSS过渡效果&#xff08;transiti…...

Tina-Linux Bootloaer简述

Tina-Linux Bootloaer简述 目录介绍 ubuntuubuntu1804:~/tina-v2.0-sdk/lichee/brandy-2.0$ tree -L 1 . ├── build.sh ├── opensbi ├── spl //boot0 ├── spl-pub //boot0 ├── tools └── u-boot-2018 /ubootTina-Linux 启动流程简述...

【Python】 Scrapyd:Python Web Scraping 的强大分布式调度工具

我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 &#x1f3b5; 许嵩《内线》 在网络爬虫项目中&#xff0c;Scrapy 是 Python 中最流行和…...

吴恩达机器学习课后题-01线性回归

线性回归 一.单变量线性回归题目损失函数&#xff08;代价函数&#xff09;梯度下降函数代价函数可视化整体代码 二.多变量线性回归特征归一化&#xff08;特征缩放&#xff09;不同学习率比较 正规方程正规方程与梯度下降比较 使用列表创建一维数组使用嵌套列表创建二维数组&a…...

白盒报告-jacoco

使用jacoco--执行nvn test 运行过程&#xff1a; 1、idea执行mvn test &#xff0c;运行过程如下&#xff1a; a.maven-surefire-plugin&#xff1a;0.8.7执行目标动作&#xff1a;prepare-agent&#xff0c; 目的是&#xff1a;执行目标动作是为了在当前的项目名下生成jecoco.…...

【MySQL】SQL语句执行流程

目录 一、连接器 二、 查缓存 三、分析器 四、优化器 五、执行器 一、连接器 学习 MySQL 的过程中&#xff0c;除了安装&#xff0c;我们要做的第一步就是连接上 MySQL 在一开始我们都是先使用命令行连接 MySQL mysql -h localhost -u root -p 你的密码 使用这个命令…...

Selenium自动化防爬技巧:从入门到精通,保障爬虫稳定运行,通过多种方式和add_argument参数设置来达到破解防爬的目的

在Web自动化测试和爬虫开发中&#xff0c;Selenium作为一种强大的自动化工具&#xff0c;被广泛用于模拟用户行为、数据抓取等场景。然而&#xff0c;随着网站反爬虫技术的日益增强&#xff0c;直接使用Selenium很容易被目标网站识别并阻止。因此&#xff0c;掌握Selenium的防爬…...

从数据类型到变量、作用域、执行上下文

从数据类型到变量、作用域、执行上下文 JS数据类型 分类 1》基本类型&#xff1a;字符串String、数字Number、布尔值Boolean、undefined、null、symbol、bigint 2》引用类型&#xff1a;Object (Object、Array、Function、Date、RegExp、Error、Arguments) Symbol是ES6新出…...

一文读懂:AI时代到底需要什么样的网络?

各位小伙伴们大家好哈&#xff0c;我是老猫。 今天跟大家来聊聊数据中心网络。 提到网络&#xff0c;通常把网络比作高速公路&#xff0c;网卡相当于上下高速公路的闸口&#xff0c;数据包就相当于运送数据的汽车&#xff0c;交通法规就是“传输协议”。 如高速公路也会堵车一…...

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现&#xff08;一&#xff09; 本系统是简易的宠物收养系统&#xff0c;为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现&#xff08;组件导航使用&#xff09; 官方文档&#xff1a;组…...

严格模式报错

部分参考&#xff1a; Android内存泄露分析之StrictMode - 星辰之力 - 博客园 (cnblogs.com)...

nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module in nginx.conf

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:42 查看/usr/local/nginx/conf/nginx.conf文件第42行数据&#xff1a; listen 443 ssl; # server中的配置 原因是&#xff1a;nginx缺少 http_ssl_modul…...

Docker 部署loki日志 用于微服务

因为每次去查看日志都去登录服务器去查询相关日志文件&#xff0c;还有不同的微服务&#xff0c;不同日期的文件夹&#xff0c;超级麻烦&#xff0c;因为之前用过ELK&#xff0c;原本打算用ELK&#xff0c;在做技术调研的时候发现了一个轻量级的日志系统Loki&#xff0c;果断采…...

[Day 57] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的零知識證明技術 一、引言 隨著區塊鏈技術的不斷發展&#xff0c;如何在保護用戶隱私的同時確保數據的完整性和可信度成為了研究的焦點。零知識證明&#xff08;Zero-Knowledge Proof&#xff0c;ZKP&#xff09;技術就是其中的一項關鍵技術&#xff0c;它允許一方在不…...

06结构型设计模式——代理模式

一、代理模式简介 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff08;GoF书中解释结构型设计模式&#xff1a;一种用来处理类或对象、模块的组合关系的模式&#xff09;&#xff0c;代理模式是其中的一种&#xff0c;它可以为其他对象提供一种代…...

《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…...

调试和优化大型深度学习模型 - 0 技术介绍

调试和优化大型深度学习模型 - 0 技术介绍 flyfish LLaMA Factory LLaMA Factory 是一个简单易用且高效的大型语言模型&#xff08;Large Language Model&#xff09;训练与微调平台。通过 LLaMA Factory&#xff0c;可以在无需编写任何代码的前提下&#xff0c;在本地完成上…...

华为S3700交换机配置VLAN的方法​

1.VLAN的详细介绍 VLAN(Virtual Local Area Network)即虚拟局域网,是一种将一个物理的局域网在逻辑上划分成多个广播域的技术。 1.1基本概念 1)作用: 隔离广播域:通过将网络划分为不同的 VLAN,广播帧只会在同一 VLAN 内传播,而不会扩散到其他 VLAN 中,从而有效…...

学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术

目录 一、概述与基础概念 1.1 套接字&#xff08;Socket&#xff09;概念 1.2 底层原理与网络协议 1.2.1 网络协议 1.2.2 套接字工作原理 二、C套接字编程核心技术 2.1 套接字编程的基本步骤 2.2 套接字编程详细实现 2.2.1 创建套接字 2.2.2 绑定地址 2.2.3 监听和接…...

SpringBoot-配置加载顺序

目录 前言 样例 内部配置加载顺序 ​ 样例 小结 前言 我之前写的配置文件&#xff0c;都是放在resources文件夹&#xff0c;根据当前目录下&#xff0c;优先级的高低&#xff0c;判断谁先被加载。但实际开发中&#xff0c;我们写的配置文件并不是&#xff0c;都放…...

第八周:机器学习笔记

第八周机器学习笔记 摘要Abstract机器学习1. 鱼和熊掌和可兼得的机器学习1.1 Deep network v.s. Fat network 2. 为什么用来验证集结果还是不好&#xff1f; Pytorch学习1. 卷积层代码实战2. 最大池化层代码实战3. 非线性激活层代码实战 总结 摘要 本周学习对李宏毅机器学习视…...

音乐怎么剪切掉一部分?5个方法,轻松学会音频分割!(2024全新)

音乐怎么剪切掉一部分&#xff1f;音频文件是娱乐和创作的重要基础。音频在我们日常生活中发挥着重要作用&#xff0c;从音乐播放列表到有趣的视频&#xff0c;它无处不在。无论是音乐爱好者还是内容创作者&#xff0c;我们常常需要对音频文件进行剪切和编辑。想象一下&#xf…...

洛谷 CF295D Greg and Caves

题目来源于&#xff1a;洛谷 题目本质&#xff1a;动态规划dp&#xff0c;枚举 解题思路&#xff1a;将整个洞分成两半&#xff0c;一半递增&#xff0c;一半递减。我们分别 DP 求值&#xff0c;最后合并。状态转移方程为&#xff1a;dpi,j​k2∑j​(j−k1)dpi−1,k​1。枚举极…...

【图像处理】在图像处理算法开发中,有哪些常见的主观评价指标和客观评价指标?

主观评价指标 在图像处理算法开发中&#xff0c;主观评价指标依赖于观察者的个人感受和判断&#xff0c;通常用于评估图像的视觉质量。以下是一些常见的主观评价指标&#xff1a; 平均意见分数 (Mean Opinion Score, MOS)&#xff1a;通过收集多个评价者的评分并计算平均值来评…...

从零开始学cv-6:图像的灰度变换

文章目录 一&#xff0c;简介&#xff1a;二、图像的线性变换三、分段线性变换四&#xff0c;非线性变换4.1 对数变换4.2 Gamma变换 五&#xff0c;效果: 一&#xff0c;简介&#xff1a; 图像灰度变换涉及对图像中每个像素的灰度值执行数学运算&#xff0c;进而调整图像的视觉…...

使用Apache POI和POI-OOXML实现word模板文档自动填充功能

最近接到一个新的需求&#xff0c;用户创建好模板文件保存到模板库&#xff0c;然后使用在线文档编辑器打开模板时&#xff0c;将系统数据填充到模板文件并生成新的word文件&#xff0c;然后在线编辑&#xff0c;研究使用Apache POI和POI-OOXML实现了这个功能。 Maven依赖 <…...

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…...

垂直行业数字化表现抢眼 亚信科技全年利润展望乐观

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年8月14日&#xff0c;亚信科技控股有限公司&#xff08;股票代码&#xff1a;01675.HK&#xff09;公布了公司截至2024年6月30日的中期业绩。 财报数据显示&#xff0c;2024年上半年&#xff0c;亚信科技的营业收入为人民币…...

EmguCV学习笔记 VB.Net 4.1 颜色变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…...

【MySQL进阶之路】表结构的操作

目录 创建表 查看表 查看数据库有哪些表 查看表结构 查看表的详细信息 修改表 表的重命名 添加一列 修改某一列的属性 删除某一列 对列进行重命名 删除表 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 【MySQL进阶之路】MySQL基础——从零认识MySQL-CSDN博客 创…...

3分钟搞定PDF转PPT!你一定要知道的3款转换神器!

在数字办公成为主流的当下&#xff0c;我们每天会收到各类基于数字化方式存储的办公文档&#xff0c;如PDF、PPT、Word、Excel文档等。 日常处理这些文档时&#xff0c;经常需要在不同格式的文档之间进行切换和转换&#xff0c;其中将PDF转换为PPT就是一个非常高频的需求&…...

【EasyExcel】导出excel-设置动态表头并导出数据

需求背景&#xff1a; 导出excel的设置某些表头动态导出(可以根据筛选条件或一些属性的数据量)&#xff0c;方便导出后用户查看想看的信息。 一、技术选型&#xff1a; easyExcel的原生数据处理 二、方案设计&#xff1a; 根据EasyExcel支持的表头List<List<String>…...

深入探索 Elasticsearch 8:新特性与核心原理剖析(上)

深入探索 Elasticsearch 8&#xff1a;新特性与核心原理剖析 目录 一、引言 &#xff08;二&#xff09;版本 8 的重要意义 二、Elasticsearch 8 的新特性 三、Elasticsearch 的核心原理 一、引言 &#xff08;一&#xff09;Elasticsearch 简介 在大数据处理和搜索领域…...

瑜伽馆预约小程序,在线预约,提高商业价值

随着大众生活质量的提高&#xff0c;对休闲运动的关注逐渐加大&#xff0c;瑜伽作为一种身心放松、改善体态的运动&#xff0c;深受女性用户的喜爱。目前&#xff0c;各大瑜伽馆开始结合数字化&#xff0c;建立了新型的线上小程序&#xff0c;帮助大众快速预约体验瑜伽&#xf…...

Python--数据类型转换

在Python中&#xff0c;数据类型的转换是一个常见的操作&#xff0c;涉及将一种数据类型转换为另一种数据类型。Python提供了多种内置函数用于执行这种转换&#xff0c;如 int()、str()、float()、list()、tuple()、set()、dict() 等。下面详细讨论Python的基本数据类型及它们之…...

域控ntdsutil修改架构、域命名、PDC、RID、结构主机

#笔记记录# FSMO盒修改 1、提示访问特权不够&#xff0c;不能执行该操作&#xff0c;0x2098 清除缓存账号密码并修改新架构管理员账号密码即可。 背景&#xff1a;更替架构主机、域命名主机 C:\Windows\system32>ntdsutil ntdsutil: roles fsmo maintenance: ?? …...

解决 Swift 6 全局变量不能满足并发安全(concurrency-safe)读写的问题

概述 WWDC 24 终于在 Swift 十岁生日发布了全新的 Swift 6。这不仅意味着 Swift 进入了全新的“大”版本时代&#xff0c;而且 Swift 编译器终于做到了并发代码执行的“绝对安全”。 不过&#xff0c;从 Swift 5 一步迈入“新时代”的小伙伴们可能对新的并发检查有些许“水土不…...

迈入退休生活,全职开发ue独立游戏上架steam

决定退休了。算了算睡后收入&#xff0c;也可以达到每月一万一&#xff0c;正好可以养家糊口。 既然退休了&#xff0c;那就做些想做的事情&#xff0c;别人养花养草&#xff0c;而我打算开发独立游戏上架steam。 一&#xff0c;盘点下目前的技术体系。 1&#xff0c;图形学底…...

什么是光伏气象站——仁科测控

【仁科测控&#xff0c;品质保障】光伏气象站&#xff0c;‌这一专门为光伏发电系统设计的监测设备&#xff0c;‌其核心能力在于精确且实时地捕捉那些对光伏发电效率产生关键影响的气象因素。‌这些数据不仅为评估光伏电站的发电性能提供了重要依据&#xff0c;‌更是优化运维…...

webshell免杀--免杀入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理webshell免杀的一些基础思路 入门级&#xff0c;不是很深入&#xff0c;主要是整理相关概念 免杀对象 1.各类杀毒软件 类似360&#xff0c;火绒等&#xff0c;查杀己方webshell的软件。 2.各类流量…...