「日拱一碼」045 機器學習-因果發現算法

目錄

基于約束的方法 (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配置…