Commit 4ca38377 authored by KangMin An's avatar KangMin An
Browse files

Update : 데이터 처리 코드 일부 수정 및 주석 갱신.

parent 81b7e5fa
...@@ -11,11 +11,12 @@ import numpy as np ...@@ -11,11 +11,12 @@ import numpy as np
class LinearRegression: class LinearRegression:
def __init__(self, train_x, train_t, weights, bias, delta=1e-4, learning_rate=0.05, err_rate=0.01): def __init__(self, train_x, train_t, weights=None, bias=None, delta=1e-4, learning_rate=0.05, err_rate=0.01):
self.train_x = train_x.T # (n, 10) -> (10, n) self.train_x = train_x.T # (n, 10) -> (10, n)
self.train_t = train_t.T # (n, 01) -> (01, n) self.train_t = train_t.T # (n, 01) -> (01, n)
if weights == None or bias == None: # weights와 bias가 존재하지 않는 경우, 초기화를 위해 bias를 대표로 확인
if bias == None:
# Initialize Parameters - w : (1, 10), b : float # Initialize Parameters - w : (1, 10), b : float
self.weights, self.bias = self.initialize(self.train_x) self.weights, self.bias = self.initialize(self.train_x)
else: else:
......
...@@ -34,8 +34,6 @@ def storeParameters(link, filename, data): ...@@ -34,8 +34,6 @@ def storeParameters(link, filename, data):
dbconfig = {"host": sys.argv[1], "user": sys.argv[2], dbconfig = {"host": sys.argv[1], "user": sys.argv[2],
"password": sys.argv[3], "database": sys.argv[4]} "password": sys.argv[3], "database": sys.argv[4]}
print(dbconfig)
eue_db = pymysql.connect(user=dbconfig["user"], password=dbconfig["password"], eue_db = pymysql.connect(user=dbconfig["user"], password=dbconfig["password"],
host=dbconfig["host"], db=dbconfig["database"], charset='utf8') host=dbconfig["host"], db=dbconfig["database"], charset='utf8')
cursor = eue_db.cursor(pymysql.cursors.DictCursor) cursor = eue_db.cursor(pymysql.cursors.DictCursor)
...@@ -44,6 +42,7 @@ query = "SELECT ID,DATALINK FROM USER;" ...@@ -44,6 +42,7 @@ query = "SELECT ID,DATALINK FROM USER;"
cursor.execute(query) cursor.execute(query)
result = cursor.fetchall() result = cursor.fetchall()
# Main Process
for userdata in result: for userdata in result:
print("User ID : ", userdata["ID"]) print("User ID : ", userdata["ID"])
...@@ -53,6 +52,7 @@ for userdata in result: ...@@ -53,6 +52,7 @@ for userdata in result:
# ./data/DO/SGG/EMD/Users/ID # ./data/DO/SGG/EMD/Users/ID
user_datalink = userdata["DATALINK"] user_datalink = userdata["DATALINK"]
dir_ls = user_datalink.split("/") dir_ls = user_datalink.split("/")
# ./data/DO/SGG/EMD/Outside # ./data/DO/SGG/EMD/Outside
outside_datalink = ("/").join(dir_ls[:-2]) + "/Outside" outside_datalink = ("/").join(dir_ls[:-2]) + "/Outside"
...@@ -65,55 +65,28 @@ for userdata in result: ...@@ -65,55 +65,28 @@ for userdata in result:
bias, learning_rate=0.05) bias, learning_rate=0.05)
model.gradientDescent() model.gradientDescent()
# Save the Parameters.
# - analysis_parameters
analysis_data = ""
''' for i in range(len(model.weights[0])):
# Test Codes Start. analysis_data += str(model.weights[0][i]) + ','
'''
print("After Linear Regression -\n")
test_data = np.array([[5], [20], [0], [16.87], [40], [
1011], [0.72], [26.70], [47.00], [64]])
test_data = (test_data - mean) / std_d
y_hat = model.predict(test_data, model.weights, model.bias)
print("Test Data.\n", test_data, "\n")
print("Predict - standard deviation : ", y_hat)
print("Predict - temperature : ", y_hat*std_d[7][0] + mean[7][0], "\n")
print("Cost.")
print(model.cost_MSE(model.train_x, model.train_t,
model.weights, model.bias), "\n")
print("Weights.")
print(model.weights, "\n")
print("Bias.")
print(model.bias)
'''
# Test Codes End.
'''
# Save the Parameters.
# - analysis_parameters
analysis_data = ""
for i in range(len(model.weights[0])): analysis_data += str(model.bias)
analysis_data += str(model.weights[0][i]) + ','
analysis_data += str(model.bias)
storeParameters(user_datalink, "/analysis_parameters.csv", analysis_data) storeParameters(user_datalink, "/analysis_parameters.csv", analysis_data)
# - prediction_parameters # - prediction_parameters
prediction_data = "" prediction_data = ""
for i in range(len(mean)): for i in range(len(mean)):
prediction_data += str(mean[i][0]) + ',' prediction_data += str(mean[i][0]) + ','
prediction_data = prediction_data[:-1] prediction_data = prediction_data[:-1]
prediction_data += '\n' prediction_data += '\n'
for i in range(len(std_d)): for i in range(len(std_d)):
prediction_data += str(std_d[i][0]) + ',' prediction_data += str(std_d[i][0]) + ','
prediction_data = prediction_data[:-1] prediction_data = prediction_data[:-1]
storeParameters( storeParameters(
user_datalink, "/prediction_parameters.csv", prediction_data) user_datalink, "/prediction_parameters.csv", prediction_data)
...@@ -34,7 +34,6 @@ def loadRawData(link, file_name): ...@@ -34,7 +34,6 @@ def loadRawData(link, file_name):
return None return None
data_file = open(file_dir, 'r', newline='') data_file = open(file_dir, 'r', newline='')
print("Data File before CSV reader.\n", data_file)
csv_data = csv.reader(data_file) csv_data = csv.reader(data_file)
for line in csv_data: for line in csv_data:
...@@ -47,7 +46,7 @@ def loadRawData(link, file_name): ...@@ -47,7 +46,7 @@ def loadRawData(link, file_name):
def handleUserRawData(user_data): def handleUserRawData(user_data):
''' '''
# User Raw Data (CSV 파일 데이터) 가공 함수 ### User Raw Data (CSV 파일 데이터) 가공 함수
- [ 월 / 일 / 시 / 분 / 온도 / 습도 / 광도 ]의 데이터를 변환하는 함수 - [ 월 / 일 / 시 / 분 / 온도 / 습도 / 광도 ]의 데이터를 변환하는 함수
- 월 / 일 / 분 제거 - 월 / 일 / 분 제거
- test_data(분이 제거된 데이터)와 true_data(단위 시간 후 실제 온도)로 나누기 - test_data(분이 제거된 데이터)와 true_data(단위 시간 후 실제 온도)로 나누기
...@@ -72,7 +71,7 @@ def handleUserRawData(user_data): ...@@ -72,7 +71,7 @@ def handleUserRawData(user_data):
def handleOutRawData(out_data): def handleOutRawData(out_data):
''' '''
# Out Raw Data (CSV 파일 데이터) 가공 함수 ### Out Raw Data (CSV 파일 데이터) 가공 함수
- [ 월 / 일 / 시 / 분 / 온도 / 습도 / 기압 / 풍속 ] 데이터를 변환하는 함수 - [ 월 / 일 / 시 / 분 / 온도 / 습도 / 기압 / 풍속 ] 데이터를 변환하는 함수
- '분' 을 제거합니다. - '분' 을 제거합니다.
- 같은 시각의 데이터들은 평균을 구해서 데이터로 저장합니다. - 같은 시각의 데이터들은 평균을 구해서 데이터로 저장합니다.
...@@ -114,6 +113,11 @@ def handleOutRawData(out_data): ...@@ -114,6 +113,11 @@ def handleOutRawData(out_data):
def handleParameters(raw_w): def handleParameters(raw_w):
'''
### Weights & Bias를 처리하는 함수
- raw 데이터는 weights와 bias가 합쳐진 상태입니다.
- raw 데이터를 하나씩 잘라 실수로 변환한 뒤, 마지막의 편향을 잘라냅니다.
'''
if raw_w == None: if raw_w == None:
return None, None return None, None
...@@ -131,7 +135,7 @@ def handleParameters(raw_w): ...@@ -131,7 +135,7 @@ def handleParameters(raw_w):
def combineXdata(user_x, out_dict): def combineXdata(user_x, out_dict):
''' '''
# 분리된 입력 데이터를 합치는 함수 ### 분리된 입력 데이터를 합치는 함수
- 사용자 데이터와 외부 데이터를 결합해 입력층의 값으로 가공합니다. - 사용자 데이터와 외부 데이터를 결합해 입력층의 값으로 가공합니다.
''' '''
train_x = [] train_x = []
...@@ -160,12 +164,13 @@ def Xnormalize(data): ...@@ -160,12 +164,13 @@ def Xnormalize(data):
''' '''
### 정규화 함수 ### 정규화 함수
- 입력 층의 데이터를 정규화 시킵니다. - 입력 층의 데이터를 정규화 시킵니다.
- 월, 일 데이터의 평균과 표준 편차를 계산하여 값을 수정합니다.
''' '''
normalized_data = data.T # (n,10) -> (10,n) normalized_data = data.T # (n,10) -> (10,n)
mean = np.mean(normalized_data, axis=1) # 평균 (10, 1) mean = np.mean(normalized_data, axis=1) # 평균 (10, 1)
std_d = np.std(normalized_data, axis=1) # 표준편차 std_d = np.std(normalized_data, axis=1) # 표준편차
# 월, 일의 평균과 표준편차 지정 # 월, 일의 평균과 표준편차 지정
new_mean = [] new_mean = []
...@@ -195,8 +200,13 @@ def Xnormalize(data): ...@@ -195,8 +200,13 @@ def Xnormalize(data):
return normalized_data, new_mean, new_std_d return normalized_data, new_mean, new_std_d
def normalize(data): def Tnormalize(data):
n_data = data.T # (n,10) -> (10,n) '''
### 데이터 정규화 함수
- 평균과 표준 편차를 이용해 입력된 데이터를 정규화 시킵니다.
- 현재 입력층의 데이터가 아닌 train 데이터의 참 값을 표준화 시킵니다.
'''
n_data = data.T # (n,1) -> (1,n)
mean = np.mean(n_data, axis=1) # 평균 mean = np.mean(n_data, axis=1) # 평균
std_d = np.std(n_data, axis=1) # 표준편차 std_d = np.std(n_data, axis=1) # 표준편차
...@@ -210,14 +220,13 @@ def normalize(data): ...@@ -210,14 +220,13 @@ def normalize(data):
def preprocessingData(user_link, out_link): def preprocessingData(user_link, out_link):
''' '''
# 데이터 분석 전 데이터 전처리 함수입니다. # 데이터 분석 전 데이터 전처리 함수
1. 데이터 로드 1. 데이터 로드
2. 데이터 1차 가공 (handle~RawData) 2. 데이터 1차 가공 (handle~RawData)
3. 데이터 2차 가공 (combineXdata) 3. 데이터 2차 가공 (combineXdata)
4. 데이터 3차 가공 (nomalize~) 4. 데이터 3차 가공 (nomalize~)
5. 데이터 넘파이 형식 배열로 변환
4. 데이터 넘파이 형식 배열로 변환 6. 반환
5. 반환
''' '''
raw_user_data = loadRawData(user_link, "/weather.csv") raw_user_data = loadRawData(user_link, "/weather.csv")
raw_out_data = loadRawData(out_link, "/weather.csv") raw_out_data = loadRawData(out_link, "/weather.csv")
...@@ -233,7 +242,7 @@ def preprocessingData(user_link, out_link): ...@@ -233,7 +242,7 @@ def preprocessingData(user_link, out_link):
train_x, mean, std_d = Xnormalize(train_x) train_x, mean, std_d = Xnormalize(train_x)
train_t = np.array(train_t) # (10,1) train_t = np.array(train_t) # (10,1)
train_t = normalize(train_t) train_t = Tnormalize(train_t)
weights = np.array(weights) if weights != None else None weights = np.array(weights) if weights != None else None
bias = float(bias) if bias != None else None bias = float(bias) if bias != None else None
......
...@@ -33,11 +33,12 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => { ...@@ -33,11 +33,12 @@ const dataProcessingJob = schedule.scheduleJob(rule, () => {
pyprocess.stdout.on("data", (data) => { pyprocess.stdout.on("data", (data) => {
console.log("Data processing is start."); console.log("Data processing is start.");
console.log(data.toString()); // Buffer to String.
}); });
pyprocess.stderr.on("data", (error) => { pyprocess.stderr.on("data", (error) => {
console.log("Error in the data processing."); console.log("Error in the data processing.");
console.log(error); console.log(error.toString());
}); });
pyprocess.on("close", () => { pyprocess.on("close", () => {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment