YOGYUI

알고리즘 - 평균 구하기 본문

Software/Etc

알고리즘 - 평균 구하기

요겨 2021. 9. 10. 14:05
반응형

(Latex 연습용 포스트)

수치형 데이터 \(N\)개의 평균(average)을 구하는 공식은 다음과 같다

\(avg_{N}={\sum_{i=1}^{N}{a_{i}} \over N}\)

이 때, 위 수식은 다음과 같이 분해할 수 있다

\(\begin{align*} avg_{N}&={a_{1}+a_{2}+a_{3}+ \cdots +a_{N-2}+a_{N-1}+a_{N} \over N} \\&= {a_{1}+a_{2}+\cdots +a_{N-2}+a_{N-1}\over N}+{a_{N} \over N} \\&= {a_{1}+a_{2}+\cdots +a_{N-2}+a_{N-1} \over N-1} \times {N -1 \over N} + {a_{N} \over N} \\&= avg_{N-1} \times {N-1 \over N} + {a_{N} \over N} \\& = {avg_{N-1} \times (N-1) + a_{N} \over N}\end{align*}\)

즉, 이전까지의 평균(\(avg_{N-1}\))과 현재값(\(a_{N}\)), 그리고 전체 데이터 개수(\(N\))로 현재 평균(\(avg_{N}\))을 구할 수 있다

 

파이썬으로 테스트 코드를 작성해보자

1. 데이터 파일 생성

테스트를 위해 100만줄의 텍스트파일을 만들어보자 (1 ~ 1000000까지 숫자 기입)

with open('./data.txt', 'w') as fp:
    for i in range(1000000):
        fp.write(f'{i+1}\n')

2. 모두 합한 후 나누기

average, cnt = 0, 0
with open('./data.txt', 'r') as fp:
    while True:
        try:
            average += int(fp.readline())
            cnt += 1
        except ValueError:
            break
average = average / cnt

3. 순차적으로 구하기

average, cnt = 0, 0
with open('./data.txt', 'r') as fp:
    while True:
        try:
            value = int(fp.readline())
            cnt += 1
            average = (average * (cnt - 1) + value) / cnt
        except ValueError:
            break

함수로 만들어보면 다음과 같다

def func_average(pre, value, count):
    return (pre * (count - 1) + value) / count
    
average, cnt = 0, 0
with open('./data.txt', 'r') as fp:
    while True:
        try:
            value = int(fp.readline())
            cnt += 1
            average = func_average(average, value, cnt)
        except ValueError:
            break

4. Numpy 배열 사용하기

import numpy as np

with open('./data.txt', 'r') as fp:
    lines = fp.readlines()
array = np.asarray([int(x) for x in lines])
average = array.mean()

어떤 것을 사용하던 결과는 500000.5로 동일하다

반응형