[白话解析] 通俗解析集成学习之bagging,boosting & 随机森林

0x00 摘要

本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来解释 集成学习。并且从名著中延伸了具体应用场景来帮助大家深入这个概念。

在机器学习过程中,会遇到很多晦涩的概念,相关数学公式很多,大家理解起来很有困难。遇到类似情况,我们应该多从直觉角度入手思考,用类比或者举例来附会,这样往往会有更好的效果。

我在讲解论述过程中给自己的要求是:在生活中或者名著中找一个例子,然后用自己的话语阐述出来。

0x01 相关概念

1. 偏置( bias ) vs 方差( variance )

  • 平方偏置( bias ),表示所有数据集的平均预测与预期的回归函数之间的差异。
  • 方差( variance ),度量了对于单独的数据集,模型所给出的解在平均值附近波动的情况,

方差 度量了同样大小的训练集的变动所导致的学习性能的变化,度量了在面对同样规模的不同训练集时,学习算法的估计结果发生变动的程度(相关于观测样本的误差,刻画了一个学习算法的精确性和特定性:一个高的方差意味着一个弱的匹配),即刻画了数据扰动所造成的影响

偏置 度量了学习算法期望预测与真实结果的偏离程度,度量了某种学习算法的平均估计结果所能逼近学习目标的程度(独立于训练样本的误差,刻画了匹配的准确性和质量:一个高的偏置意味着一个坏的匹配),即刻画了学习算法本身的拟合能力

网上的比较好的例子是那个标靶的例子,大家可以去看看

  • High Variance, low bias 对应就是点都打在靶心附近,但是散乱,所以瞄的是准的,但手不一定稳。
  • Low variance, high bias 对应就是点都打的很集中,但不一定是靶心附近,手很稳,但是瞄的不准。

这里试图用水浒传来解释下这两个概念。

2. 用梁山为例通俗说方差

比如说五虎将,武力平均值就是呼延灼,其下是秦明,董平;其上是林冲,关胜。假设武力值是 秦明 95,董平 96,呼延灼 97,关胜 98,林冲 99针对这个样本,其方差就是秦明,董平,林冲,关胜这四人的武力值和呼延灼差距多少。
如果都和呼延灼需要大战八百回合才能分出胜负,那么说明方差小。如果大战三百合就能分出胜负,那说明方差大。

3. 用梁山为例通俗说偏置

假设马军八骠骑的武力值如下:徐宁 92、索超 90、张清 86、朱仝 90、史进 88、穆弘 85,花荣 90、杨志 95。如果有一个模型,用八骠骑来拟合五虎将。这个模型是:任意选取一个八骠骑来拟合。( 实际工作中偏置应该是取八骠骑平均值,这里偏置是任选一个,是为了说明方便 )如果用杨志来拟合五虎将,则最能逼近五虎将,这时候偏置小。如果选出的是穆弘,则偏置最大。
对于没遮拦穆弘,大家估计都是只知其名不知其事,可见其武力值最低。当然穆弘的故事可能是在古本《水浒》有,但是后来世代相传中从今本《水浒》中被删除,所以被低视。水浒故事有系统的文字记录首见《宣和遗事》。该书讲述先后落草太行山梁山、后来《水浒》说成是入伙鲁西梁山泊的人物共三十八名。其中的没遮拦穆横无疑就是《水浒》中的穆弘。
《宣和遗事》中的穆横是押运花石纲的十二指使之一。这十二人因公务而结义,后又因营救杨志而同往太行山落草,遂成为开创山寨的基本成员。《水浒传》处理这十二指使,有八人是和穆横完全一样待遇的(林冲、花荣、张清、徐宁、李应、关胜、孙立、杨志)。
这八人全都在《水浒》里成了独当一面的人物。如果一切顺应传统去发展,穆弘总不致变成一个有名无实的空白人物。

下面是《宣和遗事》

先是朱勔运花石纲时分,差着杨志、李进义、林冲、王雄,花荣、柴进、张青、徐宁、李应、穆横、关胜、孙立十二人为指使,前往太湖等处,押人夫搬运花石。

那十二人领了文字,结义为兄弟,誓有灾厄,各相救援。李进义等十名,运花石已到京城;只有杨志在颍州等候孙立不来,在彼处雪阻。那雪景如何却是:乱飘僧舍茶烟湿,密洒歌楼酒力微。
那杨志为等孙立不来,又值雪天,旅涂贫困,缺少果足,未免将一口宝刀出市货卖。终日价无人商量。行至日哺,遇一个恶少后生要卖宝刀,两个交口厮争,那后生被杨志挥刀一斫,只见颈随刀落。杨志上了枷,取了招状,送狱推勘。结案申奏文字回来,太守判道:“杨志事体虽大,情实可悯。将杨志诰札出身尽行烧毁,配卫州军城。”断罢,差两人防送往卫州交管。正行次,撞着一汉,高叫:“杨指使!”杨志抬头一觑,却认得孙立指使。孙立惊怪:“哥怎恁地犯罪”。杨志把那卖刀杀人的事,一一说与孙立。道罢,各人自去。那孙立心中思忖:“杨志因等候我了,犯着这罪。当初结义之时,誓在厄难相救。”只得星夜奔归京师,报与李进义等知道杨志犯罪因由。这李进义同孙立商议,兄弟十一人往黄河岸上,等待杨志过来,将防送军人杀了,同往太行山落草为寇去也。

0x02 集成学习(ensemble learning)

1. 为什么要集成

在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。

比如各弱分类器间具有一定差异性(如不同的算法,或相同算法不同参数配置),这会导致生成的分类决策边界不同,也就是说它们在决策时会犯不同的错误。

集成方法的思想是通过将这些弱学习器的偏置和/或方差结合起来,从而创建一个「强学习器」(或「集成模型」),从而获得更好的性能。

集成学习是一种机器学习范式。其基本思想是:「三个臭皮匠顶个诸葛亮」。「团结就是力量」。「博采众长」

在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。

我们可以对集成学习的思想做一个概括。对于训练集数据,我们通过训练若干个个体学习器,通过一定的结合策略,就可以最终形成一个强学习器,以达到博采众长的目的。

  • 集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类

  • 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法

  • 如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。

2. 分类

对于集成学习的分类,常见两种分类方法:

分类1

个体学习器按照个体学习器之间是否存在依赖关系可以分为两类:

  • 个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法;
  • 个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林(Random Forest)系列算法。

分类2

集成学习按照基本分类器之间的关系可以分为异态集成学习和同态集成学习。

  • 异态集成学习是指弱分类器之间本身不同;

  • 而同态集成学习是指弱分类器之间本身相同只是参数不同。

3. 主要问题

集成学习有两个主要的问题需要解决:

1)怎么训练每个算法?即如何得到若干个个体学习器。

2)怎么融合每个算法?即如何选择一种结合策略,将这些个体学习器集合成一个强学习器。

如何得到个体学习器?

