新手必看:如何用DoWhy在IHDP数据集上跑通第一个因果推断案例(附完整代码)

因果推断dowhy之-ihdp数据集上的案例学习 本案例按照标准DoWhy标准流程进行,实现因果的分析的结果。 阅读详情

从零到一:用DoWhy与IHDP数据集完成你的首次因果推断实战

如果你刚接触因果推断,面对“反事实”、“识别假设”、“倾向得分”这些术语感到一头雾水,同时又对Python库DoWhy跃跃欲试,那么这篇文章就是为你准备的。我不会给你堆砌复杂的理论公式,而是带你亲手跑通一个完整的、可复现的因果推断案例。我们将使用经典的IHDP数据集,这个数据集在因果推断领域就像机器学习里的“鸢尾花数据集”,是绝佳的入门沙盒。

为什么选择IHDP?因为它源于一个真实的随机对照试验,却被人为引入了选择偏倚,模拟了我们在现实世界中更常遇到的观察性数据。这让我们能在已知“标准答案”的情况下,检验各种因果推断方法的有效性。而DoWhy库,由微软研究院推出,它提供了一套清晰、统一的“建模-识别-估计-反驳”四步框架,能极大地降低因果分析的门槛,让你把精力集中在问题本身,而非代码实现上。

本文面向数据分析师、算法工程师、社科研究者等任何希望将因果思维融入工作的朋友。你将学到的不只是一串可以运行的代码,更是理解每一步背后的意图,以及如何规避初学时最常见的“坑”。让我们开始吧。

1. 环境搭建与数据初探:打好第一块基石

在编写任何代码之前,一个稳定、可复现的环境是成功的一半。我强烈建议使用conda或venv创建独立的Python环境,这能避免后续令人头疼的包版本冲突问题。

1.1 创建专属环境与安装核心库

打开你的终端(或Anaconda Prompt),执行以下命令来创建并激活一个新环境:

# 使用 conda 创建环境
conda create -n causal_dowhy python=3.9 -y
conda activate causal_dowhy

# 安装核心库
pip install dowhy pandas numpy scikit-learn matplotlib seaborn

注意:这里固定Python 3.9版本是因为它在与多数科学计算库的兼容性上最为稳定。DoWhy库本身在不断更新,但核心API保持良好的一致性。

安装完成后,可以在Python中快速验证一下:

import dowhy
print(f"DoWhy版本: {dowhy.__version__}")

接下来,我们需要获取本次实战的主角——IHDP数据集。原始数据托管在GitHub上,但由于网络访问问题,直接读取链接经常失败,这也是新手遇到的第一个典型障碍。我的建议是,永远优先进行数据的本地化处理。

1.2 IHDP数据集解析与本地化处理

IHDP数据集旨在研究“专家家访”(treatment)对“婴儿日后认知测试得分”(outcome)的影响。它包含747个样本(处理组139,控制组608)和25个协变量(x1到x25),涵盖了婴儿和母亲的各种特征。

原始数据文件是一个没有表头的CSV,共29列,其结构如下表所示:

列索引含义说明
0treatment处理变量(1=专家家访,0=无)
1y_factual观测到的实际结果
2y_cfactual反事实结果(这是关键,仅在模拟数据中存在)
3mu0控制组潜在结果的条件期望
4mu1处理组潜在结果的条件期望
5-29x1 - x2525个预处理后的连续型协变量

y_cfactual、mu0、mu1是我们在真实世界中永远无法观测的,但在这个半合成数据集中,它们为我们提供了评估因果估计准确性的“金标准”。

你可以从可靠的资源库(如OpenML)下载名为ihdp_npci_1.csv的文件,并将其保存到你的项目目录下的data/文件夹中。然后,我们使用Pandas进行加载和初步审视:

import pandas as pd
import numpy as np

# 使用本地路径读取数据,避免网络问题
data_path = "./data/ihdp_npci_1.csv" # 请根据你的实际路径调整
data_raw = pd.read_csv(data_path, header=None)

