YOGYUI

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

Software/Etc

알고리즘 - 평균 구하기

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

(Latex 연습용 포스트)

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

avgN=Ni=1aiN

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

avgN=a1+a2+a3++aN2+aN1+aNN=a1+a2++aN2+aN1N+aNN=a1+a2++aN2+aN1N1×N1N+aNN=avgN1×N1N+aNN=avgN1×(N1)+aNN

즉, 이전까지의 평균(avgN1)과 현재값(aN), 그리고 전체 데이터 개수(N)로 현재 평균(avgN)을 구할 수 있다

 

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

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로 동일하다

반응형