主要从以下5个方面得到:

  • 基本分类器本身的种类,即其构成算法不同;
  • 对数据进行处理不同,比如说boosting,bagging,stacking,cross-validation,hold-out test;
  • 对输入特征进行处理和选择;
  • 对输出结果进行处理,比如说有的学者提出的纠错码;
  • 引入随机扰动;

很重要的一点是:我们对弱学习器的选择应该和我们聚合这些模型的方式相一致。如果我们选择具有低偏置高方差的基础模型,我们应该使用一种倾向于减小方差的聚合方法;而如果我们选择具有低方差高偏置的基础模型,我们应该使用一种倾向于减小偏置的聚合方法。

如何选择一种结合策略

一旦选定了弱学习器,我们仍需要定义它们的拟合方式(在拟合当前模型时,要考虑之前模型的哪些信息?)和聚合方式(如何将当前的模型聚合到之前的模型中?)

这就引出了如何组合这些模型的问题。我们可以用三种主要的旨在组合弱学习器的「元算法」:

  • bagging,该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。

  • boosting,该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。

  • stacking,该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。

非常粗略地说,我们可以说 bagging 的重点在于获得一个方差比其组成部分更小的集成模型,而 boosting 和 stacking 则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)。

我们可以看看在水浒传如何应用结合策略

梁山要打某座州府,究竟用什么办法呢?听吴学究的嘛?
吴学究在生辰纲的表现实在不行,漏洞太多。打大名府等也基本就是一招:事先混进城里,然后里应外合。
所以还是应该集思广益,采用集成学习。可以采用两个办法办法1
神机军师朱武,混江龙李俊,智多星吴用,入云龙公孙胜,混世魔王樊瑞五个人都分别出一个主意,然后投票选出一个综合方案。方法2
吴用先出一个主意,然后朱武针对这个主意做些调整补漏,给出了一个新主意。李俊再针对朱武的主意进行修补,给出了第三个主意...... 最后给出一个最终主意。办法1 就是bagging方式的近似模拟
办法2 就是boosting方式的近似模拟

0x03 Bootstrap

首先需要介绍下Bootstrap,这个其实不属于集成学习,而是统计学的一种方法,属于集成学习的先驱。

Boostrap是靴子的带子的意思,名字来源于“pull up your own boostraps”,意思是通过拉靴子提高自己,本来的意思是不可能发生的事情,但后来发展成通过自己的努力让事情变得更好。放在组合分类器这里,意思就是通过分类器自己提高分类的性能。

Boostrap是一种抽样方法。

人们希望获取整体的全部信息,因为这样就可以做到“运筹帷幄”——整体都知道了,还有什么样本是我们不能掌握的吗?而实际上获取整体的信息是很难的,甚至是不可能的,所以才有了统计学中的“抽样”。也就是说,我们只能获取整体中的某些样本的信息,人们期望可以通过这些有限的样本信息来尽可能准确地估计总体,从而为决策提供依据。而Bootstrap方法认为,既然得到的样本是从总体中“抽取”的,那么为什么不可以把这些样本当做一个整体,从中进行***有放回地再抽取***呢?这种方法看似简单,而实际上却是十分有效的。

具体的方法是:

1)采用重复抽样的方法每次从n个原始样本中抽取m个样本(m自己设定)
(2)对于m个样本计算统计量
(3)重复步骤(1)(2)N次(N一般大于1000),这样就可以算出N个统计量
(4)计算这N个统计量的方差比如说,我现在要对一些未知样本做分类,分类算法选取一种,比如SVM。我要估计的总体参数是准确率(accuracy)。对于n个原始样本,从步骤(1)开始,每次对抽取出的样本用SVM训练出一个模型,然后用这个模型对未知样本做分类,得到一个准确率。重复N次,可以得到N个准确率,然后对计算出的N个准确率做方差。为什么要计算这N个统计量的方差而不是期望或者均值。方差表示的是一组数据与其平均水平的偏离程度,如果计算的方差值在一定范围之内,则表示这些数据的波动不是很大,那么他们的均值就可以用来估计总体的参数,而如果方差很大,这些样本统计量波动很大,那么总体的参数估计就不太准确?

看起来太简单了,所以提出者Efron给统计学顶级期刊投稿的时候被拒绝的理由–“太简单”。

Bootstrap只是提供了一种组合方法的思想,就是将基分类器的训练结果进行综合分析,而其它的名称如Bagging。Boosting是对组合方法的具体演绎。所以由Bootstrap方法开始,我们将导入到集成学习。

0x04 bagging方法

Bagging是boostrap aggregation的缩写,又叫自助聚集,是一种根据均匀概率分布从数据中重复抽样(有放回)的技术。至于为什么叫bootstrap aggregation,因为它抽取训练样本的时候采用的就是bootstrap的方法!

子训练样本集的大小和原始数据集相同。在构造每一个子分类器的训练样本时,由于是对原始数据集的有放回抽样,因此同一个训练样本集中可能出现多次同一个样本数据。

1. Bagging策略过程

  • 从样本集中用Bootstrap采样选出n个训练样本(放回,因为别的分类器抽训练样本的时候也要用)
  • 在所有属性上,用这n个样本训练分类器(CART or SVM or …)
  • 重复以上两步m次,就可以得到m个分类器(CART or SVM or …)
  • 将数据放在这m个分类器上跑,最后投票机制(多数服从少数)看到底分到哪一类(分类问题)
  • 对于分类问题:由投票表决产生分类结果;对于回归问题:由n个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)

2. 总结一下bagging方法

  • Bagging通过降低基分类器的方差,改善了泛化误差
  • 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起
  • 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例

0x05 随机森林

随机森林是结合 Breimans 的 “Bootstrap aggregating” 想法和 Ho 的"random subspace method"以建造决策树的集合。即 Bagging + 决策树 = 随机森林。这是在共拥有m个特征的决策树中随机选择k个特征组成n棵决策树,再选择预测结果模式(如果是回归问题,选择平均值)。

1. Bagging特点如何应用

假设共有N个样本,M个特征,让我们结合Bagging的各个特点看看。

用Bootstrap采样 (Bagging特点应用) : 每棵树都有放回的随机抽取训练样本,这里抽取随机抽取 2/3 的样本作为训练集,再有放回的随机选取 m 个特征作为这棵树的分枝的依据。

**随机:**一个是随机选取样本 (Bagging特点应用) ,一个是随机选取特征。这样就构建出了一棵树。之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

**选出优秀特征:**随机森林真正厉害的地方不在于它通过多棵树进行综合得出最终结果,而是在于通过迭代使得森林中的树不断变得优秀 (森林中的树选用更好的特征进行分枝)。

**迭代得到若干分类器 (Bagging特点应用):**按照上面的步骤迭代多次,逐步去除相对较差的特征,每次都会生成新的森林,直到剩余的特征数为 m 为止。假设迭代 x 次,得到 x 个森林。

**投票表决 (Bagging特点应用):**用另外 1/3 样本 (也叫做袋外样本) 做为测试集,对迭代出的 x 个森林进行预测。预测出所有样本的结果之后与真实值进行比较,选择套外误差率最小的森林作为最终的随机森林模型。