# 为列赋予有意义的名称
column_names = ["treatment", "y_factual", "y_cfactual", "mu0", "mu1"] + [f"x{i}" for i in range(1, 26)]
data_raw.columns = column_names

# 查看数据前5行及基本信息
print("数据形状:", data_raw.shape)
print("\n前5行数据:")
print(data_raw.head())
print("\n数据概览:")
print(data_raw.info())
print("\n处理组与控制组样本数:")
print(data_raw['treatment'].value_counts())

执行这段代码,你不仅能看到数据,还能立刻发现处理组(139)远少于控制组(608),这种不平衡在观察性研究中非常普遍,也是我们需要因果推断方法的原因之一——简单的对比均值(ATE)可能会被混淆变量严重误导。

2. 构建因果图与DoWhy四步法框架

理解了数据之后,我们正式进入DoWhy的核心逻辑。DoWhy将因果分析流程抽象为四个步骤,这就像一份烹饪食谱,让你不会迷失在复杂的操作中。

2.1 第一步:建模 - 用因果图表述你的假设

在DoWhy中,我们首先需要创建一个CausalModel对象。这一步的核心是明确指定处理变量、结果变量以及我们认为的共同原因(混淆变量)。这实质上是将我们的领域知识编码进一个简化的因果图中。

from dowhy import CausalModel

# 假设所有25个协变量x1-x25都是共同原因(混淆变量)
common_causes = [f"x{i}" for i in range(1, 26)]

model = CausalModel(
    data=data_raw,
    treatment='treatment',
    outcome='y_factual',
    common_causes=common_causes
)

# 可视化因果图(需要graphviz支持)
# 如果未安装graphviz,可以跳过这行或使用 `pip install graphviz`
try:
    model.view_model()
    from IPython.display import Image, display
    display(Image(filename="causal_model.png"))
except:
    print("Graphviz未安装,无法生成图形。但模型已成功创建。")
    print("你可以通过 `pip install graphviz` 并安装系统级Graphviz软件来启用此功能。")

这个简单的因果图蕴含了一个关键假设:所有协变量X同时影响了是否接受家访(T)和孩子的认知得分(Y)。这就是典型的混淆结构。DoWhy会根据这个图结构,自动进行后续的识别分析。

2.2 第二步:识别 - 从因果问题到统计问题

“识别”要回答的是:基于我们假设的因果图,感兴趣的因果效应(例如平均处理效应ATE)能否从观测数据中估计出来?如果能,需要调整哪些变量?

# 识别因果效应
identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)
print(identified_estimand)

运行上述代码,你会看到类似下面的输出:

Estimand type: EstimandType.NONPARAMETRIC_ATE

### Estimand : 1
Estimand name: backdoor
Estimand expression:
d
────────────(E[y_factual|x25,x10,x7,x24,x13,x4,x12,x18,x21,x15,x9,x1,x20,x3,x22,
d[treatment]
x5,x14,x17,x11,x8,x23,x2,x19,x6,x16])
Estimand assumption 1, Unconfoundedness: If U→{treatment} and U→y_factual then P(y_factual|treatment,x25,x10,...,x16,U) = P(y_factual|treatment,x25,x10,...,x16)

这里,DoWhy告诉我们:

  1. 识别策略:它找到了一个“后门”准则下的识别策略。简单说,就是通过控制所有列出的25个协变量(x25, x10, ..., x16),可以阻断所有从混淆变量到结果的非因果路径。
  2. 关键假设:无混淆假设。即在我们控制了所有这些观测到的协变量之后,不存在其他未观测的混淆变量(U)。这是因果推断中最核心、也最需要谨慎对待的假设。proceed_when_unidentifiable=True参数允许我们在无法完全保证可识别时继续,但我们必须牢记这个假设的局限性。

3. 估计:多种方法实战与结果解读

识别出需要调整的变量集后,我们就可以用各种统计和机器学习方法进行估计了。DoWhy的强大之处在于它统一了多种估计器的接口。让我们对比几种经典方法。

3.1 方法一:线性回归调整

这是最直观的方法,直接将结果对处理变量和所有混淆变量做线性回归,处理变量的系数即为估计的因果效应。

