파이썬에서 DirectLiNGAM
파이썬에서 DirectLiNGAM(with bootstrapping)
메모 및 비망록
목차
◆ 소개
◆환경
◆ 절차
◆3 변수편
- 준비
- 데이터 생성
- 부트 스트랩
- 방향 확인
--DAG 확인
◆7 변수편
- 준비
- 데이터 생성
- 부트 스트랩
- 방향 확인
--DAG 확인
◆참조
소개
마지막으로 구현 된 lingam 패키지를 사용하여 시뮬레이션 데이터를 추정했습니다.
파이썬에서 LiNGAM
h tps:// 퀵했다. 작은 m/곰 LP는/있어 MS/f05BD031cf9 다아 C464 아 0
환경
OS: Mojave (version; 10.14.6)
Python: 3.7.6
JupyterLab: 1.2.6
절차
3변수편
준비
# DirectLiNGAM
# Import and sets
import numpy as np
import pandas as pd
import graphviz
import lingam
from lingam.utils import make_dot
print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])
np.set_printoptions(precision=3, suppress=True)
np.random.seed(0)
['1.18.1', '1.0.1', '0.13.2', '1.2.1']
데이터 생성
# Create test data
x0 = np.random.uniform(size=10000)
x1 = 3.0*x0 + np.random.uniform(size=10000)
x2 = 5.0*x0 + 0.5*x1 + np.random.uniform(size=10000)
X = pd.DataFrame(np.array([x0, x1, x2]).T,columns=['x0', 'x1', 'x2'])
X.head()
x0 x1 x2
0 0.758125 2.643633 5.420089
1 0.503319 1.721282 3.439239
2 0.177017 1.007955 2.377846
3 0.832537 2.579844 6.171695
4 0.516825 1.788134 4.235760
# Visualize the test data
m = np.array([[0.0, 0.0, 0.0],
[3.0, 0.0, 0.0],
[5.0, 0.5, 0.0]])
make_dot(m)
이 인과 관계는 부트 스트랩 방법을 사용하여 추정됩니다.
부트 스트랩
model = lingam.DirectLiNGAM()
result = model.bootstrap(X, 3000) # Number of bootstrapping samples
cdc = result.get_causal_direction_counts(n_directions=10, min_causal_effect=0.1)
방향 확인
from lingam.utils import print_causal_directions
print_causal_directions(cdc, 3000)
x1 <--- x0 (100.0%)
x2 <--- x0 (100.0%)
x2 <--- x1 (100.0%)
이번은 간단한 데이터이므로 이 시점에서 인과관계가 분명했다.
DAG 확인
전단계에서는 어디까지나 변수간의 1 대 1 관계를 보고 있었다.
이번에는 그들을 통합하여 DAG로 봅니다.
dagc = result.get_directed_acyclic_graph_counts(n_dags=5, min_causal_effect=0.1)
from lingam.utils import print_dagc
print_dagc(dagc, 3000)
DAG[0]: 100.0%
x1 <--- x0
x2 <--- x0
x2 <--- x1
잘 방향을 추정할 수 있었다.
DAG 후보를 5개까지 출력하도록 설정했지만 100.0%였기 때문인지 나머지는 출력되지 않았다.
# Get the probability of bootstrapping.
prob = result.get_probabilities(min_causal_effect=0.1)
print(prob)
[[0. 0. 0.]
[1. 0. 0.]
[1. 1. 0.]]
확률도 1로 출력되었다.
7변수편
다소 복잡하게 하여 이 인과관계를 추정하였다.
준비
# DirectLiNGAM
# Import and sets
import numpy as np
import pandas as pd
import graphviz
import lingam
from lingam.utils import make_dot
print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])
np.set_printoptions(precision=3, suppress=True)
np.random.seed(0)
['1.18.1', '1.0.1', '0.13.2', '1.2.1']
데이터 생성
# Create test data
x0 = np.random.uniform(size=10000)
x6 = np.random.uniform(size=10000)
x1 = -5.0*x0 + np.random.uniform(size=10000)
x2 = -2.5*x0 + 3.0*x1 + np.random.uniform(size=10000)
x5 = 6.0*x6 + np.random.uniform(size=10000)
x3 = 4.0*x2 + 7.0*x5 + np.random.uniform(size=10000)
x4 = 1.0*x1 + 2.0*x2 + 8.0*x6 +np.random.uniform(size=10000)
X = pd.DataFrame(np.array([x0, x1, x2, x3, x4, x5, x6]).T,columns=['x0', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6'])
X.head()
x0 x1 x2 x3 x4 x5 x6
0 0.548814 -2.351895 -7.669592 3.641327 -10.776980 4.858864 0.748268
1 0.715189 -3.534790 -11.889026 -38.446302 -24.968283 1.292542 0.180203
2 0.602763 -2.090516 -7.601441 -9.739672 -13.753596 2.811044 0.389023
3 0.544883 -2.318181 -7.484214 -27.062919 -16.475002 0.307835 0.037600
4 0.423655 -1.173992 -4.064288 -13.340880 -8.625065 0.308386 0.011788
# Visualize the test data
m = np.array([[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[-2.5, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 4.0, 0.0, 0.0, 7.0, 0.0],
[0.0, 1.0, 2.0, 0.0, 0.0, 0.0, 8.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]])
make_dot(m)
이 인과 관계는 부트 스트랩 방법을 사용하여 추정됩니다.
부트 스트랩
model = lingam.DirectLiNGAM()
result = model.bootstrap(X, 3000) # Number of bootstrapping samples
cdc = result.get_causal_direction_counts(n_directions=10, min_causal_effect=0.1)
방향 확인
from lingam.utils import print_causal_directions
print_causal_directions(cdc, 3000)
x1 <--- x0 (100.0%)
x2 <--- x0 (100.0%)
x2 <--- x1 (100.0%)
x3 <--- x5 (100.0%)
x4 <--- x1 (100.0%)
x4 <--- x2 (100.0%)
x5 <--- x6 (100.0%)
x4 <--- x6 (97.4%)
x3 <--- x2 (96.1%)
x3 <--- x4 (4.8%)
DAG 확인
dagc = result.get_directed_acyclic_graph_counts(n_dags=5, min_causal_effect=0.1)
from lingam.utils import print_dagc
print_dagc(dagc, 3000)
DAG[0]: 88.5%
x1 <--- x0
x2 <--- x0
x2 <--- x1
x3 <--- x2
x3 <--- x5
x4 <--- x1
x4 <--- x2
x4 <--- x6
x5 <--- x6
DAG[1]: 3.9%
x1 <--- x0
x2 <--- x0
x2 <--- x1
x3 <--- x4
x3 <--- x5
x4 <--- x1
x4 <--- x2
x4 <--- x6
x5 <--- x6
DAG[2]: 2.7%
x1 <--- x0
x2 <--- x0
x2 <--- x1
x3 <--- x2
x3 <--- x5
x4 <--- x0
x4 <--- x1
x4 <--- x2
x4 <--- x6
x5 <--- x6
DAG[3]: 2.6%
x1 <--- x0
x2 <--- x0
x2 <--- x1
x3 <--- x2
x3 <--- x5
x4 <--- x1
x4 <--- x2
x4 <--- x3
x5 <--- x6
DAG[4]: 0.9%
x1 <--- x0
x2 <--- x0
x2 <--- x1
x3 <--- x2
x3 <--- x4
x3 <--- x5
x4 <--- x1
x4 <--- x2
x4 <--- x6
x5 <--- x6
88.5%로 정확한 인과관계를 추정할 수 있었다.
prob = result.get_probabilities(min_causal_effect=0.1)
print(prob)
[[0. 0. 0. 0. 0. 0. 0. ]
[1. 0. 0. 0. 0. 0. 0. ]
[1. 1. 0. 0. 0. 0. 0. ]
[0.006 0. 0.961 0. 0.048 1. 0.007]
[0.027 1. 1. 0.026 0. 0. 0.974]
[0. 0. 0. 0. 0. 0. 1. ]
[0. 0. 0. 0. 0. 0. 0. ]]
참조
・수식과 Python으로 이해하는 LiNGAM(ICA판)
htps : // 코 m / k 코 테라 / ms / 6d7f5598464 18 아후 아 7c
· 구조 방정식 모델에 의한 인과 추론 : 인과 구조 탐색에 관한 최근의 발전
htps //w w. s에서 멋지다. 네 t/시시미즈 2006/bsj2012ー
· 파이썬에서 LiNGAM
h tps:// 퀵했다. 작은 m/곰 LP는/있어 MS/f05BD031cf9 다아 C464 아 0
· LiNGAM docs
h tps : // ㅃ가 m. Red d. cs. 이오 / 엔 / 아 st / 가서 x. HTML
· lingam GitHub (examples)
htps : // 기주 b. 이 m / cdt15 / ぃ가 m / t ree / 뭐 r / 에 mp ぇ s
Reference
이 문제에 관하여(파이썬에서 DirectLiNGAM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kumalpha/items/ee2fa4b29360d2bd119c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)