2. 选出优秀特征

对于选出优秀特征这个,需要再做一下解释。

随机森林的思想是构建出优秀的树,优秀的树需要优秀的特征。那我们需要知道各个特征的重要程度。对于每一棵树都有个特征,要知道某个特征在这个树中是否起到了作用,可以随机改变这个特征的值,使得“这棵树中有没有这个特征都无所谓”,之后比较改变前后的测试集误差率,误差率的差距作为该特征在该树中的重要程度,测试集即为该树抽取样本之后剩余的样本(袋外样本)(由袋外样本做测试集造成的误差称为袋外误差)。

在一棵树中对于个特征都计算一次,就可以算法个特征在该树中的重要程度。我们可以计算出所有树中的特征在各自树中的重要程度。但这只能代表这些特征在树中的重要程度不能代表特征在整个森林中的重要程度。那我们怎么计算各特征在森林中的重要程度呢?每个特征在多棵数中出现,取这个特征值在多棵树中的重要程度的均值即为该特征在森林中的重要程度。这样就得到了所有特征在森林中的重要程度。将所有的特征按照重要程度排序,去除森林中重要程度低的部分特征,得到新的特征集。这时相当于我们回到了原点,这算是真正意义上完成了一次迭代。

0x06 Boosting 方法

"Boosting"的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本

Boosting 方法和bagging 方法的工作思路是一样的:我们构建一系列模型,将它们聚合起来得到一个性能更好的强学习器。然而,与重点在于减小方差的 bagging 不同,boosting 着眼于以一种适应性很强的方式顺序拟合多个弱学习器:序列中每个模型在拟合的过程中,会更加重视那些序列中之前的模型处理地很糟糕的观测数据。

Boosting是一种迭代算法,针对同一个训练集训练不同的分类器(弱分类器),然后进行分类,对于分类正确的样本权值低,分类错误的样本权值高(通常是边界附近的样本),最后的分类器是很多弱分类器的线性叠加(加权组合),分类器相当简单。实际上就是一个简单的弱分类算法提升(boost)的过程。

每次样本加入的过程中,通常根据它们的上一轮的分类准确率给予不同的权重。数据通常会被重新加权,来强化对之前分类错误数据点的分类。

当boost运行每个模型时,它会跟踪哪些数据样本是最成功的,哪些不是。输出分类错误最多的数据集被赋予更重的权重。这些数据被认为更复杂,需要更多的迭代来正确地训练模型

在实际分类阶段,boosting处理模型的方式也有所不同。在boosting中,模型的错误率被跟踪,因为更好的模型被赋予更好的权重。即 误差越小的弱分类器,权值越大。这样,当“投票”发生时,就像bagging一样,结果更好的模型对最终的输出有更的强拉动力。

0x07 AdaBoost

由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法。采用指数损失的原因是:每一轮最小化指数损失其实是在训练一个logistic regression模型,这样就逼近对数几率 (log odds)。

1. 两个主要问题

Boosting算法是将“弱学习算法“提升为“强学习算法”的过程。采用Boosting思想实现的算法,需要解决两个主要问题。

  1. 如何选择一组有不同优缺点的弱学习器,使得它们可以相互弥补不足。
  2. 如何组合弱学习器的输出以获得整体的更好的决策表现。

和这两个问题对应的是加法模型和前向分步算法。

  • 加法模型就是说强分类器由一系列弱分类器线性相加而成。
  • 前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。

前向分布算法说:“我可以提供一套框架,不管基函数和损失函数是什么形式,只要你的模型是加法模型,就可以按照我的框架的指导,去求解。” 也就是说,前向分步算法提供了一种学习加法模型的普遍性方法,不同形式的基函数、不同形式的损失函数都可以用这种普遍性方法去求出加法模型的最优化参数,它是一种元算法。

前向分步算法的思路是:加法模型中一共有M个基函数以及与之相应的M个系数,可以从前往后,每次学习一个基函数及其系数。

2. AdaBoost的解决方案

选择弱学习器

为了解决第一个问题,AdaBoost的办法是:每轮结束时改变样本的权值。这样AdaBoost让每一个新加入的弱学习器都体现出一些新的数据中的模式。

为了实现这一点,AdaBoost为每一个训练样本维护一个权重分布。即对任意一个样本 xi 都有一个分布 D(i) 与之对应,以表示这个样本的重要性。

当衡量弱学习器的表现时,AdaBoost会考虑每个样本的权重。权重较大的误分类样本会比权重较小的误分类样本贡献更大的训练错误率。为了获得更小的加权错误率,弱分类器必须更多的聚焦于高权重的样本,保证对它们准确的预测。

也可以这么理解提高错误点的权值的意义:当"下一次分类器"再次分错了这些点之后,会提高"下一次分类器"整体的错误率,这样就导致 “下一次分类器” 自己的 权重 变的很小,最终导致这个分类器在整个混合分类器的权值变低。

通过修改样本的权重 D(i) ,也就改变了样本的概率分布,将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。这样就可以引导弱学习器学习训练样本的不同部分。

训练时候,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。

组合弱学习器

现在,我们获得了一组已训练的拥有不同优缺点的弱学习器,如何有效的组合它们,使得相互优势互补来产生更准确的整体预测效果?这就是第二个问题

对于第二个问题,AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。这个很好理解,正确率高分得好的弱分类器在强分类器中当然应该有较大的发言权。

每一个弱学习器是用不同的权重分布训练出来的,我们可以看做给不同的弱学习器分配了不同的任务,每个弱学习器都尽力完成给定的任务。直觉上看,当我们要把每个弱学习器的判断组合到最终的预测结果中时,如果弱学习器在之前的任务中表现优异,我们会更多的相信它,相反,如果弱学习器在之前的任务中表现较差,我们就更少的相信它。

换句话说,我们会加权地组合弱学习器,给每个弱学习器赋予一个表示可信程度的值 wi ,这个值取决于它在被分配的任务中的表现,表现越好 wi 越大,反之越小。

0x08 从水浒传中派生一个例子看如何使用集成学习

我们找一个例子来详细看看如何使用集成学习这个概念。现在梁山需要投票来决定是否接受招安。宋江说了,我们要科学民主的进行决策,所以我们采用最新科技:集成学习。

1. Bagging

首先考虑的是bagging方法

如果采用了bagging方法。样本有放回,而且投票可以并行。每次抽取 5 个人投票是否接受。第一次抽出 徐宁 、索超 、朱仝 、花荣、杨志。则 5 票都是 接受招安第二次抽出 鲁智深,武松,朱贵,刘唐,李逵。则 5 票都是 反对招安第三次抽出 徐宁 、索超,鲁智深,武松,阮小二。则 2 票接受,3 票反对,则这次样本是 反对招安。最后综合三次的结果是:反对招安。现在情况已经对招安不利了,如果再并行进行投票,那么对结果就更无法估计。
这样的话,对于是否招安就真的是梁山群体民主评议,公明哥哥和吴学究没办法后台黑箱操控了。