# 使用线性回归进行估计
estimate_linear = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.linear_regression",
    test_significance=True  # 进行显著性检验
)
print(estimate_linear)
print(f"\n线性回归估计的ATE: {estimate_linear.value:.4f}")

输出会包含估计值、置信区间和p值。线性回归假设处理效应是常数,且关系是线性的,虽然简单,但可能不符合复杂的数据情况。

3.2 方法二:倾向得分匹配

PSM通过为每个处理组样本在控制组中寻找“背景”相似的个体进行匹配,来模拟随机化实验。

# 使用倾向得分匹配
estimate_psm = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.propensity_score_matching"
)
print(f"\n倾向得分匹配估计的ATE: {estimate_psm.value:.4f}")

提示:PSM的效果非常依赖于匹配质量(最近邻、卡钳值等)。DoWhy提供了默认参数,但在实际应用中,你可能需要根据数据分布调整method_params。

3.3 方法三:倾向得分分层与加权

除了匹配,倾向得分还有两种主流用法:

# 倾向得分分层:将样本按倾向得分分为若干层,在层内计算效应后加权平均
estimate_strat = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.propensity_score_stratification",
    method_params={'num_strata': 50, 'clipping_threshold': 5}
)

# 倾向得分逆概率加权:用倾向得分的倒数对样本进行加权
estimate_ipw = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.propensity_score_weighting"
)

print(f"倾向得分分层估计的ATE: {estimate_strat.value:.4f}")
print(f"逆概率加权估计的ATE: {estimate_ipw.value:.4f}")

3.4 与“真实值”对比

由于IHDP是半合成数据,我们知道反事实结果,因此可以计算真实的平均处理效应(ATE)作为基准:

# 计算真实的ATE (基于反事实数据)
ate_true = np.mean(data_raw['mu1'] - data_raw['mu0'])
print(f"\n基于反事实数据的真实ATE: {ate_true:.4f}")

# 计算简单的均值差异(有偏的ATE)
ate_naive = (data_raw[data_raw['treatment']==1]['y_factual'].mean() -
              data_raw[data_raw['treatment']==0]['y_factual'].mean())
print(f"简单均值差异(有偏): {ate_naive:.4f}")

将不同方法的估计结果与真实ATE、简单均值差异放在一起对比,是极具启发性的:

估计方法估计的ATE值说明
真实ATE~4.0 (示例)理论上的“标准答案”
简单均值差异通常显著偏离4.0因混淆变量存在而严重有偏
线性回归调整~3.93调整了混淆变量,接近真实值
倾向得分匹配~3.98通过匹配模拟随机化
倾向得分分层~3.46对极端倾向得分敏感
逆概率加权~3.93依赖倾向得分模型正确性

这个对比表格直观地展示了:如果不做任何调整(简单均值差异),估计结果会有很大偏差。而采用了因果推断方法后,估计值更接近真实效应。不同方法的结果略有差异,这正说明了不存在“唯一正确”的估计方法,我们需要进行稳健性检验。

4. 反驳与稳健性检验:给你的分析装上“保险”

得到估计值远不是终点。因果推断的结论非常依赖于我们之前做出的假设(尤其是无混淆假设)。DoWhy的“反驳”步骤提供了一系列工具,用于检验我们的估计对这些假设的敏感度。

4.1 反驳一:添加随机混淆变量

如果我们的估计是稳健的,那么加入一个随机生成的、与真实变量无关的混淆变量,不应该显著改变估计结果。

refute_random = model.refute_estimate(
    identified_estimand,
    estimate_linear,  # 这里用线性回归的估计结果做示例
    method_name="random_common_cause"
)
print(refute_random)

如果输出显示新效应(New effect)与原效应(Estimated effect)非常接近,且p值很大(例如>0.05),则说明估计对添加无关混淆变量不敏感,这是一个积极的信号。

4.2 反驳二:安慰剂检验

这是一个非常巧妙的检验。我们将处理变量替换为一个完全随机的虚拟变量(安慰剂),然后重新估计效应。如果原来的效应是真实的,那么使用安慰剂处理应该得到一个接近零的效应。

