目录

基于约束的方法 (Constraint-based)

基于评分的方法 (Score-based)

基于函数因果模型的方法 (Functional Causal Models)

基于梯度的方法 (Gradient-based)


因果发现是机器学习中一个重要的研究方向,它旨在从观测数据中推断变量之间的因果关系

基于约束的方法 (Constraint-based)

  • 核心思想:利用条件独立性检验来推断因果结构
  • 代表算法:PC算法、FCI算法、RFCI算法
## 因果发现算法
# 1. 基于约束的方法——PC算法
from pgmpy.estimators import PC
import pandas as pd
import numpy as np# 生成数据
data = pd.DataFrame(np.random.randn(1000, 3), columns=['X', 'Y', 'Z'])# PC算法
est = PC(data)
model = est.estimate(variant="orig", alpha=0.05)  
print("因果边:", model.edges())

基于评分的方法 (Score-based)

  • 核心思想:定义评分函数评估图结构,搜索得分最高的图
  • 代表算法:GES算法、FGES算法
# 2. 基于评分的方法——GES算法
import numpy as np
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
from itertools import permutations
from sklearn.linear_model import LinearRegressionnp.random.seed(42)
X = np.random.normal(size=1000)
Y = 0.5 * X + np.random.normal(size=1000)
Z = 0.3 * Y + np.random.normal(size=1000)
data = pd.DataFrame({'X': X, 'Y': Y, 'Z': Z})variables = data.columns.tolist()  
print("变量列表:", variables)  # ['X', 'Y', 'Z']def compute_bic(data, parents_dict):"""计算 BIC 评分(线性高斯模型)"""score = 0for node in data.columns:X = data[parents_dict[node]] if parents_dict[node] else np.zeros((len(data), 1))y = data[node]model = LinearRegression().fit(X, y)residuals = y - model.predict(X)n = len(data)k = len(parents_dict[node])sigma2 = np.var(residuals)score += -n * np.log(sigma2) / 2 - k * np.log(n) / 2return score# 穷举所有可能的 DAG(检查 edges 生成)
best_score = -np.inf
best_graph = Noneall_edges = list(permutations(variables, 2))
print("所有可能的边组合:", all_edges)  # [('X', 'Y'), ('X', 'Z'), ('Y', 'X'), ('Y', 'Z'), ('Z', 'X'), ('Z', 'Y')]for u, v in all_edges:graph = {node: [] for node in variables}graph[v].append(u)  # 添加边 u -> vscore = compute_bic(data, graph)if score > best_score:best_score = scorebest_graph = graph# 可视化
G = nx.DiGraph()
for node in best_graph:for parent in best_graph[node]:G.add_edge(parent, node)nx.draw(G, with_labels=True, node_color='lightgreen')
plt.title("GES Algorithm (Simplified)")
plt.savefig('ges_graph.png')
plt.show()

基于函数因果模型的方法 (Functional Causal Models)

  • 核心思想:假设数据生成过程的函数形式
  • 代表算法:LiNGAM、ANM(加性噪声模型)、PNL(后非线性模型)
# 3. 基于函数因果模型的方法——LiNGAM
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
from itertools import permutationsnp.random.seed(42)
X = np.random.normal(size=1000)
Y = 0.5 * X + np.random.normal(size=1000)
Z = 0.3 * Y + np.random.normal(size=1000)
data = pd.DataFrame({'X': X, 'Y': Y, 'Z': Z})data = (data - data.mean()) / data.std()try:# 尝试使用 causallearn 的 LiNGAMfrom causallearn.search.FCMBased.lingam import DirectLiNGAMmodel = DirectLiNGAM()model.fit(data)adj_matrix = model.adjacency_matrix_print("LiNGAM 邻接矩阵:\n", adj_matrix)# [[0.         0.41099056 0.]#  [0.         0.         0.]# [0.          0.31428138 0.]]except ImportError:print("未找到 causallearn,改用简化版 LiNGAM(基于回归残差)")# 简化版 LiNGAM(基于残差独立性检验)adj_matrix = np.zeros((3, 3))  # 初始化邻接矩阵variables = data.columns.tolist()for i, target in enumerate(variables):predictors = [var for var in variables if var != target]X_pred = data[predictors].valuesy_target = data[target].values# 多元线性回归coef = np.linalg.lstsq(X_pred, y_target, rcond=None)[0]residuals = y_target - X_pred.dot(coef)# 检查残差与预测变量的独立性(简化版:相关系数)for j, predictor in enumerate(predictors):corr = np.corrcoef(residuals, data[predictor])[0, 1]if abs(corr) < 0.05:  # 阈值可调整adj_matrix[variables.index(predictor), i] = 1  # predictor -> target# 可视化
G = nx.DiGraph(adj_matrix)
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_size=1000, arrowsize=20,node_color='lightgreen', edge_color='gray')
plt.title('LiNGAM Causal Graph (Direct)' if 'model' in locals() else 'Simplified LiNGAM')
plt.show()