如果宋江想黑箱操作,他就不能采用bagging方法,而是需要选择boosting,因为这个算法的训练集的选择不是独立的,每一次选择的训练集都依赖于上一次学习的结果,所以利于宋江暗箱操纵。

2. Boosting

于是宋江决定采取Boosting方法,大家可以看看宋江如何使用boosting一步一步调整bias以达到最好拟合 “接受招安” 这个最终期望的。

"Boosting"的基本思想是通过某种方式使得每一轮基学习器在训练过程中更加关注上一轮学习错误的样本所以我们有两套方案。
方案一:每次每次剔除异常数值
方案二:每次调整异常数值权重-----------------------------------------------------------------方案一:每次剔除异常数值,这种适合宋江的样本全部无法控制的情况  迭代1 
样本:鲁智深,武松,朱贵,刘唐,李逵。则 5 票都是 反对招安
宋江说:出家人与世无争,就不要参与投票了,改换为徐宁,索超两位兄弟。
宋江跟踪错误率,因为本次弱分类器误差太大,所以本次权重降低。迭代2
样本:徐宁,索超,朱贵,刘唐,李逵。则 2 票接受,3 票反对,则这次样本是 反对招安
宋江说:铁牛兄弟不懂事,乱投票,来人乱棒打出去,换成杨志兄弟。
宋江跟踪错误率,因为本次弱分类器误差太大,所以本次权重降低。迭代3
样本:徐宁,索超,朱贵,刘唐,杨志。则 3 票接受,2 票反对,则这次样本是 接受招安
宋江说:朱贵兄弟平时总是打点酒店,对于时政缺少认知,换成关胜兄弟。
宋江跟踪错误率,因为本次弱分类器误差较小,所以本次权重增加。迭代4
样本:徐宁,索超,关胜,刘唐,杨志。则 4 票接受,1 票反对,则这次样本是 接受招安
宋江说:刘唐兄弟头发染色了,不利用梁山形象,换成花荣兄弟。
宋江跟踪错误率,因为本次弱分类器误差较小,所以本次权重增加。迭代5
样本:徐宁,索超,关胜,花荣,杨志。则 5 票接受,则这次样本是 接受招安。
宋江跟踪错误率,因为本次弱分类器没有误差,所以本次权重增加。
即误差率小的分类器,在最终分类器中的重要程度大。最后综合 5 次选举结果,梁山最后决定接受招安。-----------------------------------------------------------------  方案二:每次降低异常数值权重,这种适合样本中有宋江可以控制的头领迭代1 
样本:武松,花荣,朱贵,杨志,李逵。则 2 票接受,3 票反对,则本次结论是 反对招安
宋江说:出家人与世无争,降低武松权重为 1/2 。
宋江跟踪错误率,因为本次弱分类器误差太大,所以本次权重降低。迭代2
样本:武松(权重1/2),花荣,朱贵,杨志,李逵。则 2 票接受,21/2 票反对,则这次结论是 反对招安
宋江说:铁牛兄弟不懂事,乱投票,降低李逵权重为 1/2。
宋江跟踪错误率,因为本次弱分类器误差太大,所以本次权重降低。迭代3
样本:武松(权重1/2),花荣,朱贵,杨志,李逵(权重1/2)。则 2 票接受,2 票反对,则这次结论是 无结论
宋江说:朱贵兄弟平时打点酒店,对于时政缺少认知,降低朱贵权重为 1/2。
宋江跟踪错误率,因为本次弱分类器无结论,所以本次权重为零。迭代4
样本:武松(权重1/2),花荣,朱贵(权重1/2),杨志,李逵(权重1/2)。则 2 票接受,11/2 票反对,则这次结论是 接受招安
宋江说:这次好,花荣做过知寨,有见地,增加花荣权重。继续投票。
宋江跟踪错误率,因为本次弱分类器误差较小,所以本次权重增加。迭代5
样本:武松(权重1/2),花荣(权重2),朱贵(权重1/2),杨志,李逵(权重1/2)。则 3 票接受,11/2 票反对,则这次结论是 接受招安
宋江说:这次好,杨志做过制使,有见地,增加杨志权重。继续投票。  
宋江跟踪错误率,因为本次弱分类器误差较小,所以本次权重增加。迭代6
样本:武松(权重1/2),花荣(权重2),朱贵(权重1/2),杨志(权重2),李逵(权重1/2)。则 4 票接受,11/2 票反对,则这次结论是 接受招安
宋江跟踪错误率,因为本次弱分类器误差较小,所以本次权重增加。  最后综合 6 次选举结果,梁山最后决定接受招安。 -----------------------------------------------------------------    这里能看出来,Boosting算法对于样本的异常值十分敏感,因为Boosting算法中每个分类器的输入都依赖于前一个分类器的分类结果,会导致误差呈指数级累积。宋江每一次选择的训练集都依赖于上一次学习的结果。每次剔除异常数值 或者 调整异常数值权重。(在实际boosting算法中是增加异常数值的权重)。宋江也根据每一次训练的训练误差得到该次预测函数的权重。

3. 为什么说bagging是减少variance,而boosting是减少bias?

bias描述的是根据样本拟合出的模型的输出预测结果的期望与样本真实结果的差距,简单讲,就是在样本上拟合的好不好。要想在bias上表现好,low bias,就得复杂化模型,增加模型的参数,但这样容易过拟合 (overfitting)。

varience描述的是样本上训练出来的模型在测试集上的表现,要想在variance上表现好,low varience,就要简化模型,减少模型的参数,但这样容易欠拟合(unfitting)。

从我们例子能看出来。1. Bagging
bagging没有针对性的对分类器进行调整,只是单纯的增加样本数量和采样次数,以此来让平均值逼近结果。
所以bagging的基模型应该本身就是强模型(偏差低方差高)。所以,bagging应该是对许多强(甚至过强)的分类器求平均。在这里,每个单独的分类器的bias都是低的,平均之后bias依然低;而每个单独的分类器都强到可能产生overfitting的程度,也就是variance高,求平均的操作起到的作用就是降低这个variance。2. Boosting
boosting就是为了让每一次分类器的结果逐渐接近期望目标。即宋江期望一步一步的boosting到最终接受招安这个结果。这样才能在样本上最好拟合“招安”这个期望结果,从最初的“拒绝招安”这个high bias过渡到“接受招安”这个期望结果。boosting是把许多弱的分类器组合成一个强的分类器。弱的分类器bias高,而强的分类器bias低,所以说boosting起到了降低bias的作用。variance不是boosting的主要考虑因素。Boosting 是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行加权,所以随着迭代不断进行,误差会越来越小,所以模型的 bias 会不断降低。这种算法无法并行,例子比如Adaptive Boosting。

4. Bagging vs Boosting

由此我们可以对比Bagging和Boosting:

  • 样本选择上:Bagging采用的是Bootstrap随机有放回抽样,各训练集是独立的;而boosting训练集的选择不是独立的,每一次选择的训练集都依赖于上一次学习的结果。如果训练集不变,那么改变的只是每一个样本的权重。
  • 样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
  • 预测函数:Bagging所有的预测函数的权重相等;Boosting根据每一次训练的训练误差得到该次预测函数的权重,误差越小的预测函数其权重越大。
  • 并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。