refute_placebo = model.refute_estimate(
    identified_estimand,
    estimate_linear,
    method_name="placebo_treatment_refuter"
)
print(refute_placebo)

理想的输出是,新效应(New effect)接近于0,并且p值较高,无法拒绝“效应为零”的原假设。这从反面支持了我们原处理效应的真实性。

4.3 反驳三:数据子集检验

通过从数据中随机抽取一个子集(例如90%)重新进行估计,来检验结果的稳定性。

refute_subset = model.refute_estimate(
    identified_estimand,
    estimate_linear,
    method_name="data_subset_refuter",
    subset_fraction=0.9  # 使用90%的数据
)
print(refute_subset)

如果子集上估计的效应与原效应相差不大,说明我们的结论不太可能依赖于某个特定的数据子集,增强了结论的可靠性。

5. 深入进阶:诊断、可视化与模型选择

完成基础流程后,我们可以深入一些,让分析更扎实、更透彻。

5.1 倾向得分诊断

在使用倾向得分方法(PSM、IPTW等)后,检查倾向得分的分布至关重要。一个好的倾向得分模型应该使处理组和控制组的得分分布在共同支持域上有大量重叠。

from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot as plt
import seaborn as sns

# 拟合一个简单的逻辑回归模型来估计倾向得分
X = data_raw[[f'x{i}' for i in range(1, 26)]]
T = data_raw['treatment']
lr = LogisticRegression(max_iter=1000).fit(X, T)
data_raw['propensity_score'] = lr.predict_proba(X)[:, 1]

# 绘制倾向得分分布图
plt.figure(figsize=(10, 6))
for treat in [0, 1]:
    subset = data_raw[data_raw['treatment'] == treat]
    sns.histplot(subset['propensity_score'], bins=30, kde=True,
                 label=f'Treatment={treat}', alpha=0.6)
plt.xlabel('Propensity Score')
plt.ylabel('Density')
plt.title('Propensity Score Distribution by Treatment Group')
plt.legend()
plt.show()

观察图形,如果两组得分分布完全分离,则意味着缺乏共同支持,基于倾向得分的估计会非常不稳定。此时需要考虑其他方法(如双重稳健估计)或重新审视协变量。

5.2 探索异质性处理效应

平均处理效应(ATE)可能掩盖了不同亚组间的差异。我们可以使用基于机器学习的方法(如Meta-Learners)来探索异质性处理效应。

# 使用DoWhy内置的线性DML估计器(Double Machine Learning)
estimate_dml = model.estimate_effect(
    identified_estimand,
    method_name="backdoor.econml.dml.LinearDML",
    method_params={
        'init_params': {'model_y': 'linear', 'model_t': 'linear'},
        'fit_params': {}
    }
)
print(f"DML估计的ATE: {estimate_dml.value:.4f}")

# 假设我们关心协变量x1对处理效应的影响
# 我们可以通过DML模型获取条件平均处理效应(CATE)的预测
# 注意:以下为概念性代码,实际需根据EconML文档调整
# cate = estimate_dml.cate_feature_names(['x1'])

5.3 完整代码整合与错误排查

将以上所有步骤整合到一个脚本中时,你可能会遇到一些典型问题。这里提供一个增强版的、带有基础错误处理的代码框架:

import pandas as pd
import numpy as np
import dowhy
from dowhy import CausalModel
import warnings
warnings.filterwarnings('ignore') # 可选,用于抑制部分警告

