docs(10_Wiki): Topic_Business/General/Graphic/Programming을 Topics/ 하위로 이동
최상위 10_Wiki/Topic_*였던 4개 카테고리 폴더를 10_Wiki/Topics/Topic_* 로 재배치. 콘텐츠 변경 없음(순수 폴더 이동) — Topics/ 하위 나머지 폴더는 이미 지난 커밋에서 전부 정리된 상태(잔존 항목은 에이전트 운영 상태 및 사용자가 보존을 요청한 업데이트0615/무제 3.canvas 뿐).
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
---
|
||||
id: wiki-2026-0508-ecology-and-ecosystem-modeling
|
||||
title: Ecology and Ecosystem Modeling
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [ecosystem modeling, agent-based ecology, Lotka-Volterra, food web, population dynamics]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
verification_status: applied
|
||||
tags: [ecology, ecosystem, abm, lotka-volterra, simulation, biodiversity, food-web]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: Python / NetLogo / Mesa
|
||||
framework: NumPy / scipy / Mesa
|
||||
---
|
||||
|
||||
# Ecology and Ecosystem Modeling
|
||||
|
||||
## 매 한 줄
|
||||
> **"매 species 매 environment 의 interaction 의 mathematical / computational simulate"**. 매 Lotka-Volterra (predator-prey), 매 food web, 매 ABM (agent-based). 매 modern: 매 deep learning + 매 climate model coupling.
|
||||
|
||||
## 매 핵심
|
||||
|
||||
### 매 model type
|
||||
- **Differential equation**: 매 Lotka-Volterra, SIR-like.
|
||||
- **Matrix model** (Leslie): 매 age-structured.
|
||||
- **Individual-based** (IBM/ABM): 매 agent.
|
||||
- **Network-based**: 매 food web.
|
||||
- **Spatial**: 매 PDE / cellular automata.
|
||||
|
||||
### 매 famous
|
||||
- **Lotka-Volterra**: 매 predator-prey oscillation.
|
||||
- **NetLogo Wolves-Sheep**: 매 ABM textbook.
|
||||
- **Madingley Model**: 매 global-scale ecosystem.
|
||||
- **EwE (Ecopath with Ecosim)**: 매 marine fisheries.
|
||||
|
||||
### 매 응용
|
||||
1. **Conservation**: 매 endangered species.
|
||||
2. **Fisheries**: 매 stock assessment.
|
||||
3. **Invasive species**: 매 spread.
|
||||
4. **Climate adaptation**: 매 range shift.
|
||||
5. **Disease ecology**: 매 zoonotic.
|
||||
6. **Restoration**: 매 rewilding scenario.
|
||||
|
||||
### 매 modern AI
|
||||
- **Species distribution**: 매 ML predict.
|
||||
- **Image classification**: 매 camera trap.
|
||||
- **Bioacoustic**: 매 bird ID.
|
||||
- **Foundation model**: 매 GeoCLIP, BioCLIP.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### Lotka-Volterra
|
||||
```python
|
||||
import numpy as np
|
||||
from scipy.integrate import odeint
|
||||
|
||||
def lv(state, t, alpha, beta, delta, gamma):
|
||||
prey, pred = state
|
||||
dprey = alpha * prey - beta * prey * pred
|
||||
dpred = delta * prey * pred - gamma * pred
|
||||
return [dprey, dpred]
|
||||
|
||||
t = np.linspace(0, 50, 1000)
|
||||
sol = odeint(lv, [10, 5], t, args=(0.5, 0.1, 0.05, 0.5))
|
||||
```
|
||||
|
||||
### Logistic growth (carrying capacity)
|
||||
```python
|
||||
def logistic(N, t, r, K):
|
||||
return r * N * (1 - N / K)
|
||||
|
||||
t = np.linspace(0, 30, 300)
|
||||
N = odeint(logistic, 5, t, args=(0.5, 100))
|
||||
```
|
||||
|
||||
### Leslie matrix (age-structured)
|
||||
```python
|
||||
def leslie_step(pop, fecundity, survival):
|
||||
L = np.zeros((len(pop), len(pop)))
|
||||
L[0, :] = fecundity
|
||||
for i in range(len(pop) - 1):
|
||||
L[i + 1, i] = survival[i]
|
||||
return L @ pop
|
||||
|
||||
# 매 example
|
||||
pop = np.array([100, 80, 50, 20])
|
||||
fec = np.array([0, 0.5, 1.5, 0.8])
|
||||
surv = np.array([0.6, 0.7, 0.5])
|
||||
for _ in range(20): pop = leslie_step(pop, fec, surv)
|
||||
```
|
||||
|
||||
### Agent-based (Mesa)
|
||||
```python
|
||||
from mesa import Agent, Model
|
||||
from mesa.space import MultiGrid
|
||||
from mesa.time import RandomActivation
|
||||
|
||||
class Sheep(Agent):
|
||||
def step(self):
|
||||
self.energy -= 1
|
||||
if grass_at(self.pos): self.energy += 5
|
||||
# 매 move
|
||||
x, y = self.random.choice(self.model.grid.get_neighborhood(self.pos, True))
|
||||
self.model.grid.move_agent(self, (x, y))
|
||||
# 매 reproduce
|
||||
if self.energy > 20:
|
||||
self.energy /= 2
|
||||
self.model.add_sheep(self.pos, self.energy)
|
||||
# 매 die
|
||||
if self.energy <= 0: self.model.kill(self)
|
||||
|
||||
class Wolf(Agent):
|
||||
def step(self):
|
||||
# 매 hunt sheep
|
||||
sheep_nearby = self.model.grid.get_cell_list_contents([self.pos])
|
||||
sheep_nearby = [a for a in sheep_nearby if isinstance(a, Sheep)]
|
||||
if sheep_nearby:
|
||||
self.energy += 20
|
||||
self.model.kill(sheep_nearby[0])
|
||||
|
||||
class Ecosystem(Model):
|
||||
def __init__(self, n_sheep, n_wolves, w, h):
|
||||
self.grid = MultiGrid(w, h, torus=True)
|
||||
self.schedule = RandomActivation(self)
|
||||
for _ in range(n_sheep): self.add_sheep((random_pos), 10)
|
||||
for _ in range(n_wolves): self.add_wolf((random_pos), 20)
|
||||
def step(self): self.schedule.step()
|
||||
```
|
||||
|
||||
### Food web (network)
|
||||
```python
|
||||
import networkx as nx
|
||||
|
||||
G = nx.DiGraph()
|
||||
# 매 edge: prey → predator
|
||||
G.add_edges_from([
|
||||
('grass', 'rabbit'), ('grass', 'mouse'),
|
||||
('rabbit', 'fox'), ('mouse', 'fox'),
|
||||
('mouse', 'owl'), ('rabbit', 'eagle'),
|
||||
])
|
||||
|
||||
# 매 trophic level
|
||||
def trophic_level(G, species):
|
||||
if G.in_degree(species) == 0: return 1
|
||||
preys = list(G.predecessors(species))
|
||||
return 1 + np.mean([trophic_level(G, p) for p in preys])
|
||||
```
|
||||
|
||||
### Species distribution model (MaxEnt-style)
|
||||
```python
|
||||
from sklearn.ensemble import RandomForestClassifier
|
||||
|
||||
def fit_sdm(presences, absences, env_features):
|
||||
X = np.vstack([presences, absences])
|
||||
y = np.array([1] * len(presences) + [0] * len(absences))
|
||||
clf = RandomForestClassifier(n_estimators=200).fit(X, y)
|
||||
return clf
|
||||
|
||||
def project(clf, future_env_grid):
|
||||
return clf.predict_proba(future_env_grid)[:, 1] # 매 suitability
|
||||
```
|
||||
|
||||
### Spatial spread (cellular automaton)
|
||||
```python
|
||||
def spread_step(grid, infected_value=1, p_spread=0.3):
|
||||
new_grid = grid.copy()
|
||||
H, W = grid.shape
|
||||
for i in range(1, H - 1):
|
||||
for j in range(1, W - 1):
|
||||
if grid[i, j] == 0:
|
||||
neighbors = grid[i-1:i+2, j-1:j+2].sum() - grid[i, j]
|
||||
if neighbors > 0 and np.random.rand() < 1 - (1 - p_spread) ** neighbors:
|
||||
new_grid[i, j] = infected_value
|
||||
return new_grid
|
||||
```
|
||||
|
||||
### Camera trap classifier (BioCLIP)
|
||||
```python
|
||||
from transformers import CLIPModel, CLIPProcessor
|
||||
model = CLIPModel.from_pretrained('imageomics/bioclip')
|
||||
|
||||
def classify_animal(image, candidate_species):
|
||||
inputs = processor(text=candidate_species, images=image, return_tensors='pt')
|
||||
out = model(**inputs)
|
||||
return candidate_species[out.logits_per_image.argmax().item()]
|
||||
```
|
||||
|
||||
### Bird sound (BirdNET-style)
|
||||
```python
|
||||
def detect_birds(audio, sr=48000, window_s=3):
|
||||
# 매 chunked inference
|
||||
chunks = chunk(audio, window_s * sr)
|
||||
return [birdnet_model.predict(c) for c in chunks]
|
||||
```
|
||||
|
||||
### Sensitivity analysis
|
||||
```python
|
||||
from SALib.sample import saltelli
|
||||
from SALib.analyze import sobol
|
||||
|
||||
problem = {
|
||||
'num_vars': 4,
|
||||
'names': ['alpha', 'beta', 'delta', 'gamma'],
|
||||
'bounds': [[0.1, 1], [0.05, 0.2], [0.01, 0.1], [0.1, 1]],
|
||||
}
|
||||
param_values = saltelli.sample(problem, 1024)
|
||||
Y = np.array([simulate(p)[-1, 0] for p in param_values]) # 매 final prey
|
||||
Si = sobol.analyze(problem, Y)
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| 2-3 species | Lotka-Volterra ODE |
|
||||
| Age structure | Leslie matrix |
|
||||
| Behavioral | ABM (Mesa / NetLogo) |
|
||||
| Network | Food web graph |
|
||||
| Range / spatial | SDM + CA |
|
||||
| Fisheries | Ecopath / EwE |
|
||||
| Camera trap data | BioCLIP / DL |
|
||||
|
||||
**기본값**: 매 question-driven — 매 quick population → ODE; 매 behavioral → ABM; 매 modern data → ML SDM.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Systems Biology]]
|
||||
- 변형: [[Lotka-Volterra]] · [[Food-Web]]
|
||||
- Adjacent: [[Cellular Automata]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 conservation. 매 invasive species. 매 climate adaptation.
|
||||
**언제 X**: 매 hard physics (use mechanistic instead).
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Ignore stochasticity**: 매 small population.
|
||||
- **Single-scale**: 매 cross-scale interaction 의 miss.
|
||||
- **Calibrate to single dataset**: 매 over-fit.
|
||||
- **No sensitivity analysis**: 매 parameter uncertainty.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (May, Levin Mathematical Ecology).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-04-20 | Auto-reinforced |
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — ODE / ABM / food web / SDM / sensitivity code |
|
||||
Reference in New Issue
Block a user