AI/Machine Learning
[ML] NNLS(Non-negative least squares)란?
운호(Noah)
2020. 9. 7. 14:29
기본 선형 회귀란?
- 기본 선형 회귀 분석에서는 독립변수 (X)와 종속 변수 (Y)의 최적화 된 선형 관계를 설명하기 위해
- 적절한 가중치(weight)와 편향(bias)을 찾습니다.
NNLS (Non-Negative Least Squares) 회귀란?
-
이때, NNLS는 가중치(weight)가 음수가 되는 것을 허용하지 않는 수학적 최적화 기술입니다.
-
독립변수 X와 종속 변수 Y가 주어졌을 때 최적화 하고자 하는 식
-
여기서 b ≥ 0 은 벡터 b 의 각 성분이 음수가 아니어야 함을 의미하고
-
‖ · ‖₂ 는 Euclidean norm 을 나타냅니다 .
-
-
즉, 유클리드 표준 값을 최소로 하며 양수값을 가지는 가중치(weight)를 찾는 것 입니다.
-
간단한 예제 코드
-
제공하는 독립변수와 종속변수
- 60 b1 + 90 b2 + 120 b3 = 67.5
- 30 b1 + 120 b2 + 90 b3 = 60
-
위 식이 주어졌을 때 유클리드 표준 값을 최소로 하는 가중치와 편향을 찾는 예제입니다.
import numpy as np from scipy.optimize import nnls A = np.array([[60, 90, 120], [30, 120, 90]]) y = np.array([67.5, 60]) # coef : 가중치, intercept : 편향 coef, intercept = nnls(A,y) print(coef) print(intercept) # [0. 0.17857143 0.42857143] # 0.0 # NNLS에서 나온 각 weight 추출 C0=np.array(pd.DataFrame(coef).iloc[0]) C1=np.array(pd.DataFrame(coef).iloc[1]) C2=np.array(pd.DataFrame(coef).iloc[2]) # 구한 가중치와 편향을 사용해 임의의 데이터 결과를 출력해보기 print(90*C0 + 120*C1 + 60*C2) print(120*C0 + 60*C1 + 90*C2) #[47.1428571429] #[49.2857142857]
-
실제 구현 코드
- 기본선형회귀와 NNLS 비교