def run_causal_analysis(data_path):
    """运行完整的因果分析流程"""
    try:
        # 1. 加载数据
        data = pd.read_csv(data_path, header=None)
        col_names = ["treatment", "y_factual", "y_cfactual", "mu0", "mu1"] + [f"x{i}" for i in range(1, 26)]
        data.columns = col_names
        print(f"数据加载成功,形状: {data.shape}")

        # 2. 建模
        common_causes = [f"x{i}" for i in range(1, 26)]
        model = CausalModel(
            data=data,
            treatment='treatment',
            outcome='y_factual',
            common_causes=common_causes
        )
        print("因果模型创建成功。")

        # 3. 识别
        identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)
        print("因果效应识别完成。")

        # 4. 估计(使用多种方法)
        methods = {
            "线性回归": "backdoor.linear_regression",
            "倾向得分匹配": "backdoor.propensity_score_matching",
            "倾向得分加权": "backdoor.propensity_score_weighting"
        }
        estimates = {}
        for name, method in methods.items():
            try:
                est = model.estimate_effect(identified_estimand, method_name=method)
                estimates[name] = est.value
                print(f"{name}估计的ATE: {est.value:.4f}")
            except Exception as e:
                print(f"{name}估计失败: {e}")

        # 5. 反驳(以安慰剂检验为例)
        if estimates:
            primary_estimate = list(estimates.values())[0]
            refute = model.refute_estimate(identified_estimand, primary_estimate,
                                           method_name="placebo_treatment_refuter")
            print(f"\n安慰剂检验结果: {refute}")

        return model, identified_estimand, estimates

    except FileNotFoundError:
        print(f"错误:在路径 '{data_path}' 未找到数据文件。")
    except Exception as e:
        print(f"运行过程中发生未知错误: {e}")

# 运行分析
if __name__ == "__main__":
    model, estimand, results = run_causal_analysis("./data/ihdp_npci_1.csv")

这个框架包含了基本的异常捕获,当数据路径错误或某个估计方法不适用时,程序不会完全崩溃,而是给出提示信息,让你能逐步排查。

走完这一整套流程,你收获的不仅仅是一个运行在IHDP数据集上的因果推断案例。你获得的是一个可迁移的分析框架。下次当你面对自己的业务数据——可能是评估一次营销活动的效果、一个产品功能改版的影响,或是一项政策实施的成效——你都可以沿用“建模-识别-估计-反驳”这个思维范式,用DoWhy这个工具,去尝试回答那些至关重要的因果问题。记住,因果推断既是科学,也是艺术,它始于大胆的假设,但必须终于严谨的检验。

IHDP数据集实战:5种因果效应估计方法对比(DoWhy版) 本文以经典的IHDP数据集为实战案例,系统对比了线性回归、倾向得分匹配、倾向得分分层、倾向得分加权和双稳健估计这五种主流因果效应估计方法。通过横向评测,深入剖析了各方法的参数设置、结果差异及适用场景,并提供了基于数据特征和稳健性需求的方法选型决策指南,帮助读者在因果推断实践中做出更明智的选择。 阅读详情

相关推荐

DoWhy实战对比:IHDP数据集中4种因果效应估计方法谁更准?(含PSM/Stratification/Weighting详解)

本文以因果推断领域的经典IHDP数据集为案例,深度对比了线性回归、倾向得分匹配、倾向得分分层和倾向得分加权四种主流因果效应估计方法。通过DoWhy框架实战,详细解析了各方法的原理、实现、在IHDP上的表现差异及适用场景,并提供了基于数据特征的方法选择决策指南,帮助研究者在面对观察性数据时做出更明智的决策。

weixin_29067143的博客 203

因果推断, 因果效应概述

概述 因果推断定义: 从观测数据中找出变量间的因果性以及变量改变后, 它对结果的具体影响. 从观测数据中找相关性并不难, 现在的机器学习也是在基于统计地从样本中学习 y^=f(x;θ)\hat y=f(\mathbf x;\theta)y^​=f(x;θ) 的拟合关系. 但没有因果推断, 对于生活,工作的指导意义就大大减弱. 所以我们需要因果推断. 随机对照实验, Randomized Controlled Trial (RCT), 是理论上完成因果推断的最佳方法, 但考虑实际, 有些实验是 expe

yichudu 5831

Mythos能力增强层:Claude 3.5的因果推理跃迁与受控发布实践