基于梯度的方法 (Gradient-based)

  • 核心思想:使用神经网络和梯度下降学习因果结构
  • 代表算法:DAG-GNN、NOTEARS
# 4. 基于梯度的方法——NOTEARS
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt# 生成数据
np.random.seed(42)
X = np.random.normal(size=1000)
Y = 0.5 * X + np.random.normal(size=1000)
Z = 0.3 * Y + np.random.normal(size=1000)
data = np.column_stack([X, Y, Z])
data = (data - data.mean(axis=0)) / data.std(axis=0)  # 标准化# 自定义简化版NOTEARS(梯度下降优化)
def notears_simple(X, lambda1=0.1, max_iter=100):n_features = X.shape[1]W = np.zeros((n_features, n_features))  # 初始化邻接矩阵for _ in range(max_iter):# 计算梯度(最小二乘损失 + 无环约束)grad = -X.T @ (X - X @ W) / len(X) + lambda1 * np.sign(W)# 投影梯度更新(确保无环)W -= 0.01 * grad  # 学习率W = np.clip(W, -1, 1)  # 限制权重范围return (W != 0).astype(int)  # 二值化邻接矩阵# 运行并可视化
W_est = notears_simple(data)
labels = ['X', 'Y', 'Z']
G = nx.DiGraph(W_est, labels=labels)
nx.draw(G, with_labels=True, node_color='lightblue', arrowsize=20)
plt.title('Simplified NOTEARS Result')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94661.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94661.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94661.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S7-1200 串行通信介绍

S7-1200 串行通信S7-1200支持的串行通讯方式点对点&#xff08;PtP&#xff09;通信Modbus 主从通信USS 通信名称CM 1241 RS232CM 1241 RS422/485CB 1241 RS485订货号6ES7241-1AH32-0XB06ES7241-1CH32-0XB06ES7241-1CH30-1XB0通讯口类型RS232RS422/RS485RS485波特率(bps)300 ;6…

达梦包含OR条件的SQL特定优化----INJECT-HINT优化方法

Time:2025/08/07Author:skatexg应用迭代发版须执行如下动作 1、按目标需求全面压力测试&#xff0c;优化潜在慢SQL或设置特殊优化参数(如&#xff1a;OPTIMIZER_OR_NBEXP) 2、达梦数据库有数据导入&#xff0c;必须收集统计信息达梦使用SF_INJECT_HINT系统函数对指定SQL增加HIN…

JSqlParser学习笔记 快速使用JSqlParser

文章目录前言本章节源码官方文档信息认识JSqlParserHow it works? 它是如何工作的&#xff1f;知识点关于statement实际应用场景引入依赖Parser 解析SQL解析sql语句解析sql区分sql类型分析增删改查语句查询语句认识PlainSelect示范新增语句了解Insert常用方法示范更新语句删除…

Godot ------ 中级人物血条制作01

Godot ------ 中级人物血条制作 引言 正文 传统血条制作 方格血条制作 传奇,暗黑破环神类血条显示 引言 在此之前,我们分四篇介绍了 Godot 中人物血条的制作,但是我们用到的都是比较基础的节点 ProgressBar,本文我们将介绍另外一种相对高级的节点 TextureProgressBar。 正…

《WebPages 类:构建高效网页的基石》

《WebPages 类&#xff1a;构建高效网页的基石》 引言 在互联网高速发展的今天&#xff0c;网页作为信息传递和交互的重要载体&#xff0c;其重要性不言而喻。而一个高效、美观、易用的网页&#xff0c;往往离不开一个优秀的网页类的设计。本文将深入探讨WebPages类的概念、特点…

直播预告|鸿蒙生态下的 Flutter 开发实战

《开发者 面对面》坚果派特辑直播&#xff08;二&#xff09;来了&#xff01;在鸿蒙系统日益完善的今天&#xff0c;Flutter 开发者将迎来哪些新机遇&#xff1f;在 HarmonyOS 上开发 Flutter&#xff0c;如何实现高效适配与生态融合&#xff1f;本期「开发者面对面」坚果派特…

web前端结合Microsoft Office Online 在线预览,vue实现(PPT、Word、Excel、PDF等)

web前端结合Microsoft Office Online 在线预览&#xff0c;vue实现&#xff08;PPT、Word、Excel、PDF等&#xff09; 什么是 Microsoft Office Online 预览服务 Microsoft Office Online 预览服务是由微软提供的免费在线文档预览工具&#xff0c;通过简单的 URL 参数配置&am…

