56 lines
2.3 KiB
Python
56 lines
2.3 KiB
Python
import numpy as np
|
|
import random
|
|
from typing import Callable, Dict, Any
|
|
|
|
class ParameterOptimizer:
|
|
"""
|
|
지능형 파라미터 최적화 엔진 (Algorithmic Review 1.2 반영)
|
|
브루트 포스 대신 시뮬레이티드 어닐링 또는 경사 하강 초기화를 활용함.
|
|
"""
|
|
|
|
def __init__(self, objective_function: Callable):
|
|
self.objective_function = objective_function
|
|
|
|
def simulated_annealing(self, initial_params: np.ndarray, iterations: int = 1000, temp: float = 1.0, cooling_rate: float = 0.95):
|
|
"""
|
|
시뮬레이티드 어닐링(Simulated Annealing) 기반 최적화
|
|
지역 최적점(Local Optima) 탈출이 가능하며 브루트 포스보다 압도적으로 빠름.
|
|
"""
|
|
current_params = initial_params
|
|
current_score = self.objective_function(current_params)
|
|
|
|
best_params = current_params
|
|
best_score = current_score
|
|
|
|
for i in range(iterations):
|
|
# 이웃 해(Neighbor) 탐색
|
|
neighbor_params = current_params + np.random.normal(0, 0.1, size=current_params.shape)
|
|
neighbor_score = self.objective_function(neighbor_params)
|
|
|
|
# 수락 확률 계산 (Metropolis Criterion)
|
|
if neighbor_score > current_score or random.random() < np.exp((neighbor_score - current_score) / temp):
|
|
current_params = neighbor_params
|
|
current_score = neighbor_score
|
|
|
|
if current_score > best_score:
|
|
best_score = current_score
|
|
best_params = neighbor_params
|
|
|
|
# 냉각 (Cooling)
|
|
temp *= cooling_rate
|
|
|
|
print(f"[Optimizer] Best Score Found: {best_score:.4f}")
|
|
return best_params
|
|
|
|
# Example Objective Function (e.g., Accuracy based on threshold and weights)
|
|
def dummy_objective(params):
|
|
# 가상의 성능 평가 함수 (파라미터가 0.5에 가까울수록 높은 점수)
|
|
return -np.sum((params - 0.5)**2)
|
|
|
|
if __name__ == "__main__":
|
|
optimizer = ParameterOptimizer(dummy_objective)
|
|
initial = np.array([0.1, 0.9, 0.2])
|
|
print(f"Starting Intelligent Optimization from {initial}...")
|
|
best = optimizer.simulated_annealing(initial)
|
|
print(f"Optimized Parameters: {best}")
|