大模型推理正从概率拟合迈向因果操作,核心在于能否建模多跳因果链并执行反事实推演。这类能力依赖因果图编译、沙盒化干预与可信度量化等关键技术,显著提升法律合同审查、金融风控推演和临床试验验证等高可靠性场景的决策质量。Mythos作为轻量级能力增强层,不替换基础模型,而是通过运行时注入实现毫秒级因果推理升级,其受控发布机制(Gated Release)将能力拆解为可验证原子单元,兼顾性能、可解释性与合规落地。本文深入解析其架构原理、部署要点与真实业务增益。

caodaoxi的专栏 366

2017 Uri Shalit & Fredrik D. Johansson:IHDP

因果推断的二值干预、实值连续结果数据集,干预为专家家访,结果为认知测试分数。

weixin_42847126的博客 2001

因果推断7--深度因果模型综述(个人笔记)

因果关系概念在人类认知中起着重要的作用。在过去的几十年里,因果推理在许多领域得到了很好的发展,如计算机科学、医学、经济学和其他工业应用。随着深度学习的发展,它越来越多地应用于对反事实数据的因果推断。通常,深度因果模型将协变量的特征映射到表示空间,然后设计各种目标函数来无偏估计反事实数据。与现有机器学习中因果模型的研究不同,本文主要对深层因果模型进行了概述,其核心贡献如下:1)总结了多剂量治疗和连续剂量治疗下普遍采用的相关指标;2)我们从发展时间轴和方法分类角度对深层因果模型进行了全面概述。

as472780551的博客 1万+

因果科学网络资源整理

因果科学网络资源整理1.研究范围2.代表人物或团队2.1国际统计学领域2.2国际计算机领域2.3国内代表人物3.经典书籍4.开源工具包5.前沿算法5.1因果发现5.2因果推断6.公开数据集7.公开课8.应用案例 1.研究范围 2.代表人物或团队 下面列举我个人关注比较多的大牛们~ 2.1国际统计学领域 从左至右依次为[超链接为大牛主页]: Jerzy Neyman James M. Robins Donald B. Rubin Tyler J. VanderWeele Paul R. Rosenbaum

爱数据爱统计 1466

保姆级教程:用DoWhy和IHDP数据集搞定因果推断(附完整代码)

本文提供了一份详细的因果推断实战指南,通过经典的IHDP数据集和微软DoWhy库,手把手教你完成从环境搭建、数据准备、因果模型构建、效应识别与估计到反驳检验的完整流程。文章包含完整代码,旨在帮助数据分析师和开发者掌握因果推断的核心方法,解决业务中常见的归因与效果评估问题。

v6b7n8m9q0的博客 757

CEVAE-VampPrior:带有VampPrior的CEVAE

CEVAE-VampPrior 具有VampPrior的因果变化自动编码器(CEVAE)的Pytorch(0.3.1)+ Pyro(0.1.2)实现 CEVAE: ://arxiv.org/pdf/1705.08821.pdf VampPrior: ://arxiv.org/pdf/1705.07120.pdf IFT6269项目。 合作者:Joao Monteiro,Yassine Yaakoubi,Abhishek Tiwari。

因果推断实战:基于DoWhy的IHDP数据集分析与效果验证

本文通过DoWhy库对经典的IHDP数据集进行因果推断实战分析,演示了从建模、识别、估计到反驳验证的全流程。文章详细介绍了如何利用线性回归、倾向得分匹配、分层与加权等多种方法估计专家家访对早产儿认知分数的因果效应,并通过反驳测试验证结果的稳健性,为处理观察性数据中的混杂偏倚提供了实用指南。

threejs5artist的博客 440

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1135

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3025

因果推断实战:DoWhy在IHDP数据集上的深度解析与应用

本文通过DoWhy库在IHDP数据集上的实战,深度解析因果推断从建模、识别、估计到反驳的全流程。文章以专家家访对婴儿认知得分的影响为例,演示了如何利用DoWhy处理观察性数据中的选择偏倚,并运用线性回归、倾向得分匹配等多种方法估计平均处理效应,最后通过反驳检验验证结论的稳健性。

weixin_29054399的博客 412

单片机开发者的福音:3步搞定VSCode智能补全(IAR工程+Clangd实战)