安卓手机用久了会出现卡顿,为什么?

安卓手机用久了出现卡顿&#xff0c;主要与内存不足、系统机制特性、硬件老化、软件冲突与冗余、使用习惯不当五大核心因素相关。以下是具体原因及针对性解决方案&#xff1a;一、卡顿核心原因分析内存不足运行内存&#xff08;RAM&#xff09;被占用&#xff1a;安卓应用默认在…

以 Eland 玩转 Elasticsearch 8.12 Learning-to-Rank

1 为什么要在 Elasticsearch 上做 LTR&#xff1f; 适用版本&#xff1a; Elasticsearch ≥ 8.12.0 前置条件&#xff1a; 需拥有包含 “Serverless LTR” 的订阅等级&#xff08;详见官方订阅矩阵&#xff09; 技术栈&#xff1a; Elasticsearch Python Eland XGBoost / Li…

OpenCV入门:图像处理基础教程

OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法&#xff0c;涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。 核心功能 图像处理&#xff1a;滤波、边缘检测、几…

影响内容传播速度的因素有哪些?

内容的传播速度是我们在衡量营销效果时的重要指标。传播速度越快&#xff0c;越能帮助品牌迅速覆盖目标受众&#xff0c;在短时间内提升影响力。影响内容传播速度的方式来自多个方面&#xff0c;下面就让我们一同来了解下这其中的因素。一、观点价值观点是否具有价值&#xff0…

css动态样式

使用scss通过变量设置css动态样式<template><div><!-- 方式一 --><p v-for"(item, index) in dataList" :key"index" :style"{--color: item.color}" >{{item.name}}</p><!-- 方式二 --><p v-for"(…

开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话

安全性&#xff1a;使用了WSS&#xff08;WebSocket Secure&#xff09;协议确保通信安全 兼容性&#xff1a;支持现代浏览器的WebRTC功能 信令机制&#xff1a;通过WebSocket进行信令交换&#xff0c;确保连接建立 媒体传输&#xff1a;使用STUN服务器进行NAT穿透&#xff0c;…

mariadb10.3.35备份脚本

一、创建备份用户[(none)]> create user buserlocalhost identified by tmrQ;[(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO buserlocalhost;[(none)]> flush privileges;二、脚本# cat mysql_bask.sh #!/bin/bash # MariaDB 10.3.35…

W3D引擎游戏开发----从入门到精通【22】

配置完成基本DT物体项后&#xff0c;在这个DT物体项中开始添加这个玩家的动画信息&#xff0c;如下所示。UseAnim设置是否使用动画功能&#xff0c;这里开启。AnimTypeN设置总共的动画类型数&#xff0c;当前只有一个待机动画&#xff0c;因此设置为1。AnimType1FrameN设置1号动…

在我国申请注册的商标在国外可以用不!

近日一个网友找到普推知产商标老杨&#xff0c;问在我国申请注册商标在新加坡和欧盟可以用不&#xff0c;当然用不成&#xff0c;根据商标法的地域性原则&#xff0c;商标权保护限于注册地&#xff0c;驰名商标享有部分跨国保护&#xff0c;但是这个要有所在国相关法律证据。如…

在开发板上画出一个2048棋盘的矩阵

#include “head.h"int* p lcd NULL; //显示屏内存映射的起始地址int g lcd width; //LCD显示屏的宽度int g lcd high ; //LCD显示屏的高度int g lcd bpp; //每个像素点所占的比特位//int x:屏的X轴&#xff08;宽度、列&#xff09;坐标//int y:屏幕y轴&#xff08;高度、…

开源软件与文化:从嬉皮士精神到数字时代的协同创新

开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新 本文章由笔者使用提示词驱动AI创作&#xff0c;并进行审阅。 文章目录开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新一、引言&#xff1a;开源的文化基因与技术革命二、开源软件的文化根源&#x…

sigfillset 函数详解

sigfillset 函数详解 一、函数概念 sigfillset() 是 POSIX 信号处理中的核心函数&#xff0c;用于初始化并填充一个信号集&#xff0c;使其包含当前系统支持的所有信号。它是操作信号屏蔽字&#xff08;signal mask&#xff09;的基础工具&#xff0c;常与 sigprocmask()、sigs…

Redis实战(8) -- 分布式锁Redission底层机制

介绍Redisson 是基于 Redis 实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;&#xff0c;提供了分布式和可扩展的 Java 数据结构&#xff0c;如分布式锁、分布式集合等。【注意】如果需要重新实现redission&#xff0c;需要重新设置RedissionClient配置…