일공이의 IT노트

[Machine Learning] 선형 결합, 가중 평균, 제곱합, 오차 제곱합 본문

Data Science/Machine Learning

[Machine Learning] 선형 결합, 가중 평균, 제곱합, 오차 제곱합

일공ILGONG 2020. 10. 14. 10:57

 

 

가중 합(weighted sum)

 

수학자들이 일반적으로 이야기하는 선형 결합은 마트에서 장을 보는 것을 기술적인 용어로 표현한 것이라고 이해할 수 있다.

제품 수량 단가
와인 2 12.50
오렌지 12 .50
머핀 3 1.75

 

위의 품목들의 비용을 계산할 때에는 각 품목의 단가를 고려해야 한다. 개별 품목의 단가와 수량을 곱해서 더하면 지불해야 할 총비용이 된다. 이를 가중 합(weighted sum)으로 생각할 수 있다.

 

 

1) 기본 파이썬 코드로 가중 합을 구하는 방법

quantity = [2, 12, 3]
costs    = [12.5, .5, 1.75]
sum(q*c for q,c in zip(quantity,costs))
36.25

 

2) Numpy 배열에 수량과 비용을 입력하여 연산을 수행하는 방법

quantity = np.array([2, 12, 3]) 
costs    = np.array([12.5, .5, 1.75])
np.sum(quantity * costs) # 요소별 곱
36.25

 

3) Numpy의 np.dot으로 구하는 방법

print(quantity.dot(costs),       # 접곱 방식 1
      np.dot(quantity, costs),   # 접곱 방식 2
      quantity @ costs,          # 접곱 방식 3
      sep='\n')
36.25
36.25
36.25

dot은 쌍을 구성하는 요소의 곱을 구하고 이를 모두 더한다.

 

'점곱'으로 표현되는 선형 결합은 쌍으로 된 갑들을 곱하고, 곱한 중간 결과들을 모두 더하는 것이다.

점곱을 수식으로 표현하면 다음과 같다.

 

 

파이썬의 zip 함수를 사용하면 요소별 계산을 편하게 구현할 수 있다. 즉, 여러 개의 시퀀스에 들어 있는 값을 순서대로 함께 처리하는데 유용하다.

 

for q_i, c_i in zip(quantity, costs):
    print("{:2d} {:5.2f} --> {:5.2f}".format(q_i, c_i, q_i * c_i))

print("Total:", 
      sum(q*c for q,c in zip(quantity,costs))) # cool-kid method
 2 12.50 --> 25.00
12  0.50 -->  6.00
 3  1.75 -->  5.25
Total: 36.25

 

 


가중 평균

 

단순 평균은 값들에 동일한 가중치를 부여하여 구한 평균이다. 그렇다면 가중 평균은 가중치에 변형을 가한 것이라고 할 수 있다. 만일 결괏값들이 확률적 시나리오의 결과고, 가중치가 이 결괏값들의 확률인 경우라면 이 가중 평균은 결과의 기댓값(expected value)라고 한다. 이를 수식으로 나타내면 다음과 같다.

 

 

파이썬 코드로는 다음과같이 구할 수 있다.

values  = np.array([10,  20,  30])
weights = np.array([.5, .25, .25])

np.dot(weights, values)
17.5

 

 


제곱합(sum of squares)

 

수량(quantity)과 값(value)이 서로 같은 경우, 곱의 합을 구할 시에 각 요소가 그 자신과 곱해 원래 값의 제곱이 되기 때문에 이를 제곱합(sum of squares)이라고 한다.

 

 

파이썬 코드로는 다음과 같이 구현할 수 있다.

values = np.array([5, -3, 2, 1])
squares = values * values # 요소별 곱
print(squares, 
      np.sum(squares),   # 제곱의 합
      np.dot(values, values), sep="\n")
[25  9  4  1]
39
39

 

 


오차 제곱합

 

우리가 가진 실제 값과 예측 값을 가지고 오차를 계산할 수 있다.

 

 

예측 값이 실제 값보다 큰지, 작은지에 따라 오차는 양수 또는 음수가 될 수 있다. 만약 오차를 측정할 때 하나는 5로 과다 추정하고 하나는 -5로 과소 추정되었다면, 이를 그냥 합했을 때 서로 상쇄되어 예측이 완벽하다고 잘못 판단하게 된다. 따라서 오차 제곱합을 이용하는 경우가 많다.

 

 

파이썬으로는 점곱과 같은 패턴으로 구할 수 있다.

np.dot(errors, errors)
61.45

 

 

가중 평균과 오차 제곱합은 머신 러닝에서 가장 흔하게 등장하는 합계 형태이다.

 

 


Reference

마크 페너, <머신러닝을 다루는 기술 with 파이썬, 사이킷런>(길벗, 2020)