본문 바로가기
IT/[Everyday]Coding

노트북 밧데리 수명 예측 연습

by Jang HyunWoong 2018. 2. 20.

노트북 밧데리 수명 로그를 보고 수명을 예측하는 파이썬 코드
“trainingdata.txt” 라는 training file이 주어진다. 
이 파일 안에는 100개의 정보가 있다. 
[충전 시간, 밧데리 수명 시간]

예를 들어, 
2.81,5.62 
7.14,8.00 
2.72,5.44 
3.87,7.74 
1.90,3.80 
5.50,8.00 
0.14,0.28 
2.00,4.00 
1.78,3.56 
3.45,6.90
...

문제는 쉽다. 
training data를 보고 밧데리 수명을 예측하자. 

input으로 충전 시간이 들어온다. 
output으로 예측되는 수명시간을 출력하면 된다. 

예를들어, 
Input:
0.15

Output:
3.00


*방법:
두 가지 조건이 있으니 .. 쉽게 할 수 있고 생각이 난게 Linear Regression 방식 이였다. 
먼저 데이터 들이 어떻게 분포되어 있는지 보기 위해 그래프를 찍어봤다. 

데이터 분포

보니까 이 노트북의 MAX 수명 시간은 8시간이다. 
충전을 오래 해도 8시간을 못넘는 것을 확인했고, 직선의 방정식이 정말 깨끗하게 나와서
좋았다. 

저 직선의 방정식만 찾으면, Charge 시간이 들어올때 예측되는 시간을 출력할 수 있다. 

인터넷을 참고해 가며 Linear Regression을 만들었다. 

지금 데이터 분포는 거의 완벽한 직선이지만, 실제 다른 데이터들은 그렇지 않다.

그렇기 때문에 학습하는 방식을 더해서 다른 데이터에도 사용될 수 있도록 만들었다. 

아래는 python 코드이고, numpy 패키지가 추가로 사용되었다. 

from numpy import loadtxt, zeros, ones, array def compute_cost(x, y, theta): m = y.size prediction = x.dot(theta).flatten() Error = (prediction - y) ** 2 J = (1.0 / (2*m)) * Error.sum() return J def gradient_descent(x, y, theta, alpha, num_iters): m = y.size J_history = zeros(shape=(num_iters, 1)) for i in range(num_iters): prediction = x.dot(theta).flatten() errors_x1 = (prediction - y) * X[:, 0] errors_x2 = (prediction - y) * X[:, 1] theta[0][0] = theta[0][0] - alpha * (1.0/m) * errors_x1.sum() theta[1][0] = theta[1][0] - alpha * (1.0/m) * errors_x2.sum() J_history[i, 0] = compute_cost(x, y, theta) return theta, J_history data = loadtxt('trainingdata.txt', delimiter=',') data = array([x.tolist() for x in data if x[1] <8]) x = data[:, 0] y = data[:, 1] #number of training m = y.size #Add a column iter = ones(shape=(m, 2)) iter[:, 1] = X #Initialize theta parameters theta = zeros(shape=(2, 1)) #gradient descent settings iterations = 1000 alpha = 0.1 theta, J_history = gradient_descent(iter, y, theta, alpha, iterations) N = float(input()) result = theta[1]*N+theta[0] if result > 8: print("8.00") else: print("%0.2f" % float(result))


*느낀점
보통 이론을 머리로만 보고 이해하고 수학처럼 손으로 풀다가, 
실제 코드로 옮겨봤다. 





반응형

'IT > [Everyday]Coding' 카테고리의 다른 글

Hamming Distance  (0) 2019.01.23
Jewels and Stones  (0) 2019.01.22
이진트리 높이 탐색  (0) 2018.02.20
이진트리 모든 데이터 탐색  (0) 2018.02.20
컵 모양의 2차 행렬의 모든 합이 가장 큰 것을 알아내라  (0) 2016.08.16