本文为单片机开发者提供了一套高效解决方案,通过EIDE插件将IAR工程导入VSCode,并生成关键的compile_commands.json文件,结合Clangd配置,仅需三步即可实现精准的智能代码补全、一键跳转等现代编辑功能,大幅提升嵌入式开发效率。

coffee的博客 525

dowhy使用demo

#encoding=utf-8 import pandas as pd import numpy as np from dowhy import CausalModel data= pd.read_csv("https://raw.githubusercontent.com/AMLab-Amsterdam/CEVAE/master/datasets/IHDP/csv/ihdp_npci_1.csv", header = None)#这里加入自己的数据集 col = ["treatment", "y_fa.

zhuiyunzhugang的博客 840

智能车赛道识别:八邻域算法的实战解析与优化

本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。

weixin_29228781的博客 263

SerDes系列之如何选择AC耦合电容

交流耦合电容用于隔离PCB互连时的直流分量(Common-mode voltage),同时传递交流分量(Voltage swing),其作用类似于一个高通滤波器,但是,如果电容容值选取不当,使用过程中会产生信号质量问题,典型的应用场景:当包含相同的长串1或0的NRZ数据应用于该高通滤波器时,会发生低频电压跌落,导致低频模式相关抖动(PDJ)。

一只豌豆象的博客 2354

Causal Inference: Trying to Understand the Question of Why

Why are you reading this article?Why did you choose to learn about causal inference? Why are you thinking that this is a really weird way to start an article? Who knows. A more interesting question to ask is why can we, as humans, think about and understa.

bbbeoy的专栏 878

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 267

终极指南:如何用EconML的AutoML功能快速构建因果模型

EconML是微软研究院ALICE项目开发的因果推断工具包,它将最先进的机器学习技术与计量经济学相结合,为复杂的因果推断问题提供自动化解决方案。本文将详细介绍如何利用EconML的AutoML功能加速因果模型开发,帮助新手和普通用户轻松掌握因果效应分析的核心技能。 ## 什么是EconML的AutoML功能? EconML的AutoML功能位于[econml/automated_ml/](ht

gitblog_00573的博客 653

计算机视觉与深度学习 | Matlab实现ORBSLAM2(附完整代码)

================================================ 博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 ================================================ 代码阅览 效果图 代码 imdsLeft = imageDatastore('C:\MichaelSpace\matlabworks

尘世冰封的专栏 1525

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

tongweb中间件selectApp.jsp存在任意文件上传(含批量验证poc)

weixin_43567873的博客 1989

causalml 快速上手:从倾向得分匹配到 ATE 估计与敏感性分析的完整实践指南

本指南以 [docs/quickstart.rst](https://link.gitcode.com/i/50a58b3d66d98a6ad6ee003aca173cf1) 为主体骨架,面向希望快速在因果推断与增量(Uplift)建模中落地因果机器学习算法的数据科学工程师。你将掌握 causalml 中倾向得分估计与匹配、S/T/X/R 元学习器与 Uplift Tree 的 ATE 估计、反事

gitblog_01018的博客 453

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

开源项目推荐:基于神经网络的因果效应估计

开源项目推荐:基于神经网络的因果效应估计 项目介绍 该项目是为实现论文《Adapting Neural Networks for the Estimation of Treatment Effects》中描述的技术而创建的一个开源软件库。该研究探索了如何从观察数据中利用神经网络来准确地估算因果效应。其核心思想是对标准神经网络结构和训练过程进行改进,以产生对精确估计的倾向性。 项目技术分析 项目采用...

gitblog_00001的博客 583

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2020年因果推断综述《A Survey on Causal Inference》

文章对因果推理方法进行了全面的回顾,根据传统因果框架所做的三个假设,将这些方法分为两类,对于每个类别,都讨论和比较了传统的统计方法和最近的机器学习方法。

l8947943的博客 3319

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: OnRobot RG2/RG6夹爪的两种控制模式全解析:Teach Mode与Compute Box的ROS实现差异对比
下一篇: Android Automotive OS开发实战:CarService核心服务解析与常见问题排查
随身带U盘
博客等级 码龄4年 30粉丝 1526原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值