2020年因果推断综述《A Survey on Causal Inference》
最近阅读了TKDD2020年的《A Survey on Causal Inference》,传送门,自己对文章按照顺序做了整理,同时对优秀的内容进行融合,如有不当之处,请多多指教。
文章对因果推理方法进行了全面的回顾,根据传统因果框架所做的三个假设,将这些方法分为两类,对于每个类别,都讨论和比较了传统的统计方法和最近的机器学习方法。
1. 背景介绍
相关性: 当两个变量呈现增加或减少的趋势,它们就是相关的。
因果关系: 部分原因造成了结果,而结果部分地依赖于原因。
例如:冰激凌销量与溺水死亡率
观察到随着冰淇淋销量增加,溺水死亡率急剧上升的现象。简单的相关性认为,吃冰淇淋会导致溺水;吃冰淇淋和游泳背后共同因素是季节。在炎热的夏季,冰淇淋的销售速度远高于寒冷的月份,而且在炎热的夏季,人们更有可能进行游泳活动,这就是因果关系。
因此,搞清因果推理背后的原因是有价值的,而最有效的方法则是进行随机对照实验
,实验组和对照组的差异
即因果因素分析。
存在问题:
- 在现实中,随机对照试验总是代价昂贵的,受试者样本不足,不能代表实验/干预最终目标的现实世界人群。
- 另一个问题是,随机对照试验只关注样本的平均值,并没有解释机制或适用于个别受试者。
- 此外,大多数随机对照试验还需要考虑伦理问题,这在很大程度上限制了其应用。
因此,现实中只能拿到非随机对照实验的数据,也称观察数据。比如在医院里面就记录了每个人病人就医时的情况(特征)、医生开的药(treatment)、病人用药后的效果(outcome),这些就是观察数据。无论是随机对照实验的数据(RCT)还是观察数据,在因果推断领域都是这样的三元组,<X,W,Y>,X是特征,W是施加的treatment,Y是outcome。
为了准确预估因果效应,解决观察数据的问题,人们提出了各种框架,比较有名的是:potential outcome framework(POF)、structural causal model(SCM)。
- POF:倾向于预估反事实的效果(即potential outcome)
- SCM:引入了因果图和结构方程,因果图构建因果结构,结构方程则衡量因果效益的大小
本文介绍潜在结果框架的基本概念
及其三个关键假设
,以确定因果效应。然后,详细讨论了基于这三个假设的七种因果推理方法
,包括重新加权方法、分层方法、基于匹配的方法、基于树的方法、基于表示的方法、基于多任务学习的方法和基于元学习的方法。还描述了放宽三个假设
的因果效应估计方法,以满足不同情况下的需求。
2. 基本概念
因果推断的任务核心目标就是找到影响结果产出的核心因素。
比如一种病有A、B 两种药可以治疗,医生给一个病人吃A药,成功率为70%,如果吃B药,成功率为90%。成功率及其变化就是因果推断希望能够从数据中学习到的。
2.1 基础定义
- unit: 因果推断里最小的物理单元,具有原子性的。单位可以是一个实体,一个公司,一个病人,一个人,或者一个物体或人的集合。
- treatment: 对一个unit施加的动作。比如潘金莲给大郎喂药,喂药就是treatment。一般用W表示,比如W=1表示吃药(施加treatment),W=0表示不吃药(没有施加treatment)。
- outcome: 某个unit在某个treatment下的表现,比如吃药之后好了还是没好。一般用Y表示,Y(W=1)表示这个人在吃药后的表现,如果Y=1表示病好了,则Y(W=1)=1的含义是这个人吃药之后病好了。同理,Y(W=1)=0表示这个人吃药之后病没有好。
- observed outcome: unit在实际的treatment下的表现,这个人实际是吃了这个药的,一般用YF=Y(W=w)Y^F=Y(W=w)YF=Y(W=w)表示。
- potential outcome: unit在潜在的treatment下的表现,比如这个人没有吃药,但是如果吃药了,其表现就是potential outcome,其实就是如果怎么做就会怎么样的结果。
- Counterfactual outcome: 是除单位实际采取的治疗之外的治疗的潜在结果。由于一个单位只能接受一种治疗,因此只能观察到一种潜在结果,其余未观察到的潜在结果就是反事实结果。一般用YCF=Y(W=w′)Y^{CF}=Y(W=w')YCF=Y(W=w′)表示。
- Pre-treatment Variables: 实施treatment前变量是一种不受treatment影响的变量,也被称为背景变量,它们可以是患者的人口统计数据、病史等。
- Post-treatment Variables: 实施treatment后变量是受治疗影响的变量。治疗后变量的一个例子是中间结果,例如前面提到的药物例子中服用药物后的实验室测试。
- treatment effect: 施加了treatment后的增量效果(or 增益),比如吃药之后相比于没有吃药,其治愈率提升了多少,其存在如下3个维度:
- Average Treatment Effect (ATE) : ATE=E[Y(W=1)]−E[T(W=0)]ATE = E[Y(W=1)] - E[T(W=0)]ATE=E[Y(W=1)]−E[T(W=0)],所有人的平均treatment effect。
- Conditional Average Treatment Effect (CATE): CATE=E[Y(W=1)∣X=x]−E[Y(W=0)∣X=x]CATE = E[Y(W = 1)|X = x] − E[Y(W = 0)|X = x]CATE=E[Y(W=1)∣X=x]−E[Y(W=0)∣X=x],在特征X=xX=xX=x的子人群里面treatment effect。
- Individual Treatment Effect (ITE): ITEi=Yi(W=1)−Yi(W=0)ITE_i = Y_i (W = 1) − Y_i (W = 0)ITEi=Yi(W=1)−Yi(W=0),某个unit(个体维度)的treatment effect。
2.2 三大假设
- Stable Unit Treatment Value Assumption (SUTVA): 任何单位的潜在结果(potential outcome)不会随着分配给其他单位的治疗而变化,并且,对于每个单位,每个治疗水平没有不同的形式或版本。这一假设强调两点:
- 第一是各单元的独立性,即各单元之间不存在相互作用。
- 第二是每种治疗是单一版本。如不同剂量的A药在SUTVA假设下是不同的治疗方法。
- Ignorability(可忽略性): 考虑到背景变量X,治疗分配W与潜在结果无关。可忽略性假设表明了三方面:
- 第一,如果两个患者具有相同的背景变量X,无论治疗分配如何,他们的潜在结果都应该是相同的。
- 第二,如果两个患者具有相同的背景变量值,无论他们的潜在结果值如何,他们的治疗分配机制应该是相同的。
- 第三,不存在某个在X之外的隐变量,同时影响outcome和treatment,使得treatment和outcome相关,因此这个假设又称unconfoundedness assumption。
- Positivity(正向性): 对于X的任何值,治疗分配都不是确定的概率。每个人都有概率被施加任何treatment,并且人群中存在所有的treatment。
2.3 Confounders and General Solutions(混淆因子和通用解决方案)
- Confounders(混淆因子): 是对实验结果有干扰的变量。如医药分析案例的年龄就是混淆因子。
- Selection bias(选择偏差): 正如ATE的定义,ATE=E[Y(W=1)]−E[T(W=0)]ATE = E[Y(W=1)] - E[T(W=0)]ATE=E[Y(W=1)]−E[T(W=0)],在机器学习领域,为了能够得到这个值,简单粗暴地用2个模型预估E[Y(W=1)]E[Y(W=1)]E[Y(W=1)]和E[T(W=0)]E[T(W=0)]E[T(W=0)],然后做差值即可得到ATE,但是由于混淆变量(Confounders)的存在,导致ATE的计算会存在很大的偏差,这种偏差就称为选择偏差。
我们再看一个辛普森悖论问题,比如,现在有两种药A和B,我们希望看看每种药的效果,如果直接看总的治愈率,A是83%,B是78%,A药的效果比B好
。但是如果根据用户的年龄划分,年轻病人中:A的治愈率是87%,B是92%;年老病人中A的治愈率是69%,B是73%。这么看,B药的效果反而比A好
。这个问题又被成为辛普森悖论。
出现悖论的原因是年轻的病人其症状更轻微,因此医生倾向于开A种药,年老的病人则开B种药,由于年轻病人的抵抗力一般较好,治愈率都比较高,所有总体看,会得出A药的效果比B药的效果好的错误结论。在这里,年龄这个变量就是一个Confounder。
避免Confounders导致的Selection bias通常有2种方法:
- match: 施加了不同treatment的人,需要需要经过匹配之后再做比较,比如选择的都是年轻人,这样就是模拟控制变量的做法。一般方法有sample re-weighting, matching, tree-based methods, confounder balancing, balanced representation learning methods, multi-task based methods。
- Meta-learning: 先基于观察数据训练模型,得到有偏的结果,后续对结果进行纠正。
3. 基于3大假设的常用方法
一般主要分为以下几类方法:
- re-weighting methods;
- stratification methods;
- matchingmethods;
- tree-based methods;
- representation based methods;
- multi-task methods;
- meta-learning methods.
3.1 Re-weighting Methods
由于混杂因子的存在,实验和对照组的协变量分布不同,将会导致选择偏差问题,而样本加权是克服选择偏差的有效方法,为数据每个单位分配适当的权重,可以创建一个治疗组和对照组分布相似的伪总体。
倾向分数(propensity score): 是平衡分数的一种特殊情况。e(x)=Pr(W=1∣X=x)e(x) = Pr (W = 1|X = x)e(x)=Pr(W=1∣X=x)
在倾向分数的基础上,提出了基于倾向评分的样本重加权。Inverse propensity weighting(IPW) 称为处理加权的逆概率,为每个样本分配一个权重r:r:r:r=We(x)+1−W1−e(x)r = \frac{W}{e(x)}+ \frac{1-W}{1-e(x)}r=e(x)W+1−e(x)1−W。
WWW为Treatment,e(x)e(x)e(x)定义如上。
IPW 中的DR estimator方法将倾向评分权重与结果回归结合起来,因此即使倾向评分或结果回归中的一个不正确(但不是两个都不正确),具有鲁棒性。
CBPS 直接从估计的参数倾向性得分构建协变量平衡得分,增加了对倾向性得分模型错定的鲁棒性。
Data-Driven Variable Decomposition(D2VD) 算法提出了区分混杂因素和调整变量,同时剔除不相关变量的方法。
实践中对观测变量之间相互作用的先验知识很少,数据通常是高维的和有噪声的。为了解决这个问题,Confounder Balancing, DCB算法用于选择和区分混杂因素以平衡分布。总的来说,DCB通过重新加权样本和混杂因素来平衡分布。
3.2 Stratification Methods
同一亚组中的单位可以被视为来自随机对照试验数据的样本。基于每个亚组的同质性,可以通过随机对照试验(rct)数据开发的方法计算每个亚组(即CATE)内的治疗效果。或者换种说法,即通过将treatment组和control组划分成为同质的子人群,消除confounder,从而消除选择偏差。简单来说就是将观察数据构建成控制变量的随机实验的数据,从而可以得到类似于AB实验的置信的数据。
比如根据倾向性得分划分多个子人群,使得子人群是同质的,从而求得子人群的ATE。缺点是treatment组和control组在倾向性得分的重叠度不一定高,导致子人群样本量少,偏差大。ATE的计算过程如下:
其中Y^t(j)\hat{Y}_t (j)Y^t(j)和Y^c(j)\hat{Y}_c (j)Y^c(j)分别是第j个子块中处理结果和控制结果的平均值。q(j)q(j)q(j)是第j个方块中单位的比例,分层有效地减小了ATE估计的偏差。分层方法的关键是如何创建块和如何组合创建的块。等频率方法是创建块的常用策略。等频率方法按出现概率(如倾向得分)分割块,使协变量在每个子组中具有相同的出现概率(即倾向得分)。
3.3 Matching Methods
基于匹配的方法提供了一种估计反事实的方法,同时减少了混杂因素带来的估计偏差。可以理解为因为每个人要么在treatment组(w=1),要么在control组(w=0)。对于在treatment组的人(原始人群),需要在control组中找到相似特征的相似人群,用相似人群的outcome来近似原始人群在control组中的outcome。一般来说,通过匹配估计的第i个单元的潜在结果为:
其中Y^i(0)\hat{Y}_i(0)Y^i(0)和Y^i(1)\hat{Y}_i(1)Y^i(1)是实验和对照估计结果,J(i)表示相反实验组中单元i匹配的邻居。
基于匹配的方法核心思想是经过变换后的倾向性评价距离,从而减少偏差,现有方法集中于Hilbert-Schmidt Independence Criterion based nearest neighbor matching (HSIC-NNM)和Randomized Nearest Neighbor Matching(RNNM)、nearest-neighbor matching (NNM)、Johnson–Lindenstrauss (JL),即通过线性或者非线性方法投影特征,进而计算距离减少偏差。常见的方法总结如图:
3.4 Tree-based Methods
基于决策树学习是一种预测建模方法。决策树是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据推断出的简单决策规则来预测目标变量的值。目标变量是离散的树模型称为分类树,其预测误差是根据错误分类代价测量的。在这些树结构中,叶子表示类标签,分支表示指向这些类标签的特征的连接。目标变量是连续的决策树被称为回归树,其预测误差由观测值和预测值之间的差的平方来测量。Classification And Regression Tree(CART)分析是一个总称,用于指代上述两个过程。CART模型对数据空间进行了分区,并为每个分区空间拟合了一个简单的预测模型,因此每个分区都可以图形化地表示为一棵决策树。
树模型在分裂过程中,每个节点的特征都是一样的,因此在做matching上有天然的优势,可以得到偏差较小的CATE的值,不过现有的树模型无法完成因果推断的任务,还需要修改树的分裂标准和输出值计算,通常输出值就是CATE。
Bayesian Additive Regression Trees(BART)有几个优势。它很容易实现,只需要插入结果、治疗分配和混杂协变量,无需关于这些变量如何参数相关的信息,以便在拟合模型时需要更少的猜测,此外,它可以处理大量的预测因子,产生一致的不确定性区间,并处理连续的处理变量和缺失数据。基于树的框架也可以扩展到一维或多维的处理。每个维度可以是离散的或连续的。树状结构用于指定用户特征和相应处理之间的关系。这个基于树的框架对于建模错误规范非常健壮,并且高度灵活,只需进行最少的手工调优。
3.5 Representation Learning Methods
表示学习通常是通过转换原始协变量或从协变量空间中提取特征来学习输入数据的表示。特别关注深度学习,多个非线性变换的组合可以产生更抽象,最终更有用的表示。深度表示学习模型能够自动搜索相关的特征并将它们组合在一起,从而实现更有效和更准确的反事实估计,而传统机器学习方法需要用户准确地识别特征。到目前为止,基于深度表征学习的方法已经取得了重大进展,以克服观测数据因果效应估计的挑战。我们将基于深度表示学习的方法分为基于领域适应的方法、基于匹配的方法和基于持续学习的方法。
基于表征的域适配(Domain Adaptation Based on Representation Learning): 提取有效的特征表示是领域自适应的关键。在接下来的讨论中,差异距离在解决因果推理中的域适应问题中起着重要的作用。学习特征表示有三大目标:
(1)基于事实表示法的低误差预测;
(2)考虑相关事实结果,对反事实结果进行低误差预测;
(3)处理实验组与对照组的分布距离
基于表征的匹配方法(Matching Based on Representation Learning): 更容易解释,因为任何样本的反事实结果都直接被设定为接受相反处理的组中与其最近的邻居的事实结果。
基于表征的持续学习方法(Continual Learning Based on Representation Learning): 现有的表示学习方法只关注特定来源和平稳的观测数据。这样的学习策略假设所有的观察数据在训练阶段已经可用,并且只有一个来源。这一假设在实践中是站不住脚的。
3.6 Multi-task Learning Methods
因果推断可以被定义为一个多任务学习问题,其中实验组和对照组有一组共享层,实验组和对照组分别有一组特定层。通过倾向分数的关联程度的dropout概率,对网络结构进行优化。多任务模型可以扩展到多个实验组中,而每个实验组的可以对参数连续性进行处理,如dose response network (DRNet)对实验的剂量进行区间化处理进行实验。
3.7 Meta-Learning Methods
因果推断里有2个关键的任务:
(1)控制混杂因素,即消除混杂因素与结果之间的伪相关性;
(2)给出了CATE估计的精确表达式。
一般来说,基于元学习的算法基于两步骤完成上述任务:
(1)估计条件平均结果E[Y∣X=X]E[Y |X = X]E[Y∣X=X],这一步学习到的预测模型为基础学习器。
(2)推导基于步进结果差异的CATE估计器,现有的元学习方法有T−learner、S−learner、X−learner、U−learnerT-learner、S-learner、X-learner、U-learnerT−learner、S−learner、X−learner、U−learner和R−learnerR-learnerR−learner。
T−learnerT-learnerT−learner和S−learnerS-learnerS−learner高度依赖训练基模型的性能。当两组的单元数量极度不平衡(即一组的单元数量远远大于另一组)时,在小组上训练的基础模型的性能会很差。为了克服这一问题,提出了X−learnerX-learnerX−learner,它采用对照组的信息,对处理组给出更好的估计,反之亦然。
4. 三种假设的放宽情形
-
Relaxing Stable Unit Treatment Value Assumption(SUTVA):这个假设主要集中在两个方面
(1)单元是独立和同分布的(i.i.d); 如和图相关的社交网络问题,信号处理(signal processing),时间序列问题(time series problem)。
(2)只存在一种程度的treatment。如treatment是连续值,比如药品的剂量,可以将连续值转化为离散值。 -
Relaxing Unconfoundedness Assumption:现有的工作绝大多数依赖于无混淆性假设,即所有混淆因素都可以测量。然而,这种假设在实践中可能是站不住脚的。
-
Relaxing Positivity Assumption:正向性假设也称为协变量重叠或共同支持,是观察性研究中确定treatment效果的必要假设。然而,很少有文献讨论在高维数据集中满足这一假设。也就是说,这个假设保证了在任何的X下,所有treatment的数据都存在,但是在高维的X下,样本是很少的,不一定存在所有treatment的样本。
5. 实践应用
5.1 常用数据集
IHDP、Jobs、Twins、ACIC datasets、IBM等其他数据集,感兴趣的请参考原论文。
5.2 常见代码库
- Dowhy,Python,https://github.com/py-why/dowhy
- Causal ML,Python,https://github.com/uber/causalml
- EconML,Python,https://github.com/microsoft/EconML#blogs-and-publications
- causalToolbox,R,https://github.com/soerenkuenzel/causalToolbox
- dragonnet,Python,https://github.com/claudiashi57/dragonnet
- DRNets,Python,https://github.com/d909b/drnet
6. 常见的应用方向
- Decision evaluation:决策相关
- Counterfactual estimation:反事实预估
- Dealing with selection bias:消除选择偏差
6.1 广告系统
如果可以正确地预估广告营销活动的收益,那么就可以给决策提供准确的数据支持,并且可以判断进行哪些广告营销活动可以带来最大的收益,如果和优化理论相结合,就可以求解在有约束条件下最大化收益的广告策略。由于随机对照实验成本较高,因此利用观察数据衡量广告收益就是一个比较重要的方向。
6.2 推荐系统
推荐和treatment effect的预估密切相关,因为给用户推荐一个item,可以认为是施加一个treatment。并且在推荐领域,选择偏差更加严重,因为用户更倾向于点击自己喜欢的item,因此推荐系统会给用户推荐他们感兴趣的item,这就导致观察数据有很大的偏差。
6.3 医药方面
当每个病人在每种药的疗效都能够准确的预估之后,医生也更有针对性的提供药方。
6.4 强化学习方面
在强化学习领域的因果推断,可以看做是一个多臂老虎机问题,treatment就是action,outcome就是reward,X特征就是上下文的特征,exploration and exploitation就类似于随机实验数据和观察数据。
6.5 自然语言处理方面
去混淆词汇特征学习旨在学习对一组目标变量具有预测性但与一组混淆变量不相关的词汇特征。它对语言分析和下游任务的解释具有重要意义。
6.6 计算机视觉方面
现有的大多数工作依赖于相关性,而不是因果相关的证据,数据中的虚假相关性导致模型对问题的语言变化非常脆弱。为此,在提出了一种数据增强策略,使模型对伪相关具有更强的鲁棒性。
6.7 其他应用
教育: 通过比较不同教学方法对学生群体的影响,可以确定更好的教学方法。此外,ITE评估可以通过评估每个学生在不同教学方法下的结果来增强个性化学习。例如,ITE评估是用来回答这样的问题:“当这个学生不能解决问题时,这个学生是从视频提示中受益更多,还是从文本提示中受益更多?”,这样智能导师系统就可以决定哪个提示更适合特定的学生。
政策决策: 在政治领域,因果推理可以提供决策支持。例如,针对工作数据集开发了各种方法,旨在回答“谁将从补贴工作培训中受益最大?”因果推断还有助于政治决策,例如是否应该将一项政策推广到较大的人口规模。
改进机器学习方法: 其实说白了就是增强了模型的可解释性。也可以扩展以提高机器学习方法的稳定性,提高模型在未知领域的泛化能力。
7. 未来方向
- 增加或放宽因果模型中的假设
- 在不同的因果模型之间建立正式的联系
- 因果推理的机器学习”和“机器学习的因果推理
- 让机器学习具备因果推理能力
- 动态环境中的因果推理
参考文献:
- https://zhuanlan.zhihu.com/p/576878672(这篇文章给我了很多启发,老哥还是很棒的)
- https://zhuanlan.zhihu.com/p/554682071
- https://blog.csdn.net/baidu_39413110/article/details/111411360
- https://www.cnblogs.com/caoyusang/p/13518354.html
- https://blog.csdn.net/qq_40707758/article/details/123348551
相关文章:
2020年因果推断综述《A Survey on Causal Inference》
最近阅读了TKDD2020年的《A Survey on Causal Inference》,传送门,自己对文章按照顺序做了整理,同时对优秀的内容进行融合,如有不当之处,请多多指教。 文章对因果推理方法进行了全面的回顾,根据传统因果框…...
嵌入式linux系统测试程序编写
文章目录 网络CPU load监测性能设定开源测试工具iozone —— 文件系统测试工具iperf —— 网络性能测试工具LMbench —— 系统性能评测LTP —— linux功能/性能压力测试memtester —— 内存测试,坏位检测stressapptest —— 内存流量压力测试stream —— 内存性能测试fio ——…...
力扣SQL刷题5
目录597. 好友申请 I:总体通过率602. 好友申请 II :谁有最多的好友603. 连续空余座位1045. 买下所有产品的客户597. 好友申请 I:总体通过率 官方讲的题目太繁琐了,大概就是(表2中列1列2不全相同的行数)/&a…...
动态规划详解(完结篇)——如何抽象出动态规划算法?以及解题思路
今天直接开始讲解FIRST:如何抽象出动态规划算法?这个问题,困扰了无数代OIER,包括本蒟蒻在比赛的时候,看一道题,怎么想到他是什么算法的呢?这就需要抽象能力而不同的算法,往往有着不同…...
C语言一维数组篇【下】——每日刷题经验分享
一维数组篇——每日刷题经验分享~😎前言🙌有序序列插入一个整数 😊序列中删除指定数字 😊序列中整数去重小乐乐查找数字筛选法求素数总结撒花💞😎博客昵称:博客小梦~ 😊最喜欢的座右…...
VHDL语言基础-组合逻辑电路-其它组合逻辑模块
目录 多路选择器: 逻辑功能: 常用的类型: 4选1多路选择器的实现: 求补器: 求补器的实现: 三态门: 三态门的应用实例: 三态门的实现: 缓冲器: 什么是…...
初识Vue
文章目录1. 前言2. Vue 的特点3. 安装 Vue4. HelloWord1. 前言 vue是什么 ? 引用 : vue.js 文档 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层…...
TOUGH系列软件建模实践方法及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合
查看原文>>> https://mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247578057&idx7&sn75f8d2c1c6edb28af76a8db4bb773de3&chksm9be2aed9ac9527cf0081082cdcf781e6c37f9f3ba383332ed1116abcbee0f05c0593187e964d&token2070450548&langzh_CN#r…...
Codeforces Round #699 (Div. 2)
E. 题意:n本书,每本书有颜色a[i],一次操作可以将其中一本书放在末尾,求满足:相同颜色的书都是相邻的 的最小操作次数. 显然最多只需要n次,考虑能节省多少次.倒着考虑,记f[i]为i~n最多能节约的次数.先预处理出每种颜色的出现的位置范围l[i],r[i]. 1.不节约这本书f[i] f[i 1]…...
MySQL存储过程的传参和流程控制
目录 一.存储过程传参—in 演示 二.存储过程传参—out 演示 三.存储过程传参—inout 演示 四.流程控制—判断 格式 演示 五.流程控制—case 语法 演示 六.流程控制—循环 循环—while 循环—repeat 循环—loop 一.存储过程传参—in in表示传入的参数,可以传…...
MySQl学习(从入门到精通11)
MySQl学习(从入门到精通11)第 14 章_视图1. 常见的数据库对象2. 视图概述2. 1 为什么使用视图?2. 2 视图的理解3. 创建视图3. 1 创建单表视图3. 2 创建多表联合视图3. 3 基于视图创建视图4. 查看视图5. 更新视图的数据5. 1 一般情况5. 2 不可…...
关于ThreadLocal
弱引用 1.1 java中的各种引用和测试: https://blog.csdn.net/thewindkee/article/details/102723838 1.2 treadlocal中的弱引用测试: https://blog.csdn.net/thewindkee/article/details/103726942 (这篇很重要) 内存泄露: https://zhuanlan.zhihu.com/p/523628871 综合考虑 …...
【C++】类和对象(中)
文章目录1. 类的6个默认成员函数2. 构造函数概念特性3. 析构函数概念特性4. 拷贝构造函数概念特征5. 运算符重载5.1 前置和后置重载5.2 赋值运算符重载6. 日期类的实现7. const成员8. 取地址及const取地址操作符重载1. 类的6个默认成员函数 如果一个类中什么成员都没有&#x…...
js下载文件
url为文件的src地址 url必须符合同源策略或者url的接口地址允许跨域,否则浏览器会报跨域错误 axios.get(data.url ,{ responseType: ‘blob’, }) .then( response>{ let blob new Blob([response.data]); let url window.URL.createObjectURL(blob); // 创建 …...
ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟
ESP8266 + STC15+ I2C OLED带网络校时功能的定时器时钟 📍相关篇《ESP8266 + STC15基于AT指令通过TCP通讯协议获取时间》 📌ESP8266 AT固件基于安信可AT固件,相关刷AT固件可以参考《NodeMCU-刷写AT固件》 🔖STC15 单片机采用的是:STC15F2K60S2 晶振频率采用内部:22.11…...
计算机入门基础知识大全
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽…...
Python程序出现错误怎么办?
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 异常处理: 本站Python教程会具体介绍。 断言(Assertions):本站Python教程会具体介绍。 python标准异常 异常名称 描述 BaseException 所有异常…...
【Vue3】v-if和v-for优先级
🎈博客主页:🌈我的主页🌈 🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏 🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩…...
Windows上实现 IOS 自动化测试
本文介绍如何使用tideviceWDAairtest/facebook-wda实现在Windows上进行IOS APP自动化测试 环境准备 Windows Python环境 Python 3.6 WebDriverAgent安装 下载最新的项目到Mac:https://github.com/appium/WebDriverAgent $ git clone https://github.com/appiu…...
Linux云服务器下怎么重置MySQL8.0数据库密码
文章目录一、修改my.cnf配置文件为mysql免登陆二、免密登陆mysql三.给root用户重置密码1、首先查看当前root用户相关信息,在mysql数据库的user表中2、把root密码置为空3、退出mysql,删除/etc/my.cnf文件中添加进去的skip-grant-tables 重启mysql服务4、使…...
JVM调优
JVM调优-VisualVmVisualVm/ Jconsule远程连接第一种方式第二种方式:java 11开启远程GC连接如果还连不上考虑防火墙拦截了端口firewall-cmd --list-all,查看一下并暴露对应端口连接配置VisualVm界面简介采集GC信息的一些命令垃圾回收器切换VisualVm/ Jconsule远程连接…...
【配电网规划】SOCPR和基于线性离散最优潮流(OPF)模型的配电网规划( DNP )(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
锦正茂EM3电磁铁的技术参数
产品特点: ※U形结构、视野开阔、磁场强度高、磁场强度大小调节方便 ※体积小、重量轻、占空比小、结构紧凑、磁场性能更佳 ※电磁铁的工作气隙调节轻便灵活,极头处设有螺纹,更换极头装卸方便 ※可选配工作间隙刻度指示 ※小气隙时用于铁…...
Go最新版下载 Go1.20版新特性
Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性,可以升级到 Go1.20,而不需要做任何代码改动。 可以使用你任何喜欢的方式升级: 比如: go install golang.org/dl/go1.20latest 具体的可以参考官网教程: ht…...
Pywirt:一款基于Python的Windows安全应急响应工具
关于Pywirt Pywirt是一款基于Python开发的网络安全工具,该工具专门针对Windows操作系统设计,可以帮助广大研究人员使用winrm并通过在Windows操作系统上收集各种信息来加快安全事件应急响应的速度。 该工具已在Windows 10操作系统上进行过完整测试。 功…...
KDZD832 智能蓄电池活化仪
一、产品概述 KDZD832 智能蓄电池活化仪(2V-24V 一体机,适用于 2V、6V、12V/24V 蓄电池,以下简称活化仪),是专用于日常维护中对落后蓄电池处理的便携式产品,它具有四种独立的使用方式:电池放电…...
纯css实现loading加载中(多种展现形式)
前言 现如今网页越来越趋近于动画,相信大家平时浏览网页或多或少都能看到一些动画效果,今天我们来做一个有意思的动画效果,纯 css 实现 loading 加载中(多种展现形式),下面一起看看吧。 1. 常规 loading 实…...
【面试题】2023 vue高频面试知识点汇总
一、MVVM原理在Vue2官方文档中没有找到Vue是MVVM的直接证据,但文档有提到:虽然没有完全遵循MVVM模型,但是 Vue 的设计也受到了它的启发,因此在文档中经常会使用vm(ViewModel 的缩写) 这个变量名表示 Vue 实例。为了感受MVVM模型的…...
跨境电商选品重要吗?
选品很重要!跨境电子商务选择的核心要求:优质商品,价格优势,符合跨境销售特点,满足目标海外市场需求,突出自身特色竞争优势。跨境电商是如何选择产品的?这个问题也很流行,应该考虑以…...
SpringBoot
这里写目录标题1.入门程序1.1 spring-boot-starter-parent1.2 启动器1.3 EnableAutoConfiguration(重要)1.4 如何注册多个Controller?1.5 引导类2.完整的SpringBoot项目2.1 启动类2.1.1 创建一个启动类2.1.2 扩展: SpringBootConfiguration2.2 使用配置类定义组件2.3 SpringBo…...
湛江做网站哪家专业/网站搜索引擎优化情况怎么写
在使用Samba进行建立Window与Linux共享时,要是不能访问,出现“您可能没有权限使用网络资源”. setsebool -P samba_enable_home_dirs on setsebool -P samba_domain_controller on setsebool -P samba_enable_home_dirs on If you need to share a system created d…...
青州做网站的电话/网络营销首先要进行
本文由玉刚说写作平台提供写作赞助 原作者:两位低调的 Android 高手 版权声明:本文版权归微信公众号玉刚说所有,未经许可,不得以任何形式转载 概述 2018年的GMTC大会于6月22号在北京刚刚拉下帷幕,GMTC会议是由极客邦科…...
杭州免费网站建站模板/江西优化中心
为什么80%的码农都做不了架构师?>>> 50%的人,把百度当做搜索引擎,而另外50%的人用它来检查网络是否连接。好吧,我中枪了。 android小程序,专门用来检查网络和网速。 访问下边6个网址…...
做网站需要学些什么软件/怎么查看网站的友情链接
燕雀安知鸿鹄之志?———《史记陈涉世家》 意思是燕雀怎么能知道鸿鹄的远大志向,比喻平凡的人哪里知道英雄人物的志向。 前文说了 Exectuor 的具体用法,却没有说到如何停止一个任务的执行。所以,本篇文章就来讲解一下 Executor 的生命周期管…...
随州网站建设学习/制作自己的网页
小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看。 小明的烦恼 活动规则是根据用户购买订单的金额给用户送相应的…...
株洲网站建设网站/app推广员好做吗
12月份前端资源分享 1. Javascript 深入浅出ES6JS实现“旋转木马”幻灯片效果GitHub 上一份很受欢迎的前端代码优化指南-强烈推荐收藏markdown 编辑器 ndpeditor抛弃jQuery,拥抱原生JavaScriptJavascript操作DOM常用API总结[译]JavaScript ES6解构赋值指南[译]JavaS…...