[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,89 +1,146 @@
|
||||
---
|
||||
id: wiki-2026-0508-non-parametric-models
|
||||
title: Non parametric Models
|
||||
title: Non-parametric Models
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [ML-NPAR-001]
|
||||
aliases: [Non-parametric Models, Nonparametric ML, Instance-based Learning]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 1.0
|
||||
tags: [machine-learning, Statistics, non-parametric, knn, decision-trees, data-driven]
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [ml, non-parametric, knn, decision-trees, gaussian-process, kernel, sklearn]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-26
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
tech_stack: { language: python, framework: scikit-learn }
|
||||
---
|
||||
|
||||
# Non-parametric Models (비모수 모델)
|
||||
# Non-parametric Models
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> "데이터의 형상을 미리 짐작하여 가두지 말고, 데이터 스스로가 자신의 구조를 드러내게 하라" — 고정된 수의 매개변수를 가지지 않고, 데이터의 규모에 따라 모델의 복잡도가 유연하게 변화하는 머신러닝 알고리즘 체계.
|
||||
## 매 한 줄
|
||||
- 비모수 모델은 고정 개수 파라미터를 두지 않고 데이터에 따라 모델 복잡도가 성장하며, k-NN·decision tree·kernel·Gaussian process가 대표 family.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **추출된 패턴:** "Instance-based and Flexible Representation" — 데이터를 선형이나 정규 분포와 같은 특정 수식으로 요약하는 대신, 데이터 포인트 그 자체를 기억하거나(K-NN) 영역을 잘게 쪼개어([[Decision Tree|Decision Tree]]s) 복잡하고 불규칙한 데이터의 경계면을 있는 그대로 학습하는 패턴.
|
||||
- **주요 특징:**
|
||||
- **Flexibility:** 데이터의 분포에 대해 강한 가정을 하지 않으므로 매우 유연함.
|
||||
- **Model Complexity:** 데이터셋의 크기가 커질수록 필요한 매개변수나 저장 용량도 비례해서 증가함.
|
||||
- **[[Overfitting|Overfitting]] Risk:** 데이터의 노이즈까지 학습할 위험이 있어 적절한 규제가 필수적임.
|
||||
- **의의:** 데이터의 패턴이 매우 복잡하거나 사전 지식이 부족한 도메인에서, 고정된 선형 모델보다 훨씬 높은 적응력을 발휘함.
|
||||
## 매 핵심
|
||||
- **정의**: parameter 개수가 데이터 크기에 따라 증가(또는 데이터 자체를 메모리에 저장). "no fixed parametric form".
|
||||
- **대표 알고리즘**:
|
||||
- k-NN: lazy learner, 거리 기반.
|
||||
- Decision tree / Random Forest / Gradient Boosting: tree 깊이·개수가 데이터에 적응.
|
||||
- Kernel methods (SVM with RBF, Kernel Ridge): support vector 수가 데이터 의존.
|
||||
- Gaussian Process: covariance matrix(N×N) → O(N³) 학습.
|
||||
- KDE(Kernel Density Estimation), Nadaraya-Watson regression.
|
||||
- **장점**: 분포 가정 약함, 복잡한 비선형 관계 포착.
|
||||
- **단점**: 데이터·계산량 증가, curse of dimensionality, 해석성 일부 약함.
|
||||
- **vs parametric**: linear/logistic regression, GLM은 고정 파라미터 → 데이터 적어도 OK, 외삽 가능.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 비모수 모델은 매개변수가 '없다'는 뜻이 아니라, 그 수가 고정되지 않았음을 의미함. 최근에는 가우시안 프로세스(Gaussian Processes)나 베이지안 비모수 모델 등을 통해 불확실성까지 정밀하게 측정하는 방향으로 고도화됨.
|
||||
- **정책 변화:** Antigravity 프로젝트는 에이전트의 작업 소요 시간 예측이나 이상 탐지(Anomaly Detection) 시, 데이터의 분포를 미리 예단하지 않기 위해 비모수적 접근법인 커널 밀도 추정(KDE)이나 랜덤 포레스트를 적극 활용함.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- [[K-Nearest-Neighbors-K-NN|K-Nearest-Neighbors-K-NN]], Decision-Trees-and-Random-Forests, [[Support-Vector-Machines|Support-Vector-Machines]]-SVM, [[Instance-based-Learning|Instance-based-Learning]]
|
||||
- **Raw Source:** 10_Wiki/Topics/AI/Non-parametric-Models.md
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
## 💻 패턴
|
||||
```python
|
||||
# k-NN classifier with distance weighting
|
||||
from sklearn.neighbors import KNeighborsClassifier
|
||||
clf = KNeighborsClassifier(n_neighbors=15, weights="distance", metric="minkowski", p=2)
|
||||
clf.fit(X_train, y_train)
|
||||
pred = clf.predict(X_test)
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
```python
|
||||
# Decision tree depth tuning via CV
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
from sklearn.model_selection import GridSearchCV
|
||||
gs = GridSearchCV(DecisionTreeClassifier(random_state=0),
|
||||
{"max_depth": [3, 5, 10, None], "min_samples_leaf": [1, 5, 20]},
|
||||
cv=5, scoring="f1_macro")
|
||||
gs.fit(X, y)
|
||||
print(gs.best_params_, gs.best_score_)
|
||||
```
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
```python
|
||||
# Random Forest with OOB score
|
||||
from sklearn.ensemble import RandomForestClassifier
|
||||
rf = RandomForestClassifier(n_estimators=500, oob_score=True, n_jobs=-1, random_state=0)
|
||||
rf.fit(X, y)
|
||||
print("OOB:", rf.oob_score_)
|
||||
```
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
```python
|
||||
# Kernel Ridge Regression with RBF
|
||||
from sklearn.kernel_ridge import KernelRidge
|
||||
kr = KernelRidge(alpha=1.0, kernel="rbf", gamma=0.1)
|
||||
kr.fit(X_train, y_train)
|
||||
```
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
```python
|
||||
# Gaussian Process regression
|
||||
from sklearn.gaussian_process import GaussianProcessRegressor
|
||||
from sklearn.gaussian_process.kernels import RBF, WhiteKernel
|
||||
kernel = 1.0 * RBF(length_scale=1.0) + WhiteKernel(noise_level=0.1)
|
||||
gpr = GaussianProcessRegressor(kernel=kernel, normalize_y=True, n_restarts_optimizer=5)
|
||||
gpr.fit(X_train, y_train)
|
||||
mu, std = gpr.predict(X_test, return_std=True)
|
||||
```
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
```python
|
||||
# KDE for density estimation
|
||||
from sklearn.neighbors import KernelDensity
|
||||
import numpy as np
|
||||
kde = KernelDensity(bandwidth=0.5, kernel="gaussian").fit(X_train)
|
||||
log_density = kde.score_samples(X_test)
|
||||
density = np.exp(log_density)
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
```python
|
||||
# Nadaraya-Watson regressor (manual)
|
||||
import numpy as np
|
||||
def nw_regress(X_train, y_train, X_test, h=1.0):
|
||||
diffs = X_test[:, None, :] - X_train[None, :, :]
|
||||
w = np.exp(-np.sum(diffs**2, axis=2) / (2 * h**2))
|
||||
return (w @ y_train) / (w.sum(axis=1) + 1e-9)
|
||||
```
|
||||
|
||||
```python
|
||||
# SVM with RBF kernel — support vectors grow with data
|
||||
from sklearn.svm import SVC
|
||||
svc = SVC(kernel="rbf", C=1.0, gamma="scale")
|
||||
svc.fit(X_train, y_train)
|
||||
print("n_SV:", len(svc.support_))
|
||||
```
|
||||
|
||||
```python
|
||||
# FAISS for large-scale k-NN (approximate)
|
||||
import faiss, numpy as np
|
||||
index = faiss.IndexHNSWFlat(X.shape[1], 32)
|
||||
index.add(X.astype(np.float32))
|
||||
D, I = index.search(query.astype(np.float32), k=10)
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
- **데이터 크기**:
|
||||
- <1k → GP, kernel ridge OK.
|
||||
- 1k–100k → tree ensemble, k-NN(brute or KD-tree).
|
||||
- >100k → tree ensemble, ANN(FAISS, ScaNN), 또는 parametric로 회귀.
|
||||
- **차원**: 고차원(>50) → tree, gradient boosting. k-NN/KDE는 curse of dim.
|
||||
- **uncertainty 필요**: GP > tree quantile regression > MC Dropout(parametric).
|
||||
- **해석성**: shallow decision tree, kNN(prototype 분석).
|
||||
|
||||
## 🔗 Graph
|
||||
- 관련: [[K-Nearest-Neighbors-K-NN]], [[Decision-Tree]], [[Random-Forest]], [[Gradient-Boosting]], [[Gaussian-Process]], [[Kernel-Methods]]
|
||||
- 도구: [[scikit-learn]], [[XGBoost]], [[LightGBM]], [[GPyTorch]], [[FAISS]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
- 데이터셋 크기/차원 → 추천 모델 family 매트릭스 생성.
|
||||
- sklearn pipeline + GridSearch boilerplate 작성.
|
||||
- 결과 해석(feature importance, partial dependence plot 설명).
|
||||
|
||||
## ❌ 안티패턴
|
||||
- 100만 row에 GaussianProcessRegressor 그대로 사용(O(N³)).
|
||||
- 고차원 sparse 데이터에 k-NN 단독.
|
||||
- random forest를 "blackbox"라 단정해 SHAP/PDP 안 씀.
|
||||
- standardize 안 한 데이터에 RBF kernel.
|
||||
|
||||
## 🧪 검증
|
||||
- CV(StratifiedKFold), nested CV for hyperparameter.
|
||||
- learning curve(데이터 추가에 따른 성능 변화) → 비모수 특성 확인.
|
||||
- 시간/메모리 프로파일링(N×N matrix가 RAM 안 넘는지).
|
||||
|
||||
## 🕓 Changelog
|
||||
- 2026-05-08 Phase 1: 초안 자동 생성.
|
||||
- 2026-05-10 Manual cleanup: 본문 보강, GP/KDE/NW/FAISS 패턴 추가, 결정 기준 정리.
|
||||
|
||||
Reference in New Issue
Block a user