0x09 随机森林代码

有兴趣的同学可以用代码来论证下Bagging。这里给出两份代码。

其一出自 https://blog.csdn.net/colourful_sky/article/details/82082854

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 26 16:38:18 2018
@author: aoanng
"""import csv
from random import seed
from random import randrange
from math import sqrtdef loadCSV(filename):#加载数据,一行行的存入列表dataSet = []with open(filename, 'r') as file:csvReader = csv.reader(file)for line in csvReader:dataSet.append(line)return dataSet# 除了标签列,其他列都转换为float类型
def column_to_float(dataSet):featLen = len(dataSet[0]) - 1for data in dataSet:for column in range(featLen):data[column] = float(data[column].strip())# 将数据集随机分成N块,方便交叉验证,其中一块是测试集,其他四块是训练集
def spiltDataSet(dataSet, n_folds):fold_size = int(len(dataSet) / n_folds)dataSet_copy = list(dataSet)dataSet_spilt = []for i in range(n_folds):fold = []while len(fold) < fold_size:  # 这里不能用if,if只是在第一次判断时起作用,while执行循环,直到条件不成立index = randrange(len(dataSet_copy))fold.append(dataSet_copy.pop(index))  # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。dataSet_spilt.append(fold)return dataSet_spilt# 构造数据子集
def get_subsample(dataSet, ratio):subdataSet = []lenSubdata = round(len(dataSet) * ratio)#返回浮点数while len(subdataSet) < lenSubdata:index = randrange(len(dataSet) - 1)subdataSet.append(dataSet[index])# print len(subdataSet)return subdataSet# 分割数据集
def data_spilt(dataSet, index, value):left = []right = []for row in dataSet:if row[index] < value:left.append(row)else:right.append(row)return left, right# 计算分割代价
def spilt_loss(left, right, class_values):loss = 0.0for class_value in class_values:left_size = len(left)if left_size != 0:  # 防止除数为零prop = [row[-1] for row in left].count(class_value) / float(left_size)loss += (prop * (1.0 - prop))right_size = len(right)if right_size != 0:prop = [row[-1] for row in right].count(class_value) / float(right_size)loss += (prop * (1.0 - prop))return loss# 选取任意的n个特征,在这n个特征中,选取分割时的最优特征
def get_best_spilt(dataSet, n_features):features = []class_values = list(set(row[-1] for row in dataSet))b_index, b_value, b_loss, b_left, b_right = 999, 999, 999, None, Nonewhile len(features) < n_features:index = randrange(len(dataSet[0]) - 1)if index not in features:features.append(index)# print 'features:',featuresfor index in features:#找到列的最适合做节点的索引,(损失最小)for row in dataSet:left, right = data_spilt(dataSet, index, row[index])#以它为节点的,左右分支loss = spilt_loss(left, right, class_values)if loss < b_loss:#寻找最小分割代价b_index, b_value, b_loss, b_left, b_right = index, row[index], loss, left, right# print b_loss# print type(b_index)return {'index': b_index, 'value': b_value, 'left': b_left, 'right': b_right}# 决定输出标签
def decide_label(data):output = [row[-1] for row in data]return max(set(output), key=output.count)# 子分割,不断地构建叶节点的过程
def sub_spilt(root, n_features, max_depth, min_size, depth):left = root['left']# print leftright = root['right']del (root['left'])del (root['right'])# print depthif not left or not right:root['left'] = root['right'] = decide_label(left + right)# print 'testing'returnif depth > max_depth:root['left'] = decide_label(left)root['right'] = decide_label(right)returnif len(left) < min_size:root['left'] = decide_label(left)else:root['left'] = get_best_spilt(left, n_features)# print 'testing_left'sub_spilt(root['left'], n_features, max_depth, min_size, depth + 1)if len(right) < min_size:root['right'] = decide_label(right)else:root['right'] = get_best_spilt(right, n_features)# print 'testing_right'sub_spilt(root['right'], n_features, max_depth, min_size, depth + 1)# 构造决策树
def build_tree(dataSet, n_features, max_depth, min_size):root = get_best_spilt(dataSet, n_features)sub_spilt(root, n_features, max_depth, min_size, 1)return root# 预测测试集结果
def predict(tree, row):predictions = []if row[tree['index']] < tree['value']:if isinstance(tree['left'], dict):return predict(tree['left'], row)else:return tree['left']else:if isinstance(tree['right'], dict):return predict(tree['right'], row)else:return tree['right']# predictions=set(predictions)def bagging_predict(trees, row):predictions = [predict(tree, row) for tree in trees]return max(set(predictions), key=predictions.count)# 创建随机森林
def random_forest(train, test, ratio, n_feature, max_depth, min_size, n_trees):trees = []for i in range(n_trees):train = get_subsample(train, ratio)#从切割的数据集中选取子集tree = build_tree(train, n_features, max_depth, min_size)# print 'tree %d: '%i,treetrees.append(tree)# predict_values = [predict(trees,row) for row in test]predict_values = [bagging_predict(trees, row) for row in test]return predict_values# 计算准确率
def accuracy(predict_values, actual):correct = 0for i in range(len(actual)):if actual[i] == predict_values[i]:correct += 1return correct / float(len(actual))if __name__ == '__main__':seed(1) dataSet = loadCSV('sonar-all-data.csv')column_to_float(dataSet)#dataSetn_folds = 5max_depth = 15min_size = 1ratio = 1.0# n_features=sqrt(len(dataSet)-1)n_features = 15n_trees = 10folds = spiltDataSet(dataSet, n_folds)#先是切割数据集scores = []for fold in folds:train_set = folds[:]  # 此处不能简单地用train_set=folds,这样用属于引用,那么当train_set的值改变的时候,folds的值也会改变,所以要用复制的形式。(L[:])能够复制序列,D.copy() 能够复制字典,list能够生成拷贝 list(L)train_set.remove(fold)#选好训练集# print len(folds)train_set = sum(train_set, [])  # 将多个fold列表组合成一个train_set列表# print len(train_set)test_set = []for row in fold:row_copy = list(row)row_copy[-1] = Nonetest_set.append(row_copy)# for row in test_set:# print row[-1]actual = [row[-1] for row in fold]predict_values = random_forest(train_set, test_set, ratio, n_features, max_depth, min_size, n_trees)accur = accuracy(predict_values, actual)scores.append(accur)print ('Trees is %d' % n_trees)print ('scores:%s' % scores)print ('mean score:%s' % (sum(scores) / float(len(scores))))

其二出自https://github.com/zhaoxingfeng/RandomForest

# -*- coding: utf-8 -*-
"""
@Env: Python2.7
@Time: 2019/10/24 13:31
@Author: zhaoxingfeng
@Function:Random Forest(RF),随机森林二分类
@Version: V1.2
参考文献:
[1] UCI. wine[DB/OL].https://archive.ics.uci.edu/ml/machine-learning-databases/wine.
"""
import pandas as pd
import numpy as np
import random
import math
import collections
from sklearn.externals.joblib import Parallel, delayedclass Tree(object):"""定义一棵决策树"""def __init__(self):self.split_feature = Noneself.split_value = Noneself.leaf_value = Noneself.tree_left = Noneself.tree_right = Nonedef calc_predict_value(self, dataset):"""通过递归决策树找到样本所属叶子节点"""if self.leaf_value is not None:return self.leaf_valueelif dataset[self.split_feature] <= self.split_value:return self.tree_left.calc_predict_value(dataset)else:return self.tree_right.calc_predict_value(dataset)def describe_tree(self):"""以json形式打印决策树,方便查看树结构"""if not self.tree_left and not self.tree_right:leaf_info = "{leaf_value:" + str(self.leaf_value) + "}"return leaf_infoleft_info = self.tree_left.describe_tree()right_info = self.tree_right.describe_tree()tree_structure = "{split_feature:" + str(self.split_feature) + \",split_value:" + str(self.split_value) + \",left_tree:" + left_info + \",right_tree:" + right_info + "}"return tree_structureclass RandomForestClassifier(object):def __init__(self, n_estimators=10, max_depth=-1, min_samples_split=2, min_samples_leaf=1,min_split_gain=0.0, colsample_bytree=None, subsample=0.8, random_state=None):"""随机森林参数----------n_estimators:      树数量max_depth:         树深度,-1表示不限制深度min_samples_split: 节点分裂所需的最小样本数量,小于该值节点终止分裂min_samples_leaf:  叶子节点最少样本数量,小于该值叶子被合并min_split_gain:    分裂所需的最小增益,小于该值节点终止分裂colsample_bytree:  列采样设置,可取[sqrt、log2]。sqrt表示随机选择sqrt(n_features)个特征,log2表示随机选择log(n_features)个特征,设置为其他则不进行列采样subsample:         行采样比例random_state:      随机种子,设置之后每次生成的n_estimators个样本集不会变,确保实验可重复"""self.n_estimators = n_estimatorsself.max_depth = max_depth if max_depth != -1 else float('inf')self.min_samples_split = min_samples_splitself.min_samples_leaf = min_samples_leafself.min_split_gain = min_split_gainself.colsample_bytree = colsample_bytreeself.subsample = subsampleself.random_state = random_stateself.trees = Noneself.feature_importances_ = dict()def fit(self, dataset, targets):"""模型训练入口"""assert targets.unique().__len__() == 2, "There must be two class for targets!"targets = targets.to_frame(name='label')if self.random_state:random.seed(self.random_state)random_state_stages = random.sample(range(self.n_estimators), self.n_estimators)# 两种列采样方式if self.colsample_bytree == "sqrt":self.colsample_bytree = int(len(dataset.columns) ** 0.5)elif self.colsample_bytree == "log2":self.colsample_bytree = int(math.log(len(dataset.columns)))else:self.colsample_bytree = len(dataset.columns)# 并行建立多棵决策树self.trees = Parallel(n_jobs=-1, verbose=0, backend="threading")(delayed(self._parallel_build_trees)(dataset, targets, random_state)for random_state in random_state_stages)def _parallel_build_trees(self, dataset, targets, random_state):"""bootstrap有放回抽样生成训练样本集,建立决策树"""subcol_index = random.sample(dataset.columns.tolist(), self.colsample_bytree)dataset_stage = dataset.sample(n=int(self.subsample * len(dataset)), replace=True, random_state=random_state).reset_index(drop=True)dataset_stage = dataset_stage.loc[:, subcol_index]targets_stage = targets.sample(n=int(self.subsample * len(dataset)), replace=True, random_state=random_state).reset_index(drop=True)tree = self._build_single_tree(dataset_stage, targets_stage, depth=0)print(tree.describe_tree())return treedef _build_single_tree(self, dataset, targets, depth):"""递归建立决策树"""# 如果该节点的类别全都一样/样本小于分裂所需最小样本数量,则选取出现次数最多的类别。终止分裂if len(targets['label'].unique()) <= 1 or dataset.__len__() <= self.min_samples_split:tree = Tree()tree.leaf_value = self.calc_leaf_value(targets['label'])return treeif depth < self.max_depth:best_split_feature, best_split_value, best_split_gain = self.choose_best_feature(dataset, targets)left_dataset, right_dataset, left_targets, right_targets = \self.split_dataset(dataset, targets, best_split_feature, best_split_value)tree = Tree()# 如果父节点分裂后,左叶子节点/右叶子节点样本小于设置的叶子节点最小样本数量,则该父节点终止分裂if left_dataset.__len__() <= self.min_samples_leaf or \right_dataset.__len__() <= self.min_samples_leaf or \best_split_gain <= self.min_split_gain:tree.leaf_value = self.calc_leaf_value(targets['label'])return treeelse:# 如果分裂的时候用到该特征,则该特征的importance加1self.feature_importances_[best_split_feature] = \self.feature_importances_.get(best_split_feature, 0) + 1tree.split_feature = best_split_featuretree.split_value = best_split_valuetree.tree_left = self._build_single_tree(left_dataset, left_targets, depth+1)tree.tree_right = self._build_single_tree(right_dataset, right_targets, depth+1)return tree# 如果树的深度超过预设值,则终止分裂else:tree = Tree()tree.leaf_value = self.calc_leaf_value(targets['label'])return treedef choose_best_feature(self, dataset, targets):"""寻找最好的数据集划分方式,找到最优分裂特征、分裂阈值、分裂增益"""best_split_gain = 1best_split_feature = Nonebest_split_value = Nonefor feature in dataset.columns:if dataset[feature].unique().__len__() <= 100:unique_values = sorted(dataset[feature].unique().tolist())# 如果该维度特征取值太多,则选择100个百分位值作为待选分裂阈值else:unique_values = np.unique([np.percentile(dataset[feature], x)for x in np.linspace(0, 100, 100)])# 对可能的分裂阈值求分裂增益,选取增益最大的阈值for split_value in unique_values:left_targets = targets[dataset[feature] <= split_value]right_targets = targets[dataset[feature] > split_value]split_gain = self.calc_gini(left_targets['label'], right_targets['label'])if split_gain < best_split_gain:best_split_feature = featurebest_split_value = split_valuebest_split_gain = split_gainreturn best_split_feature, best_split_value, best_split_gain@staticmethoddef calc_leaf_value(targets):"""选择样本中出现次数最多的类别作为叶子节点取值"""label_counts = collections.Counter(targets)major_label = max(zip(label_counts.values(), label_counts.keys()))return major_label[1]@staticmethoddef calc_gini(left_targets, right_targets):"""分类树采用基尼指数作为指标来选择最优分裂点"""split_gain = 0for targets in [left_targets, right_targets]:gini = 1# 统计每个类别有多少样本,然后计算ginilabel_counts = collections.Counter(targets)for key in label_counts:prob = label_counts[key] * 1.0 / len(targets)gini -= prob ** 2split_gain += len(targets) * 1.0 / (len(left_targets) + len(right_targets)) * ginireturn split_gain@staticmethoddef split_dataset(dataset, targets, split_feature, split_value):"""根据特征和阈值将样本划分成左右两份,左边小于等于阈值,右边大于阈值"""left_dataset = dataset[dataset[split_feature] <= split_value]left_targets = targets[dataset[split_feature] <= split_value]right_dataset = dataset[dataset[split_feature] > split_value]right_targets = targets[dataset[split_feature] > split_value]return left_dataset, right_dataset, left_targets, right_targetsdef predict(self, dataset):"""输入样本,预测所属类别"""res = []for _, row in dataset.iterrows():pred_list = []# 统计每棵树的预测结果,选取出现次数最多的结果作为最终类别for tree in self.trees:pred_list.append(tree.calc_predict_value(row))pred_label_counts = collections.Counter(pred_list)pred_label = max(zip(pred_label_counts.values(), pred_label_counts.keys()))res.append(pred_label[1])return np.array(res)if __name__ == '__main__':df = pd.read_csv("source/wine.txt")df = df[df['label'].isin([1, 2])].sample(frac=1, random_state=66).reset_index(drop=True)clf = RandomForestClassifier(n_estimators=5,max_depth=5,min_samples_split=6,min_samples_leaf=2,min_split_gain=0.0,colsample_bytree="sqrt",subsample=0.8,random_state=66)train_count = int(0.7 * len(df))feature_list = ["Alcohol", "Malic acid", "Ash", "Alcalinity of ash", "Magnesium", "Total phenols", "Flavanoids", "Nonflavanoid phenols", "Proanthocyanins", "Color intensity", "Hue", "OD280/OD315 of diluted wines", "Proline"]clf.fit(df.loc[:train_count, feature_list], df.loc[:train_count, 'label'])from sklearn import metricsprint(metrics.accuracy_score(df.loc[:train_count, 'label'], clf.predict(df.loc[:train_count, feature_list])))print(metrics.accuracy_score(df.loc[train_count:, 'label'], clf.predict(df.loc[train_count:, feature_list])))

0x10 参考

统计学中“最简单”的Bootstrap方法介绍及其应用 https://blog.csdn.net/SunJW_2017/article/details/79160369

分类器组合方法Bootstrap, Boosting, Bagging, 随机森林(一)https://blog.csdn.net/zjsghww/article/details/51591009

集成学习算法与Boosting算法原理 https://baijiahao.baidu.com/s?id=1619984901377076475

机器学习算法GBDT

终于有人说清楚了–XGBoost算法

xgboost的原理没你想像的那么难 https://www.jianshu.com/p/7467e616f227

为什么没有人把 boosting 的思路应用在深度学习上? https://www.zhihu.com/question/53257850

集成学习算法与Boosting算法原理 https://baijiahao.baidu.com/s?id=1619984901377076475

集成学习法之bagging方法和boosting方法 https://blog.csdn.net/qq_30189255/article/details/51532442

总结:Bootstrap(自助法),Bagging,Boosting(提升) https://www.jianshu.com/p/708dff71df3a

https://blog.csdn.net/zjsghww/article/details/51591009

集成学习(Ensemble Learning) https://blog.csdn.net/wydbyxr/article/details/82259728

Adaboost入门教程——最通俗易懂的原理介绍 http://www.uml.org.cn/sjjmwj/2019030721.asp

Boosting和Bagging: 如何开发一个鲁棒的机器学习算法 https://ai.51cto.com/art/201906/598160.htm

为什么bagging降低方差,boosting降低偏差?https://blog.csdn.net/sinat_25394043/article/details/104119469

bagging与boosting两种集成模型的偏差bias以及方差variance 的理解 https://blog.csdn.net/shenxiaoming77/article/details/53894973

用通俗易懂的方式剖析随机森林 https://blog.csdn.net/cg896406166/article/details/83796557

python实现随机森林 https://blog.csdn.net/colourful_sky/article/details/82082854

https://github.com/zhaoxingfeng/RandomForest

数据分析(工具篇)——Boosting https://zhuanlan.zhihu.com/p/26215100

AdaBoost原理详解

知识篇——基于AdaBoost的分类问题 https://www.jianshu.com/p/a6426f4c4e64

数据挖掘面试题之梯度提升树 https://www.jianshu.com/p/0e5ccc88d2cb

★★★★★★关于生活和技术的思考★★★★★★
微信公众账号:罗西的思考
如果您想及时得到个人撰写文章的消息推送,或者想看看个人推荐的技术资料,可以扫描下面二维码(或者长按识别二维码)关注个人公众号)。
在这里插入图片描述

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

相关文章

  1. 小白如何学习Python?选对方法很重要

    近年来,Python应用领域增多、就业薪资上涨,这吸引了很多人关注学习。更重要的是Python语法简洁、功能强大,即使是0基础也能学会,这让很多想要从事IT开发的人看到了希望。不过新手小白如何学习Python呢?Python是一门语法简洁、功能强大、上手简单的计算机编程语言,根据TIO…...

    2024/4/20 15:26:25
  2. Avoiding != null statements 避免判空语句

    问题 来源Stack Overflow 为了避免空指针,我们常常会看到这样的语句if (someobject != null) {someobject.doCalc();}最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 回答一 To put this another way, there are two instances whe…...

    2024/4/20 16:54:49
  3. Linux安装Redis 完整步骤

    安装:1.获取redis资源wget http://download.redis.io/releases/redis-4.0.8.tar.gz2.解压tar xzvf redis-4.0.8.tar.gz3.安装cd redis-4.0.8makecd srcmake install PREFIX=/usr/local/redis4.移动配置文件到安装目录下cd ../mkdir /usr/local/redis/etcmv redis.conf /usr/lo…...

    2024/4/26 16:55:11
  4. 工作三年的java开发工程师来面试,问技术原理他竟然这样跟我说

    今天面试一个三年的java开发工程师,问工作原理他答不上来。这是当时的面试过程:问: spring mvc在开发中常用吧?答:常用。问:那你能讲讲它的工作原理吗?答:会用就行,了解原理干啥。微微一笑,再问:那你能说说平时使用了它的哪些注解呢?答:用的时候百度一下,谁记这个…...

    2024/4/23 14:50:42
  5. 高并发那些事

    高并发分布式架构演进之路关于高并发的常见概念 分布式:系统中的多个模块部署在不同的服务器上面,即可称为分布式系统,比如django和数据库分别部署在不同的服务器上面,或者同一份代码部署在多个服务器上高可用 系统中的某个节点失效时,其他节点能够接替它继续提供服务,则可以认…...

    2024/4/23 14:50:42
  6. 2020年熔化焊接与热切割证模拟考试题库及熔化焊接与热切割理论考试试题

    题库来源:安全生产模拟考试一点通公众号小程序2020年熔化焊接与热切割证模拟考试题库及熔化焊接与热切割理论考试试题是由公众号安全生产模拟考试一点通提供,熔化焊接与热切割证模拟考试题库是根据熔化焊接与热切割最新版教材,熔化焊接与热切割大纲整理而成(含2020年熔化焊…...

    2024/4/28 6:55:06
  7. Element-ui 表格 (Table)组件中滚动条样式修改

    1. 修改单个滚动条样式 在对应组件的样式中使用穿透 <style lang="scss" scoped> .el-table {/deep/ .el-table__body-wrapper::-webkit-scrollbar {width: 10px; /*滚动条宽度*/height: 10px; /*滚动条高度*/}/*定义滚动条轨道 内阴影+圆角*//deep/ .el-table…...

    2024/4/28 17:56:32
  8. JS-网络协议

    JS部分自学笔记网络协议 物理层、数据链路层、网络层(IP)、传输层(TCP/UDP)、应用层(HTTP、HTTPS)TCP:面向连接的协议(快递、外卖) 1.建立连接(三次握手)2.传输数据 3.断开连接(四次挥手)优点:安全;准确度非常高 缺点:传输效率低、耗资源UDP:无连接的协议(适…...

    2024/4/28 15:57:59
  9. 2n皇后问题(经典8皇后问题)

    8皇后问题是回溯算法的经典案例,回溯又称深搜,简单来说就是递归的枚举。 回溯算法优于穷举在于一旦遇到达不到目标或不优,立即向上返回重新选择,寻找别的路径。 有点像暴力破解,不过一旦不达目标则不继续当前方案,因此是比暴力破解省下减少很多运算量 问题描述给定一个n*…...

    2024/4/28 12:56:36
  10. JS学习(3)

    1.事件和事件类型事件发生必须绑定 绑定事件1.内联模式2.外联模式/脚本模式(最多) 绑定事件格式:元素节点.on+事件类型 = 匿名函数 click 事件类型 onclick 事件处理函数事件类型的种类 一、鼠标事件(可以绑定任意的元素节点上)click 单击 dblclick 双击 mouseover 鼠…...

    2024/4/29 2:34:19
  11. Shiro入门 -- 集成Spring

    1、创建maven-webapp项目,引入依赖<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><…...

    2024/4/28 12:19:08
  12. Data Types Systemverilog 笔记 2

    数据类型概述:Integer 有四状态和双状态整数型。四状态 双状态logic;reg;wire;integer;time shortint;int;longint;byte;bitString 可保存长度可变的字符串,单个字符是byte类型。常用字符串方法event event evt;/*声明evt事件*/ -> evt;/*触发evt*/ @(evt)/*捕获evt触发*/…...

    2024/4/28 15:29:51
  13. Pandas入门3(dtype+fillna+replace+rename+concat+join)

    文章目录5. dtype 数据类型6. Missing data 缺失值6.1 查找缺失值 pd.isnull(),pd.notnull()6.2 填补缺失值 fillna(),replace()7. Renaming and Combining 重命名、合并7.1 Renaming 重命名7.2 Combining 合并数据 learn from https://www.kaggle.com/learn/pandas 上一篇:…...

    2024/4/28 5:24:02
  14. C/S架构学习之 SOCKET

    什么是socket? socket又译为“嵌套字”,是计算机之间进行通信的一种约定,通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 为了与远程计算机进行数据传输,可以通过Internet。socket就是用来连接到Internet的工具,即网络连接工具…...

    2024/4/28 5:22:45
  15. TBSS分析之路

    我自己用的是Windows电脑。进行TBSS 分析需要Mac 系统或者Linux 系统,因为它是基于FSL 的一个工具包,而FSL 只能在Linux系统或者mac 上安装和使用。为了运行TBSS, 我征用了我老公的mac,然后在他的电脑的一通操作,首先装了XQuartz.app(装FSL )之前必须要先装这个工具。然后…...

    2024/4/28 12:21:14
  16. 阿里面试官问我:如何加载100M的图片却不撑爆内存?你会咋答?

    还记得当年面试一个面试官问我怎么加载巨图才能不撑爆内存,我没回答上来,他说分片显示,我寻思特么分片能减少内存使用??现在可以打他脸了!内容扩展1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?2.内存中如果加载一张 500*500 的 png 高清图…...

    2024/4/29 0:14:16
  17. 大二下期学期计划

    我是一名大二软件技术专业的学生。在这个学期由于疫情的原因,我们推迟了两个多月才开学,虽然在家也有在上网课,但是还是耽搁了许多课程。大二时,要真正的转入大学生角色,把高中固有的思维和学习,生活方式切实的转变过来。认识贵大的一切,认识- -些老师,熟悉-点人文地理…...

    2024/4/28 23:21:24
  18. 简单的绝对值和阶乘的方法

    简单的绝对值方法:function abs(vm){if(vm>=0){return vm;}else{return -vm;} }简单的阶乘方法//方法一: function factorial1(n){let product = 1;while(n>1){product *= n;n--;}return product; } factorial1(6) //方法二: function factorial2(n){let i,product = …...

    2024/4/28 16:49:50
  19. dubbo入门搭建教程

    Dubbo的使用背景公共的逻辑业务提取出来形成服务,使得相同逻辑代码复用,各个层级之间最大限度的松耦合。版本2.5.10 安装过程 1、准备前提 (1)安装Zookeeper建议参考 (2)安装Tomcat建议参考 2、下载dubbo项目,并打成war包 (1)下载地址:点击链接下载 (2)解压,并找到…...

    2024/4/28 11:32:40
  20. vscode适合初学者的最佳ide

    选择vscode的原因:学习python,有个顺手的ide还是必要的,从sumblime 到pycharm,其实pycharm最多也就用了五天,感觉就是不喜欢,太麻烦了,虽然功能强大,但是就是不喜欢,各种坑踩完之后, 微软的集成包太大了,下载安装,启动都不方便,自带的ide太扎眼,最后用上了vscode…...

    2024/5/1 14:36:05

最新文章

  1. 数据结构(十一)----图的应用

    目录 一.最小生成树 1.Prim算法&#xff08;普里姆&#xff09; 2.Kruskal算法(克鲁斯卡尔): 二.最短路径&#xff08;BFS算法&#xff09; 1.单源最短路径 &#xff08;1&#xff09;BFS算法&#xff08;无权图&#xff09; &#xff08;2&#xff09;Dijkstra算法&…...

    2024/5/6 7:37:55
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 北航2023年考研机试题

    【问题描述】一共6个手机基站&#xff0c;具有记录手机连接基站的能力&#xff0c;6个手机基站分别为ABCDEF&#xff0c;他们具有自己的覆盖范围且任何两个基站的覆盖范围不想交&#xff0c;基站保存的手机登陆日志包括手机号&#xff08;11位&#xff0c;用字符串保存&#xf…...

    2024/5/5 8:38:20
  4. Go语言中如何实现继承

    完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go语言中没有传统意义上的类和继承的概念&#xff0c;但可以通过嵌入类型&#xff08;embedded types&#xff09;来实现类似的功能。嵌入类型允许一个结构…...

    2024/5/5 8:37:47
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57